aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main.go27
-rw-r--r--pressure.go4
-rw-r--r--temperature.go71
-rw-r--r--ui.go29
4 files changed, 121 insertions, 10 deletions
diff --git a/main.go b/main.go
index d36ebc8..653fd61 100644
--- a/main.go
+++ b/main.go
@@ -27,13 +27,27 @@ var engineSpeed = [numPoints]int32{2000, 3000, 4000, 5000, 6000, 7000}
var volumetricEfficiency = [numPoints]int32{100, 100, 100, 100, 100, 100}
var (
+ intakeAirTemperature = [numPoints]temperature{
+ {35, celcius},
+ {35, celcius},
+ {35, celcius},
+ {35, celcius},
+ {35, celcius},
+ {35, celcius},
+ }
+
+ // selectedTemperatureUnit is used to index temperatureUnitStrings.
+ selectedTemperatureUnit = defaultTemperatureUnitIndex
+)
+
+var (
manifoldPressure = [numPoints]pressure{
- newPressure(),
- newPressure(),
- newPressure(),
- newPressure(),
- newPressure(),
- newPressure(),
+ {100, defaultPressureUnit},
+ {100, defaultPressureUnit},
+ {100, defaultPressureUnit},
+ {100, defaultPressureUnit},
+ {100, defaultPressureUnit},
+ {100, defaultPressureUnit},
}
// selectedPressureUnit is used to index pressureUnitStrings.
@@ -47,6 +61,7 @@ func loop() {
Rows(
engineSpeedRow(),
volumetricEfficiencyRow(),
+ intakeAirTemperatureRow(),
manifoldPressureRow(),
).
Columns(
diff --git a/pressure.go b/pressure.go
index 74f035d..f486552 100644
--- a/pressure.go
+++ b/pressure.go
@@ -48,10 +48,6 @@ type pressure struct {
unit pressureUnit
}
-func newPressure() pressure {
- return pressure{100, defaultPressureUnit}
-}
-
func (p pressure) asUnit(u pressureUnit) float32 {
pa := p.val * float32(p.unit) // Convert to pascals.
return pa / float32(u) // Convert to desired unit.
diff --git a/temperature.go b/temperature.go
new file mode 100644
index 0000000..89cb1ba
--- /dev/null
+++ b/temperature.go
@@ -0,0 +1,71 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+)
+
+type temperatureUnit int
+
+const (
+ celcius temperatureUnit = iota
+ kelvin
+ fahrenheit
+)
+
+// temperatureUnitStrings returns a slice of strings, each representing a
+// temperatureUnit.
+// This is necessary because giu.Combo only works with strings.
+func temperatureUnitStrings() []string {
+ return []string{"°C", "°K", "°F"}
+}
+
+const (
+ defaultTemperatureUnit temperatureUnit = celcius
+ // Used to index temperatureUnitStrings
+ defaultTemperatureUnitIndex int32 = 0 // celcius
+)
+
+func temperatureUnitFromString(s string) (temperatureUnit, error) {
+ // Each case corresponds to a value in volumeUnitStrings.
+ switch s {
+ case "°C":
+ return celcius, nil
+ case "°K":
+ return kelvin, nil
+ case "°F":
+ return fahrenheit, nil
+ default:
+ return *new(temperatureUnit), errors.New(fmt.Sprintf("invalid temperatureUnit: '%s'", s))
+ }
+}
+
+type temperature struct {
+ val float32
+ unit temperatureUnit
+}
+
+func (t temperature) asUnit(u temperatureUnit) (float32, error) {
+ // Convert to celcius
+ var c float32
+ switch t.unit {
+ case celcius:
+ c = t.val
+ case kelvin:
+ c = t.val - 272.15
+ case fahrenheit:
+ c = (t.val - 32.0) * (5.0 / 9.0)
+ }
+
+ // Convert to desired unit
+ switch u {
+ case celcius:
+ return c, nil
+ case kelvin:
+ return c + 272.15, nil
+ case fahrenheit:
+ return c * (9.0 / 5.0) + 32.0, nil
+ default:
+ return 0, errors.New(fmt.Sprintf("invalid temperatureUnit: '%v'", u))
+ }
+}
diff --git a/ui.go b/ui.go
index dd12b06..57765a3 100644
--- a/ui.go
+++ b/ui.go
@@ -50,6 +50,35 @@ func volumetricEfficiencyRow() *g.TableRowWidget {
)
}
+func intakeAirTemperatureRow() *g.TableRowWidget {
+ return g.TableRow(
+ g.Label("Intake Air Temperature"),
+ g.Combo(
+ "",
+ temperatureUnitStrings()[selectedTemperatureUnit],
+ temperatureUnitStrings(),
+ &selectedTemperatureUnit,
+ ).
+ OnChange(func() {
+ s := temperatureUnitStrings()[selectedTemperatureUnit]
+ u, err := temperatureUnitFromString(s)
+ check(err)
+
+ for i := range intakeAirTemperature {
+ t, err := intakeAirTemperature[i].asUnit(u)
+ check(err)
+ intakeAirTemperature[i] = temperature{t, u}
+ }
+ }),
+ g.InputFloat(&intakeAirTemperature[0].val).Format("%.2f"),
+ g.InputFloat(&intakeAirTemperature[1].val).Format("%.2f"),
+ g.InputFloat(&intakeAirTemperature[2].val).Format("%.2f"),
+ g.InputFloat(&intakeAirTemperature[3].val).Format("%.2f"),
+ g.InputFloat(&intakeAirTemperature[4].val).Format("%.2f"),
+ g.InputFloat(&intakeAirTemperature[5].val).Format("%.2f"),
+ )
+}
+
func manifoldPressureRow() *g.TableRowWidget {
return g.TableRow(
g.Label("Manifold Absolute Pressure"),