From faf14d71cfbac1f21500f4b997441fa03731bf0e Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 28 Feb 2025 20:55:13 -0500 Subject: add volume flow rate to ui --- main.c | 25 ++++++++++++++++++++++++- ui.c | 33 +++++++++++++++++++++++++++++++++ ui.h | 5 +++++ widget.c | 10 ++++++++++ widget.h | 9 +++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 4c1257a..63926f8 100644 --- a/main.c +++ b/main.c @@ -24,7 +24,7 @@ enum window { }; enum layout { - LABEL_WIDTH = 48, + LABEL_WIDTH = 128, UNIT_WIDTH = 48, FIELD_WIDTH = 64, }; @@ -61,6 +61,7 @@ static void rpm_row(mu_Context *ctx, UI *ui); static void map_row(mu_Context *ctx, UI *ui); static void ve_row(mu_Context *ctx, UI *ui); static void dup_del_row(mu_Context *ctx, UI *ui); +static void volume_flow_rate_row(mu_Context *ctx, UI *ui); static void hpad(mu_Context *ctx, int w); static void vpad(mu_Context *ctx, int h); @@ -136,6 +137,10 @@ main_window(mu_Context *ctx, UI *ui) { ve_row(ctx, ui); dup_del_row(ctx, ui); + vpad(ctx, 0); + + volume_flow_rate_row(ctx, ui); + mu_end_window(ctx); } @@ -150,6 +155,7 @@ displacement_row(mu_Context *ctx, UI *ui) { mu_label(ctx, "Displacement:"); if (w_field(ctx, &ui->displacement) & MU_RES_CHANGE) { set_displacement(ui); + set_all_volume_flow_rate(ui); } w_select(ctx, &ui->displacement_unit); } @@ -166,6 +172,7 @@ rpm_row(mu_Context *ctx, UI *ui) { for (i = 0; i < ui->npoints; i++) { if (w_field(ctx, &ui->rpm[i])) { ui->points[i].rpm = rpm(ui->rpm[i].value); + set_volume_flow_rate(ui, i); } } } @@ -183,6 +190,7 @@ map_row(mu_Context *ctx, UI *ui) { for (i = 0; i npoints; i++) { if (w_field(ctx, &ui->map[i])) { set_map(ui, i); + set_volume_flow_rate(ui, i); } } } @@ -224,6 +232,21 @@ dup_del_row(mu_Context *ctx, UI *ui) { } } +static void +volume_flow_rate_row(mu_Context *ctx, UI *ui) { + int i; + + mu_layout_row(ctx, 0, NULL, 0); + mu_layout_width(ctx, LABEL_WIDTH); + mu_label(ctx, "volume flow rate"); + mu_layout_width(ctx, UNIT_WIDTH); + w_select(ctx, &ui->volume_flow_rate_unit); + mu_layout_width(ctx, FIELD_WIDTH); + for (i = 0; i < ui->npoints; i++) { + w_label(ctx, ui->volume_flow_rate[i]); + } +} + static void hpad(mu_Context *ctx, int w) { mu_layout_width(ctx, w); diff --git a/ui.c b/ui.c index 676c442..c88ccb5 100644 --- a/ui.c +++ b/ui.c @@ -1,4 +1,5 @@ #include +#include #include #include "microui.h" @@ -21,6 +22,11 @@ static Pressure (*pressure_converters[nelem(pressure_units)])(double) = { millibar, kilopascal, bar, psi, }; +static const char *const volume_flow_rate_units[] = {"m³/s", "CFM"}; +static double (*volume_flow_rate_converters[nelem(volume_flow_rate_units)])(VolumeFlowRate) = { + as_cubic_metre_per_sec, as_cubic_foot_per_min, +}; + void init_ui(UI *ui) { @@ -37,6 +43,9 @@ init_ui(UI *ui) { w_init_field(&ui->ve[0]); init_engine(&ui->points[0]); + + w_init_select(&ui->volume_flow_rate_unit, nelem(volume_flow_rate_units), volume_flow_rate_units); + w_init_label(ui->volume_flow_rate[0]); } void @@ -68,6 +77,28 @@ set_map(UI *ui, int idx) { ui->points[idx].map = p; } +void +set_volume_flow_rate(UI *ui, int idx) { + int unit_idx; + double (*convert)(VolumeFlowRate), v; + + unit_idx = ui->volume_flow_rate_unit.idx; + assert(unit_idx >= 0 && (long unsigned int) unit_idx < nelem(volume_flow_rate_units)); + + convert = volume_flow_rate_converters[unit_idx]; + v = convert(volume_flow_rate(&ui->points[idx])); + snprintf(ui->volume_flow_rate[idx], sizeof(ui->volume_flow_rate[idx]), "%lf", v); +} + +void +set_all_volume_flow_rate(UI *ui) { + int i; + + for (i = 0; i < ui->npoints; i++) { + set_volume_flow_rate(ui, i); + } +} + void insert_point(UI *ui, int idx) { int i; @@ -81,6 +112,7 @@ insert_point(UI *ui, int idx) { memmove(&ui->map[i], &ui->map[i-1], sizeof(ui->map[i-1])); memmove(&ui->ve[i], &ui->ve[i-1], sizeof(ui->ve[i-1])); memmove(&ui->points[i], &ui->points[i-1], sizeof(ui->points[i-1])); + memmove(&ui->volume_flow_rate[i], &ui->volume_flow_rate[i-1], sizeof(ui->volume_flow_rate[i-1])); } ui->npoints++; } @@ -96,6 +128,7 @@ remove_point(UI *ui, int idx) { memmove(&ui->map[idx], &ui->map[idx+1], sizeof(ui->map[idx])); memmove(&ui->ve[idx], &ui->ve[idx+1], sizeof(ui->ve[idx])); memmove(&ui->points[idx], &ui->points[idx+1], sizeof(ui->points[idx])); + memmove(&ui->volume_flow_rate[idx], &ui->volume_flow_rate[idx+1], sizeof(ui->volume_flow_rate[idx])); } ui->npoints--; } diff --git a/ui.h b/ui.h index 56f1bd3..2a57001 100644 --- a/ui.h +++ b/ui.h @@ -14,10 +14,15 @@ typedef struct { w_Field ve[MAX_POINTS]; Engine points[MAX_POINTS]; + + w_Select volume_flow_rate_unit; + w_Label volume_flow_rate[MAX_POINTS]; } UI; void init_ui(UI *ui); void set_displacement(UI *ui); void set_map(UI *ui, int idx); +void set_volume_flow_rate(UI *ui, int idx); +void set_all_volume_flow_rate(UI *ui); void insert_point(UI *ui, int idx); void remove_point(UI *ui, int idx); diff --git a/widget.c b/widget.c index a08ded9..cc9d894 100644 --- a/widget.c +++ b/widget.c @@ -76,3 +76,13 @@ w_select(mu_Context *ctx, w_Select *select) { return res; } + +void +w_init_label(w_Label label) { + label[0] = '\0'; +} + +void +w_label(mu_Context *ctx, const w_Label label) { + mu_label(ctx, label); +} diff --git a/widget.h b/widget.h index afd7bb1..546ed1c 100644 --- a/widget.h +++ b/widget.h @@ -1,3 +1,6 @@ +enum { LABEL_SIZE = 128 }; + + /* Field is a floating point number input field. */ typedef struct { char buf[64]; @@ -17,3 +20,9 @@ typedef struct { void w_init_select(w_Select *select, int nopts, const char *const opts[]); int w_select(mu_Context *ctx, w_Select *select); + + +typedef char w_Label[LABEL_SIZE]; + +void w_init_label(w_Label label); +void w_label(mu_Context *ctx, const w_Label label); -- cgit v1.2.3