Wecker-Library

Dependents:   Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD

Committer:
wolpra98
Date:
Thu Apr 30 10:35:04 2015 +0000
Revision:
0:6f0b18518e88
Child:
1:ade7876100e2
Wecker;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wolpra98 0:6f0b18518e88 1 #include "mbed.h"
wolpra98 0:6f0b18518e88 2 #include "LCD.h"
wolpra98 0:6f0b18518e88 3 #include "const.h"
wolpra98 0:6f0b18518e88 4 #include "RTC8563.h"
wolpra98 0:6f0b18518e88 5 #include "Wecker.h"
wolpra98 0:6f0b18518e88 6
wolpra98 0:6f0b18518e88 7 char week;
wolpra98 0:6f0b18518e88 8 int hour, minute, sec;
wolpra98 0:6f0b18518e88 9 int hrse, hrsz, mine, minz, sece, secz;
wolpra98 0:6f0b18518e88 10 int ahour, aminute, ahrse, ahrsz, amine, aminz;
wolpra98 0:6f0b18518e88 11 int nextStd, nextMin;
wolpra98 0:6f0b18518e88 12 typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state;
wolpra98 0:6f0b18518e88 13 state Mode=Normal;
wolpra98 0:6f0b18518e88 14 Ticker tick1;
wolpra98 0:6f0b18518e88 15 Timer tim1,tim2;
wolpra98 0:6f0b18518e88 16
wolpra98 0:6f0b18518e88 17 RTC8563 rtc;
wolpra98 0:6f0b18518e88 18 Serial pc(USBTX, USBRX);
wolpra98 0:6f0b18518e88 19 I2C i2c(p28, p27);
wolpra98 0:6f0b18518e88 20 LCD lcd(p11, p6, p7, p8, p9, p10);
wolpra98 0:6f0b18518e88 21
wolpra98 0:6f0b18518e88 22 InterruptIn swStd(P1_16);
wolpra98 0:6f0b18518e88 23 InterruptIn swMin(P0_23);
wolpra98 0:6f0b18518e88 24 InterruptIn swSlp(P0_10);
wolpra98 0:6f0b18518e88 25
wolpra98 0:6f0b18518e88 26 Wecker::Wecker()
wolpra98 0:6f0b18518e88 27 {
wolpra98 0:6f0b18518e88 28 swStd.rise(this, &Wecker::btn1);
wolpra98 0:6f0b18518e88 29 swMin.rise(this, &Wecker::btn2);
wolpra98 0:6f0b18518e88 30 swSlp.rise(this, &Wecker::btn3);
wolpra98 0:6f0b18518e88 31 //tick1.attach(this, &Wecker::tickHold,0.1);
wolpra98 0:6f0b18518e88 32 }
wolpra98 0:6f0b18518e88 33
wolpra98 0:6f0b18518e88 34 void Wecker::printTime()
wolpra98 0:6f0b18518e88 35 {
wolpra98 0:6f0b18518e88 36 lcd.home();
wolpra98 0:6f0b18518e88 37 week = rtc.rtc_read(WEEKDAYS);
wolpra98 0:6f0b18518e88 38 hour = rtc.rtc_read(HOURS);
wolpra98 0:6f0b18518e88 39 minute = rtc.rtc_read(MINUTES);
wolpra98 0:6f0b18518e88 40 sec = rtc.rtc_read(SECONDS);
wolpra98 0:6f0b18518e88 41
wolpra98 0:6f0b18518e88 42 hrsz = ((hour >> 4)&0x03) + 48;
wolpra98 0:6f0b18518e88 43 hrse = (hour & 0x0F) + 48;
wolpra98 0:6f0b18518e88 44 minz = (minute >> 4) + 48;
wolpra98 0:6f0b18518e88 45 mine = (minute & 0x0F) + 48;
wolpra98 0:6f0b18518e88 46 secz = (sec >> 4) + 48;
wolpra98 0:6f0b18518e88 47 sece = (sec & 0x0F) + 48;
wolpra98 0:6f0b18518e88 48
wolpra98 0:6f0b18518e88 49 lcd.data(hrsz);
wolpra98 0:6f0b18518e88 50 lcd.data(hrse);
wolpra98 0:6f0b18518e88 51 lcd.string(":");
wolpra98 0:6f0b18518e88 52 lcd.data(minz);
wolpra98 0:6f0b18518e88 53 lcd.data(mine);
wolpra98 0:6f0b18518e88 54 lcd.string(":");
wolpra98 0:6f0b18518e88 55 lcd.data(secz);
wolpra98 0:6f0b18518e88 56 lcd.data(sece);
wolpra98 0:6f0b18518e88 57 }
wolpra98 0:6f0b18518e88 58 int Wecker::bcd(int dec)
wolpra98 0:6f0b18518e88 59 {
wolpra98 0:6f0b18518e88 60 return ((dec/10)<<4)+(dec%10);
wolpra98 0:6f0b18518e88 61 }
wolpra98 0:6f0b18518e88 62 int Wecker::unbcd(int bcd)
wolpra98 0:6f0b18518e88 63 {
wolpra98 0:6f0b18518e88 64 return ((bcd>>4)*10)+(bcd%16);
wolpra98 0:6f0b18518e88 65 }
wolpra98 0:6f0b18518e88 66
wolpra98 0:6f0b18518e88 67 void Wecker::printAlarmTime()
wolpra98 0:6f0b18518e88 68 {
wolpra98 0:6f0b18518e88 69 lcd.setcursor(0,2);
wolpra98 0:6f0b18518e88 70 ahour = rtc.rtc_read(HOUR_ALARM);
wolpra98 0:6f0b18518e88 71 aminute = rtc.rtc_read(MINUTE_ALARM);
wolpra98 0:6f0b18518e88 72
wolpra98 0:6f0b18518e88 73 ahrsz = ((ahour >> 4)&0x03) + 48;
wolpra98 0:6f0b18518e88 74 ahrse = (ahour & 0x0F) + 48;
wolpra98 0:6f0b18518e88 75 aminz = (aminute >> 4) + 48;
wolpra98 0:6f0b18518e88 76 amine = (aminute & 0x0F) + 48;
wolpra98 0:6f0b18518e88 77
wolpra98 0:6f0b18518e88 78 lcd.string("Alarm:");
wolpra98 0:6f0b18518e88 79 lcd.data(ahrsz);
wolpra98 0:6f0b18518e88 80 lcd.data(ahrse);
wolpra98 0:6f0b18518e88 81 lcd.string(":");
wolpra98 0:6f0b18518e88 82 lcd.data(aminz);
wolpra98 0:6f0b18518e88 83 lcd.data(amine);
wolpra98 0:6f0b18518e88 84 lcd.string(":00");
wolpra98 0:6f0b18518e88 85
wolpra98 0:6f0b18518e88 86 }
wolpra98 0:6f0b18518e88 87
wolpra98 0:6f0b18518e88 88 void Wecker::btn1()
wolpra98 0:6f0b18518e88 89 {
wolpra98 0:6f0b18518e88 90 switch (Mode) {
wolpra98 0:6f0b18518e88 91 case Normal:
wolpra98 0:6f0b18518e88 92 int nextStd = unbcd(rtc.rtc_read(HOURS));
wolpra98 0:6f0b18518e88 93 if (nextStd>=23)
wolpra98 0:6f0b18518e88 94 nextStd=0;
wolpra98 0:6f0b18518e88 95 else
wolpra98 0:6f0b18518e88 96 nextStd++;
wolpra98 0:6f0b18518e88 97 rtc.rtc_write(HOURS, bcd(nextStd));
wolpra98 0:6f0b18518e88 98 while(swStd==1);
wolpra98 0:6f0b18518e88 99 break;
wolpra98 0:6f0b18518e88 100 case setAlarm:
wolpra98 0:6f0b18518e88 101 nextStd = unbcd(rtc.rtc_read(HOUR_ALARM));
wolpra98 0:6f0b18518e88 102 if (nextStd>=23)
wolpra98 0:6f0b18518e88 103 nextStd=0;
wolpra98 0:6f0b18518e88 104 else
wolpra98 0:6f0b18518e88 105 nextStd++;
wolpra98 0:6f0b18518e88 106 rtc.rtc_write(HOUR_ALARM, bcd(nextStd));
wolpra98 0:6f0b18518e88 107 while(swStd==1);
wolpra98 0:6f0b18518e88 108 break;
wolpra98 0:6f0b18518e88 109 }
wolpra98 0:6f0b18518e88 110 }
wolpra98 0:6f0b18518e88 111
wolpra98 0:6f0b18518e88 112 void Wecker::btn2()
wolpra98 0:6f0b18518e88 113 {
wolpra98 0:6f0b18518e88 114 switch (Mode) {
wolpra98 0:6f0b18518e88 115 case Normal:
wolpra98 0:6f0b18518e88 116 nextMin = unbcd(rtc.rtc_read(MINUTES));
wolpra98 0:6f0b18518e88 117 if (nextMin>=59)
wolpra98 0:6f0b18518e88 118 nextMin=0;
wolpra98 0:6f0b18518e88 119 else
wolpra98 0:6f0b18518e88 120 nextMin++;
wolpra98 0:6f0b18518e88 121 rtc.rtc_write(MINUTES, bcd(nextMin));
wolpra98 0:6f0b18518e88 122 while(swStd==1);
wolpra98 0:6f0b18518e88 123 break;
wolpra98 0:6f0b18518e88 124 case setAlarm:
wolpra98 0:6f0b18518e88 125 nextMin = unbcd(rtc.rtc_read(MINUTE_ALARM));
wolpra98 0:6f0b18518e88 126 if (nextMin>=59)
wolpra98 0:6f0b18518e88 127 nextMin=0;
wolpra98 0:6f0b18518e88 128 else
wolpra98 0:6f0b18518e88 129 nextMin++;
wolpra98 0:6f0b18518e88 130 rtc.rtc_write(MINUTE_ALARM, bcd(nextMin));
wolpra98 0:6f0b18518e88 131 while(swStd==1);
wolpra98 0:6f0b18518e88 132 break;
wolpra98 0:6f0b18518e88 133 }
wolpra98 0:6f0b18518e88 134 }
wolpra98 0:6f0b18518e88 135
wolpra98 0:6f0b18518e88 136 void Wecker::tickHold()
wolpra98 0:6f0b18518e88 137 {
wolpra98 0:6f0b18518e88 138 switch (Mode) {
wolpra98 0:6f0b18518e88 139 case Normal:
wolpra98 0:6f0b18518e88 140 if (swSlp==1)
wolpra98 0:6f0b18518e88 141 tim2.start();
wolpra98 0:6f0b18518e88 142 if ((swStd==1&&tim2.read()<5.0)||(swMin==1&&tim2.read()<5.0)) {
wolpra98 0:6f0b18518e88 143 Mode =setAlarm;
wolpra98 0:6f0b18518e88 144 tim2.stop();
wolpra98 0:6f0b18518e88 145 tim2.reset();
wolpra98 0:6f0b18518e88 146 } else {
wolpra98 0:6f0b18518e88 147 tim2.stop();
wolpra98 0:6f0b18518e88 148 tim2.reset();
wolpra98 0:6f0b18518e88 149 }
wolpra98 0:6f0b18518e88 150 break;
wolpra98 0:6f0b18518e88 151 case AlarmOn:
wolpra98 0:6f0b18518e88 152 if (swSlp==1)
wolpra98 0:6f0b18518e88 153 tim1.start();
wolpra98 0:6f0b18518e88 154 while(swSlp==1);
wolpra98 0:6f0b18518e88 155 tim1.stop();
wolpra98 0:6f0b18518e88 156 if (tim1.read()>=3.0)
wolpra98 0:6f0b18518e88 157 Mode = Normal;
wolpra98 0:6f0b18518e88 158 tim1.reset();
wolpra98 0:6f0b18518e88 159 break;
wolpra98 0:6f0b18518e88 160 case Sleep:
wolpra98 0:6f0b18518e88 161 if (swSlp==1)
wolpra98 0:6f0b18518e88 162 tim1.start();
wolpra98 0:6f0b18518e88 163 while(swSlp==1);
wolpra98 0:6f0b18518e88 164 tim1.stop();
wolpra98 0:6f0b18518e88 165 if (tim1.read()>=3.0)
wolpra98 0:6f0b18518e88 166 Mode = Normal;
wolpra98 0:6f0b18518e88 167 tim1.reset();
wolpra98 0:6f0b18518e88 168 break;
wolpra98 0:6f0b18518e88 169 }
wolpra98 0:6f0b18518e88 170 }
wolpra98 0:6f0b18518e88 171
wolpra98 0:6f0b18518e88 172 void Wecker::btn3()
wolpra98 0:6f0b18518e88 173 {
wolpra98 0:6f0b18518e88 174 switch (Mode) {
wolpra98 0:6f0b18518e88 175 case Normal:
wolpra98 0:6f0b18518e88 176 tim1.start();
wolpra98 0:6f0b18518e88 177 while(swSlp==1);
wolpra98 0:6f0b18518e88 178 tim1.stop();
wolpra98 0:6f0b18518e88 179 if (tim1.read()>=3.0)
wolpra98 0:6f0b18518e88 180 Mode = Alarm;
wolpra98 0:6f0b18518e88 181 tim1.reset();
wolpra98 0:6f0b18518e88 182 }
wolpra98 0:6f0b18518e88 183 }