hexagram/src/thermo.c

88 lines
2.2 KiB
C
Raw Normal View History

#include <math.h>
#include <hexagram/gauge.h>
#include <hexagram/thermo.h>
2024-01-11 17:39:52 -05:00
#define RAD (M_PI / 180.0)
2024-01-11 17:39:52 -05:00
#define ANGLE_MIN (144.0 * RAD)
#define ANGLE_MAX (216.0 * RAD)
2024-01-11 17:39:52 -05:00
#define LEVEL_MIN 48
#define LEVEL_WARN 116
#define LEVEL_MAX 127
2024-01-11 17:39:52 -05:00
#define FONT_FACE "Muli"
2019-06-09 15:46:41 -05:00
2024-01-11 17:39:52 -05:00
static int draw_bg(hexagram_gauge *gauge, cairo_t *cr) {
hexagram_thermo *thermo = (hexagram_thermo *)gauge;
double incr;
int i;
2019-06-09 15:46:41 -05:00
2024-01-11 17:39:52 -05:00
if (hexagram_dial_draw_bg(&thermo->dial, cr) < 0) {
goto error_dial_draw_bg;
}
2024-01-11 17:39:52 -05:00
cairo_select_font_face(cr,
FONT_FACE,
CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_BOLD);
2019-06-09 15:46:41 -05:00
2024-01-11 17:39:52 -05:00
cairo_set_font_size(cr, thermo->dial.radius * 0.1);
2024-01-11 17:39:52 -05:00
cairo_set_source_rgb(cr, 1, 1, 1);
2024-01-16 13:52:01 -05:00
hexagram_dial_draw_legend(&thermo->dial, cr, 0.725, thermo->dial.min_value, "C");
2019-06-09 15:46:41 -05:00
2024-01-11 17:39:52 -05:00
cairo_set_source_rgb(cr, 1, 0, 0);
2024-01-16 13:52:01 -05:00
hexagram_dial_draw_legend(&thermo->dial, cr, 0.725, thermo->dial.max_value, "H");
2024-01-11 17:39:52 -05:00
cairo_set_line_width(cr, 6.0);
2019-06-09 15:46:41 -05:00
2024-01-11 17:39:52 -05:00
incr = (thermo->dial.max_value - thermo->dial.min_value) / 8.0;
2024-01-11 17:39:52 -05:00
for (i=0; i<9; i++) {
double level = thermo->dial.min_value + i * incr;
2019-06-28 18:10:01 -05:00
2024-01-11 17:39:52 -05:00
if (level >= LEVEL_WARN) {
cairo_set_source_rgb(cr, 0.8, 0, 0);
} else {
cairo_set_source_rgb(cr, 1, 1, 1);
}
2024-01-11 17:39:52 -05:00
hexagram_dial_draw_mark(&thermo->dial, cr, 0.83, 0.87, level);
level += incr;
}
2024-01-11 17:39:52 -05:00
return 0;
error_dial_draw_bg:
return -1;
}
2019-06-13 23:59:47 -05:00
2024-01-11 17:39:52 -05:00
int hexagram_thermo_init(hexagram_thermo *thermo,
double x,
double y,
double radius) {
if (hexagram_dial_init(&thermo->dial,
HEXAGRAM_DIAL_BOTTOM,
x,
y,
radius,
ANGLE_MIN,
ANGLE_MAX,
LEVEL_MIN,
LEVEL_MAX) < 0) {
goto error_dial_init;
}
2024-01-11 17:39:52 -05:00
thermo->dial.gauge.draw_bg = draw_bg;
thermo->dial.value = LEVEL_MIN;
thermo->level_warn = LEVEL_WARN;
return 0;
error_dial_init:
return -1;
}