diff options
| -rw-r--r-- | spaghetti-monster/anduril/battcheck-mode.c | 29 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/battcheck-mode.h | 5 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/config-default.h | 4 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/load-save-config-fsm.h | 3 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/load-save-config.c | 6 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-adc.c | 14 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-adc.h | 5 |
7 files changed, 64 insertions, 2 deletions
diff --git a/spaghetti-monster/anduril/battcheck-mode.c b/spaghetti-monster/anduril/battcheck-mode.c index c468332..3b4a144 100644 --- a/spaghetti-monster/anduril/battcheck-mode.c +++ b/spaghetti-monster/anduril/battcheck-mode.c @@ -35,6 +35,7 @@ uint8_t battcheck_state(Event event, uint16_t arg) { set_state(off_state, 0); return MISCHIEF_MANAGED; } + #if defined(USE_BEACON_MODE) // 2 clicks: beacon mode else if (event == EV_2clicks) { @@ -48,9 +49,37 @@ uint8_t battcheck_state(Event event, uint16_t arg) { return MISCHIEF_MANAGED; } #endif + + #ifdef USE_VOLTAGE_CORRECTION + // 7 clicks: voltage config mode + else if (event == EV_7clicks) { + push_state(voltage_config_state, 0); + return MISCHIEF_MANAGED; + } + #endif + return EVENT_NOT_HANDLED; } +#ifdef USE_VOLTAGE_CORRECTION +// the user can adjust the battery measurements... on a scale of 1 to 13 +// 1 = subtract 0.30V +// 2 = subtract 0.25V +// ... +// 7 = no effect (add 0V) +// 8 = add 0.05V +// ... +// 13 = add 0.30V +void voltage_config_save() { + uint8_t foo = config_state_values[0]; + if (foo) voltage_correction = config_state_values[0]; +} + +uint8_t voltage_config_state(Event event, uint16_t arg) { + return config_state_base(event, arg, 1, voltage_config_save); +} +#endif // #ifdef USE_VOLTAGE_CORRECTION + #endif diff --git a/spaghetti-monster/anduril/battcheck-mode.h b/spaghetti-monster/anduril/battcheck-mode.h index f57fa74..8ddf31d 100644 --- a/spaghetti-monster/anduril/battcheck-mode.h +++ b/spaghetti-monster/anduril/battcheck-mode.h @@ -22,5 +22,10 @@ uint8_t battcheck_state(Event event, uint16_t arg); +#ifdef USE_VOLTAGE_CORRECTION +void voltage_config_save(); +uint8_t voltage_config_state(Event event, uint16_t arg); +#endif + #endif diff --git a/spaghetti-monster/anduril/config-default.h b/spaghetti-monster/anduril/config-default.h index c68e869..0957a29 100644 --- a/spaghetti-monster/anduril/config-default.h +++ b/spaghetti-monster/anduril/config-default.h @@ -86,6 +86,10 @@ #define BATTCHECK_VpT //#define BATTCHECK_8bars // FIXME: breaks build //#define BATTCHECK_4bars // FIXME: breaks build +// allow the user to calibrate the voltage readings? +// (adjust in 0.05V increments from -0.30V to +0.30V) +// (1 = -0.30V, 2 = -0.25V, ... 7 = 0V, ... 13 = +0.30V) +#define USE_VOLTAGE_CORRECTION // enable beacon mode #define USE_BEACON_MODE diff --git a/spaghetti-monster/anduril/load-save-config-fsm.h b/spaghetti-monster/anduril/load-save-config-fsm.h index d9c5f4c..c7c4c8d 100644 --- a/spaghetti-monster/anduril/load-save-config-fsm.h +++ b/spaghetti-monster/anduril/load-save-config-fsm.h @@ -60,6 +60,9 @@ typedef enum { therm_ceil_e, therm_cal_offset_e, #endif + #ifdef USE_VOLTAGE_CORRECTION + voltage_correction_e, + #endif #ifdef USE_INDICATOR_LED indicator_led_mode_e, #endif diff --git a/spaghetti-monster/anduril/load-save-config.c b/spaghetti-monster/anduril/load-save-config.c index 7268dc9..8360ee4 100644 --- a/spaghetti-monster/anduril/load-save-config.c +++ b/spaghetti-monster/anduril/load-save-config.c @@ -60,6 +60,9 @@ void load_config() { therm_ceil = eeprom[therm_ceil_e]; therm_cal_offset = eeprom[therm_cal_offset_e]; #endif + #ifdef USE_VOLTAGE_CORRECTION + voltage_correction = eeprom[voltage_correction_e]; + #endif #ifdef USE_INDICATOR_LED indicator_led_mode = eeprom[indicator_led_mode_e]; #endif @@ -114,6 +117,9 @@ void save_config() { eeprom[therm_ceil_e] = therm_ceil; eeprom[therm_cal_offset_e] = therm_cal_offset; #endif + #ifdef USE_VOLTAGE_CORRECTION + eeprom[voltage_correction_e] = voltage_correction; + #endif #ifdef USE_INDICATOR_LED eeprom[indicator_led_mode_e] = indicator_led_mode; #endif diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c index 45a4297..96c4af3 100644 --- a/spaghetti-monster/fsm-adc.c +++ b/spaghetti-monster/fsm-adc.c @@ -114,7 +114,12 @@ static inline uint8_t calc_voltage_divider(uint16_t value) { // use 9.7 fixed-point to get sufficient precision uint16_t adc_per_volt = ((ADC_44<<5) - (ADC_22<<5)) / (44-22); // shift incoming value into a matching position - uint8_t result = ((value>>1) / adc_per_volt) + VOLTAGE_FUDGE_FACTOR; + uint8_t result = ((value>>1) / adc_per_volt) + + VOLTAGE_FUDGE_FACTOR + #ifdef USE_VOLTAGE_CORRECTION + + voltage_correction - 7 + #endif + ; return result; } #endif @@ -262,7 +267,12 @@ static inline void ADC_voltage_handler() { // calculate actual voltage: volts * 10 // ADC = 1.1 * 1024 / volts // volts = 1.1 * 1024 / ADC - voltage = ((uint16_t)(2*1.1*1024*10)/(measurement>>6) + VOLTAGE_FUDGE_FACTOR) >> 1; + voltage = ((uint16_t)(2*1.1*1024*10)/(measurement>>6) + + VOLTAGE_FUDGE_FACTOR + #ifdef USE_VOLTAGE_CORRECTION + + voltage_correction - 7 + #endif + ) >> 1; #endif // if low, callback EV_voltage_low / EV_voltage_critical diff --git a/spaghetti-monster/fsm-adc.h b/spaghetti-monster/fsm-adc.h index cc33264..56583bb 100644 --- a/spaghetti-monster/fsm-adc.h +++ b/spaghetti-monster/fsm-adc.h @@ -52,6 +52,11 @@ void adc_deferred(); // do the actual ADC-related calculations static inline void ADC_voltage_handler(); uint8_t voltage = 0; +#ifdef USE_VOLTAGE_CORRECTION +// same 0.05V units as fudge factor, +// but 7 is neutral, and the expected range is from 1 to 13 +uint8_t voltage_correction = 7; +#endif #ifdef USE_LVP void low_voltage(); #endif |
