Actually make speedo units work

This commit is contained in:
XANTRONIX Development 2024-01-17 17:40:23 -05:00
parent dd9ffecc57
commit 183f817e47
4 changed files with 49 additions and 25 deletions

View file

@ -19,7 +19,9 @@ int hexagram_speedo_init(hexagram_speedo *speedo,
double x, double x,
double y, double y,
double radius, double radius,
double max_value, double max_value);
void hexagram_speedo_set_units(hexagram_speedo *speedo,
hexagram_speedo_units units); hexagram_speedo_units units);
#endif /* _HEXAGRAM_SPEEDO_H */ #endif /* _HEXAGRAM_SPEEDO_H */

View file

@ -12,8 +12,7 @@
#define SECTION_HEIGHT_TOP 64 #define SECTION_HEIGHT_TOP 64
#define SECTION_HEIGHT_BOTTOM 52 #define SECTION_HEIGHT_BOTTOM 52
#define SPEEDO_MAX 200.0 #define SPEEDO_MAX 322.0
#define SPEEDO_UNITS HEXAGRAM_SPEEDO_MPH
#define PATTERN_WIDTH 100 #define PATTERN_WIDTH 100
#define PATTERN_HEIGHT 87 #define PATTERN_HEIGHT 87
@ -102,8 +101,7 @@ int hexagram_cluster_init(hexagram_cluster *cluster,
CLUSTER_HEIGHT / 2, CLUSTER_HEIGHT / 2,
CLUSTER_HEIGHT / 2, CLUSTER_HEIGHT / 2,
CLUSTER_HEIGHT / 2, CLUSTER_HEIGHT / 2,
SPEEDO_MAX, SPEEDO_MAX) < 0) {
SPEEDO_UNITS) < 0) {
goto error_speedo_init; goto error_speedo_init;
} }

View file

@ -8,7 +8,7 @@
#define DIAL_MAIN_BEZEL_WIDTH 16 #define DIAL_MAIN_BEZEL_WIDTH 16
#define DIAL_RADIUS_LEGEND_MAIN 0.675 #define DIAL_RADIUS_LEGEND_MAIN 0.69
#define DIAL_RADIUS_LEGEND_BOTTOM 0.725 #define DIAL_RADIUS_LEGEND_BOTTOM 0.725
#define DIAL_RADIUS_NEEDLE_MAIN_MIN 0.51 #define DIAL_RADIUS_NEEDLE_MAIN_MIN 0.51

View file

@ -4,10 +4,12 @@
#include <hexagram/gauge.h> #include <hexagram/gauge.h>
#include <hexagram/speedo.h> #include <hexagram/speedo.h>
#define SPEEDO_ANGLE_MIN 232.0 * (M_PI / 180.0) #define SPEED_FACTOR_MPH 0.621371
#define SPEEDO_ANGLE_MAX 488.0 * (M_PI / 180.0)
#define SPEEDO_FONT_FACE "Muli" #define ANGLE_MIN 232.0 * (M_PI / 180.0)
#define ANGLE_MAX 488.0 * (M_PI / 180.0)
#define FONT_FACE "Muli"
static int draw_text(hexagram_speedo *speedo, static int draw_text(hexagram_speedo *speedo,
cairo_t *cr, cairo_t *cr,
@ -18,7 +20,7 @@ static int draw_text(hexagram_speedo *speedo,
cairo_text_extents_t extents; cairo_text_extents_t extents;
cairo_select_font_face(cr, cairo_select_font_face(cr,
SPEEDO_FONT_FACE, FONT_FACE,
CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_ITALIC,
CAIRO_FONT_WEIGHT_BOLD); CAIRO_FONT_WEIGHT_BOLD);
@ -39,35 +41,41 @@ static int draw_text(hexagram_speedo *speedo,
static int draw_bg(hexagram_gauge *gauge, cairo_t *cr) { static int draw_bg(hexagram_gauge *gauge, cairo_t *cr) {
hexagram_speedo *speedo = (hexagram_speedo *)gauge; hexagram_speedo *speedo = (hexagram_speedo *)gauge;
int speed; double factor = (speedo->units == HEXAGRAM_SPEEDO_KPH)?
1.0: SPEED_FACTOR_MPH;
double font_size = (speedo->units == HEXAGRAM_SPEEDO_KPH)?
0.085: 0.1;
int speed, max = (int)round(speedo->dial.max_value * factor);
if (hexagram_dial_draw_bg(&speedo->dial, cr) < 0) { if (hexagram_dial_draw_bg(&speedo->dial, cr) < 0) {
goto error_dial_draw_bg; goto error_dial_draw_bg;
} }
cairo_select_font_face(cr, cairo_select_font_face(cr,
SPEEDO_FONT_FACE, FONT_FACE,
CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_ITALIC,
CAIRO_FONT_WEIGHT_BOLD); CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size(cr, speedo->dial.radius * 0.1); cairo_set_font_size(cr, speedo->dial.radius * font_size);
cairo_set_source_rgb(cr, 1, 1, 1); cairo_set_source_rgb(cr, 1, 1, 1);
for (speed=0; speed<=(int)speedo->dial.max_value; speed += 5) { for (speed=0; speed<=max; speed += 5) {
int large = speed % 10 == 0? 1: 0; int large = speed % 10 == 0? 1: 0;
cairo_set_line_width(cr, large? 6.0: 2.0); cairo_set_line_width(cr, large? 6.0: 2.0);
hexagram_dial_draw_mark(&speedo->dial, cr, (double)speed, large); hexagram_dial_draw_mark(&speedo->dial, cr, (double)speed / factor, large);
} }
for (speed=0; speed<=(int)speedo->dial.max_value; speed += 20) { for (speed=0; speed<=max; speed += 20) {
char buf[8]; char buf[8];
if (snprintf(buf, 8, "%d", speed) < 0) { if (snprintf(buf, 8, "%d", speed) < 0) {
goto error_snprintf; goto error_snprintf;
} }
hexagram_dial_draw_legend(&speedo->dial, cr, speed, buf); hexagram_dial_draw_legend(&speedo->dial, cr, (double)speed / factor, buf);
} }
return 0; return 0;
@ -80,18 +88,25 @@ error_dial_draw_bg:
static int draw_fg(hexagram_gauge *gauge, cairo_t *cr) { static int draw_fg(hexagram_gauge *gauge, cairo_t *cr) {
hexagram_speedo *speedo = (hexagram_speedo *)gauge; hexagram_speedo *speedo = (hexagram_speedo *)gauge;
char buf[8]; char buf[8];
double factor = (speedo->units == HEXAGRAM_SPEEDO_KPH)?
1.0: SPEED_FACTOR_MPH;
if (hexagram_dial_draw_fg(&speedo->dial, cr) < 0) { if (hexagram_dial_draw_fg(&speedo->dial, cr) < 0) {
goto error_dial_draw_fg; goto error_dial_draw_fg;
} }
if (snprintf(buf, sizeof(buf), "%d", (int)speedo->dial.value) < 0) { if (snprintf(buf, sizeof(buf), "%d", (int)(speedo->dial.value * factor)) < 0) {
goto error_snprintf; goto error_snprintf;
} }
draw_text(speedo, cr, gauge->x, gauge->y - speedo->dial.radius * 0.01, buf, 0.32); draw_text(speedo, cr, gauge->x, gauge->y - speedo->dial.radius * 0.01, buf, 0.32);
draw_text(speedo, cr, gauge->x, gauge->y + speedo->dial.radius * 0.2, "mph", 0.1); draw_text(speedo,
cr,
gauge->x,
gauge->y + speedo->dial.radius * 0.2,
speedo->units == HEXAGRAM_SPEEDO_KPH? "kph": "mph",
0.1);
return 0; return 0;
@ -104,15 +119,14 @@ int hexagram_speedo_init(hexagram_speedo *speedo,
double x, double x,
double y, double y,
double radius, double radius,
double max_value, double max_value) {
hexagram_speedo_units units) {
if (hexagram_dial_init(&speedo->dial, if (hexagram_dial_init(&speedo->dial,
HEXAGRAM_DIAL_MAIN, HEXAGRAM_DIAL_MAIN,
x, x,
y, y,
radius, radius,
SPEEDO_ANGLE_MIN, ANGLE_MIN,
SPEEDO_ANGLE_MAX, ANGLE_MAX,
0, 0,
max_value) < 0) { max_value) < 0) {
goto error_dial_init; goto error_dial_init;
@ -120,10 +134,20 @@ int hexagram_speedo_init(hexagram_speedo *speedo,
speedo->dial.gauge.draw_bg = draw_bg; speedo->dial.gauge.draw_bg = draw_bg;
speedo->dial.gauge.draw_fg = draw_fg; speedo->dial.gauge.draw_fg = draw_fg;
speedo->units = units; speedo->units = HEXAGRAM_SPEEDO_KPH;
return 0; return 0;
error_dial_init: error_dial_init:
return -1; return -1;
} }
void hexagram_speedo_set_units(hexagram_speedo *speedo,
hexagram_speedo_units units) {
switch (units) {
case HEXAGRAM_SPEEDO_KPH:
case HEXAGRAM_SPEEDO_MPH:
speedo->units = units;
break;
}
}