fw: Implement charging indicator

master
Markus Koch 2020-08-09 12:14:21 +02:00
parent 859c898d8a
commit 82614c65d7
5 changed files with 26 additions and 7 deletions

View File

@ -24,6 +24,10 @@ void batmon_init()
// Enable ADC // Enable ADC
ADCSRA |= (1 << ADEN); ADCSRA |= (1 << ADEN);
ADCSRA |= (1 << ADSC); ADCSRA |= (1 << ADSC);
// Configure charging indicator pin
PORT_CHI(DDR) &= ~(1 << PIN_CHI);
PORT_CHI(PORT) &= ~(1 << PIN_CHI);
} }
uint8_t batmon_proc() uint8_t batmon_proc()
@ -74,3 +78,8 @@ inline uint8_t batmon_ok_to_boot()
{ {
return (batmon_get_voltage_sync() > BAT_THRES_POWER_ON); return (batmon_get_voltage_sync() > BAT_THRES_POWER_ON);
} }
inline uint8_t batmon_is_charging()
{
return !(PORT_CHI(PIN) & PIN_CHI);
}

View File

@ -6,6 +6,9 @@
#define PORT_ADCC(t) t##C #define PORT_ADCC(t) t##C
#define PIN_ADCC (1 << 1) #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 // 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_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) #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_get_voltage();
uint8_t batmon_proc(); uint8_t batmon_proc();
uint8_t batmon_ok_to_boot(); uint8_t batmon_ok_to_boot();
uint8_t batmon_is_charging();
#endif // BATMON_H #endif // BATMON_H

View File

@ -4,7 +4,7 @@
#include "input.h" #include "input.h"
#include "systick.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; static volatile uint8_t sw_event = 0;
void input_init() void input_init()
@ -19,7 +19,7 @@ void input_init()
PORT_SBCMON(PORT) |= PIN_SBCMON; PORT_SBCMON(PORT) |= PIN_SBCMON;
} }
inline int8_t get_rotary_delta() inline uint8_t get_rotary_delta()
{ {
return rotary_delta; return rotary_delta;
} }
@ -42,11 +42,13 @@ static inline void input_proc_rotary()
if (a == 1 && last_a == 0) { if (a == 1 && last_a == 0) {
silly_debounce = ROTARY_DEBOUNCE; silly_debounce = ROTARY_DEBOUNCE;
rotary_delta += !!(a ^ b); if (rotary_delta < 31)
rotary_delta += !!(a ^ b);
} }
if (a == 0 && last_a == 1) { if (a == 0 && last_a == 1) {
silly_debounce = ROTARY_DEBOUNCE; silly_debounce = ROTARY_DEBOUNCE;
rotary_delta -= !(a ^ b); if (rotary_delta > 0)
rotary_delta -= !(a ^ b);
} }
last_a = a; last_a = a;
@ -96,7 +98,7 @@ inline uint8_t get_switch_event()
inline void input_clear_events() inline void input_clear_events()
{ {
rotary_delta = 0; rotary_delta = 16;
sw_event = 0; sw_event = 0;
} }

View File

@ -14,7 +14,7 @@
void input_init(); void input_init();
void input_proc(); void input_proc();
int8_t get_rotary_delta(); uint8_t get_rotary_delta();
uint8_t get_switch_event(); uint8_t get_switch_event();
void input_clear_events(); void input_clear_events();
uint8_t get_sbc_state(); uint8_t get_sbc_state();

View File

@ -65,7 +65,7 @@ uint8_t spi_proc()
x = 0; x = 0;
y = Y_MAX; y = Y_MAX;
SPDR = get_switch_event(); SPDR = get_switch_event();
spdr_next = get_rotary_delta(); spdr_next = get_rotary_delta() | (batmon_is_charging() << 7);
} }
return spi_cs; return spi_cs;
@ -138,6 +138,10 @@ int main()
if (batmon_proc()) if (batmon_proc())
reset(); reset();
} }
if (PORT_KEYPAD(PIN) == 0b11111001) {
_delay_ms(500);
reset();
}
} }
return 0; return 0;
} }