Auto updating alarm watch - accepts alarm settings from a BLE device like a Raspberry Pi and buzzes at the appropriate time - also displays binary time

Dependencies:   BLE_API mbed-src nRF51822 nrf51_rtc

Revision:
6:4a12e0f03381
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LedDisplay.h	Tue Mar 01 13:03:32 2016 +0000
@@ -0,0 +1,184 @@
+#ifndef __LED_DISPLAY_H__
+#define __LED_DISPLAY_H__
+
+#include "nrf51_rtc.h"
+
+// Hour LEDs
+const int numHourPins = 5;
+DigitalOut hourPins[numHourPins] = { p0, p1, p2, p3, p4 };
+
+// Minute LEDs
+const int numMinPins = 6;
+DigitalOut minPins[numMinPins] = { p23, p24, p25, p28, p29, p30 };
+
+// Status LEDs
+const int numStatusPins = 3;
+DigitalOut statusPins[numStatusPins] = { p6, p10, p11 };
+
+// Status bit numbers
+const int STATUS_BITS_EXTRA_BIT = 0;
+const int STATUS_BITS_SECS_BIT = 1;
+const int STATUS_BITS_ALARM_BIT = 2;
+
+void callbackForLEDMuxing();
+
+class LedDisplay
+{
+public:
+    enum DispType {
+        DispType_None = 0,
+        DispType_CurTime = 1,
+        DispType_AlarmTime = 2,
+        };
+    
+    LedDisplay()
+    {
+        _dispType = DispType_None;
+        _timeDisplayStartTime = 0;
+        _secsToDisplayFor = 0;
+        _timeToShow_Hour = 0;
+        _timeToShow_Min = 0;
+        _statusBits = 0;
+        _curTimeLEDBitPos = 0;
+        clear();
+    }
+
+    void clear()
+    {
+        // Clear all LEDs
+        for (int i = 0; i < numHourPins; i++)
+            hourPins[i] = 0;
+        for (int i = 0; i < numMinPins; i++)
+            minPins[i] = 0;
+        for (int i = 0; i < numStatusPins; i++)
+            statusPins[i] = 0;
+    }
+    
+    void start(time_t timeToShow, DispType dispType, int secsToDisplayFor, bool extraInfoBit)
+    {
+        // Save time to show
+        _timeToShow_time_t = timeToShow;
+        _dispType = dispType;
+        _secsToDisplayFor = secsToDisplayFor;
+        if (dispType == DispType_None)
+            return;
+
+        // Convert time to binary displayable info (localtime)
+        if (((int)_timeToShow_time_t != -1) && ((int)_timeToShow_time_t != 0))
+        {
+            struct tm * timeinfo;
+            timeinfo = localtime (&_timeToShow_time_t);           
+            _timeToShow_Hour = timeinfo->tm_hour;
+            _timeToShow_Min = timeinfo->tm_min;
+        }
+        else
+        {
+            _timeToShow_Hour = 0;
+            _timeToShow_Min = 0;
+        }
+        
+        // Status - extra bit
+        _statusBits = 0;
+        if (extraInfoBit)
+            _statusBits |= (1 << STATUS_BITS_EXTRA_BIT);
+            
+        // Status - alarm bit
+        if (dispType == DispType_AlarmTime)
+            _statusBits |= (1 << STATUS_BITS_ALARM_BIT);
+        else
+            _statusBits &= (~(1 << STATUS_BITS_ALARM_BIT));
+        
+        // Record time we started displaying
+        time_t curTime = rtc.time();
+        _timeDisplayStartTime = curTime;
+
+        // Ready to display on next callback
+        _curTimeLEDBitPos = 0;
+        _timerForLEDMuxing.attach(callbackForLEDMuxing, 0.001);
+
+    }
+    
+    void stop()
+    {
+        _dispType = DispType_None;
+    }
+    
+    void showNext()
+    {
+        // Clear LEDs
+        clear();
+
+        // Check display type
+        if (_dispType == DispType_None)
+            return;
+
+        // Get current time
+        time_t curTime = rtc.time();
+        
+        // Stop displaying time after a certain number of seconds
+        if (curTime - _timeDisplayStartTime >= _secsToDisplayFor)
+        {
+            stop();
+            return;
+        }
+    
+        // Flash status seconds
+        if (_dispType == DispType_CurTime)
+        {
+            if ((curTime % 2) == 0)
+                _statusBits |= (1 << STATUS_BITS_SECS_BIT);
+            else
+                _statusBits &= (~(1 << STATUS_BITS_SECS_BIT));
+        }
+        
+        // Display binary time
+        int mask = 1 << _curTimeLEDBitPos;
+        if ((_curTimeLEDBitPos < numHourPins) && ((_timeToShow_Hour & mask) != 0))
+            hourPins[_curTimeLEDBitPos] = 1;
+        if ((_curTimeLEDBitPos < numMinPins) && ((_timeToShow_Min & mask) != 0))
+            minPins[_curTimeLEDBitPos] = 1;
+        if ((_curTimeLEDBitPos < numStatusPins) && ((_statusBits & mask) != 0))
+            statusPins[_curTimeLEDBitPos] = 1;
+        
+        // Next bit pos
+        _curTimeLEDBitPos++;
+        if (_curTimeLEDBitPos > numMinPins)
+            _curTimeLEDBitPos = 0;
+    
+        // Set for another callback
+        _timerForLEDMuxing.attach(callbackForLEDMuxing, 0.001);
+    }
+    
+private:
+
+    // Display type
+    DispType _dispType;
+
+    // Time to show
+    time_t _timeToShow_time_t;
+    int _timeToShow_Hour;
+    int _timeToShow_Min;
+    
+    // Time displaying started and time to show for
+    time_t _timeDisplayStartTime;
+    int _secsToDisplayFor;
+    
+    // Status bit
+    int _statusBits;
+    
+    // Timeout used to display LEDs
+    Timeout _timerForLEDMuxing;
+    
+    // Cur time disp info
+    int _curTimeLEDBitPos;
+};
+
+static LedDisplay ledDisplay;
+
+void callbackForLEDMuxing()
+{
+    ledDisplay.showNext();
+}
+
+
+#endif /* #ifndef __BLE_BUTTON_SERVICE_H__ */
\ No newline at end of file