status_output.c 1.92 KiB
#include "status_output.h"
uint8_t led_map[DOOR_MAX_STATUS_FLAG+1] = {LED_UNLOCKED, LED_LOCKED, LED_OPEN,
LED_ALARM, (LED_ALARM | LED_FLAG_BLINK),
(LED_UNLOCKED | LED_FLAG_BLINK), (LED_LOCKED | LED_FLAG_BLINK)};
volatile uint8_t led_blink_time = 0;
#define LED_BLINK_INTERVAL 80 //800ms
volatile uint8_t led_blink_fraction;
volatile uint8_t led_update_needed = 1;
void status_init(void){
LED_DDR |= LED_MASK;
LED_PORT |= LED_POWER;
}
void status_tick(void){
if (led_blink_time == 0){
led_blink_time = LED_BLINK_INTERVAL;
led_update_needed = 1;
} else {
led_blink_time--;
}
if (led_blink_time == led_blink_fraction) led_update_needed = 1;
}
void status_set_leds(uint8_t power_status, uint8_t door_status){
uint8_t led_status = 0;
uint8_t blink_on = (led_blink_time <= led_blink_fraction);
led_update_needed = 0;
if (power_status & POWER_STATUS_AC_ON){
led_status = LED_POWER;
for (uint8_t i = 0; i <= DOOR_MAX_STATUS_FLAG; i++){
if (door_status & (1 << i)){
uint8_t pin = led_map[i];
if (pin & LED_FLAG_BLINK){
if (blink_on) led_status |= (pin & (uint8_t)~LED_FLAG_BLINK);
} else {
led_status |= pin;
}
}
}
} else {
//turn of all status leds, and let the power led blink
if (blink_on) led_status = LED_POWER;
}
LED_PORT = led_status & ~LED_ALARM;
}
void status_update(uint8_t door_status_changed, uint8_t power_status_changed){
uint8_t door_status = door_get_status();
uint8_t power_status = power_get_status();
led_blink_fraction = (power_status & POWER_STATUS_AC_ON) ? (LED_BLINK_INTERVAL / 2) : (LED_BLINK_INTERVAL / 16);
status_set_leds(power_status, door_status);
if (door_status_changed) {door_write_status(); printf_P(PSTR("\n"));}
if (power_status_changed) {power_write_status(); printf_P(PSTR("\n"));}
}
void status_process(){
if (led_update_needed) status_update(0,0);
}