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:
3:a4b8d67de1b1
Parent:
2:9090120e2656
Child:
4:f0b030a3223f
--- a/main.cpp	Sun Jul 26 15:38:59 2015 +0000
+++ b/main.cpp	Mon Jul 27 15:25:59 2015 +0000
@@ -5,6 +5,7 @@
 #include "mbed.h"
 #include "BLE.h"
 #include "ButtonService.h"
+#include "WatchTimeService.h"
 
 // BLE platform
 BLE ble;
@@ -16,12 +17,23 @@
 InterruptIn button(D8);
 
 // Device name - this is the visible name of device on BLE
-const static char     DEVICE_NAME[] = "Button";
+const static char     DEVICE_NAME[] = "JoesAlarm";
+
+// UUIDs of services offered
+static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID, WatchTimeService::WATCHTIME_SERVICE_UUID};
+
+// Service offering to read and set the time on the watch
+WatchTimeService *pWatchTimeService;
 
 // TEST CODE
-static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID};
-
-// TEST CODE
+int callbackCount = 0;
+uint8_t testbuf[WatchTimeService::WatchTime_BlockSize];
+time_t retval = 0;
+int servcode = 0;
+int buflen = 0;
+int mycode = 0;
+int offs = 0;
+int butcode = 0;
 ButtonService *buttonServicePtr;
 
 // Handle button press to read watch
@@ -50,9 +62,51 @@
     led1 = !led1; /* Do blinky on LED1 to indicate system aliveness. */
 }
 
+time_t watchTimeToUnix(const uint8_t* pWatchTime)
+{
+    struct tm tminfo;
+    tminfo.tm_year = int(pWatchTime[0])*256 + pWatchTime[1] - 1900;
+    tminfo.tm_mon = pWatchTime[2] - 1;
+    tminfo.tm_mday = pWatchTime[3];
+    tminfo.tm_hour = pWatchTime[4];
+    tminfo.tm_min = pWatchTime[5];
+    tminfo.tm_sec = pWatchTime[6];
+    tminfo.tm_isdst = -1;
+    time_t timest = mktime(&tminfo);
+    return timest;
+}
+
+void onDataWrittenCallback(const GattWriteCallbackParams *params) 
+{
+    // TEST code
+    callbackCount++;
+    memcpy(testbuf, params->data, WatchTimeService::WatchTime_BlockSize);
+    servcode = params->handle;
+    buflen = params->len;
+    mycode = pWatchTimeService->getValueHandle();
+    butcode = buttonServicePtr->getValueHandle();
+    offs = params->offset;
+
+    // Check if this is time setting
+    if (pWatchTimeService->getValueHandle() == params->handle) 
+    {
+        if (params->len == WatchTimeService::WatchTime_BlockSize)
+        {
+            time_t timest = watchTimeToUnix(params->data);
+            retval = timest;
+            if (timest != -1)
+                set_time(timest);
+        }
+    }
+}
+    
 int main(void)
 {
+    printf("AlarmWatch\r\n");
+    
     // TEST CODE
+    memset(testbuf, 0, WatchTimeService::WatchTime_BlockSize);
+    int loopCount = 0;
     led1 = 1;
     Ticker ticker;
     ticker.attach(periodicCallback, 1);
@@ -62,10 +116,16 @@
     // BLE init
     ble.init();
     ble.gap().onDisconnection(disconnectionCallback);
-
+    ble.onDataWritten(onDataWrittenCallback);
+    
     // TEST CODE
     ButtonService buttonService(ble, false /* initial value for button pressed */);
     buttonServicePtr = &buttonService;
+    
+    // Watch Time Service
+    uint8_t initialTime[] = { uint8_t(2015/256), uint8_t(2015%256), 7, 26, 12, 8, 0 };    
+    WatchTimeService watchTimeService(ble, initialTime);
+    pWatchTimeService = &watchTimeService;
 
     // Setup advertising
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
@@ -77,6 +137,21 @@
 
     while (true) {
         ble.waitForEvent();
+        
+        loopCount++;
+        if (loopCount < 5)
+            continue;
+        loopCount = 0;
+        
+        time_t rawtime;
+        struct tm * timeinfo;        
+        time (&rawtime);
+        timeinfo = localtime (&rawtime);
+        printf ("Current local time and date: %s callbacks %d retval %d\r\n", asctime(timeinfo), callbackCount, retval);
+        printf ("Timest %02x %02x %02x %02x %02x %02x %02x %ld\r\n", testbuf[0],
+                testbuf[1], testbuf[2], testbuf[3], testbuf[4], testbuf[5], testbuf[6], retval); 
+        printf ("serv %d buflen %d mycode %d offs %d butcode %d\r\n", servcode, buflen, mycode, offs, butcode);
+        printf ("val %ld\r\n", watchTimeService.getValueHandle());
     }
 }