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

Revision:
2:6f0158399eff
Parent:
1:f8713c387a68
Child:
5:e374481e7554
--- 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();
-}