Clock with Real-Time Clock (RTC-8564) and I2C LCD module(SB1062B).

Dependencies:   DebouncedEdgeIn I2cLCD_cursor Rtc8564 mbed beep

/media/uploads/togayan/imgp0004s.jpg /media/uploads/togayan/lcdclock_circuit_rev4.png

ViewModel/ClockViewModel.cpp

Committer:
togayan
Date:
2014-02-17
Revision:
2:6f0158399eff
Parent:
1:f8713c387a68
Child:
5:e374481e7554

File content as of revision 2:6f0158399eff:

#include "ClockViewModel.h"

using ViewModel::ClockViewModel;

// Icon Name ----
// Mark
// Battery_1
// Battery_2
// Battery_3
// Battery_4
// NoSound
// Lock
// ArrowDown
// ArrowUp
// Input
// Alarm
// Tell
// Antenna
// --------------

const char* ClockViewModel::WEEKDAYS[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT", "ERR"};

ClockViewModel::ClockViewModel(I2cLCD& i2clcd, PinName set, PinName increment, PinName decrement)
    :m_i2clcd(i2clcd),
     m_set(set),
     m_increment(increment),
     m_decrement(decrement),
     m_clock(0),
     m_dateTime(0),
     m_mode(Model::CLOCK)
{
    m_set.mode(PullUp);
    m_increment.mode(PullUp);
    m_decrement.mode(PullUp);
    m_set.fall(this, &ClockViewModel::setButtonOn);
    m_increment.fall(this, &ClockViewModel::incrementButtonOn);
    m_decrement.fall(this, &ClockViewModel::decrementButtonOn);
}

void ClockViewModel::setClock(Model::Clock* clock)
{
    m_clock = clock;
    m_dateTime = m_clock->getDateTime();
}

void ClockViewModel::initialize()
{
    // print ICON
    m_i2clcd.seticon( I2cLCD::Mark );
    m_i2clcd.seticon( I2cLCD::Battery_1 );
    m_i2clcd.seticon( I2cLCD::Battery_2 );
    m_i2clcd.seticon( I2cLCD::Battery_3 );
    m_i2clcd.seticon( I2cLCD::Battery_4 );
    m_i2clcd.seticon( I2cLCD::NoSound );
    m_i2clcd.seticon( I2cLCD::Lock );
    m_i2clcd.seticon( I2cLCD::ArrowDown );
    m_i2clcd.seticon( I2cLCD::ArrowUp );
    m_i2clcd.seticon( I2cLCD::Input );
    m_i2clcd.seticon( I2cLCD::Alarm );
    m_i2clcd.seticon( I2cLCD::Tell );
    m_i2clcd.seticon( I2cLCD::Antenna );
}

void ClockViewModel::dateTimeUpdated()
{
    static char dat[31] = " 20--/--/-- ***\n  -- : -- : --";
    uint8_t val = 0;

    val = m_dateTime->tm_year % 100;
    dat[3]  = '0' + val / 10;
    dat[4]  = '0' + val % 10;
    val = m_dateTime->tm_mon + 1;
    dat[6]  = '0' + val / 10;
    dat[7]  = '0' + val % 10;
    val = m_dateTime->tm_mday;
    dat[9]  = '0' + val / 10;
    dat[10] = '0' + val % 10;
    val = m_dateTime->tm_wday;
    dat[12] = WEEKDAYS[val][0];
    dat[13] = WEEKDAYS[val][1];
    dat[14] = WEEKDAYS[val][2];
    val = m_dateTime->tm_hour;
    dat[18] = '0' + val / 10;
    dat[19] = '0' + val % 10;
    val = m_dateTime->tm_min;
    dat[23] = '0' + val / 10;
    dat[24] = '0' + val % 10;
    val = m_dateTime->tm_sec;
    dat[28] = '0' + val / 10;
    dat[29] = '0' + val % 10;

    m_i2clcd.locate(0, 0);
    m_i2clcd.puts(dat);
    setCurSor();
}

void ClockViewModel::mode(Model::OperationMode mode)
{
    m_mode = mode;
    setCurSor();
}

void ClockViewModel::setButtonOn()
{
    m_clock->requestModeChange();
}

void ClockViewModel::incrementButtonOn()
{
    m_clock->requestIncrementValue();
}

void ClockViewModel::decrementButtonOn()
{
    m_clock->requestDecrementValue();
}

void ClockViewModel::setCurSor()
{
    switch(m_mode)
    {
    case Model::CLOCK:
        m_i2clcd.cursor(false, 0, 0);
        break;
    case Model::SET_YEAR:
        m_i2clcd.cursor(true, 4, 0);
        break;
    case Model::SET_MONTH:
        m_i2clcd.cursor(true, 7, 0);
        break;
    case Model::SET_DAY:
        m_i2clcd.cursor(true, 10, 0);
        break;
    case Model::SET_HOUR:
        m_i2clcd.cursor(true, 3, 1);
        break;
    case Model::SET_MINUTE:
        m_i2clcd.cursor(true, 8, 1);
        break;
    case Model::SET_SECOND:
        m_i2clcd.cursor(true, 13, 1);
        break;
    default:
        break;
    }
}