83 lines
1.3 KiB
C
83 lines
1.3 KiB
C
#include <stdint.h>
|
|
#include <avr/io.h>
|
|
|
|
#include "clock.h"
|
|
|
|
|
|
#define VALID_LED_REG_DIR DDRB
|
|
#define VALID_LED_REG PORTB
|
|
|
|
#define VALID_LED PB0
|
|
|
|
#define DARK_SWITCH_REG_DIR DDRD
|
|
#define DARK_SWITCH_OUT_REG PORTD
|
|
#define DARK_SWITCH_IN_REG PIND
|
|
|
|
#define DARK_SWITCH PD7
|
|
|
|
|
|
uint8_t validLedStatus = 0;
|
|
|
|
void validLedSetStatus(uint8_t x) {
|
|
validLedStatus = x;
|
|
}
|
|
|
|
uint8_t isNotDark() {
|
|
return DARK_SWITCH_IN_REG & (1 << DARK_SWITCH);
|
|
}
|
|
|
|
static inline void validLedEnable() {
|
|
PORTB |= (1 << PB0);
|
|
}
|
|
|
|
static inline void validLedDisable() {
|
|
PORTB &= ~(1 << PB0);
|
|
}
|
|
|
|
|
|
void validLedInit() {
|
|
// validLed
|
|
VALID_LED_REG_DIR |= (1 << VALID_LED);
|
|
|
|
// dark switch
|
|
DARK_SWITCH_REG_DIR &= ~(1 << DARK_SWITCH);
|
|
// pull-up on
|
|
DARK_SWITCH_OUT_REG |= (1 << DARK_SWITCH);
|
|
}
|
|
|
|
|
|
void validLedEngine() {
|
|
static uint8_t ledToggle = 0;
|
|
|
|
|
|
if (clockNextBlink()) {
|
|
uint8_t light = isNotDark();
|
|
|
|
switch (validLedStatus) {
|
|
case 0:
|
|
validLedDisable();
|
|
break;
|
|
case 1:
|
|
if (ledToggle != 0) {
|
|
ledToggle = 0;
|
|
validLedDisable();
|
|
} else {
|
|
ledToggle = 1;
|
|
if (light != 0) {
|
|
validLedEnable();
|
|
} else {
|
|
validLedDisable();
|
|
}
|
|
}
|
|
break;
|
|
case 2:
|
|
if (light != 0) {
|
|
validLedEnable();
|
|
} else {
|
|
validLedDisable();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|