diff options
| -rw-r--r-- | main.go | 27 | ||||
| -rw-r--r-- | pressure.go | 4 | ||||
| -rw-r--r-- | temperature.go | 71 | ||||
| -rw-r--r-- | ui.go | 29 |
4 files changed, 121 insertions, 10 deletions
@@ -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)) + } +} @@ -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"), |