Clock with Real-Time Clock (RTC-8564) and I2C LCD module(SB1062B).
Dependencies: DebouncedEdgeIn I2cLCD_cursor Rtc8564 mbed beep
Diff: ViewModel/ClockViewModel.cpp
- Revision:
- 2:6f0158399eff
- Parent:
- 1:f8713c387a68
- Child:
- 5:e374481e7554
diff -r f8713c387a68 -r 6f0158399eff ViewModel/ClockViewModel.cpp --- a/ViewModel/ClockViewModel.cpp Fri Feb 14 09:24:03 2014 +0000 +++ b/ViewModel/ClockViewModel.cpp Mon Feb 17 08:13:21 2014 +0000 @@ -1,5 +1,4 @@ #include "ClockViewModel.h" -#include "EventMechanism/EventParam0.h" using ViewModel::ClockViewModel; @@ -19,17 +18,23 @@ // Antenna // -------------- -ClockViewModel::ClockViewModel(I2cLCD& i2clcd, PinName set, PinName select, EventMechanism::I_EventHandler* evHandler, DigitalOut& led) +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_select(select), - m_evHandler(evHandler), + m_increment(increment), + m_decrement(decrement), m_clock(0), m_dateTime(0), - m_led(led) + m_mode(Model::CLOCK) { m_set.mode(PullUp); - m_set.fall(this, &ClockViewModel::setButtonPressed); + 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) @@ -40,9 +45,6 @@ void ClockViewModel::initialize() { - //m_set.rise(this, &ClockViewModel::setButtonPressed); - m_select.fall(this, &ClockViewModel::selectButtonPressed); - // print ICON m_i2clcd.seticon( I2cLCD::Mark ); m_i2clcd.seticon( I2cLCD::Battery_1 ); @@ -61,52 +63,84 @@ void ClockViewModel::dateTimeUpdated() { - static char dat[31] = " 20-- / -- / --\n -- : -- : --"; + static char dat[31] = " 20--/--/-- ***\n -- : -- : --"; uint8_t val = 0; - val = m_dateTime->year % 100; - dat[3] = '0' + val / 10; - dat[4] = '0' + val % 10; - val = m_dateTime->month; - dat[8] = '0' + val / 10; - dat[9] = '0' + val % 10; - val = m_dateTime->day; - dat[13] = '0' + val / 10; - dat[14] = '0' + val % 10; - val = m_dateTime->hour; + 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->minute; + val = m_dateTime->tm_min; dat[23] = '0' + val / 10; dat[24] = '0' + val % 10; - val = m_dateTime->second; + 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::setButtonPressed() +void ClockViewModel::setButtonOn() +{ + m_clock->requestModeChange(); +} + +void ClockViewModel::incrementButtonOn() { - m_evHandler->postEvent(new EventMechanism::EventParam0<ClockViewModel>(this, &ClockViewModel::setButtonPressedAsync)); + m_clock->requestIncrementValue(); +} + +void ClockViewModel::decrementButtonOn() +{ + m_clock->requestDecrementValue(); } -void ClockViewModel::setButtonPressedAsync() -{ - puts("setButtonPressedAsync\n"); - m_led = (m_led == 1)? 0 : 1; - m_clock->initialize(); -} - -void ClockViewModel::selectButtonPressed() +void ClockViewModel::setCurSor() { - m_evHandler->postEvent(new EventMechanism::EventParam0<ClockViewModel>(this, &ClockViewModel::selectButtonPressedAsync)); + 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; + } } - -void ClockViewModel::selectButtonPressedAsync() -{ - puts("selectButtonPressedAsync\n"); - m_led = (m_led == 1)? 0 : 1; - m_clock->initialize(); -}