[c5c522c] | 1 | #include <stdlib.h> |
---|
| 2 | #include <stdio.h> |
---|
| 3 | #include <string.h> |
---|
| 4 | #include <unistd.h> |
---|
| 5 | #include <fcntl.h> |
---|
| 6 | |
---|
| 7 | #include "../../shared/sockets.h" |
---|
| 8 | |
---|
| 9 | #include "main.h" |
---|
| 10 | #include "mode.h" |
---|
| 11 | #include "load.h" |
---|
| 12 | |
---|
| 13 | int loadavg_fd = 0; |
---|
| 14 | |
---|
| 15 | static double get_loadavg(void); |
---|
| 16 | |
---|
| 17 | static double get_loadavg(void) |
---|
| 18 | { |
---|
| 19 | double load; |
---|
| 20 | |
---|
| 21 | reread(loadavg_fd, "get_load:"); |
---|
| 22 | sscanf(buffer, "%lf", &load); |
---|
| 23 | return load; |
---|
| 24 | } |
---|
| 25 | |
---|
| 26 | |
---|
| 27 | int load_init() |
---|
| 28 | { |
---|
| 29 | if(!loadavg_fd) |
---|
| 30 | loadavg_fd = open("/proc/loadavg",O_RDONLY); |
---|
| 31 | |
---|
| 32 | return 0; |
---|
| 33 | } |
---|
| 34 | |
---|
| 35 | int load_close() |
---|
| 36 | { |
---|
| 37 | if(loadavg_fd) |
---|
| 38 | close(loadavg_fd); |
---|
| 39 | |
---|
| 40 | loadavg_fd = 0; |
---|
| 41 | |
---|
| 42 | return 0; |
---|
| 43 | } |
---|
| 44 | |
---|
| 45 | |
---|
| 46 | /////////////////////////////////////////////////////////////////////////// |
---|
| 47 | // Shows a display very similar to "xload"'s histogram. |
---|
| 48 | // |
---|
| 49 | |
---|
| 50 | int xload_screen(int rep, int display) |
---|
| 51 | { |
---|
| 52 | static int first = 1; |
---|
| 53 | static float loads[LCD_MAX_WIDTH]; |
---|
| 54 | int n, i; |
---|
| 55 | float loadmax=0, factor, x; |
---|
| 56 | int status = 0; |
---|
| 57 | |
---|
| 58 | |
---|
| 59 | if(first) // Only the first time this is ever called... |
---|
| 60 | { |
---|
| 61 | first = 0; |
---|
| 62 | memset(loads, 0, sizeof(float)*LCD_MAX_WIDTH); |
---|
| 63 | |
---|
| 64 | sock_send_string(sock, "screen_add X\n"); |
---|
| 65 | sprintf(buffer, "screen_set X name {X-Load: %s}\n", host); |
---|
| 66 | sock_send_string(sock, buffer); |
---|
| 67 | // Add the vbars... |
---|
| 68 | for(i=1; i<lcd_wid; i++) |
---|
| 69 | { |
---|
| 70 | sprintf(tmp, "widget_add X %i vbar\n", i); |
---|
| 71 | sock_send_string(sock, tmp); |
---|
| 72 | sprintf(tmp, "widget_set X %i %i %i 0\n", i, i, lcd_hgt); |
---|
| 73 | sock_send_string(sock, tmp); |
---|
| 74 | } |
---|
| 75 | // And add a title... |
---|
| 76 | if(lcd_hgt >= 4) |
---|
| 77 | { |
---|
| 78 | sock_send_string(sock, "widget_add X title title\n"); |
---|
| 79 | sock_send_string(sock, "widget_set X title {LOAD }\n"); |
---|
| 80 | } |
---|
| 81 | else |
---|
| 82 | { |
---|
| 83 | sock_send_string(sock, "widget_add X title string\n"); |
---|
| 84 | sock_send_string(sock, "widget_set X title 1 1 {LOAD}\n"); |
---|
| 85 | sock_send_string(sock, "widget_del X heartbeat\n"); |
---|
| 86 | } |
---|
| 87 | sock_send_string(sock, "widget_add X zero string\n"); |
---|
| 88 | sock_send_string(sock, "widget_add X top string\n"); |
---|
| 89 | sprintf(tmp, "widget_set X zero %i %i 0\n", lcd_wid, lcd_hgt); |
---|
| 90 | sock_send_string(sock, tmp); |
---|
| 91 | sprintf(tmp, "widget_set X top %i %i 1\n", |
---|
| 92 | lcd_wid, (lcd_hgt==2)?1:2); |
---|
| 93 | sock_send_string(sock, tmp); |
---|
| 94 | } |
---|
| 95 | |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | for(n=0; n<(lcd_wid-2); n++) loads[n] = loads[n+1]; |
---|
| 99 | loads[lcd_wid-2] = get_loadavg(); |
---|
| 100 | |
---|
| 101 | for(n=0; n<lcd_wid-1; n++) |
---|
| 102 | if(loads[n] > loadmax) loadmax = loads[n]; |
---|
| 103 | |
---|
| 104 | n = (int)loadmax; |
---|
| 105 | if ((float)n < loadmax) { n++; } |
---|
| 106 | sprintf(tmp, "widget_set X top %i %i %i\n", |
---|
| 107 | lcd_wid, (lcd_hgt==2)?1:2, n); |
---|
| 108 | //if(display) sock_send_string(sock, tmp); |
---|
| 109 | sock_send_string(sock, tmp); |
---|
| 110 | |
---|
| 111 | |
---|
| 112 | if (loadmax < 1.0) factor = (float)(lcd_cellhgt) * ((lcd_hgt==2)?2.0:3.0); |
---|
| 113 | else factor = (float)(lcd_cellhgt) * ((lcd_hgt==2)?2.0:3.0) / (float)n; |
---|
| 114 | |
---|
| 115 | for(n=0; n<lcd_wid-1; n++) |
---|
| 116 | { |
---|
| 117 | x = (loads[n] * factor); |
---|
| 118 | //###test!!!!!! |
---|
| 119 | //x=n; |
---|
| 120 | |
---|
| 121 | sprintf(tmp, "widget_set X %i %i %i %i\n", n+1, n+1, lcd_hgt, (int)x); |
---|
| 122 | //if(display) sock_send_string(sock, tmp); |
---|
| 123 | sock_send_string(sock, tmp); |
---|
| 124 | } |
---|
| 125 | |
---|
| 126 | if(loadmax < LOAD_MIN) |
---|
| 127 | { |
---|
| 128 | status = BACKLIGHT_OFF; |
---|
| 129 | } |
---|
| 130 | if(loadmax > LOAD_MIN) |
---|
| 131 | { |
---|
| 132 | status = BACKLIGHT_ON; |
---|
| 133 | } |
---|
| 134 | if(loads[lcd_wid-2] > LOAD_MAX) |
---|
| 135 | { |
---|
| 136 | status = BLINK_ON; |
---|
| 137 | } |
---|
| 138 | |
---|
| 139 | // And now the title... |
---|
| 140 | if(lcd_hgt >= 4) |
---|
| 141 | sprintf(tmp, "widget_set X title {LOAD %2.2f: %s}\n", |
---|
| 142 | loads[lcd_wid-2], host); |
---|
| 143 | else |
---|
| 144 | sprintf(tmp, "widget_set X title 1 1 {%s %2.2f}\n", |
---|
| 145 | host, loads[lcd_wid-2]); |
---|
| 146 | //if(display) sock_send_string(sock, tmp); |
---|
| 147 | sock_send_string(sock, tmp); |
---|
| 148 | |
---|
| 149 | |
---|
| 150 | return status; |
---|
| 151 | } // End xload_screen() |
---|
| 152 | |
---|
| 153 | |
---|
| 154 | |
---|