refactoring
This commit is contained in:
159
src/clock.c
Normal file
159
src/clock.c
Normal file
@ -0,0 +1,159 @@
|
||||
#include <stdint.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
|
||||
volatile clock_t clock;
|
||||
volatile opTime_t opTime;
|
||||
|
||||
volatile uint8_t useLocalClock = 1;
|
||||
|
||||
volatile uint8_t nextSecond = 0;
|
||||
volatile uint8_t nextMinute = 0;
|
||||
|
||||
ISR(TIMER2_OVF_vect) {
|
||||
clock.second++;
|
||||
nextSecond = 1;
|
||||
|
||||
if (useLocalClock == 1) {
|
||||
if (clock.second >= 60) {
|
||||
clock.second = 0;
|
||||
clock.minute++;
|
||||
|
||||
nextMinute = 1;
|
||||
}
|
||||
if (clock.minute >= 60) {
|
||||
clock.minute = 0;
|
||||
clock.hour++;
|
||||
}
|
||||
if (clock.hour >= 24) {
|
||||
clock.hour = 0;
|
||||
}
|
||||
}
|
||||
|
||||
opTime.second++;
|
||||
|
||||
if (opTime.second >= 60) {
|
||||
opTime.second = 0;
|
||||
opTime.minute++;
|
||||
}
|
||||
if (opTime.minute >= 60) {
|
||||
opTime.minute = 0;
|
||||
opTime.hour++;
|
||||
}
|
||||
if (opTime.hour >= 24) {
|
||||
opTime.hour = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void clockInit() {
|
||||
clock.hour = 0;
|
||||
clock.minute = 0;
|
||||
clock.second = 0;
|
||||
|
||||
opTime.hour = 0;
|
||||
opTime.minute = 0;
|
||||
opTime.second = 0;
|
||||
|
||||
// seconds
|
||||
TCCR2 = 0b00000101;
|
||||
ASSR |= (1 << AS2);
|
||||
TIMSK |= (1 << TOIE2) | (1 << TICIE1);
|
||||
|
||||
// heartbeat
|
||||
TCCR0 = (1 << CS02) | (1 << CS00);
|
||||
TIMSK |= (1 << TOIE0);
|
||||
}
|
||||
|
||||
opTime_t clockGetOpTime() {
|
||||
return opTime;
|
||||
}
|
||||
|
||||
void clockSetUseLocalClock(uint8_t x) {
|
||||
useLocalClock = x;
|
||||
}
|
||||
|
||||
void clockSetClock(uint8_t year, uint8_t month, uint8_t day, uint8_t weekday, uint8_t hour, uint8_t minute) {
|
||||
cli();
|
||||
clock.year = year;
|
||||
clock.month = month;
|
||||
clock.day = day;
|
||||
clock.weekday = weekday;
|
||||
clock.hour = hour;
|
||||
clock.minute = minute;
|
||||
sei();
|
||||
}
|
||||
|
||||
void clockClearSecond() {
|
||||
cli();
|
||||
clock.second = 0;
|
||||
sei();
|
||||
}
|
||||
|
||||
clock_t clockGetClock() {
|
||||
cli();
|
||||
clock_t c = clock;
|
||||
sei();
|
||||
return c;
|
||||
}
|
||||
|
||||
uint8_t clockNextSecond() {
|
||||
if (nextSecond != 0) {
|
||||
nextSecond = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t clockNextMinute() {
|
||||
if (nextMinute != 0) {
|
||||
nextMinute = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
volatile uint8_t tack = 0;
|
||||
volatile uint8_t step = 0;
|
||||
|
||||
|
||||
uint8_t clockNextStep() {
|
||||
if (step != 0) {
|
||||
step = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t clockNextTack() {
|
||||
if (tack != 0) {
|
||||
tack = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
ISR(TIMER0_OVF_vect) {
|
||||
static uint8_t subDivTack = 0;
|
||||
subDivTack++;
|
||||
if (subDivTack >= SUB_DIV_LED) {
|
||||
subDivTack = 0;
|
||||
tack = 1;
|
||||
}
|
||||
|
||||
static uint8_t subDivStepper = 0;
|
||||
subDivStepper++;
|
||||
if (subDivStepper >= SUB_DIV_STEPPER) {
|
||||
subDivStepper = 0;
|
||||
step = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user