// Dash Interface // // Douglas Thrift // // $Id$ #include #include #include #include #include #include #include #include #include #include #include #include #include "Display.hpp" bool debug(false); void Uname(Display &display, time_t now = 0) { utsname os; ::uname(&os); static Pcre::RegEx version(_B("^(\\d+\\.\\d+)-([A-Z])[A-Z]*(-p\\d+)?.*$")); Pcre::RegEx::Match match(version(os.release)); display.Set(0, 1, os.sysname + _B(" ") + match[1] + match[2] + match[3]); int mib[] = { CTL_KERN, KERN_BOOTTIME }; timeval boottime; size_t size(sizeof (boottime)); if (now && ::sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { time_t uptime(now - boottime.tv_sec); if (uptime > 60) uptime += 30; std::ostringstream output; output << _B("up ") << (uptime / 86400) << '+'; uptime %= 86400; output.width(2); output.fill('0'); output << (uptime / 3600) << ':'; uptime %= 3600; output << (uptime / 60) << ':' << (uptime % 60); output << std::string(20 - output.str().size(), ' '); display.Set(0, 2, output.str()); } else display.Set(0, 2, _B("up -+--:--:-- ")); double averages[3]; if (::getloadavg(averages, 3) == -1 || !now) display.Set(0, 3, _B("-.--, -.--, -.-- ")); else { std::ostringstream output; output << std::fixed << std::setprecision(2) << averages[0] << _B(", ") << averages[1] << _B(", ") << averages[2]; output << std::string(20 - output.str().size(), ' '); display.Set(0, 3, output.str()); } } int main(int argc, char *argv[]) { std::string device; { Pcre::RegEx devicePath(_B("^-device=(/.+)$")); Pcre::RegEx deviceNumber(_B("^-device=([0-9]+)$")); Pcre::RegEx deviceName(_B("^-device=(.+)$")); for (char **arg = argv + 1; *arg; ++arg) { Pcre::RegEx::Match match; if (*arg == _B("-debug")) debug = true; else if (match = devicePath(*arg)) device = match[1]; else if (match = deviceNumber(*arg)) device = _B("/dev/cuaU") + match[1]; else if (match = deviceName(*arg)) device = _B("/dev/") + match[1]; else goto usage; } } if (device.empty()) { usage: std::cout << _B("Usage: ") << argv[0] << _B(" [-debug] [-device=device]") << std::endl; return 2; } try { //enum Mode { Uname, Music, English, Metric, Nautical, Last } mode(Uname); //Audacious audacious; Display display(device); display.Clear(); display.SetBacklight(100); display.Set(2, 0, _B("--:--:-- -- ---")); display.Set(0, Display::Green, 0); display.Set(0, Display::Red, 100); { uint8_t mask(Display::Up | Display::Enter | Display::Cancel | Display::Left | Display::Right | Display::Down); display.KeyReporting(mask, mask); } ::Uname(display); display.Store(); ::Uname(display, std::time(NULL)); /*GPS::GPS gps; gps.Query(_B("o")); std::cout << gps.GetLatitude() << std::endl;*/ /*time_t now(std::time(NULL)); char when[16]; std::strftime(when, sizeof (when), "%l:%M:%S %p %Z", std::localtime(&now));*/ } catch (const std::exception &exception) { std::cerr << argv[0] << _B(": ") << exception.what() << std::endl; return 1; } return 0; }