LED Digital Clock

Dependents:   IF-SmartClock

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?

UserRevisionLine numberNew 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 }