5 #include "thermometer.h"
9 static Thermometer_settings thermometer_settings;
10 static SA_Image thermometer_1, thermometer_2;
11 static AquariumData *ad;
12 static int status_list[STATUSES];
14 Thermometer_settings *thermometer_get_settings_ptr(void)
16 return &thermometer_settings;
19 int thermometer_get_real_status(int status)
22 for(i=0;i<STATUSES;i++){
32 void thermometer_gen_list(void)
34 status_list[STATUS_OFF] = TRUE;
36 #ifdef STATUS_HAVE_FAN1
37 status_list[STATUS_FAN1] = TRUE;
39 status_list[STATUS_FAN1] = FALSE;
42 #ifdef STATUS_HAVE_FAN2
43 status_list[STATUS_FAN2] = TRUE;
45 status_list[STATUS_FAN2] = FALSE;
48 #ifdef STATUS_HAVE_TEMP1
49 status_list[STATUS_TEMP1] = TRUE;
51 status_list[STATUS_TEMP1] = FALSE;
53 #ifdef STATUS_HAVE_TEMP2
54 status_list[STATUS_TEMP2] = TRUE;
56 status_list[STATUS_TEMP2] = FALSE;
58 #ifdef STATUS_HAVE_SWAP
59 status_list[STATUS_SWAP] = TRUE;
61 status_list[STATUS_SWAP] = FALSE;
63 #ifdef STATUS_HAVE_DISC
64 status_list[STATUS_DISC] = TRUE;
66 status_list[STATUS_DISC] = FALSE;
69 #ifdef STATUS_HAVE_CPU
70 status_list[STATUS_CPU] = TRUE;
72 status_list[STATUS_CPU] = FALSE;
75 #ifdef STATUS_HAVE_MEM
76 status_list[STATUS_MEM] = TRUE;
78 status_list[STATUS_MEM] = FALSE;
82 #ifdef STATUS_HAVE_NET_ETH0
83 status_list[STATUS_NET_ETH0_RECV] = TRUE;
84 status_list[STATUS_NET_ETH0_SEND] = TRUE;
85 status_list[STATUS_NET_ETH0_BOTH] = TRUE;
87 status_list[STATUS_NET_ETH0_RECV] = FALSE;
88 status_list[STATUS_NET_ETH0_SEND] = FALSE;
89 status_list[STATUS_NET_ETH0_BOTH] = FALSE;
93 #ifdef STATUS_HAVE_NET_ETH1
94 status_list[STATUS_NET_ETH1_RECV] = TRUE;
95 status_list[STATUS_NET_ETH1_SEND] = TRUE;
96 status_list[STATUS_NET_ETH1_BOTH] = TRUE;
98 status_list[STATUS_NET_ETH1_RECV] = FALSE;
99 status_list[STATUS_NET_ETH1_SEND] = FALSE;
100 status_list[STATUS_NET_ETH1_BOTH] = FALSE;
104 #ifdef STATUS_HAVE_NET_PPP0
105 status_list[STATUS_NET_PPP0_RECV] = TRUE;
106 status_list[STATUS_NET_PPP0_SEND] = TRUE;
107 status_list[STATUS_NET_PPP0_BOTH] = TRUE;
109 status_list[STATUS_NET_PPP0_RECV] = FALSE;
110 status_list[STATUS_NET_PPP0_SEND] = FALSE;
111 status_list[STATUS_NET_PPP0_BOTH] = FALSE;
115 #ifdef STATUS_HAVE_NET_LO
116 status_list[STATUS_NET_LO_RECV] = TRUE;
117 status_list[STATUS_NET_LO_SEND] = TRUE;
118 status_list[STATUS_NET_LO_BOTH] = TRUE;
120 status_list[STATUS_NET_LO_RECV] = FALSE;
121 status_list[STATUS_NET_LO_SEND] = FALSE;
122 status_list[STATUS_NET_LO_BOTH] = FALSE;
128 void thermometer_exit(void)
130 if(thermometer_1.pixbuf!=NULL){
131 g_object_unref(thermometer_1.pixbuf);
132 thermometer_1.pixbuf = NULL;
135 if(thermometer_2.pixbuf!=NULL){
136 g_object_unref(thermometer_2.pixbuf);
137 thermometer_2.pixbuf = NULL;
141 void thermometer_change_colour(SA_Image *image, unsigned char r, unsigned char g, unsigned char b)
145 alpha = gdk_pixbuf_get_has_alpha(image->pixbuf);
146 for(y=0;y<image->height;y++){
147 ypos = y*image->rowstride;
149 for(x=0;x<image->width*(3+alpha);x+=(3+alpha)){
150 if(image->image[ypos+x+0] == 0xff){
151 image->image[ypos+x+0] = r;
152 image->image[ypos+x+1] = g;
153 image->image[ypos+x+2] = b;
156 if(image->image[ypos+x+0] == 0xbf){
159 image->image[ypos+x+0] = r-0x20;
161 image->image[ypos+x+0] = 0x00;
164 image->image[ypos+x+1] = g-0x20;
166 image->image[ypos+x+1] = 0x00;
169 image->image[ypos+x+2] = b-0x20;
171 image->image[ypos+x+2] = 0x00;
180 void thermometer_init(void)
182 ad = aquarium_get_settings_ptr();
184 thermometer_gen_list();
186 if(thermometer_1.image!=NULL || thermometer_2.image!=NULL)
190 if(thermometer_settings.messure1 != thermometer_get_real_status(STATUS_OFF)){
191 load_image("thermometer.png", &thermometer_1,1);
192 thermometer_change_colour(&thermometer_1,
193 thermometer_settings.c1.r,thermometer_settings.c1.g,thermometer_settings.c1.b);
196 if(thermometer_settings.messure2 != thermometer_get_real_status(STATUS_OFF)){
197 load_image("thermometer.png", &thermometer_2,1);
198 thermometer_change_colour(&thermometer_2,
199 thermometer_settings.c2.r,thermometer_settings.c2.g,thermometer_settings.c2.b);
205 int thermometer_status_level(int messure, int roof, char *mount_p)
207 //(30 * status_level / 100)
208 int status_type, level, real_roof;
209 status_type = thermometer_get_real_status(messure);
218 level = status_sensors(SENSORS_FAN1);
222 level = status_sensors(SENSORS_FAN2);
226 level = status_sensors(SENSORS_TEMP1);
230 level = status_sensors(SENSORS_TEMP2);
234 level = status_swap();
238 level = status_disc(mount_p);
242 level = status_cpu();
246 level = status_mem();
250 case STATUS_NET_ETH0_RECV:
251 level = status_net(NET_ETH0, NET_RECV);
254 case STATUS_NET_ETH0_SEND:
255 level = status_net(NET_ETH0, NET_SENT);
258 case STATUS_NET_ETH0_BOTH:
259 level = (status_net(NET_ETH0, NET_RECV) + status_net(NET_ETH0, NET_SENT))/2;
262 case STATUS_NET_ETH1_RECV:
263 level = status_net(NET_ETH1, NET_RECV);
266 case STATUS_NET_ETH1_SEND:
267 level = status_net(NET_ETH1, NET_SENT);
270 case STATUS_NET_ETH1_BOTH:
271 level = (status_net(NET_ETH1, NET_RECV) + status_net(NET_ETH1, NET_SENT))/2;
274 case STATUS_NET_PPP0_RECV:
275 level = status_net(NET_PPP0, NET_RECV);
278 case STATUS_NET_PPP0_SEND:
279 level = status_net(NET_PPP0, NET_SENT);
282 case STATUS_NET_PPP0_BOTH:
283 level = (status_net(NET_PPP0, NET_RECV) + status_net(NET_PPP0, NET_SENT))/2;
286 case STATUS_NET_LO_RECV:
287 level = status_net(NET_LO, NET_RECV);
290 case STATUS_NET_LO_SEND:
291 level = status_net(NET_LO, NET_SENT);
294 case STATUS_NET_LO_BOTH:
295 level = (status_net(NET_LO, NET_RECV) + status_net(NET_LO, NET_SENT))/2;
305 if(level > real_roof)
308 if(level <0 || real_roof <=0)
311 return (int)(30.0 - 30.0*(float)level / (float)real_roof);
315 void thermometer_core(SA_Image *thermometer, int mode,int draw, int vert, int horz, int split,
316 unsigned char r, unsigned char g, unsigned char b, unsigned char alpha,
317 unsigned char r_s, unsigned char g_s, unsigned char b_s, unsigned char alpha_s,
318 int messure, int messure_s, int roof, int roof_s, char *mount_point, char *mount_point_s)
321 int x=0, y=0, colour, status_type;
322 static int status_level[2] = {0, 0}, count = 0;
328 status_type = thermometer_get_real_status(messure);
329 if(status_type == STATUS_OFF)
335 y = ad->ymax/2 - thermometer->height/2;
337 y = ad->ymax - thermometer->height;
342 x = ad->xmax/2 - thermometer->width/2;
344 x = ad->xmax - thermometer->width - 1;
346 draw_pic_alpha(thermometer->image, thermometer->width,
347 thermometer->height, x, y, 0, 0x80);
349 colour = (((int)r) <<16) + (((int)g) <<8) + (int)b;
352 /* Status level is between 0 and 30, 0 is max */
354 status_level[0] = thermometer_status_level(messure, roof, mount_point);
356 anti_line(x+3, y + 2 + status_level[0], x+3,
357 y+thermometer->height-3,
360 anti_line(x+2, y+thermometer->height-4, x+2,
361 y + thermometer->height-5, 1, colour, 0);
365 colour = (((int)r_s) <<16) + (((int)g_s) <<8) + (int)b_s;
368 status_level[1] = thermometer_status_level(messure_s, roof_s, mount_point_s);
370 anti_line(x+4, y+thermometer->height-3, x+4,
371 y + 2 + status_level[1], 1, colour, 0);
374 anti_line(x+4, y+thermometer->height-3, x+4,
375 y + 2 + status_level[0], 1, colour, 0);
378 anti_line(x+5, y+thermometer->height-4, x+5,
379 y + thermometer->height-5, 1, colour, 0);
381 /* Update about once a second */
389 void thermometer_update(int mode)
392 thermometer_core(&thermometer_1, mode, thermometer_settings.draw1,
393 thermometer_settings.vert1,thermometer_settings.horz1,
394 thermometer_settings.split1,
395 thermometer_settings.c1.r, thermometer_settings.c1.g,thermometer_settings.c1.b,
396 thermometer_settings.c1.alpha,
397 thermometer_settings.c1_s.r,thermometer_settings.c1_s.g,thermometer_settings.c1_s.b,
398 thermometer_settings.c1_s.alpha,
399 thermometer_settings.messure1, thermometer_settings.messure1_s,
400 thermometer_settings.roof1, thermometer_settings.roof1_s,
401 thermometer_settings.mount_point1,
402 thermometer_settings.mount_point1_s);
405 thermometer_core(&thermometer_2, mode, thermometer_settings.draw2,
406 thermometer_settings.vert2,thermometer_settings.horz2,
407 thermometer_settings.split2,
408 thermometer_settings.c2.r, thermometer_settings.c2.g,thermometer_settings.c2.b,
409 thermometer_settings.c2.alpha,
410 thermometer_settings.c2_s.r,thermometer_settings.c2_s.g,thermometer_settings.c2_s.b,
411 thermometer_settings.c2_s.alpha,
412 thermometer_settings.messure2, thermometer_settings.messure2_s,
413 thermometer_settings.roof2, thermometer_settings.roof2_s,
414 thermometer_settings.mount_point2,
415 thermometer_settings.mount_point2_s);