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: main.cpp
- 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()); } }