From b99473f1f25ae7473b87609e61396ebea3d32aac Mon Sep 17 00:00:00 2001 From: hg Date: Tue, 29 Jan 2013 14:38:59 +0100 Subject: [PATCH] refactoring --- src/clock.c | 2 +- src/clock.h | 2 +- src/dcf77.c | 401 ++++++++++++++++++++++++++++++++++++++++ src/{main.h => dcf77.h} | 13 +- src/main.c | 401 ++-------------------------------------- src/stepper.c | 214 ++++++++++----------- src/stepper.h | 1 - src/validLed.c | 49 ++--- src/validLed.h | 3 +- 9 files changed, 563 insertions(+), 523 deletions(-) create mode 100644 src/dcf77.c rename src/{main.h => dcf77.h} (80%) diff --git a/src/clock.c b/src/clock.c index a4e1d71..9ceb2a3 100644 --- a/src/clock.c +++ b/src/clock.c @@ -131,7 +131,7 @@ uint8_t clockNextStep() { } } -uint8_t clockNextTack() { +uint8_t clockNextBlink() { if (tack != 0) { tack = 0; return 1; diff --git a/src/clock.h b/src/clock.h index fbf62e5..6043cd5 100644 --- a/src/clock.h +++ b/src/clock.h @@ -29,7 +29,7 @@ void clockInit(); opTime_t clockGetOpTime(); uint8_t clockNextStep(); -uint8_t clockNextTack(); +uint8_t clockNextBlink(); uint8_t clockNextSecond(); uint8_t clockNextMinute(); diff --git a/src/dcf77.c b/src/dcf77.c new file mode 100644 index 0000000..c989214 --- /dev/null +++ b/src/dcf77.c @@ -0,0 +1,401 @@ +#include +#include +#include +#include + +#include "clock.h" +#include "validLed.h" +#include "stepper.h" +#include "dcf77.h" + + + + +void dcf77Init() { + // signal measurment + TCCR1A = 0; + TCCR1B = (1 << CS12) | (1 << CS10); + + DDRD &= ~(1 << PD2); + DDRD &= ~(1 << PD3); + PORTD |= (1 << PD2) | (1 << PD3); + MCUCR |= (1 << ISC11) | (1 << ISC10) | (1 << ISC01); + GICR |= (1 << INT0) | (1 << INT1); + + dcf77SetValid(0); + +} + + + +volatile uint8_t tick; +volatile uint16_t captValue = 0; +volatile uint16_t gapValue = 0; +volatile uint8_t valid = 0; +uint16_t validCnt = 0; +uint16_t timeValidCnt = 0; + + + + + +ISR(INT0_vect) { + uint16_t tmpCnt = TCNT1; + gapValue = tmpCnt - captValue; + TCNT1 = 0; +} + +ISR(INT1_vect) { + captValue = TCNT1; + tick = 1; +} + + +void dcf77SetValid(uint8_t x) { + valid = x; + validLedSetStatus(valid); + if (valid == 1) { + validCnt++; + clockSetUseLocalClock(1); + } else if (valid == 2) { + timeValidCnt++; + clockSetUseLocalClock(0); + stepperEnable(); + } else { + clockSetUseLocalClock(1); + } +} + +uint8_t getValid() { + return valid; +} + + + +void dcf77Engine() { + static receivedData_t rd; + static uint8_t state = 0; + static uint8_t showState = 0; + uint8_t bit = 0; + + + + if (tick != 0) { + tick = 0; + + uint16_t pulse = (((uint32_t) captValue) * 1000) / 15625; + uint16_t gap = (((uint32_t) gapValue) * 1000) / 15625; + + if (gap > START_GAP_MIN) { + if (valid == 0) { + dcf77SetValid(1);; + } + state = 0; + clockClearSecond(); + } + + if (pulse > ZERO_WIDTH_MIN && pulse < ZERO_WIDTH_MAX) { + bit = 0; + } else if (pulse > ONE_WIDTH_MIN && pulse < ONE_WIDTH_MAX) { + bit = 1; + } else { + bit = 2; + dcf77SetValid(0);; + } + + + if (valid > 0) { + switch (state) { + case 0: + if (bit != 0) + dcf77SetValid(0); + break; + case 1: + break; + case 2: + break; + case 3: + break; + case 4: + break; + case 5: + break; + case 6: + break; + case 7: + break; + case 8: + break; + case 9: + break; + case 10: + break; + case 11: + break; + case 12: + break; + case 13: + break; + case 14: + break; + case 15: + break; + case 16: + break; + case 17: + break; + case 18: + break; + case 19: + break; + case 20: + if (bit != 1) + dcf77SetValid(0); + break; + case 21: + rd.minuteOneCnt = 0; + rd.minuteDigit0 = 0; + rd.minuteDigit0 |= bit; + if (bit == 1) + rd.minuteOneCnt++; + break; + case 22: + rd.minuteDigit0 |= (bit << 1); + if (bit == 1) + rd.minuteOneCnt++; + break; + case 23: + rd.minuteDigit0 |= (bit << 2); + if (bit == 1) + rd.minuteOneCnt++; + break; + case 24: + rd.minuteDigit0 |= (bit << 3); + if (bit == 1) + rd.minuteOneCnt++; + break; + case 25: + rd.minuteDigit1 = 0; + rd.minuteDigit1 |= bit; + if (bit == 1) + rd.minuteOneCnt++; + break; + case 26: + rd.minuteDigit1 |= (bit << 1); + if (bit == 1) + rd.minuteOneCnt++; + break; + case 27: + rd.minuteDigit1 |= (bit << 2); + if (bit == 1) + rd.minuteOneCnt++; + break; + case 28: + rd.minuteOneCnt += bit; + if (rd.minuteOneCnt % 2 != 0) { + printf("MINUTE INVALID\n"); + dcf77SetValid(0); + } else { + printf("MINUTE %u %u\n", rd.minuteDigit0, rd.minuteDigit1); + } + break; + case 29: + rd.hourOneCnt = 0; + rd.hourDigit0 = 0; + rd.hourDigit0 |= bit; + if (bit == 1) + rd.hourOneCnt++; + break; + case 30: + rd.hourDigit0 |= (bit << 1); + if (bit == 1) + rd.hourOneCnt++; + break; + case 31: + rd.hourDigit0 |= (bit << 2); + if (bit == 1) + rd.hourOneCnt++; + break; + case 32: + rd.hourDigit0 |= (bit << 3); + if (bit == 1) + rd.hourOneCnt++; + break; + case 33: + rd.hourDigit1 = 0; + rd.hourDigit1 |= bit; + if (bit == 1) + rd.hourOneCnt++; + break; + case 34: + rd.hourDigit1 |= (bit << 1); + if (bit == 1) + rd.hourOneCnt++; + break; + case 35: + rd.hourOneCnt += bit; + if (rd.hourOneCnt % 2 != 0) { + printf("HOUR INVALID\n"); + dcf77SetValid(0); + } else { + printf("HOUR %u %u\n", rd.hourDigit0, rd.hourDigit1); + } + break; + case 36: + rd.dateOneCnt = 0; + rd.dayDigit0 = 0; + rd.dayDigit0 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 37: + rd.dayDigit0 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 38: + rd.dayDigit0 |= (bit << 2); + if (bit == 1) + rd.dateOneCnt++; + break; + case 39: + rd.dayDigit0 |= (bit << 3); + if (bit == 1) + rd.dateOneCnt++; + break; + case 40: + rd.dayDigit1 = 0; + rd.dayDigit1 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 41: + rd.dayDigit1 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 42: + rd.weekdayDigit0 = 0; + rd.weekdayDigit0 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 43: + rd.weekdayDigit0 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 44: + rd.weekdayDigit0 |= (bit << 2); + if (bit == 1) + rd.dateOneCnt++; + break; + case 45: + rd.monthDigit0 = 0; + rd.monthDigit0 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 46: + rd.monthDigit0 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 47: + rd.monthDigit0 |= (bit << 2); + if (bit == 1) + rd.dateOneCnt++; + break; + case 48: + rd.monthDigit0 |= (bit << 3); + if (bit == 1) + rd.dateOneCnt++; + break; + case 49: + rd.monthDigit1 = 0; + rd.monthDigit1 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 50: + rd.yearDigit0 = 0; + rd.yearDigit0 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 51: + rd.yearDigit0 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 52: + rd.yearDigit0 |= (bit << 2); + if (bit == 1) + rd.dateOneCnt++; + break; + case 53: + rd.yearDigit0 |= (bit << 3); + if (bit == 1) + rd.dateOneCnt++; + break; + case 54: + rd.yearDigit1 = 0; + rd.yearDigit1 |= bit; + if (bit == 1) + rd.dateOneCnt++; + break; + case 55: + rd.yearDigit1 |= (bit << 1); + if (bit == 1) + rd.dateOneCnt++; + break; + case 56: + rd.yearDigit1 |= (bit << 2); + if (bit == 1) + rd.dateOneCnt++; + break; + case 57: + rd.yearDigit1 |= (bit << 3); + if (bit == 1) + rd.dateOneCnt++; + break; + case 58: + rd.dateOneCnt += bit; + if (rd.dateOneCnt % 2 != 0) { + printf("DATE INVALID\n"); + dcf77SetValid(0); + } else { + printf("DAY %u %u\n", rd.dayDigit0, rd.dayDigit1); + printf("WEEKDAY %u\n", rd.weekdayDigit0); + printf("MONTH %u %u\n", rd.monthDigit0, rd.monthDigit1); + printf("YEAR %u %u\n", rd.yearDigit0, rd.yearDigit1); + + clockSetClock(rd.yearDigit0 + rd.yearDigit1 * 10, + rd.monthDigit0 + rd.monthDigit1 * 10, + rd.dayDigit0 + rd.dayDigit1 * 10, + rd.weekdayDigit0, + rd.hourDigit0 + rd.hourDigit1 * 10, + rd.minuteDigit0 + rd.minuteDigit1 * 10); + + dcf77SetValid(2); + } + break; + case 59: + break; + default: + valid = 0; + break; + } + + showState = state; + state++; + } + + printf("DCF77: %d %02d %d %d %d %d %d\n", + valid, showState, bit, pulse, gap, validCnt, timeValidCnt); + } + + + + +} diff --git a/src/main.h b/src/dcf77.h similarity index 80% rename from src/main.h rename to src/dcf77.h index 70afec1..72ad686 100644 --- a/src/main.h +++ b/src/dcf77.h @@ -1,14 +1,18 @@ -#ifndef MAIN_H_ -#define MAIN_H_ +#ifndef DCF77_H_ +#define DCF77_H_ + #include + #define START_GAP_MIN 1500 #define ONE_WIDTH_MIN 170 #define ONE_WIDTH_MAX 260 #define ZERO_WIDTH_MIN 70 #define ZERO_WIDTH_MAX 150 + + typedef struct receivedData_s { uint8_t minuteDigit0; uint8_t minuteDigit1; @@ -27,6 +31,9 @@ typedef struct receivedData_s { } receivedData_t; +void dcf77Init(); +void dcf77Engine(); +void dcf77SetValid(uint8_t x); -#endif /* MAIN_H_ */ +#endif /* DCF77_H_ */ diff --git a/src/main.c b/src/main.c index ece237c..8e7e731 100644 --- a/src/main.c +++ b/src/main.c @@ -1,429 +1,52 @@ #include #include #include -#include -#include "main.h" +#include "dcf77.h" #include "clock.h" #include "uartdrv.h" #include "stepper.h" #include "validLed.h" - - - - - -receivedData_t rd; - -extern volatile clock_t clock; - -volatile uint8_t tick; -volatile uint16_t captValue = 0; -volatile uint16_t gapValue = 0; -volatile uint8_t valid = 0; -uint16_t validCnt = 0; -uint16_t timeValidCnt = 0; - - - -ISR(INT0_vect) { - uint16_t tmpCnt = TCNT1; - gapValue = tmpCnt - captValue; - TCNT1 = 0; -} - -ISR(INT1_vect) { - captValue = TCNT1; - tick = 1; -} - - -void setValid(uint8_t x) { - valid = x; - if (valid == 1) { - validCnt++; - clockSetUseLocalClock(1); - } else if (valid == 2) { - timeValidCnt++; - clockSetUseLocalClock(0); - stepperEnable(); - } else { - clockSetUseLocalClock(1); - } -} - -uint8_t getValid() { - return valid; -} - int main() { - // signal measurment - TCCR1A = 0; - TCCR1B = (1 << CS12) | (1 << CS10); - - DDRD &= ~(1 << PD2); - DDRD &= ~(1 << PD3); - PORTD |= (1 << PD2) | (1 << PD3); - MCUCR |= (1 << ISC11) | (1 << ISC10) | (1 << ISC01); - GICR |= (1 << INT0) | (1 << INT1); - // esd prot DDRD |= (1 << PD5) | (1 << PD6); uartdrvInit(); clockInit(); + dcf77Init(); stepperInit(); validLedInit(); - setValid(0); + sei(); printf("MyClock started\n"); - uint8_t bit = 0; - uint8_t state = 0; - while (1) { - if (tick != 0) { - tick = 0; + dcf77Engine(); - uint16_t pulse = (((uint32_t) captValue) * 1000) / 15625; - uint16_t gap = (((uint32_t) gapValue) * 1000) / 15625; + stepperEngine(); - if (gap > START_GAP_MIN) { - if (valid == 0) { - setValid(1);; - } - state = 0; - clockClearSecond(); - } - - if (pulse > ZERO_WIDTH_MIN && pulse < ZERO_WIDTH_MAX) { - bit = 0; - } else if (pulse > ONE_WIDTH_MIN && pulse < ONE_WIDTH_MAX) { - bit = 1; - } else { - bit = 2; - setValid(0);; - } + validLedEngine(); - if (valid > 0) { - switch (state) { - case 0: - if (bit != 0) - setValid(0); - break; - case 1: - break; - case 2: - break; - case 3: - break; - case 4: - break; - case 5: - break; - case 6: - break; - case 7: - break; - case 8: - break; - case 9: - break; - case 10: - break; - case 11: - break; - case 12: - break; - case 13: - break; - case 14: - break; - case 15: - break; - case 16: - break; - case 17: - break; - case 18: - break; - case 19: - break; - case 20: - if (bit != 1) - setValid(0); - break; - case 21: - rd.minuteOneCnt = 0; - rd.minuteDigit0 = 0; - rd.minuteDigit0 |= bit; - if (bit == 1) - rd.minuteOneCnt++; - break; - case 22: - rd.minuteDigit0 |= (bit << 1); - if (bit == 1) - rd.minuteOneCnt++; - break; - case 23: - rd.minuteDigit0 |= (bit << 2); - if (bit == 1) - rd.minuteOneCnt++; - break; - case 24: - rd.minuteDigit0 |= (bit << 3); - if (bit == 1) - rd.minuteOneCnt++; - break; - case 25: - rd.minuteDigit1 = 0; - rd.minuteDigit1 |= bit; - if (bit == 1) - rd.minuteOneCnt++; - break; - case 26: - rd.minuteDigit1 |= (bit << 1); - if (bit == 1) - rd.minuteOneCnt++; - break; - case 27: - rd.minuteDigit1 |= (bit << 2); - if (bit == 1) - rd.minuteOneCnt++; - break; - case 28: - rd.minuteOneCnt += bit; - if (rd.minuteOneCnt % 2 != 0) { - printf("MINUTE INVALID\n"); - setValid(0); - } else { - printf("MINUTE %u %u\n", rd.minuteDigit0, rd.minuteDigit1); - } - break; - case 29: - rd.hourOneCnt = 0; - rd.hourDigit0 = 0; - rd.hourDigit0 |= bit; - if (bit == 1) - rd.hourOneCnt++; - break; - case 30: - rd.hourDigit0 |= (bit << 1); - if (bit == 1) - rd.hourOneCnt++; - break; - case 31: - rd.hourDigit0 |= (bit << 2); - if (bit == 1) - rd.hourOneCnt++; - break; - case 32: - rd.hourDigit0 |= (bit << 3); - if (bit == 1) - rd.hourOneCnt++; - break; - case 33: - rd.hourDigit1 = 0; - rd.hourDigit1 |= bit; - if (bit == 1) - rd.hourOneCnt++; - break; - case 34: - rd.hourDigit1 |= (bit << 1); - if (bit == 1) - rd.hourOneCnt++; - break; - case 35: - rd.hourOneCnt += bit; - if (rd.hourOneCnt % 2 != 0) { - printf("HOUR INVALID\n"); - setValid(0); - } else { - printf("HOUR %u %u\n", rd.hourDigit0, rd.hourDigit1); - } - break; - case 36: - rd.dateOneCnt = 0; - rd.dayDigit0 = 0; - rd.dayDigit0 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 37: - rd.dayDigit0 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 38: - rd.dayDigit0 |= (bit << 2); - if (bit == 1) - rd.dateOneCnt++; - break; - case 39: - rd.dayDigit0 |= (bit << 3); - if (bit == 1) - rd.dateOneCnt++; - break; - case 40: - rd.dayDigit1 = 0; - rd.dayDigit1 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 41: - rd.dayDigit1 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 42: - rd.weekdayDigit0 = 0; - rd.weekdayDigit0 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 43: - rd.weekdayDigit0 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 44: - rd.weekdayDigit0 |= (bit << 2); - if (bit == 1) - rd.dateOneCnt++; - break; - case 45: - rd.monthDigit0 = 0; - rd.monthDigit0 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 46: - rd.monthDigit0 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 47: - rd.monthDigit0 |= (bit << 2); - if (bit == 1) - rd.dateOneCnt++; - break; - case 48: - rd.monthDigit0 |= (bit << 3); - if (bit == 1) - rd.dateOneCnt++; - break; - case 49: - rd.monthDigit1 = 0; - rd.monthDigit1 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 50: - rd.yearDigit0 = 0; - rd.yearDigit0 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 51: - rd.yearDigit0 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 52: - rd.yearDigit0 |= (bit << 2); - if (bit == 1) - rd.dateOneCnt++; - break; - case 53: - rd.yearDigit0 |= (bit << 3); - if (bit == 1) - rd.dateOneCnt++; - break; - case 54: - rd.yearDigit1 = 0; - rd.yearDigit1 |= bit; - if (bit == 1) - rd.dateOneCnt++; - break; - case 55: - rd.yearDigit1 |= (bit << 1); - if (bit == 1) - rd.dateOneCnt++; - break; - case 56: - rd.yearDigit1 |= (bit << 2); - if (bit == 1) - rd.dateOneCnt++; - break; - case 57: - rd.yearDigit1 |= (bit << 3); - if (bit == 1) - rd.dateOneCnt++; - break; - case 58: - rd.dateOneCnt += bit; - if (rd.dateOneCnt % 2 != 0) { - printf("DATE INVALID\n"); - setValid(0); - } else { - printf("DAY %u %u\n", rd.dayDigit0, rd.dayDigit1); - printf("WEEKDAY %u\n", rd.weekdayDigit0); - printf("MONTH %u %u\n", rd.monthDigit0, rd.monthDigit1); - printf("YEAR %u %u\n", rd.yearDigit0, rd.yearDigit1); - - clockSetClock(rd.yearDigit0 + rd.yearDigit1 * 10, - rd.monthDigit0 + rd.monthDigit1 * 10, - rd.dayDigit0 + rd.dayDigit1 * 10, - rd.weekdayDigit0, - rd.hourDigit0 + rd.hourDigit1 * 10, - rd.minuteDigit0 + rd.minuteDigit1 * 10); - - setValid(2); - } - break; - case 59: - break; - default: - valid = 0; - break; - } - - printf("%02d:%02d:%02d %02d.%02d.%02d %d %d %02d %d %d %d %d %d\n", - clock.hour, clock.minute, clock.second, - clock.day, clock.month, clock.year, clock.weekday, - valid, state, bit, pulse, gap, validCnt, timeValidCnt); - - state++; - } else { - - printf("%02d:%02d:%02d %02d.%02d.%02d %d %d %02d %d %d %d %d %d\n", - clock.hour, clock.minute, clock.second, - clock.day, clock.month, clock.year, clock.weekday, - valid, state, bit, pulse, gap, validCnt, timeValidCnt); - } + if (clockNextSecond()) { + clock_t clock = clockGetClock(); + printf("Time: %02d:%02d:%02d %d %02d.%02d.%02d\n", + clock.year, clock.month, clock.day, clock.weekday, + clock.hour, clock.minute, clock.second); } if (clockNextMinute()) { opTime_t opTime = clockGetOpTime(); - printf("% 4d:%02d:%02d\n", opTime.hour, opTime.minute, opTime.second); - } - - if (clockNextStep()) { - stepperEngine(); - } - - if (clockNextTack()) { - validLedEngine(valid); + printf("OpTime: % 4d:%02d:%02d\n", opTime.hour, opTime.minute, opTime.second); } } diff --git a/src/stepper.c b/src/stepper.c index 3ada504..6e4e935 100644 --- a/src/stepper.c +++ b/src/stepper.c @@ -4,7 +4,6 @@ #include -#include "main.h" #include "clock.h" #include "stepper.h" @@ -138,130 +137,133 @@ void stepperEngine() { static uint8_t hourStepPosition = 0; static int8_t hourDirection = 0; - clock_t clock = clockGetClock(); - switch (stepperState) { - case 0: - //printf("0 "); - if (stepperEnableFlag == 1) { - // is current minute position different from desired one? - minuteStepPosition = clock.minute * STEPS_PER_MINUTE; + if (clockNextStep()) { - if (currentMinutePosition != minuteStepPosition) { - printf("M:\n"); + clock_t clock = clockGetClock(); - stepperState = 1; + switch (stepperState) { + case 0: + //printf("0 "); + if (stepperEnableFlag == 1) { + // is current minute position different from desired one? + minuteStepPosition = clock.minute * STEPS_PER_MINUTE; + + if (currentMinutePosition != minuteStepPosition) { + printf("M:\n"); + + stepperState = 1; + } } - } - break; - case 1: - printf("1 "); - // switch on the minute motor and set the direction - minuteMotorEnable(); + break; + case 1: + printf("1 "); + // switch on the minute motor and set the direction + minuteMotorEnable(); - if (currentMinutePosition > minuteStepPosition) { - printf("b\n"); - minuteDirection = -1; - minuteMotorBackward(); - } else { - printf("f\n"); - minuteDirection = 1; - minuteMotorForward(); - } + if (currentMinutePosition > minuteStepPosition) { + printf("b\n"); + minuteDirection = -1; + minuteMotorBackward(); + } else { + printf("f\n"); + minuteDirection = 1; + minuteMotorForward(); + } - stepperState = 2; - break; - case 2: - printf("2 "); + stepperState = 2; + break; + case 2: + printf("2 "); - // move one step + // move one step - printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition); + printf("d: %d, c: %d\n", minuteStepPosition, currentMinutePosition); - currentMinutePosition += minuteDirection; + currentMinutePosition += minuteDirection; - minuteMotorPulse(); + minuteMotorPulse(); - if (currentMinutePosition == minuteStepPosition) { - stepperState = 3; - } - break; - case 3: - printf("3\n"); + if (currentMinutePosition == minuteStepPosition) { + stepperState = 3; + } + break; + case 3: + printf("3\n"); - // switch off the minute motor - minuteMotorDisable(); + // switch off the minute motor + minuteMotorDisable(); - stepperState = 4; - break; - case 4: - printf("4 "); + stepperState = 4; + break; + case 4: + printf("4 "); - // is current hour position different from desired one? - hourStepPosition = clock.hour * STEPS_PER_HOUR; + // is current hour position different from desired one? + hourStepPosition = clock.hour * STEPS_PER_HOUR; - if (currentHourPosition != hourStepPosition) { - printf(" H:\n"); + if (currentHourPosition != hourStepPosition) { + printf(" H:\n"); + + stepperState = 5; + } else { + // done + printf("\n"); + stepperState = 0; + } + break; + case 5: + printf("5 "); + + // switch on the hour motor and set the direction + hourMotorEnable(); + + if (currentHourPosition > hourStepPosition) { + printf("b\n"); + hourDirection = -1; + hourMotorBackward(); + } else { + printf("f\n"); + hourDirection = 1; + hourMotorForward(); + } + + stepperState = 6; + break; + case 6: + printf("6 "); + + // move one step + + printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition); + + currentHourPosition += hourDirection; + + hourMotorPulse(); + + if (currentHourPosition == hourStepPosition) { + stepperState = 7; + } + break; + case 7: + printf("7\n"); + + // switch off the hour motor + hourMotorDisable(); + + stepperState = 8; + break; + case 8: + printf("8\n"); - stepperState = 5; - } else { // done - printf("\n"); stepperState = 0; + break; + default: + printf("default\n"); + stepperState = 0; + break; } - break; - case 5: - printf("5 "); - - // switch on the hour motor and set the direction - hourMotorEnable(); - - if (currentHourPosition > hourStepPosition) { - printf("b\n"); - hourDirection = -1; - hourMotorBackward(); - } else { - printf("f\n"); - hourDirection = 1; - hourMotorForward(); - } - - stepperState = 6; - break; - case 6: - printf("6 "); - - // move one step - - printf("d: %d, c: %d\n", hourStepPosition, currentHourPosition); - - currentHourPosition += hourDirection; - - hourMotorPulse(); - - if (currentHourPosition == hourStepPosition) { - stepperState = 7; - } - break; - case 7: - printf("7\n"); - - // switch off the hour motor - hourMotorDisable(); - - stepperState = 8; - break; - case 8: - printf("8\n"); - - // done - stepperState = 0; - break; - default: - printf("default\n"); - stepperState = 0; - break; } - } diff --git a/src/stepper.h b/src/stepper.h index e308600..ef0e82a 100644 --- a/src/stepper.h +++ b/src/stepper.h @@ -2,7 +2,6 @@ #define STEPPER_H_ #include -#include "main.h" #include "clock.h" #define STEPS_PER_MINUTE 3 diff --git a/src/validLed.c b/src/validLed.c index 8826538..f2e6334 100644 --- a/src/validLed.c +++ b/src/validLed.c @@ -1,7 +1,7 @@ #include #include -#include "main.h" +#include "clock.h" #define VALID_LED_REG_DIR DDRB @@ -16,6 +16,11 @@ #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); @@ -41,35 +46,37 @@ void validLedInit() { } -void validLedEngine(uint8_t valid) { +void validLedEngine() { static uint8_t ledToggle = 0; - uint8_t light = isNotDark(); - switch (valid) { - case 0: - validLedDisable(); - break; - case 1: - if (ledToggle != 0) { - ledToggle = 0; + if (clockNextBlink()) { + uint8_t light = isNotDark(); + + switch (validLedStatus) { + case 0: validLedDisable(); - } else { - ledToggle = 1; + 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; } - break; - case 2: - if (light != 0) { - validLedEnable(); - } else { - validLedDisable(); - } - break; } - } diff --git a/src/validLed.h b/src/validLed.h index 814941d..5dadb79 100644 --- a/src/validLed.h +++ b/src/validLed.h @@ -4,7 +4,8 @@ void validLedInit(); -void validLedEngine(uint8_t valid); +void validLedEngine(); +void validLedSetStatus(uint8_t x); #endif /* VALIDLED_H_ */