ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/truck/DashInterface/Display.cpp
(Generate patch)

Comparing DashInterface/Display.cpp (file contents):
Revision 33 by douglas, 2008-02-29T19:05:18-08:00 vs.
Revision 39 by douglas, 2008-03-05T14:39:41-08:00

# Line 6 | Line 6
6  
7   #include <foreach.hpp>
8   #include <scopes.hpp>
9 + #include <timing.hpp>
10  
11   #include <iomanip>
12   #include <iostream>
# Line 102 | Line 103 | void Communicate(Display *display)
103          display->Communicate_();
104   }
105  
106 < Display::Display(const std::string &device) : ucom(Posix::Open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)), ucomCondition(ucomLock), running(true), responsesCondition(responsesLock), thread(reinterpret_cast<void *(*)(void *)>(::Communicate), this)
106 > void Activity(Display *display)
107 > {
108 >        display->Activity();
109 > }
110 >
111 > Display::Display(const std::string &device, Callback callback, void *data) : ucom(Posix::Open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)), ucomCondition(ucomLock), running(true), responsesCondition(responsesLock), keyActivityCondition(keyActivityLock), callback(callback), data(data), communicate(reinterpret_cast<void *(*)(void *)>(::Communicate), this), activity(reinterpret_cast<void *(*)(void *)>(::Activity), this)
112   {
113          ::termios state;
114  
# Line 128 | Line 134 | Display::~Display()
134   {
135          running = false;
136  
137 <        thread.Join();
137 >        communicate.Join();
138 >        activity.Join();
139  
140          Posix::Close(ucom);
141   }
# Line 161 | Line 168 | void Display::Communicate_()
168                          {
169                          case Packet::KeyActivity:
170                                  _synchronized (keyActivityLock)
171 +                                {
172                                          keyActivity.push(response);
173 +                                        keyActivityCondition.Signal();
174 +                                }
175  
176                                  break;
177                          case Packet::FanSpeedReport:
# Line 175 | Line 185 | void Display::Communicate_()
185                                  responsesCondition.Signal();
186                          }
187  
188 < next:   ::usleep(500);
188 > next:   Timing::NanoSleep(Timing::Time(0, 10000000));
189          }
190 +
191 +        keyActivityCondition.Signal();
192   }
193  
194   Display::Packet Display::Communicate_(Display::Packet::Command command, uint8_t length, const uint8_t *data)
195   {
196          Packet packet(command, length, data);
197  
198 + retry:
199          _synchronized (ucomLock)
200                  ucom << packet;
201  
202          _synchronized (responsesLock)
203          {
204                  while (responses.empty())
205 <                        responsesCondition.Wait();
205 >                        try
206 >                        {
207 >                                responsesCondition.Wait(Timing::GetTimeOfDay() += 1);
208 >                        }
209 >                        catch (const Posix::Error &error)
210 >                        {
211 >                                if (error.what() != _B("Operation timed out"))
212 >                                        throw error;
213 >
214 >                                goto retry;
215 >                        }
216  
217                  Packet response(responses.front());
218  
# Line 203 | Line 226 | Display::Packet Display::Communicate_(Di
226          throw;
227   }
228  
229 + void Display::Activity()
230 + {
231 +        if (callback == NULL)
232 +                return;
233 +
234 +        while (running)
235 +                _synchronized (keyActivityLock)
236 +                {
237 +                        while (keyActivity.empty())
238 +                                keyActivityCondition.Wait();
239 +
240 +                        while (keyActivity.size())
241 +                        {
242 +                                KeyActivity activity(KeyActivity(*keyActivity.front().data));
243 +
244 +                                keyActivity.pop();
245 +
246 +                                _desynchronized (keyActivityLock)
247 +                                        callback(activity, data);
248 +                        }
249 +                }
250 + }
251 +
252   bool Display::Ping(const std::string &data)
253   {
254          return data == Communicate<const std::string &>(Packet::PingCommand, data).GetData();
# Line 217 | Line 263 | void Display::Set(uint8_t column, uint8_
263   {
264          Communicate(Packet::SendDataToLCD, column, row, data);
265   }
220
221 Display::KeyActivity Display::GetKeyActivity()
222 {
223        _synchronized (keyActivityLock)
224                if (keyActivity.size())
225                {
226                        KeyActivity activity(KeyActivity(*keyActivity.front().data));
227
228                        keyActivity.pop();
229
230                        return activity;
231                }
232
233        return None;
234 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines