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, committed 2015-07-27
- Comitter:
- Bobty
- Date:
- Mon Jul 27 15:25:59 2015 +0000
- Parent:
- 2:9090120e2656
- Child:
- 4:f0b030a3223f
- Commit message:
- Basic functionality of setting the time is working but no RTC is enabled
Changed in this revision
--- a/ButtonService.h Sun Jul 26 15:38:59 2015 +0000
+++ b/ButtonService.h Mon Jul 27 15:25:59 2015 +0000
@@ -34,6 +34,11 @@
ble.gattServer().write(buttonState.getValueHandle(), (uint8_t *)&newState, sizeof(bool));
}
+ GattAttribute::Handle_t getValueHandle()
+ {
+ return buttonState.getValueHandle();
+ }
+
private:
BLE &ble;
ReadOnlyGattCharacteristic<bool> buttonState;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WatchTimeService.h Mon Jul 27 15:25:59 2015 +0000
@@ -0,0 +1,36 @@
+// BLE Service for Watch Time
+// To allow a watch device to be told the current time
+
+#ifndef __BLE_WATCHTIME_SERVICE_H__
+#define __BLE_WATCHTIME_SERVICE_H__
+
+class WatchTimeService {
+public:
+
+ static const int WatchTime_BlockSize = 7;
+ const static uint16_t WATCHTIME_SERVICE_UUID = 0xFE32;
+ const static uint16_t WATCHTIME_STATE_CHARACTERISTIC_UUID = 0xFE33;
+
+ WatchTimeService(BLE &_ble, uint8_t* pInitialWatchTime) :
+ ble(_ble), watchTimeVal(WATCHTIME_STATE_CHARACTERISTIC_UUID, pInitialWatchTime, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY)
+ {
+ GattCharacteristic *charTable[] = {&watchTimeVal};
+ GattService watchTimeService(WatchTimeService::WATCHTIME_SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
+ ble.gattServer().addService(watchTimeService);
+ }
+
+ void sendWatchTime(uint8_t* pWatchTime) {
+ ble.gattServer().write(watchTimeVal.getValueHandle(), pWatchTime, WatchTime_BlockSize);
+ }
+
+ GattAttribute::Handle_t getValueHandle()
+ {
+ return watchTimeVal.getValueHandle();
+ }
+
+private:
+ BLE &ble;
+ ReadWriteArrayGattCharacteristic<uint8_t, WatchTime_BlockSize> watchTimeVal;
+};
+
+#endif /* #ifndef __BLE_WATCHTIME_SERVICE_H__ */
--- 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());
}
}