Wecker-Library

Dependents:   Projekt_Wecker_LCD Projekt_Wecker_LCD Projekt_Wecker_LCD

Wecker.cpp

Committer:
wolpra98
Date:
2015-04-30
Revision:
0:6f0b18518e88
Child:
1:ade7876100e2

File content as of revision 0:6f0b18518e88:

#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();
    }
}