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; |
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 |
|
{ |