aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2025-03-01 14:17:48 -0500
committerSam Anthony <sam@samanthony.xyz>2025-03-01 14:17:48 -0500
commit3f05b42ab04ca4990edf0f374f02dfea7b3be10a (patch)
tree1a68a4ada816fea29328ccc544c1dab2d467158b
parent8beee1dcf1baed84e4c783e2e6e81cfa70440481 (diff)
downloadvolute-3f05b42ab04ca4990edf0f374f02dfea7b3be10a.zip
add ambient temperature input
-rw-r--r--main.c21
-rw-r--r--ui.c40
-rw-r--r--ui.h5
3 files changed, 60 insertions, 6 deletions
diff --git a/main.c b/main.c
index e31e7ab..8722224 100644
--- a/main.c
+++ b/main.c
@@ -57,6 +57,7 @@ static void main_loop(mu_Context *ctx, UI *ui);
static void process_frame(mu_Context *ctx, UI *ui);
static void main_window(mu_Context *ctx, UI *ui);
static void displacement_row(mu_Context *ctx, UI *ui);
+static void ambient_temperature_row(mu_Context *ctx, UI *ui);
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);
@@ -146,12 +147,7 @@ main_window(mu_Context *ctx, UI *ui) {
static void
displacement_row(mu_Context *ctx, UI *ui) {
- int widths[] = {
- LABEL_WIDTH+UNIT_WIDTH+ctx->style->spacing,
- FIELD_WIDTH,
- UNIT_WIDTH
- };
- mu_layout_row(ctx, nelem(widths), widths, 0);
+ mu_layout_row(ctx, 3, (int[]) {LABEL_WIDTH, FIELD_WIDTH, UNIT_WIDTH}, 0);
mu_label(ctx, "Displacement:");
if (w_field(ctx, &ui->displacement) & MU_RES_CHANGE) {
set_displacement(ui);
@@ -163,6 +159,19 @@ displacement_row(mu_Context *ctx, UI *ui) {
}
static void
+ambient_temperature_row(mu_Context *ctx, UI *ui) {
+ mu_layout_row(ctx, 3, (int[]) {LABEL_WIDTH, FIELD_WIDTH, UNIT_WIDTH}, 0);
+ mu_label(ctx, "Ambient temperature:");
+ if (w_field(ctx, &ui->ambient_temperature) & MU_RES_CHANGE) {
+ set_ambient_temperature(ui);
+ set_all_volume_flow_rate(ui);
+ }
+ if (w_select(ctx, &ui->ambient_temperature_unit) & MU_RES_CHANGE) {
+ set_ambient_temperature_unit(ui);
+ }
+}
+
+static void
rpm_row(mu_Context *ctx, UI *ui) {
int i;
diff --git a/ui.c b/ui.c
index 1591901..418cb10 100644
--- a/ui.c
+++ b/ui.c
@@ -19,6 +19,14 @@ static const VolumeReader volume_readers[nelem(volume_units)] = {
as_cubic_centimetre, as_litre, as_cubic_inch,
};
+static const char *const temperature_units[] = {"°C", "K", "°F", "°R"};
+static const TemperatureMaker temperature_makers[nelem(temperature_units)] = {
+ celsius, kelvin, fahrenheit, rankine,
+};
+static const TemperatureReader temperature_readers[nelem(temperature_units)] = {
+ as_celsius, as_kelvin, as_fahrenheit, as_rankine,
+};
+
static const char *const pressure_units[] = {"mbar", "kPa", "bar", "psi"};
static const PressureMaker pressure_makers[nelem(pressure_units)] = {
millibar, kilopascal, bar, psi,
@@ -37,6 +45,9 @@ void
init_ui(UI *ui) {
w_init_field(&ui->displacement);
w_init_select(&ui->displacement_unit, nelem(volume_units), volume_units);
+
+ w_init_field(&ui->ambient_temperature);
+ w_init_select(&ui->ambient_temperature_unit, nelem(temperature_units), temperature_units);
ui->npoints = 1;
@@ -83,6 +94,35 @@ set_displacement_unit(UI *ui) {
}
void
+set_ambient_temperature(UI *ui) {
+ int idx, i;
+ TemperatureMaker convert;
+ Temperature t;
+
+ idx = ui->ambient_temperature_unit.idx;
+ assert(idx >= 0 && (long unsigned int) idx < nelem(temperature_units));
+
+ convert = temperature_makers[idx];
+ t = convert(ui->ambient_temperature.value);
+
+ for (i = 0; i < ui->npoints; i++) {
+ ui->points[i].ambient_temperature = t;
+ }
+}
+
+void
+set_ambient_temperature_unit(UI *ui) {
+ TemperatureMaker maker;
+ Temperature t;
+ TemperatureReader reader;
+
+ maker = temperature_makers[ui->ambient_temperature_unit.oldidx];
+ t = maker(ui->ambient_temperature.value);
+ reader = temperature_readers[ui->ambient_temperature_unit.idx];
+ w_set_field(&ui->ambient_temperature, reader(t));
+}
+
+void
set_map(UI *ui, int idx) {
int unit_idx;
PressureMaker convert;
diff --git a/ui.h b/ui.h
index cc985ae..e207327 100644
--- a/ui.h
+++ b/ui.h
@@ -4,6 +4,9 @@ typedef struct {
w_Field displacement;
w_Select displacement_unit;
+ w_Field ambient_temperature;
+ w_Select ambient_temperature_unit;
+
int npoints;
w_Field rpm[MAX_POINTS];
@@ -22,6 +25,8 @@ typedef struct {
void init_ui(UI *ui);
void set_displacement(UI *ui);
void set_displacement_unit(UI* ui);
+void set_ambient_temperature(UI *ui);
+void set_ambient_temperature_unit(UI *ui);
void set_map(UI *ui, int idx);
void set_map_unit(UI *ui);
void set_ve(UI *ui, int idx);