LED Digital Clock
DigitakClock.cpp@4:3b57eeb896a2, 2015-10-23 (annotated)
- Committer:
- takashikojo
- Date:
- Fri Oct 23 05:51:12 2015 +0000
- Revision:
- 4:3b57eeb896a2
- Parent:
- 3:ad3301aff314
Initial public version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takashikojo | 0:ae969dd370ab | 1 | #include "mbed.h" |
takashikojo | 0:ae969dd370ab | 2 | #include "DigitalClock.h" |
takashikojo | 2:c374349d4902 | 3 | #include <algorithm> |
takashikojo | 2:c374349d4902 | 4 | |
takashikojo | 0:ae969dd370ab | 5 | #if 0 |
takashikojo | 2:c374349d4902 | 6 | //Enable debug |
takashikojo | 2:c374349d4902 | 7 | #define DBG(x, ...) std::printf("[DigitalClock : DBG]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 2:c374349d4902 | 8 | #define WARN(x, ...) std::printf("[DigitalClock : WARN]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 2:c374349d4902 | 9 | #else |
takashikojo | 2:c374349d4902 | 10 | //Disable debug |
takashikojo | 2:c374349d4902 | 11 | #define DBG(x, ...) |
takashikojo | 2:c374349d4902 | 12 | #define WARN(x, ...) |
takashikojo | 0:ae969dd370ab | 13 | #endif |
takashikojo | 2:c374349d4902 | 14 | |
takashikojo | 2:c374349d4902 | 15 | #define ERR(x, ...) std::printf("[DigitalClock : ERR]"x"\r\n", ##__VA_ARGS__); |
takashikojo | 2:c374349d4902 | 16 | |
takashikojo | 0:ae969dd370ab | 17 | DigitalClock::DigitalClock (PinName seg0, PinName seg1, PinName seg2, PinName seg3, |
takashikojo | 0:ae969dd370ab | 18 | PinName seg4, PinName seg5, PinName seg6, PinName dot, |
takashikojo | 0:ae969dd370ab | 19 | PinName digit0, PinName digit1, PinName digit2, PinName digit3 |
takashikojo | 0:ae969dd370ab | 20 | ) : |
takashikojo | 0:ae969dd370ab | 21 | FourDigitLED(seg0, seg1, seg2, seg3, seg4, seg5, seg6, dot, digit0, digit1, digit2, digit3) |
takashikojo | 0:ae969dd370ab | 22 | { |
takashikojo | 0:ae969dd370ab | 23 | maxHour = 24 ; |
takashikojo | 2:c374349d4902 | 24 | blink = 0 ; |
takashikojo | 2:c374349d4902 | 25 | optionActive = false ; |
takashikojo | 2:c374349d4902 | 26 | optionCount = 0 ; |
takashikojo | 3:ad3301aff314 | 27 | updateLED = true ; |
takashikojo | 2:c374349d4902 | 28 | for(int j=0; j<AC_OPTION_NUM; j++) |
takashikojo | 2:c374349d4902 | 29 | for(int i=0; i<4; i++)optVal[j][i] = 0x0 ; |
takashikojo | 0:ae969dd370ab | 30 | } ; |
takashikojo | 0:ae969dd370ab | 31 | |
takashikojo | 0:ae969dd370ab | 32 | DigitalClock::~DigitalClock(void){ } ; |
takashikojo | 0:ae969dd370ab | 33 | |
takashikojo | 0:ae969dd370ab | 34 | void DigitalClock::start(void) { |
takashikojo | 3:ad3301aff314 | 35 | updateLED = true ; |
takashikojo | 0:ae969dd370ab | 36 | } |
takashikojo | 0:ae969dd370ab | 37 | |
takashikojo | 0:ae969dd370ab | 38 | void DigitalClock::stop(void) { |
takashikojo | 3:ad3301aff314 | 39 | updateLED = false ; |
takashikojo | 0:ae969dd370ab | 40 | } |
takashikojo | 0:ae969dd370ab | 41 | |
takashikojo | 0:ae969dd370ab | 42 | bool DigitalClock::setLED(int h, int m) { |
takashikojo | 0:ae969dd370ab | 43 | if(((h >= 0)&&(h<maxHour)) && ((m >= 0)&&(m<60))){ |
takashikojo | 4:3b57eeb896a2 | 44 | |
takashikojo | 4:3b57eeb896a2 | 45 | setNum(3, (h/10)==0?-1:(h/10)) ; /* leading zero suppress */ |
takashikojo | 0:ae969dd370ab | 46 | setNum(2, h%10) ; |
takashikojo | 0:ae969dd370ab | 47 | setNum(1, m/10) ; |
takashikojo | 0:ae969dd370ab | 48 | setNum(0, m%10) ; |
takashikojo | 0:ae969dd370ab | 49 | return true ; |
takashikojo | 0:ae969dd370ab | 50 | } |
takashikojo | 0:ae969dd370ab | 51 | return false ; |
takashikojo | 0:ae969dd370ab | 52 | } |
takashikojo | 0:ae969dd370ab | 53 | |
takashikojo | 0:ae969dd370ab | 54 | void DigitalClock::flashLED(void) { |
takashikojo | 0:ae969dd370ab | 55 | #define JST (9*60*60) |
takashikojo | 0:ae969dd370ab | 56 | struct tm local; |
takashikojo | 0:ae969dd370ab | 57 | time_t ctTime; |
takashikojo | 1:3c9a2c4733fa | 58 | |
takashikojo | 2:c374349d4902 | 59 | basePulse++ ; |
takashikojo | 2:c374349d4902 | 60 | |
takashikojo | 2:c374349d4902 | 61 | if((blink == 1) && ((basePulse%2) ==0)){ |
takashikojo | 2:c374349d4902 | 62 | setNum(3, -1) ; setNum(2, -1) ; setNum(1, -1) ; setNum(0, -1) ; |
takashikojo | 2:c374349d4902 | 63 | return ; |
takashikojo | 2:c374349d4902 | 64 | } |
takashikojo | 2:c374349d4902 | 65 | if((blink == 2) && ((basePulse%5) ==0)){ |
takashikojo | 1:3c9a2c4733fa | 66 | setNum(3, -1) ; setNum(2, -1) ; setNum(1, -1) ; setNum(0, -1) ; |
takashikojo | 1:3c9a2c4733fa | 67 | return ; |
takashikojo | 1:3c9a2c4733fa | 68 | } |
takashikojo | 2:c374349d4902 | 69 | |
takashikojo | 0:ae969dd370ab | 70 | ctTime = time(NULL) + JST ; |
takashikojo | 0:ae969dd370ab | 71 | local = *localtime(&ctTime); |
takashikojo | 2:c374349d4902 | 72 | #define SET_PTN(index) for(int i=0; i<4; i++)setPtn(i, optVal[index][i], 0x7f) ; |
takashikojo | 2:c374349d4902 | 73 | #define TIME_DISP (8*4) |
takashikojo | 2:c374349d4902 | 74 | if(optionActive) { |
takashikojo | 2:c374349d4902 | 75 | optionCount ++ ; |
takashikojo | 2:c374349d4902 | 76 | if(optionCount < optNum){ |
takashikojo | 3:ad3301aff314 | 77 | SET_PTN(optionCount) ; |
takashikojo | 2:c374349d4902 | 78 | } else { |
takashikojo | 2:c374349d4902 | 79 | setLED(local.tm_hour, local.tm_min) ; |
takashikojo | 2:c374349d4902 | 80 | } |
takashikojo | 2:c374349d4902 | 81 | if(optionCount > (optNum + TIME_DISP)) |
takashikojo | 2:c374349d4902 | 82 | optionCount = 0 ; |
takashikojo | 2:c374349d4902 | 83 | } else setLED(local.tm_hour, local.tm_min) ; |
takashikojo | 0:ae969dd370ab | 84 | } |
takashikojo | 0:ae969dd370ab | 85 | |
takashikojo | 3:ad3301aff314 | 86 | |
takashikojo | 1:3c9a2c4733fa | 87 | void DigitalClock::setBlink(bool sw) |
takashikojo | 1:3c9a2c4733fa | 88 | { |
takashikojo | 1:3c9a2c4733fa | 89 | blink = sw ; |
takashikojo | 1:3c9a2c4733fa | 90 | } |
takashikojo | 1:3c9a2c4733fa | 91 | |
takashikojo | 2:c374349d4902 | 92 | void DigitalClock::setOptVal(const int index, const unsigned int v[], int times) { |
takashikojo | 2:c374349d4902 | 93 | if(index >= AC_OPTION_NUM)return ; |
takashikojo | 2:c374349d4902 | 94 | DBG("optVal[%d]=%02x,%02x,%02x,%02x\n",index, v[0], v[1], v[2], v[3]) ; |
takashikojo | 2:c374349d4902 | 95 | for(int j=0; j<4; j++)optVal[index][j] = v[j] ; |
takashikojo | 2:c374349d4902 | 96 | optTimes[index] = times ; |
takashikojo | 2:c374349d4902 | 97 | optNum = max(optNum, index+1) ; |
takashikojo | 3:ad3301aff314 | 98 | } |
takashikojo | 3:ad3301aff314 | 99 | |
takashikojo | 3:ad3301aff314 | 100 | static int pollCount = 0 ; |
takashikojo | 3:ad3301aff314 | 101 | void DigitalClock::poll(void) |
takashikojo | 3:ad3301aff314 | 102 | { |
takashikojo | 3:ad3301aff314 | 103 | #define PER_200mSEC(count)((count%200)==0) |
takashikojo | 3:ad3301aff314 | 104 | #define PER_5mSEC(count) ((count%5)==0) |
takashikojo | 3:ad3301aff314 | 105 | |
takashikojo | 3:ad3301aff314 | 106 | pollCount++ ; |
takashikojo | 3:ad3301aff314 | 107 | if(updateLED && PER_200mSEC(pollCount)) |
takashikojo | 3:ad3301aff314 | 108 | flashLED() ; |
takashikojo | 3:ad3301aff314 | 109 | if(PER_5mSEC(pollCount)) |
takashikojo | 3:ad3301aff314 | 110 | scanDigit() ; |
takashikojo | 2:c374349d4902 | 111 | } |