#include #include #include #include #include #include #include "../../shared/sockets.h" #include "main.h" #include "mode.h" #include "batt.h" int batt_fd = 0; static int get_batt_stat(int *acstat, int *battstat, int *battflag, int *percent); static int get_batt_stat(int *acstat, int *battstat, int *battflag, int *percent) { char str[64]; if(!batt_fd) batt_fd = open("/proc/apm", O_RDONLY); if(batt_fd <= 0) return -1; if(lseek(batt_fd, 0, 0) != 0) return -1; if(read(batt_fd, str, sizeof(str)-1) < 0) return -1; if(3 > sscanf(str+13, "0x%x 0x%x 0x%x %d", acstat, battstat, battflag, percent)) return -1; return 0; } int batt_init() { static int first = 1; if(first) { first = 0; sock_send_string(sock, "screen_add B\n"); } return 0; } int batt_close() { if(batt_fd) close(batt_fd); batt_fd = 0; return 0; } //////////////////////////////////////////////////////////////////////// // Battery Screen shows apm battery status... // //#################### //## Battery: 100% ### //AC: Unknown //Batt: Low (Charging) //E------------------F int battery_screen(int rep, int display) { static int first=1; int acstat=0, battstat=0, battflag=0, percent=0; if(first) { first = 0; sprintf(buffer, "screen_set B name {APM stats: %s}\n", host); sock_send_string(sock, buffer); sock_send_string(sock, "widget_add B title title\n"); sprintf(tmp, "widget_set B title {LCDPROC %s}\n", version); sock_send_string(sock, tmp); sock_send_string(sock, "widget_add B one string\n"); if(lcd_hgt >= 4) { sock_send_string(sock, "widget_add B two string\n"); sock_send_string(sock, "widget_add B three string\n"); sock_send_string(sock, "widget_add B gauge hbar\n"); sock_send_string(sock, "widget_set B one 1 2 {AC: Unknown}\n"); sock_send_string(sock, "widget_set B two 1 3 {Batt: Unknown}\n"); sock_send_string(sock, "widget_set B three 1 4 {E F}\n"); sock_send_string(sock, "widget_set B gauge 2 4 0\n"); } } // Only run once every 16 frames... //if(rep&0x0f) return 0; get_batt_stat(&acstat, &battstat, &battflag, &percent); if(percent >= 0) sprintf(buffer, "%i%%", percent); else sprintf(buffer, "??%%"); sprintf(tmp, "widget_set B title {Batt: %s: %s}\n", buffer, host); if(display) sock_send_string(sock, tmp); if(lcd_hgt >= 4) // 4-line version of the screen { sprintf(tmp, "widget_set B one 1 2 {"); switch(acstat) { case 0: sprintf(tmp+strlen(tmp), "AC: Off}\n"); break; case 1: sprintf(tmp+strlen(tmp), "AC: On}\n"); break; case 2: sprintf(tmp+strlen(tmp), "AC: Backup}\n"); break; default: sprintf(tmp+strlen(tmp), "AC: Unknown}\n"); break; } if(display) sock_send_string(sock, tmp); sprintf(tmp, "widget_set B two 1 3 {"); if(battflag == 0xff) { sprintf(tmp+strlen(tmp), "Battery Stat Unknown"); } else { sprintf(tmp+strlen(tmp), "Batt:"); if(battflag & 1) sprintf(tmp+strlen(tmp), " High"); if(battflag & 2) sprintf(tmp+strlen(tmp), " Low"); if(battflag & 4) sprintf(tmp+strlen(tmp), " Critical"); if(battflag & 8 ||battstat == 3) sprintf(tmp+strlen(tmp), " Charging"); if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)"); } sprintf(tmp+strlen(tmp), "}\n"); if(display) sock_send_string(sock, tmp); if(percent > 0) { sprintf(tmp, "widget_set B gauge 2 4 %i\n", (percent * ((lcd_wid-2)*lcd_cellwid)/100)); if(display) sock_send_string(sock, tmp); } } // end if(lcd_hgt >= 4) else // two-line version of the screen { sprintf(tmp, "widget_set B one 1 2 {"); if(acstat == 1) sprintf(tmp+strlen(tmp), "AC, "); if(battflag == 0xff) { sprintf(tmp+strlen(tmp), "No battery???"); } else { sprintf(tmp+strlen(tmp), "Batt:"); if(battflag & 1) sprintf(tmp+strlen(tmp), " High"); if(battflag & 2) sprintf(tmp+strlen(tmp), " Low"); if(battflag & 4) sprintf(tmp+strlen(tmp), " Critical"); if(battflag & 8 ||battstat == 3) sprintf(tmp+strlen(tmp), " Charging"); if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)"); } sprintf(tmp+strlen(tmp), "}\n"); if(display) sock_send_string(sock, tmp); } return 0; }