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
Diff: LedDisplay.h
- Revision:
- 6:4a12e0f03381
diff -r 2682353a8c32 -r 4a12e0f03381 LedDisplay.h --- /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