From 0c5d33fc817047ab2c2c9dd3ed6784c032755819 Mon Sep 17 00:00:00 2001 From: sam-anthony Date: Sat, 26 Mar 2022 15:56:22 -0230 Subject: intake air temperature --- main.go | 27 +++++++++++++++++----- pressure.go | 4 ---- temperature.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui.go | 29 ++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 temperature.go diff --git a/main.go b/main.go index d36ebc8..653fd61 100644 --- a/main.go +++ b/main.go @@ -26,14 +26,28 @@ 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"), -- cgit v1.2.3