Speeduino
Loading...
Searching...
No Matches
units.h
Go to the documentation of this file.
1#pragma once
2
3#include <stdint.h>
4
39template <typename TUser,
40 typename TRaw>
44
51 constexpr TUser toUser(TRaw raw) const {
52 return ((TUser)raw + (TUser)translate) * (TUser)scale;
53 }
54
61 constexpr TRaw toRaw(TUser user) const {
62 // Since all conversionFactor instances are constexpr, compiler will heavily
63 // optimize this. E.g. removing division or replacing with shift & multiply.
64 return scaleUser(user) - (TRaw)translate;
65 }
66private:
67 constexpr TRaw scaleUser(TUser user) const {
68 // Since all conversionFactor instances are constexpr, compiler will heavily
69 // optimize this. E.g. removing division or replacing with shift & multiply.
70 return user / (TUser)scale;
71 }
72};
73
84static constexpr conversionFactor<uint16_t, uint8_t> RPM_COARSE = { .scale=100U, .translate=0U };
85
90static constexpr conversionFactor<uint16_t, uint8_t> RPM_MEDIUM = { .scale=10U, .translate=0U };
91
96static constexpr conversionFactor<uint16_t, uint8_t> RPM_FINE = { .scale=5U, .translate=0U };
97
102static constexpr conversionFactor<uint32_t, uint8_t> TIME_TENTH_MILLIS = { .scale=10000U, .translate=0U };
103
108static constexpr conversionFactor<uint16_t, uint8_t> TIME_TWENTY_MILLIS = { .scale=5U, .translate=0U };
109
114static constexpr conversionFactor<uint16_t, uint8_t> TIME_TEN_MILLIS = { .scale=100U, .translate=0U };
115
117static constexpr conversionFactor<uint16_t, uint8_t> MAP = { .scale=2U, .translate=0U };
118
120static constexpr conversionFactor<int16_t, uint8_t> MAP_DOT = { .scale=10U, .translate=0U };
121
123static constexpr conversionFactor<int16_t, uint8_t> TPS_DOT = { .scale=10U, .translate=0U };
124
126static constexpr conversionFactor<uint16_t, uint8_t> CRANKING_ENRICHMENT = { .scale=5U, .translate=0U };
127
129static constexpr conversionFactor<int8_t, uint8_t> IGNITION_ADVANCE_LARGE = { .scale=1U, .translate=-40 };
130
132static constexpr conversionFactor<int8_t, uint8_t> IGNITION_ADVANCE_SMALL = { .scale=1U, .translate=-15 };
133
135static constexpr conversionFactor<int16_t, uint8_t> TEMPERATURE = { .scale=1U, .translate=-40 };
136
138
146static inline constexpr uint8_t temperatureAddOffset(int16_t temp) {
147 // TODO: remove this function, replace with TEMPERATURE.toRaw()
148 return TEMPERATURE.toRaw(temp);
149}
150
158static inline constexpr int16_t temperatureRemoveOffset(uint8_t temp) {
159 // TODO: remove this function, replace with TEMPERATURE.toUser()
160 return TEMPERATURE.toUser(temp);
161}
162
static TIntegral readSerialIntegralTimeout(void)
Reads an integral type, timing out if necessary.
Definition comms.cpp:173
Scale and translate signed/unsigned values to convert between "raw" & "user" values.
Definition units.h:41
uint16_t scale
Scale factor, must be >0.
Definition units.h:42
constexpr TRaw toRaw(TUser user) const
Convert a value from a user value to raw page value.
Definition units.h:61
constexpr TUser toUser(TRaw raw) const
Convert a value from raw page value to user value.
Definition units.h:51
int16_t translate
Translation - can be negative.
Definition units.h:43
static constexpr conversionFactor< uint16_t, uint8_t > RPM_MEDIUM
RPM stored as RPM/10. E.g. 2700 -> 270 -> 2700.
Definition units.h:90
static constexpr conversionFactor< uint16_t, uint8_t > TIME_TWENTY_MILLIS
Time values stored in 20 milliseconds.
Definition units.h:108
static constexpr conversionFactor< uint16_t, uint8_t > MAP
MAP values: kpa.
Definition units.h:117
static constexpr uint8_t temperatureAddOffset(int16_t temp)
Convert from a user temperature (-40, 215) to storage (0, 255)
Definition units.h:146
static constexpr int16_t temperatureRemoveOffset(uint8_t temp)
Convert from a storage temperature (0, 255) to user (-40, 215)
Definition units.h:158
static constexpr conversionFactor< int16_t, uint8_t > TEMPERATURE
All temperature measurements are stored offset by 40 degrees, to represent temperature ranges from -4...
Definition units.h:135
static constexpr conversionFactor< uint16_t, uint8_t > RPM_FINE
RPM stored as RPM/5. E.g. 1300->260->1300.
Definition units.h:96
static constexpr conversionFactor< int8_t, uint8_t > IGNITION_ADVANCE_LARGE
Ignition values from the main spark table are offset 40 degrees downwards to allow for negative spark...
Definition units.h:129
static constexpr conversionFactor< int8_t, uint8_t > IGNITION_ADVANCE_SMALL
Ignition advance adjustments can use a smaller offset.
Definition units.h:132
static constexpr conversionFactor< uint16_t, uint8_t > TIME_TEN_MILLIS
Time values stored in 10 milliseconds.
Definition units.h:114
static constexpr conversionFactor< int16_t, uint8_t > MAP_DOT
MAP rate of change: kpa/s
Definition units.h:120
static constexpr conversionFactor< uint16_t, uint8_t > CRANKING_ENRICHMENT
Cranking enrichment values range from 0% to 1275%.
Definition units.h:126
static constexpr conversionFactor< uint16_t, uint8_t > RPM_COARSE
RPM stored as RPM/100. E.g. 2700 -> 27 -> 2700.
Definition units.h:84
static constexpr conversionFactor< int16_t, uint8_t > TPS_DOT
TPS rate of change: %/s.
Definition units.h:123
static constexpr conversionFactor< uint32_t, uint8_t > TIME_TENTH_MILLIS
Time values stored in 1/10th milliseconds I.e ms/10.
Definition units.h:102