source: npl/mediabox/lcdproc_edwin/src/clients/lcdproc/batt.c @ c5c522c

gcc484ntopperl-5.22
Last change on this file since c5c522c was c5c522c, checked in by Edwin Eefting <edwin@datux.nl>, 8 years ago

initial commit, transferred from cleaned syn3 svn tree

  • Property mode set to 100644
File size: 4.4 KB
Line 
1#include <stdlib.h>
2#include <stdio.h>
3#include <string.h>
4#include <unistd.h>
5#include <fcntl.h>
6#include <sys/utsname.h>
7
8#include "../../shared/sockets.h"
9
10#include "main.h"
11#include "mode.h"
12#include "batt.h"
13
14int batt_fd = 0;
15
16
17static int get_batt_stat(int *acstat, int *battstat,
18                         int *battflag, int *percent);
19
20static int get_batt_stat(int *acstat, int *battstat,
21                         int *battflag, int *percent)
22{
23  char str[64];
24 
25  if(!batt_fd)
26    batt_fd = open("/proc/apm", O_RDONLY);
27  if(batt_fd <= 0) return -1;
28
29  if(lseek(batt_fd, 0, 0) != 0) return -1;
30
31  if(read(batt_fd, str, sizeof(str)-1) < 0) return -1;
32 
33  if(3 > sscanf(str+13, "0x%x 0x%x 0x%x %d",
34                acstat, battstat, battflag, percent))
35    return -1;
36
37  return 0;
38 
39}
40
41
42
43int batt_init()
44{
45   static int first = 1;
46
47   if(first)
48   {
49      first = 0;
50      sock_send_string(sock, "screen_add B\n");
51   }
52
53   return 0;
54}
55
56int batt_close()
57{
58   if(batt_fd) close(batt_fd);
59   batt_fd = 0;
60
61   return 0;
62}
63
64
65////////////////////////////////////////////////////////////////////////
66// Battery Screen shows apm battery status...
67//
68
69//####################
70//## Battery: 100% ###
71//AC: Unknown
72//Batt: Low (Charging)
73//E------------------F
74
75int battery_screen(int rep, int display)
76{
77   static int first=1;
78
79   int acstat=0, battstat=0, battflag=0, percent=0;
80 
81
82   if(first)
83   {
84      first = 0;
85
86      sprintf(buffer, "screen_set B name {APM stats: %s}\n", host);
87      sock_send_string(sock, buffer);
88      sock_send_string(sock, "widget_add B title title\n");
89      sprintf(tmp, "widget_set B title {LCDPROC %s}\n", version);
90      sock_send_string(sock, tmp);
91      sock_send_string(sock, "widget_add B one string\n");
92      if(lcd_hgt >= 4)
93      {
94         sock_send_string(sock, "widget_add B two string\n");
95         sock_send_string(sock, "widget_add B three string\n");
96         sock_send_string(sock, "widget_add B gauge hbar\n");
97         sock_send_string(sock,
98                          "widget_set B one 1 2 {AC: Unknown}\n");
99         sock_send_string(sock,
100                          "widget_set B two 1 3 {Batt: Unknown}\n");
101         sock_send_string(sock,
102                          "widget_set B three 1 4 {E                  F}\n");
103         sock_send_string(sock, "widget_set B gauge 2 4 0\n");
104      }
105   }
106   
107   // Only run once every 16 frames...
108   //if(rep&0x0f) return 0;
109 
110   get_batt_stat(&acstat, &battstat, &battflag, &percent);
111
112
113   if(percent >= 0) sprintf(buffer, "%i%%", percent);
114   else sprintf(buffer, "??%%");
115   sprintf(tmp, "widget_set B title {Batt: %s: %s}\n", buffer, host);
116 
117   if(display) sock_send_string(sock, tmp);
118 
119
120   if(lcd_hgt >= 4) // 4-line version of the screen
121   {
122      sprintf(tmp, "widget_set B one 1 2 {");
123      switch(acstat)
124      {
125         case 0: sprintf(tmp+strlen(tmp), "AC: Off}\n");
126            break;
127         case 1: sprintf(tmp+strlen(tmp), "AC: On}\n");
128            break;
129         case 2: sprintf(tmp+strlen(tmp), "AC: Backup}\n");
130            break;
131         default: sprintf(tmp+strlen(tmp), "AC: Unknown}\n");
132            break;
133      }
134     
135      if(display) sock_send_string(sock, tmp);
136
137
138   
139      sprintf(tmp, "widget_set B two 1 3 {");
140      if(battflag == 0xff)
141      {
142         sprintf(tmp+strlen(tmp), "Battery Stat Unknown");
143      }
144      else
145      {
146         sprintf(tmp+strlen(tmp), "Batt:");
147         if(battflag & 1)  sprintf(tmp+strlen(tmp), " High");
148         if(battflag & 2)  sprintf(tmp+strlen(tmp), " Low");
149         if(battflag & 4)  sprintf(tmp+strlen(tmp), " Critical");
150         if(battflag & 8
151            ||battstat == 3)  sprintf(tmp+strlen(tmp), " Charging");
152         if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)");
153      }
154      sprintf(tmp+strlen(tmp), "}\n");
155      if(display) sock_send_string(sock, tmp);
156   
157
158      if(percent > 0)
159      {
160         sprintf(tmp, "widget_set B gauge 2 4 %i\n",
161                 (percent * ((lcd_wid-2)*lcd_cellwid)/100));
162         if(display) sock_send_string(sock, tmp);
163      }
164   } // end if(lcd_hgt >= 4)
165   else // two-line version of the screen
166   {
167      sprintf(tmp, "widget_set B one 1 2 {");
168      if(acstat == 1)
169         sprintf(tmp+strlen(tmp), "AC, ");
170     
171      if(battflag == 0xff)
172      {
173         sprintf(tmp+strlen(tmp), "No battery???");
174      }
175      else
176      {
177         sprintf(tmp+strlen(tmp), "Batt:");
178         if(battflag & 1)  sprintf(tmp+strlen(tmp), " High");
179         if(battflag & 2)  sprintf(tmp+strlen(tmp), " Low");
180         if(battflag & 4)  sprintf(tmp+strlen(tmp), " Critical");
181         if(battflag & 8
182            ||battstat == 3)  sprintf(tmp+strlen(tmp), " Charging");
183         if(battflag & 128) sprintf(tmp+strlen(tmp), " (NONE)");
184      }
185      sprintf(tmp+strlen(tmp), "}\n");
186      if(display) sock_send_string(sock, tmp);
187   
188   }
189   
190  return 0;
191}
192
193
Note: See TracBrowser for help on using the repository browser.