Added support for DE200C VFD
[lcdproc-de200c.git] / clients / lcdproc / disk.c
blob1573591cb97345945b3d8b96eec580a4fef6e5f1
1 #include <sys/types.h>
2 #include <sys/param.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <fcntl.h>
9 #ifdef HAVE_CONFIG_H
10 #include "config.h"
11 #endif
13 #include "shared/sockets.h"
15 #include "main.h"
16 #include "mode.h"
17 #include "machine.h"
18 #include "disk.h"
19 #include "util.h"
22 ///////////////////////////////////////////////////////////////////////////
23 // Gives disk stats.
25 // Stays onscreen until it is done; rolls over all mounted file systems
26 // +--------------------+ +--------------------+
27 // |## DISKS: myhost ##@| |## DISKS: myhost ##@|
28 // |/ 18.3G E-- F| |-local 18.3G E--- F|
29 // |-local 18.3G E--- F| +--------------------+
30 // |/boot 949.6M E- F|
31 // +--------------------+
33 // TODO: Disk screen! Requires virtual pages in the server, though...
34 int
35 disk_screen(int rep, int display, int *flags_ptr)
37 static mounts_type mnt[256];
38 static int count = 0;
40 // Holds info to display (avoid recalculating it)
41 struct disp {
42 char dev[16];
43 char cap[8];
44 int full;
45 } table[256];
46 int i;
47 static int num_disks = 0;
48 static int dev_wid = 6;
49 static int gauge_wid = 6;
51 #define huge long long int
52 huge size;
54 if ((*flags_ptr & INITIALIZED) == 0) {
55 *flags_ptr |= INITIALIZED;
57 dev_wid = (lcd_wid >= 20) ? (lcd_wid - 8) / 2 : (lcd_wid / 2) - 1;
58 gauge_wid = (lcd_wid >= 20) ? (lcd_wid - dev_wid - 10) : (lcd_wid - dev_wid - 3);
60 sock_send_string(sock, "screen_add D\n");
61 sock_printf(sock, "screen_set D -name {Disk Use: %s}\n", get_hostname());
62 sock_send_string(sock, "widget_add D title title\n");
63 sock_printf(sock, "widget_set D title {DISKS: %s}\n", get_hostname());
64 sock_send_string(sock, "widget_add D f frame\n");
65 sock_printf(sock, "widget_set D f 1 2 %i %i %i %i v 12\n", lcd_wid, lcd_hgt, lcd_wid, lcd_hgt - 1);
66 sock_send_string(sock, "widget_add D err1 string\n");
67 sock_send_string(sock, "widget_add D err2 string\n");
68 sock_send_string(sock, "widget_set D err1 5 2 { Reading }\n");
69 sock_send_string(sock, "widget_set D err2 5 3 {Filesystems}\n");
71 // Grab disk stats on first display, and fill "table".
72 // Get rid of old, unmounted filesystems...
74 machine_get_fs(mnt, &count);
76 // Fill the display structure...
77 if (count) {
78 sock_send_string(sock, "widget_set D err1 30 5 .\n");
79 sock_send_string(sock, "widget_set D err2 30 5 .\n");
80 for (i = 0; i < count; i++) {
81 if (strlen(mnt[i].mpoint) > dev_wid)
82 sprintf(table[i].dev, "-%s", (mnt[i].mpoint) + (strlen(mnt[i].mpoint) - (dev_wid - 1)));
83 else
84 sprintf(table[i].dev, "%s", mnt[i].mpoint);
86 table[i].full = (huge) (lcd_cellwid * gauge_wid)
87 * (huge) (mnt[i].blocks - mnt[i].bfree)
88 / (huge) mnt[i].blocks;
90 size = (huge) mnt[i].bsize * (huge) mnt[i].blocks;
91 memset(table[i].cap, '\0', 8);
93 sprintf_memory(table[i].cap, (double) size, 1);
96 else {
97 sock_send_string(sock, "widget_set D err1 1 2 {Error Retrieving}\n");
98 sock_send_string(sock, "widget_set D err2 1 3 {Filesystem Stats}\n");
99 return 0;
102 // Display stuff... (show for two seconds, then scroll once per
103 // second, then hold at the end for two seconds)
104 sock_printf(sock, "widget_set D f 1 2 %i %i %i %i v 12\n", lcd_wid, lcd_hgt, lcd_wid, count);
105 for (i = 0; i < count; i++) {
106 char tmp[lcd_wid+1]; // should be large enough
108 if (table[i].dev[0] == '\0')
109 continue;
111 if (i >= num_disks) { // Make sure we have enough lines...
112 sock_printf(sock, "widget_add D s%i string -in f\n", i);
113 sock_printf(sock, "widget_add D h%i hbar -in f\n", i);
115 if (lcd_wid >= 20) { // 20+x columns
116 sprintf(tmp, "%-*s %6s E%*sF", dev_wid, table[i].dev, table[i].cap, gauge_wid, "");
117 sock_printf(sock, "widget_set D s%i 1 %i {%s}\n", i, i + 1, tmp);
118 sock_printf(sock, "widget_set D h%i %i %i %i\n", i, 10 + dev_wid, i + 1, table[i].full);
120 else { // < 20 columns
121 sprintf(tmp, "%-*s E%*sF", dev_wid, table[i].dev, gauge_wid, "");
122 sock_printf(sock, "widget_set D s%i 1 %i {%s}\n", i, i + 1, tmp);
123 sock_printf(sock, "widget_set D h%i %i %i %i\n", i, 3 + dev_wid, i + 1, table[i].full);
127 // Now remove extra widgets...
128 for ( ; i < num_disks; i++) {
129 sock_printf(sock, "widget_del D s%i\n", i);
130 sock_printf(sock, "widget_del D h%i\n", i);
133 num_disks = count;
135 #undef huge
137 return 0;