aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.c25
-rw-r--r--ui.c33
-rw-r--r--ui.h5
-rw-r--r--widget.c10
-rw-r--r--widget.h9
5 files changed, 81 insertions, 1 deletions
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 <ui->npoints; i++) {
if (w_field(ctx, &ui->map[i])) {
set_map(ui, i);
+ set_volume_flow_rate(ui, i);
}
}
}
@@ -225,6 +233,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);
mu_label(ctx, "");
diff --git a/ui.c b/ui.c
index 676c442..c88ccb5 100644
--- a/ui.c
+++ b/ui.c
@@ -1,4 +1,5 @@
#include <assert.h>
+#include <stdio.h>
#include <string.h>
#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
@@ -69,6 +78,28 @@ set_map(UI *ui, int idx) {
}
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);