Wecker-Library
Dependents: Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD
Diff: Wecker.cpp
- Revision:
- 0:6f0b18518e88
- Child:
- 1:ade7876100e2
diff -r 000000000000 -r 6f0b18518e88 Wecker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Wecker.cpp Thu Apr 30 10:35:04 2015 +0000 @@ -0,0 +1,183 @@ +#include "mbed.h" +#include "LCD.h" +#include "const.h" +#include "RTC8563.h" +#include "Wecker.h" + +char week; +int hour, minute, sec; +int hrse, hrsz, mine, minz, sece, secz; +int ahour, aminute, ahrse, ahrsz, amine, aminz; +int nextStd, nextMin; +typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state; +state Mode=Normal; +Ticker tick1; +Timer tim1,tim2; + +RTC8563 rtc; +Serial pc(USBTX, USBRX); +I2C i2c(p28, p27); +LCD lcd(p11, p6, p7, p8, p9, p10); + +InterruptIn swStd(P1_16); +InterruptIn swMin(P0_23); +InterruptIn swSlp(P0_10); + +Wecker::Wecker() +{ + swStd.rise(this, &Wecker::btn1); + swMin.rise(this, &Wecker::btn2); + swSlp.rise(this, &Wecker::btn3); + //tick1.attach(this, &Wecker::tickHold,0.1); +} + +void Wecker::printTime() +{ + lcd.home(); + week = rtc.rtc_read(WEEKDAYS); + hour = rtc.rtc_read(HOURS); + minute = rtc.rtc_read(MINUTES); + sec = rtc.rtc_read(SECONDS); + + hrsz = ((hour >> 4)&0x03) + 48; + hrse = (hour & 0x0F) + 48; + minz = (minute >> 4) + 48; + mine = (minute & 0x0F) + 48; + secz = (sec >> 4) + 48; + sece = (sec & 0x0F) + 48; + + lcd.data(hrsz); + lcd.data(hrse); + lcd.string(":"); + lcd.data(minz); + lcd.data(mine); + lcd.string(":"); + lcd.data(secz); + lcd.data(sece); +} +int Wecker::bcd(int dec) +{ + return ((dec/10)<<4)+(dec%10); +} +int Wecker::unbcd(int bcd) +{ + return ((bcd>>4)*10)+(bcd%16); +} + +void Wecker::printAlarmTime() +{ + lcd.setcursor(0,2); + ahour = rtc.rtc_read(HOUR_ALARM); + aminute = rtc.rtc_read(MINUTE_ALARM); + + ahrsz = ((ahour >> 4)&0x03) + 48; + ahrse = (ahour & 0x0F) + 48; + aminz = (aminute >> 4) + 48; + amine = (aminute & 0x0F) + 48; + + lcd.string("Alarm:"); + lcd.data(ahrsz); + lcd.data(ahrse); + lcd.string(":"); + lcd.data(aminz); + lcd.data(amine); + lcd.string(":00"); + +} + +void Wecker::btn1() +{ + switch (Mode) { + case Normal: + int nextStd = unbcd(rtc.rtc_read(HOURS)); + if (nextStd>=23) + nextStd=0; + else + nextStd++; + rtc.rtc_write(HOURS, bcd(nextStd)); + while(swStd==1); + break; + case setAlarm: + nextStd = unbcd(rtc.rtc_read(HOUR_ALARM)); + if (nextStd>=23) + nextStd=0; + else + nextStd++; + rtc.rtc_write(HOUR_ALARM, bcd(nextStd)); + while(swStd==1); + break; + } +} + +void Wecker::btn2() +{ + switch (Mode) { + case Normal: + nextMin = unbcd(rtc.rtc_read(MINUTES)); + if (nextMin>=59) + nextMin=0; + else + nextMin++; + rtc.rtc_write(MINUTES, bcd(nextMin)); + while(swStd==1); + break; + case setAlarm: + nextMin = unbcd(rtc.rtc_read(MINUTE_ALARM)); + if (nextMin>=59) + nextMin=0; + else + nextMin++; + rtc.rtc_write(MINUTE_ALARM, bcd(nextMin)); + while(swStd==1); + break; + } +} + +void Wecker::tickHold() +{ + switch (Mode) { + case Normal: + if (swSlp==1) + tim2.start(); + if ((swStd==1&&tim2.read()<5.0)||(swMin==1&&tim2.read()<5.0)) { + Mode =setAlarm; + tim2.stop(); + tim2.reset(); + } else { + tim2.stop(); + tim2.reset(); + } + break; + case AlarmOn: + if (swSlp==1) + tim1.start(); + while(swSlp==1); + tim1.stop(); + if (tim1.read()>=3.0) + Mode = Normal; + tim1.reset(); + break; + case Sleep: + if (swSlp==1) + tim1.start(); + while(swSlp==1); + tim1.stop(); + if (tim1.read()>=3.0) + Mode = Normal; + tim1.reset(); + break; + } +} + +void Wecker::btn3() +{ + switch (Mode) { + case Normal: + tim1.start(); + while(swSlp==1); + tim1.stop(); + if (tim1.read()>=3.0) + Mode = Alarm; + tim1.reset(); + } +} \ No newline at end of file