Wecker-Library

Dependents:   Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD

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