Skip to content
Snippets Groups Projects
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);
}