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 36 by douglas, 2008-03-04T22:24:35-08:00 vs.
Revision 38 by douglas, 2008-03-05T13:36:38-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) : ucom(Posix::Open(device, O_RDWR | O_NOCTTY | O_NONBLOCK)), ucomCondition(ucomLock), running(true), responsesCondition(responsesLock), keyActivityCondition(keyActivityLock), callback(callback), 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(10000);
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 192 | Line 204 | retry:
204                  while (responses.empty())
205                          try
206                          {
207 <                                timeval when;
196 <
197 <                                ::gettimeofday(&when, NULL);
198 <
199 <                                timespec wait;
200 <
201 <                                TIMEVAL_TO_TIMESPEC(&when, &wait);
202 <
203 <                                ++wait.tv_sec;
204 <
205 <                                responsesCondition.Wait(wait);
207 >                                responsesCondition.Wait(Timing::GetTimeOfDay() += 1);
208                          }
209                          catch (const Posix::Error &error)
210                          {
# Line 224 | 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);
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 238 | Line 263 | void Display::Set(uint8_t column, uint8_
263   {
264          Communicate(Packet::SendDataToLCD, column, row, data);
265   }
241
242 Display::KeyActivity Display::GetKeyActivity()
243 {
244        _synchronized (keyActivityLock)
245                if (keyActivity.size())
246                {
247                        KeyActivity activity(KeyActivity(*keyActivity.front().data));
248
249                        keyActivity.pop();
250
251                        return activity;
252                }
253
254        return None;
255 }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines