test publish

Dependencies:   BLE_API nRF51822 mbed

Fork of KS7 by masaaki makabe

Committer:
masaaki_makabe
Date:
Fri Aug 12 04:07:00 2016 +0000
Branch:
KS3
Revision:
36:3cca74c30551
Parent:
33:d7b53d548c33
???????????????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masaaki_makabe 31:b5e19d153db4 1 /*
masaaki_makabe 31:b5e19d153db4 2 * BLE Current Time Service (subset)
masaaki_makabe 31:b5e19d153db4 3 *
masaaki_makabe 31:b5e19d153db4 4 * by ohneta/ Oct. 2015
masaaki_makabe 31:b5e19d153db4 5 */
masaaki_makabe 31:b5e19d153db4 6 #ifndef __BLE_CURRENT_TIME_SERVICE_H__
masaaki_makabe 31:b5e19d153db4 7 #define __BLE_CURRENT_TIME_SERVICE_H__
masaaki_makabe 31:b5e19d153db4 8
masaaki_makabe 31:b5e19d153db4 9 #include "ble/BLE.h"
masaaki_makabe 31:b5e19d153db4 10 #include <time.h>
masaaki_makabe 31:b5e19d153db4 11 #include "ble_date_time.h"
masaaki_makabe 31:b5e19d153db4 12 #include "common.h"
masaaki_makabe 31:b5e19d153db4 13 //extern Serial pc;
masaaki_makabe 31:b5e19d153db4 14
masaaki_makabe 31:b5e19d153db4 15
masaaki_makabe 31:b5e19d153db4 16 enum BLE_DayofWeek {
masaaki_makabe 31:b5e19d153db4 17 notknown = 0,
masaaki_makabe 31:b5e19d153db4 18 Monday = 1,
masaaki_makabe 31:b5e19d153db4 19 Tuesday,
masaaki_makabe 31:b5e19d153db4 20 Wednesday,
masaaki_makabe 31:b5e19d153db4 21 Thursday,
masaaki_makabe 31:b5e19d153db4 22 Friday,
masaaki_makabe 31:b5e19d153db4 23 Saturday,
masaaki_makabe 31:b5e19d153db4 24 Sunday
masaaki_makabe 31:b5e19d153db4 25 };
masaaki_makabe 31:b5e19d153db4 26
masaaki_makabe 31:b5e19d153db4 27 typedef struct : ble_date_time_t/*BLE_DateTime*/ {
masaaki_makabe 31:b5e19d153db4 28 BLE_DayofWeek dayOfWeek;
masaaki_makabe 31:b5e19d153db4 29 } BLE_DayDateTime;
masaaki_makabe 31:b5e19d153db4 30
masaaki_makabe 31:b5e19d153db4 31 typedef struct BLE_ExactTime256 : BLE_DayDateTime {
masaaki_makabe 31:b5e19d153db4 32 uint8_t fractions256;
masaaki_makabe 31:b5e19d153db4 33 } BLE_ExactTime256;
masaaki_makabe 31:b5e19d153db4 34
masaaki_makabe 31:b5e19d153db4 35 typedef struct BLE_CurrentTime : BLE_ExactTime256 {
masaaki_makabe 31:b5e19d153db4 36 uint8_t adjustReason;
masaaki_makabe 31:b5e19d153db4 37 } BLE_CurrentTime;
masaaki_makabe 31:b5e19d153db4 38
masaaki_makabe 31:b5e19d153db4 39 #define BLE_CURRENT_TIME_CHAR_VALUE_SIZE 10
masaaki_makabe 31:b5e19d153db4 40
masaaki_makabe 31:b5e19d153db4 41 /**
masaaki_makabe 31:b5e19d153db4 42 *
masaaki_makabe 31:b5e19d153db4 43 */
masaaki_makabe 31:b5e19d153db4 44 class CurrentTimeService {
masaaki_makabe 31:b5e19d153db4 45
masaaki_makabe 31:b5e19d153db4 46 protected:
masaaki_makabe 31:b5e19d153db4 47 Ticker ticker;
masaaki_makabe 31:b5e19d153db4 48
masaaki_makabe 31:b5e19d153db4 49 /**
masaaki_makabe 31:b5e19d153db4 50 * ticker callback.
masaaki_makabe 31:b5e19d153db4 51 * interval = 1sec
masaaki_makabe 31:b5e19d153db4 52 */
masaaki_makabe 31:b5e19d153db4 53 void epochtimePeriodicCallback(void)
masaaki_makabe 31:b5e19d153db4 54 {
masaaki_makabe 31:b5e19d153db4 55 time_t tmpEpochTime = epochTimeByDateTimeBuffer();
masaaki_makabe 31:b5e19d153db4 56 tmpEpochTime++;
masaaki_makabe 31:b5e19d153db4 57 dataTimeBufferByEpochTime(&tmpEpochTime);
masaaki_makabe 31:b5e19d153db4 58
masaaki_makabe 31:b5e19d153db4 59 counter++;
masaaki_makabe 31:b5e19d153db4 60 tmCnt--;
masaaki_makabe 31:b5e19d153db4 61 }
masaaki_makabe 31:b5e19d153db4 62
masaaki_makabe 31:b5e19d153db4 63 void dataTimeBufferByEpochTime(time_t *epochTime)
masaaki_makabe 31:b5e19d153db4 64 {
masaaki_makabe 31:b5e19d153db4 65 struct tm *tmPtr = localtime(epochTime);
masaaki_makabe 31:b5e19d153db4 66
masaaki_makabe 31:b5e19d153db4 67 *(uint16_t *)&valueBytes[0] = tmPtr->tm_year + 1900;
masaaki_makabe 31:b5e19d153db4 68 valueBytes[2] = tmPtr->tm_mon + 1;
masaaki_makabe 31:b5e19d153db4 69 valueBytes[3] = tmPtr->tm_mday;
masaaki_makabe 31:b5e19d153db4 70 valueBytes[4] = tmPtr->tm_hour;
masaaki_makabe 31:b5e19d153db4 71 valueBytes[5] = tmPtr->tm_min;
masaaki_makabe 31:b5e19d153db4 72 valueBytes[6] = tmPtr->tm_sec;
masaaki_makabe 31:b5e19d153db4 73 valueBytes[7] = (BLE_DayofWeek)((tmPtr->tm_wday == 0) ? 7 : tmPtr->tm_wday);
masaaki_makabe 31:b5e19d153db4 74 valueBytes[8] = 0x00;
masaaki_makabe 31:b5e19d153db4 75 valueBytes[9] = 0x00;
masaaki_makabe 31:b5e19d153db4 76 //#ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 77 // pc.printf("WRITE ==> %d/%d/%d %02d:%02d:%02d \r\n", tmPtr->tm_year, tmPtr->tm_mon, tmPtr->tm_mday, tmPtr->tm_hour, tmPtr->tm_min, tmPtr->tm_sec);
masaaki_makabe 31:b5e19d153db4 78 //#endif
masaaki_makabe 31:b5e19d153db4 79
masaaki_makabe 31:b5e19d153db4 80 ble.gattServer().write(currentTimeCharacteristic.getValueHandle(), valueBytes, BLE_CURRENT_TIME_CHAR_VALUE_SIZE);
masaaki_makabe 31:b5e19d153db4 81 }
masaaki_makabe 31:b5e19d153db4 82
masaaki_makabe 31:b5e19d153db4 83 time_t epochTimeByDateTimeBuffer()
masaaki_makabe 31:b5e19d153db4 84 {
masaaki_makabe 31:b5e19d153db4 85 struct tm timep;
masaaki_makabe 31:b5e19d153db4 86 {
masaaki_makabe 31:b5e19d153db4 87 timep.tm_year = *(uint16_t *)&valueBytes[0] - 1900;
masaaki_makabe 31:b5e19d153db4 88 timep.tm_mon = valueBytes[2] - 1;
masaaki_makabe 31:b5e19d153db4 89 timep.tm_mday = valueBytes[3];
masaaki_makabe 31:b5e19d153db4 90 timep.tm_hour = valueBytes[4];
masaaki_makabe 31:b5e19d153db4 91 timep.tm_min = valueBytes[5];
masaaki_makabe 31:b5e19d153db4 92 timep.tm_sec = valueBytes[6];
masaaki_makabe 31:b5e19d153db4 93 timep.tm_isdst = 0;
masaaki_makabe 31:b5e19d153db4 94 }
masaaki_makabe 31:b5e19d153db4 95 //#ifdef UART_DEBUG
masaaki_makabe 31:b5e19d153db4 96 // pc.printf("READ ==> %d/%d/%d %02d:%02d:%02d \r\n", timep.tm_year, timep.tm_mon, timep.tm_mday, timep.tm_hour, timep.tm_min, timep.tm_sec);
masaaki_makabe 31:b5e19d153db4 97 //#endif
masaaki_makabe 31:b5e19d153db4 98 time_t epochTime = mktime(&timep);
masaaki_makabe 31:b5e19d153db4 99
masaaki_makabe 31:b5e19d153db4 100 return epochTime;
masaaki_makabe 31:b5e19d153db4 101 }
masaaki_makabe 31:b5e19d153db4 102
masaaki_makabe 31:b5e19d153db4 103 public:
masaaki_makabe 31:b5e19d153db4 104 //------------------------------------------------------------------------------------
masaaki_makabe 31:b5e19d153db4 105 /**
masaaki_makabe 31:b5e19d153db4 106 *
masaaki_makabe 31:b5e19d153db4 107 */
masaaki_makabe 31:b5e19d153db4 108 CurrentTimeService(BLE &_ble, ble_date_time_t &initialDateTime) :
masaaki_makabe 31:b5e19d153db4 109 ble(_ble),
masaaki_makabe 31:b5e19d153db4 110 currentTimeCharacteristic( GattCharacteristic::UUID_CURRENT_TIME_CHAR,
masaaki_makabe 31:b5e19d153db4 111 valueBytes, BLE_CURRENT_TIME_CHAR_VALUE_SIZE, BLE_CURRENT_TIME_CHAR_VALUE_SIZE,
masaaki_makabe 31:b5e19d153db4 112 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ
masaaki_makabe 31:b5e19d153db4 113 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
masaaki_makabe 31:b5e19d153db4 114 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE
masaaki_makabe 31:b5e19d153db4 115 )
masaaki_makabe 31:b5e19d153db4 116 {
masaaki_makabe 31:b5e19d153db4 117 writeDateTime(initialDateTime);
masaaki_makabe 31:b5e19d153db4 118 ticker.attach(this, &CurrentTimeService::epochtimePeriodicCallback, 1.0);
masaaki_makabe 31:b5e19d153db4 119
masaaki_makabe 31:b5e19d153db4 120 GattCharacteristic *charsTable[] = {&currentTimeCharacteristic};
masaaki_makabe 31:b5e19d153db4 121 GattService currentTimeService(GattService::UUID_CURRENT_TIME_SERVICE, charsTable, sizeof(charsTable) / sizeof(GattCharacteristic *) );
masaaki_makabe 31:b5e19d153db4 122
masaaki_makabe 31:b5e19d153db4 123 ble.addService(currentTimeService);
masaaki_makabe 31:b5e19d153db4 124 ble.onDataWritten(this, &CurrentTimeService::onDataWritten);
masaaki_makabe 31:b5e19d153db4 125
masaaki_makabe 31:b5e19d153db4 126 counter = 0;
masaaki_makabe 31:b5e19d153db4 127 }
masaaki_makabe 31:b5e19d153db4 128
masaaki_makabe 31:b5e19d153db4 129 /**
masaaki_makabe 31:b5e19d153db4 130 */
masaaki_makabe 31:b5e19d153db4 131 void writeDateTime(ble_date_time_t &dateTime)
masaaki_makabe 31:b5e19d153db4 132 {
masaaki_makabe 31:b5e19d153db4 133 *(uint16_t *)&valueBytes[0] = dateTime.year;
masaaki_makabe 31:b5e19d153db4 134 valueBytes[2] = dateTime.month;
masaaki_makabe 31:b5e19d153db4 135 valueBytes[3] = dateTime.day;
masaaki_makabe 31:b5e19d153db4 136 valueBytes[4] = dateTime.hours;
masaaki_makabe 31:b5e19d153db4 137 valueBytes[5] = dateTime.minutes;
masaaki_makabe 31:b5e19d153db4 138 valueBytes[6] = dateTime.seconds;
masaaki_makabe 31:b5e19d153db4 139
masaaki_makabe 31:b5e19d153db4 140 // not support
masaaki_makabe 31:b5e19d153db4 141 valueBytes[7] = 0x00; // day of week
masaaki_makabe 31:b5e19d153db4 142 valueBytes[8] = 0x00; // Fractions256
masaaki_makabe 31:b5e19d153db4 143 valueBytes[9] = 0x00; // Adjust Reason
masaaki_makabe 31:b5e19d153db4 144 }
masaaki_makabe 31:b5e19d153db4 145
masaaki_makabe 31:b5e19d153db4 146 void writeEpochTime(time_t et)
masaaki_makabe 31:b5e19d153db4 147 {
masaaki_makabe 31:b5e19d153db4 148 dataTimeBufferByEpochTime(&et);
masaaki_makabe 31:b5e19d153db4 149 }
masaaki_makabe 31:b5e19d153db4 150
masaaki_makabe 31:b5e19d153db4 151 /**
masaaki_makabe 31:b5e19d153db4 152 */
masaaki_makabe 31:b5e19d153db4 153 void readDateTime(ble_date_time_t &dateTime)
masaaki_makabe 31:b5e19d153db4 154 {
masaaki_makabe 31:b5e19d153db4 155 dateTime.year = *(uint16_t *)&valueBytes[0];
masaaki_makabe 31:b5e19d153db4 156 dateTime.month = valueBytes[2];
masaaki_makabe 31:b5e19d153db4 157 dateTime.day = valueBytes[3];
masaaki_makabe 31:b5e19d153db4 158 dateTime.hours = valueBytes[4];
masaaki_makabe 31:b5e19d153db4 159 dateTime.minutes = valueBytes[5];
masaaki_makabe 31:b5e19d153db4 160 dateTime.seconds = valueBytes[6];
masaaki_makabe 31:b5e19d153db4 161 }
masaaki_makabe 31:b5e19d153db4 162
masaaki_makabe 31:b5e19d153db4 163 time_t readEpochTime()
masaaki_makabe 31:b5e19d153db4 164 {
masaaki_makabe 31:b5e19d153db4 165 return epochTimeByDateTimeBuffer();
masaaki_makabe 31:b5e19d153db4 166 }
masaaki_makabe 31:b5e19d153db4 167
masaaki_makabe 31:b5e19d153db4 168
masaaki_makabe 31:b5e19d153db4 169 // for BLE GATT callback (optional)
masaaki_makabe 31:b5e19d153db4 170 virtual void onDataWritten(const GattWriteCallbackParams *params)
masaaki_makabe 31:b5e19d153db4 171 {
masaaki_makabe 31:b5e19d153db4 172 if (params->handle == currentTimeCharacteristic.getValueHandle()) {
masaaki_makabe 31:b5e19d153db4 173 memcpy((void *)&valueBytes, params->data, params->len);
masaaki_makabe 31:b5e19d153db4 174 }
masaaki_makabe 31:b5e19d153db4 175 }
masaaki_makabe 31:b5e19d153db4 176
masaaki_makabe 31:b5e19d153db4 177 int getCounter() const { return counter; }
masaaki_makabe 31:b5e19d153db4 178 void setCounter(int val) { counter = val; }
masaaki_makabe 31:b5e19d153db4 179 int getTm() const { return tmCnt; }
masaaki_makabe 31:b5e19d153db4 180 void setTm(int val) { tmCnt = val; }
masaaki_makabe 31:b5e19d153db4 181
masaaki_makabe 31:b5e19d153db4 182 protected:
masaaki_makabe 31:b5e19d153db4 183 BLE &ble;
masaaki_makabe 31:b5e19d153db4 184 uint8_t valueBytes[BLE_CURRENT_TIME_CHAR_VALUE_SIZE];
masaaki_makabe 31:b5e19d153db4 185 GattCharacteristic currentTimeCharacteristic;
masaaki_makabe 31:b5e19d153db4 186 private:
masaaki_makabe 31:b5e19d153db4 187 int counter; /*timer counter*/
masaaki_makabe 31:b5e19d153db4 188 int tmCnt; /*for timeout*/
masaaki_makabe 31:b5e19d153db4 189 };
masaaki_makabe 31:b5e19d153db4 190
masaaki_makabe 31:b5e19d153db4 191 #endif /* #ifndef __BLE_CURRENT_TIME_SERVICE_H__*/
masaaki_makabe 36:3cca74c30551 192