From 82614c65d78bdf45f1d6ca86b480eb817618049b Mon Sep 17 00:00:00 2001 From: Markus Koch Date: Sun, 9 Aug 2020 12:14:21 +0200 Subject: [PATCH] fw: Implement charging indicator --- firmware/batmon.c | 9 +++++++++ firmware/batmon.h | 4 ++++ firmware/input.c | 12 +++++++----- firmware/input.h | 2 +- firmware/main.c | 6 +++++- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/firmware/batmon.c b/firmware/batmon.c index f1a150f..fe2ffdc 100644 --- a/firmware/batmon.c +++ b/firmware/batmon.c @@ -24,6 +24,10 @@ void batmon_init() // Enable ADC ADCSRA |= (1 << ADEN); ADCSRA |= (1 << ADSC); + + // Configure charging indicator pin + PORT_CHI(DDR) &= ~(1 << PIN_CHI); + PORT_CHI(PORT) &= ~(1 << PIN_CHI); } uint8_t batmon_proc() @@ -74,3 +78,8 @@ inline uint8_t batmon_ok_to_boot() { return (batmon_get_voltage_sync() > BAT_THRES_POWER_ON); } + +inline uint8_t batmon_is_charging() +{ + return !(PORT_CHI(PIN) & PIN_CHI); +} diff --git a/firmware/batmon.h b/firmware/batmon.h index a9e8a59..7ca00f2 100644 --- a/firmware/batmon.h +++ b/firmware/batmon.h @@ -6,6 +6,9 @@ #define PORT_ADCC(t) t##C #define PIN_ADCC (1 << 1) +#define PORT_CHI(t) t##B /* Charging indicator */ +#define PIN_CHI (1 << 7) + // Nominal 3.7V: 195; Full 4.2V: 220 #define BAT_THRES_POWER_ON 175 // TODO: Minimum ADC value to allow turning the device on (3.3V) #define BAT_THRES_POWER_OFF 165 // TODO: ADC value to (hard) power off the device. (3.1V) @@ -14,5 +17,6 @@ void batmon_init(); uint8_t batmon_get_voltage(); uint8_t batmon_proc(); uint8_t batmon_ok_to_boot(); +uint8_t batmon_is_charging(); #endif // BATMON_H diff --git a/firmware/input.c b/firmware/input.c index a571d0a..318243a 100644 --- a/firmware/input.c +++ b/firmware/input.c @@ -4,7 +4,7 @@ #include "input.h" #include "systick.h" -static volatile int8_t rotary_delta = 0; +static volatile uint8_t rotary_delta = 0; static volatile uint8_t sw_event = 0; void input_init() @@ -19,7 +19,7 @@ void input_init() PORT_SBCMON(PORT) |= PIN_SBCMON; } -inline int8_t get_rotary_delta() +inline uint8_t get_rotary_delta() { return rotary_delta; } @@ -42,11 +42,13 @@ static inline void input_proc_rotary() if (a == 1 && last_a == 0) { silly_debounce = ROTARY_DEBOUNCE; - rotary_delta += !!(a ^ b); + if (rotary_delta < 31) + rotary_delta += !!(a ^ b); } if (a == 0 && last_a == 1) { silly_debounce = ROTARY_DEBOUNCE; - rotary_delta -= !(a ^ b); + if (rotary_delta > 0) + rotary_delta -= !(a ^ b); } last_a = a; @@ -96,7 +98,7 @@ inline uint8_t get_switch_event() inline void input_clear_events() { - rotary_delta = 0; + rotary_delta = 16; sw_event = 0; } diff --git a/firmware/input.h b/firmware/input.h index b232dbc..93d7ac7 100644 --- a/firmware/input.h +++ b/firmware/input.h @@ -14,7 +14,7 @@ void input_init(); void input_proc(); -int8_t get_rotary_delta(); +uint8_t get_rotary_delta(); uint8_t get_switch_event(); void input_clear_events(); uint8_t get_sbc_state(); diff --git a/firmware/main.c b/firmware/main.c index ab1640e..ec4350d 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -65,7 +65,7 @@ uint8_t spi_proc() x = 0; y = Y_MAX; SPDR = get_switch_event(); - spdr_next = get_rotary_delta(); + spdr_next = get_rotary_delta() | (batmon_is_charging() << 7); } return spi_cs; @@ -138,6 +138,10 @@ int main() if (batmon_proc()) reset(); } + if (PORT_KEYPAD(PIN) == 0b11111001) { + _delay_ms(500); + reset(); + } } return 0; }