Projekt-Alarmclock

Dependencies:   LCD RTC8563 Wecker mbed

main.cpp

Committer:
wolpra98
Date:
2015-05-29
Revision:
1:b71a6c225c2b
Parent:
0:bb9c3f242f5a
Child:
2:d3708e92660f

File content as of revision 1:b71a6c225c2b:

#include "mbed.h"
#include "LCD.h"
#include "const.h"
#include "RTC8563.h"
#include "Wecker.h"

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;
            }
    }
}