13 #include "shared/sockets.h"
22 ///////////////////////////////////////////////////////////////////////////
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...
35 disk_screen(int rep
, int display
, int *flags_ptr
)
37 static mounts_type mnt
[256];
40 // Holds info to display (avoid recalculating it)
47 static int num_disks
= 0;
48 static int dev_wid
= 6;
49 static int gauge_wid
= 6;
51 #define huge long long int
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...
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)));
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);
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");
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')
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
);