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

Comparing DashInterface/DashInterface.cpp (file contents):
Revision 30 by douglas, 2008-02-28T17:01:10-08:00 vs.
Revision 37 by douglas, 2008-03-05T02:29:38-08:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 + #include <iomanip>
8   #include <iostream>
9 + #include <sstream>
10  
11   #include <foreach.hpp>
12   #include <hash.hpp>
13   #include <regex.hpp>
14 + #include <timing.hpp>
15  
16   #include <Audacious.hpp>
17   #include <GPS.hpp>
18  
19 + #include <sys/types.h>
20 + #include <sys/sysctl.h>
21 + #include <sys/utsname.h>
22 +
23   #include <sqlite3.h>
24  
25   #include "Display.hpp"
26  
27   bool debug(false);
28  
29 + void Uname_(Display &display, time_t now = 0, bool change = false)
30 + {
31 +        if (!now || change)
32 +        {
33 +                utsname os;
34 +
35 +                ::uname(&os);
36 +
37 +                static Pcre::RegEx version(_B("^(\\d+\\.\\d+)-([A-Z])[A-Z]*(-p\\d+)?.*$"));
38 +                Pcre::RegEx::Match match(version(os.release));
39 +
40 +                display.Set(0, 1, os.sysname + _B(" ") + match[1] + match[2] + match[3]);
41 +        }
42 +
43 +        int mib[] = { CTL_KERN, KERN_BOOTTIME };
44 +        timeval boottime;
45 +        size_t size(sizeof (boottime));
46 +
47 +        if (now && ::sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0)
48 +        {
49 +                time_t uptime(now - boottime.tv_sec);
50 +
51 +                if (uptime > 60)
52 +                        uptime += 30;
53 +
54 +                char *when;
55 +                int days(uptime / 86400);
56 +
57 +                uptime %= 86400;
58 +
59 +                int hours(uptime / 3600);
60 +
61 +                uptime %= 3600;
62 +
63 +                int minutes(uptime / 60), seconds(uptime % 60);
64 +
65 +                ::asprintf(&when, "%i+%02i:%02i:%02i", days, hours, minutes, seconds);
66 +
67 +                std::string then(when);
68 +
69 +                then.append(17 - std::strlen(when), ' ');
70 +
71 +                std::free(when);
72 +
73 +                if (change)
74 +                        display.Set(0, 2, _B("up ") + then);
75 +                else
76 +                        display.Set(3, 2, then);
77 +        }
78 +        else
79 +                display.Set(0, 2, _B("up -+--:--:--       "));
80 +
81 +        double averages[3];
82 +
83 +        if (::getloadavg(averages, 3) == -1 || !now)
84 +                display.Set(0, 3, _B("-.--, -.--, -.--    "));
85 +        else
86 +        {
87 +                char *load;
88 +
89 +                ::asprintf(&load, "%.2f, %.2f, %.2f", averages[0], averages[1] , averages[2]);
90 +
91 +                display.Set(0, 3, load + std::string(20 - std::strlen(load), ' '));
92 +
93 +                std::free(load);
94 +        }
95 + }
96 +
97 + enum Mode { Uname, Music, English, Metric, Nautical, Menu };
98 +
99 + Mode &operator ++(Mode &mode)
100 + {
101 +        return mode = Mode((mode + 1) % Menu);
102 + }
103 +
104 + Mode &operator --(Mode &mode)
105 + {
106 +        return mode = Mode((Menu + mode - 1) % Menu);
107 + }
108 +
109   int main(int argc, char *argv[])
110   {
111          std::string device;
# Line 54 | Line 141 | usage: std::cout << _B("Usage: ") << arg
141  
142          try
143          {
57                //enum Mode { Uname, Music, English, Metric, Nautical, Last } mode(Uname);
58                //Audacious audacious;
144                  Display display(device);
145  
146 <                display.Ping("Hello!");
146 >                display.Clear();
147 >                display.SetBacklight(100);
148 >                display.Set(2, 0, _B("--:--:-- -- ---"));
149 >
150 >                enum { Running };
151 >
152 >                display.Set(Running, Display::Green, 0);
153 >                display.Set(Running, Display::Red, 100);
154 >
155 >                {
156 >                        uint8_t mask(Display::Up | Display::Enter | Display::Cancel | Display::Left | Display::Right | Display::Down);
157 >
158 >                        display.KeyReporting(mask, mask);
159 >                }
160  
161 <                std::cout << display.Version() << std::endl;
161 >                Uname_(display);
162  
163                  display.Store();
164 <                display.Clear();
165 <                display.SetBacklight(100);
68 <                display.KeyReporting(Display::Up | Display::Enter | Display::Cancel | Display::Left | Display::Right | Display::Down, Display::Up | Display::Enter | Display::Cancel | Display::Left | Display::Right | Display::Down);
69 <                display.Set(0, 0, _B("Hello, World!"));
70 <                display.Set(0, Display::Green, 0);
71 <                display.Set(0, Display::Red, 100);
164 >                display.Set(Running, Display::Green, 100);
165 >                display.Set(Running, Display::Red, 0);
166  
167 <                /*GPS::GPS gps;
167 >                Mode mode(Uname);
168 >                //Audacious::Audacious audacious;
169 >                //GPS::GPS gps;
170  
171 <                gps.Query(_B("o"));
171 >                _forever
172 >                {
173 >                        bool change(false);
174 >
175 >                        // XXX: I'm going to refactor this into callback functions, grr
176 >                        while (Display::KeyActivity activity = display.GetKeyActivity())
177 >                                if (mode != Menu)
178 >                                        switch (activity)
179 >                                        {
180 >                                        case Display::UpPress:
181 >                                                ++mode;
182 >
183 >                                                goto change;
184 >                                        case Display::DownPress:
185 >                                                --mode;
186 >
187 >                                                goto change;
188 >                                        case Display::LeftPress:
189 >                                                std::cerr << _B("Previous") << std::endl;
190 >
191 >                                                break;
192 >                                        case Display::RightPress:
193 >                                                std::cerr << _B("Next") << std::endl;
194 >
195 >                                                break;
196 >                                        case Display::EnterPress:
197 >                                                std::cerr << _B("Menu") << std::endl;
198 >
199 >                                                mode = Menu;
200 >
201 >                                                goto change;
202 >                                        case Display::ExitPress:
203 >                                                std::cerr << _B("Play/Pause") << std::endl;
204 >
205 >                                                break;
206 >                                        default:
207 >                                                break;
208 >                                        }
209 >
210 >                        if (false)
211 > change:                 change = true;
212 >
213 >                        Timing::Time now(Timing::GetTimeOfDay());
214 >
215 >                        if (mode != Menu)
216 >                        {
217 >                                char when[16];
218 >
219 >                                std::strftime(when, sizeof (when), "%l:%M:%S %p %Z", std::localtime(now));
220 >
221 >                                display.Set(2, 0, when);
222 >                        }
223 >
224 >                        switch (mode)
225 >                        {
226 >                        case Uname:
227 >                                Uname_(display, now, change);
228 >
229 >                                break;
230 >                        case Music:
231 >                        case English:
232 >                        case Metric:
233 >                        case Nautical:
234 >                        case Menu:
235 >                                break;
236 >                        }
237  
238 <                std::cout << gps.GetLatitude() << std::endl;*/
238 >                        Timing::NanoSleep(Timing::Time(1) -= Timing::GetTimeOfDay().GetNanoseconds());
239 >                }
240          }
241          catch (const std::exception &exception)
242          {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines