Projekt-Alarmclock

Dependencies:   LCD RTC8563 Wecker mbed

Revision:
1:b71a6c225c2b
Parent:
0:bb9c3f242f5a
Child:
2:d3708e92660f
--- a/main.cpp	Thu Apr 30 10:38:17 2015 +0000
+++ b/main.cpp	Fri May 29 12:01:00 2015 +0000
@@ -4,14 +4,209 @@
 #include "RTC8563.h"
 #include "Wecker.h"
 
+Wecker wecker;
 
-Wecker wecker;
+void btnStdr();
+void btnMinr();
+void btnSlpr();
+void btnSlpf();
+void tickControll();
+
+typedef enum {Normal, setAlarm, AlarmOn, Alarm, Sleep} state;
+state Mode=Normal;
+char sMode[2];
+
+Ticker tick1;
+Timer tim1,tim2,tim3;
+
+InterruptIn swStd(P0_15);
+InterruptIn swMin(P0_23);
+InterruptIn swSlp(P0_10);
+DigitalIn alarm(P1_28);
+DigitalOut myled(LED1);
+
 int main()
 {
     wecker.rtc_init();
+    swStd.rise(&btnStdr);
+    swMin.rise(&btnMinr);
+    swSlp.rise(&btnSlpr);
+    swSlp.fall(&btnSlpf);
+    tick1.attach(&tickControll,0.01);
     while(1) {
         wecker.printTime();
+        wecker.printState(sMode);
         wecker.printAlarmTime();
         wait(0.1);
     }
+}
+
+
+
+void btnSlpr()
+{
+    wait_ms(20);
+    switch (Mode) {
+        case Normal:
+            if(tim1.read()==0)
+                tim1.start();
+            if (swStd==1 || swMin==1)
+                Mode = setAlarm;
+            break;
+        case AlarmOn:
+            if (tim1.read()==0)
+                tim1.start();
+            break;
+        case Sleep:
+            if (tim1.read()==0)
+                tim1.start();
+            break;
+        case Alarm:
+            Mode=Sleep;
+            break;
+    }
+}
+
+void btnStdr()
+{
+    wait_ms(20);
+    switch(Mode) {
+        case Normal:
+            int nextStd = wecker.unbcd(wecker.rtc_read(HOURS));
+            if (swSlp != 1) {
+                if (nextStd>=23)
+                    nextStd=0;
+                else
+                    nextStd++;
+                wecker.rtc_write(HOURS, wecker.bcd(nextStd));
+            }
+            break;
+        case setAlarm:
+            tim2.stop();
+            tim2.reset();
+            nextStd = wecker.unbcd(wecker.rtc_read(HOUR_ALARM));
+            if (nextStd>=23)
+                nextStd=0;
+            else
+                nextStd++;
+            wecker.rtc_write(HOUR_ALARM, wecker.bcd(nextStd));
+            break;
+        case Alarm:
+            Mode=Sleep;
+            tim3.stop();
+            tim3.reset();
+            break;
+    }
+}
+
+void btnMinr()
+{
+    wait_ms(20);
+    switch(Mode) {
+        case Normal:
+            int nextMin = wecker.unbcd(wecker.rtc_read(MINUTES));
+            if (swSlp != 1) {
+                if (nextMin>=59)
+                    nextMin=0;
+                else
+                    nextMin++;
+                wecker.rtc_write(MINUTES, wecker.bcd(nextMin));
+            }
+            break;
+        case setAlarm:
+            tim2.stop();
+            tim2.reset();
+            nextMin = wecker.unbcd(wecker.rtc_read(MINUTE_ALARM));
+            if (nextMin>=59)
+                nextMin=0;
+            else
+                nextMin++;
+            wecker.rtc_write(MINUTE_ALARM, wecker.bcd(nextMin));
+            break;
+        case Alarm:
+            tim3.stop();
+            tim3.reset();
+            Mode=Sleep;
+            break;
+    }
+}
+
+void tickControll()
+{
+    switch(Mode) {
+        case Normal:
+            strcpy(sMode,"No");
+            break;
+        case setAlarm:
+            strcpy(sMode,"sA");
+            if(swStd==0 && swMin==0)
+                tim2.start();
+            if(tim2.read()>=5.0) {
+                Mode=Normal;
+                tim2.stop();
+                tim2.reset();
+            }
+            break;
+        case AlarmOn:
+            strcpy(sMode,"AO");
+            if(alarm==0)
+                Mode=Alarm;
+            break;
+        case Sleep:
+            if(tim3.read()==0)
+                tim3.start();
+            if(tim3.read()>=300) {
+                Mode=Alarm;
+                tim3.stop();
+                tim3.reset();
+            }
+            strcpy(sMode,"Sl");
+            myled=0;
+            break;
+        case Alarm:
+            if(tim3.read()==0)
+                tim3.start();
+            if(tim3.read()>=300) {
+                Mode=Sleep;
+                tim3.stop();
+                tim3.reset();
+            }
+            strcpy(sMode,"Al");
+            myled=1;
+            break;
+    }
+}
+
+void btnSlpf()
+{
+    switch(Mode) {
+        case Normal:
+            if (swStd==1 || swMin==1)
+                Mode = setAlarm;
+            if(tim1.read()!=0) {
+                tim1.stop();
+                if (tim1.read()>=3.0)
+                    Mode = AlarmOn;
+                wecker.rtc_write(CONTROL2, 0x02);
+                tim1.reset();
+                break;
+            case AlarmOn:
+                tim1.stop();
+                if (tim1.read()>=3.0)
+                    Mode = Normal;
+                wecker.rtc_write(CONTROL2, 0);
+                tim1.reset();
+                break;
+            case Sleep:
+                tim1.stop();
+                if (tim1.read()>=3.0) {
+                    Mode = Normal;
+                    tim3.stop();
+                    tim3.reset();
+                }
+                wecker.rtc_write(CONTROL2, 0);
+                tim1.reset();
+                break;
+            }
+    }
 }
\ No newline at end of file