9 const char voltage_filename
[] = "/sys/class/power_supply/BAT0/voltage_now";
10 const char current_filename
[] = "/sys/class/power_supply/BAT0/current_now";
17 static float fatof(const char *filename
) {
18 FILE *f
= fopen(filename
, "r");
23 const int bufsize
= 1024;
25 const int read
= fread(buf
, sizeof(char), bufsize
, f
);
26 if (read
== 0 || read
== bufsize
|| ferror(f
)) {
34 float val
= strtof(buf
, &end
);
35 int parsed
= end
- buf
;
36 gboolean parsed_all
= parsed
== read
;
37 gboolean parsed_all_but_space
= parsed
== read
- 1 && isspace(*end
);
38 gboolean parse_ok
= parsed_all
|| parsed_all_but_space
;
39 if (errno
!= 0 || parsed
== 0 || !parse_ok
) {
45 static gboolean
collect_data(struct State
*state
__attribute__((unused
))) {
46 fprintf(stderr
, "Voltage: %f, current: %f\n", fatof(voltage_filename
),
47 fatof(current_filename
));
51 static void activate(GtkApplication
*app
, gpointer user_data
) {
53 GtkWidget
*window
= gtk_application_window_new(app
);
54 gtk_window_set_title(GTK_WINDOW(window
), "BatteryViewer");
55 gtk_window_set_default_size(GTK_WINDOW(window
), 200, 200);
57 GtkWidget
*box
= gtk_box_new(GTK_ORIENTATION_VERTICAL
, 1);
58 gtk_container_add(GTK_CONTAINER(window
), box
);
60 struct State
*state
= (struct State
*)user_data
;
61 state
->voltage
= BV_CHART(bv_chart_new());
62 bv_chart_add_point(state
->voltage
, 0.0, 0.0);
63 bv_chart_add_point(state
->voltage
, 1.0, 1.0);
64 bv_chart_add_point(state
->voltage
, 3.0, 2.0);
65 gboolean expand
= TRUE
;
68 gtk_box_pack_start(GTK_BOX(box
), GTK_WIDGET(state
->voltage
), expand
, fill
,
71 state
->current
= BV_CHART(bv_chart_new());
72 bv_chart_add_point(state
->current
, 0.0, 1.0);
73 bv_chart_add_point(state
->current
, 1.0, 0.0);
74 gtk_box_pack_end(GTK_BOX(box
), GTK_WIDGET(state
->current
), expand
, fill
,
77 gtk_widget_show_all(window
);
79 g_timeout_add_seconds(1, (GSourceFunc
)collect_data
, user_data
);
82 int main(int argc
, char **argv
) {
85 GtkApplication
*app
= gtk_application_new("com.scottworley.batteryviewer",
86 G_APPLICATION_DEFAULT_FLAGS
);
87 g_signal_connect(app
, "activate", G_CALLBACK(activate
), &state
);
88 int status
= g_application_run(G_APPLICATION(app
), argc
, argv
);