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 37 by douglas, 2008-03-05T02:29:38-08:00 vs.
Revision 39 by douglas, 2008-03-05T14:39:41-08:00

# Line 103 | 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 129 | 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 162 | 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 178 | Line 187 | void Display::Communicate_()
187  
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)
# Line 215 | Line 226 | retry:
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 229 | Line 263 | void Display::Set(uint8_t column, uint8_
263   {
264          Communicate(Packet::SendDataToLCD, column, row, data);
265   }
232
233 Display::KeyActivity Display::GetKeyActivity()
234 {
235        _synchronized (keyActivityLock)
236                if (keyActivity.size())
237                {
238                        KeyActivity activity(KeyActivity(*keyActivity.front().data));
239
240                        keyActivity.pop();
241
242                        return activity;
243                }
244
245        return None;
246 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines