test
Dependencies: BLE_API nRF51822 mbed
Fork of KS7 by
CurrentTimeService.h@33:d7b53d548c33, 2016-08-10 (annotated)
- Committer:
- masaaki_makabe
- Date:
- Wed Aug 10 06:56:36 2016 +0000
- Branch:
- KS3
- Revision:
- 33:d7b53d548c33
- Parent:
- 31:b5e19d153db4
- Child:
- 36:3cca74c30551
1.BLE????????????????; 2.Timer??????????????LED??????????????????????
Who changed what in which revision?
User | Revision | Line number | New 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[] = {¤tTimeCharacteristic}; |
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 | 33:d7b53d548c33 | 172 | #ifdef UART_DEBUG |
masaaki_makabe | 33:d7b53d548c33 | 173 | //pc.printf("onDataWritten START\r\n"); |
masaaki_makabe | 33:d7b53d548c33 | 174 | #endif |
masaaki_makabe | 31:b5e19d153db4 | 175 | if (params->handle == currentTimeCharacteristic.getValueHandle()) { |
masaaki_makabe | 31:b5e19d153db4 | 176 | memcpy((void *)&valueBytes, params->data, params->len); |
masaaki_makabe | 33:d7b53d548c33 | 177 | #ifdef UART_DEBUG |
masaaki_makabe | 33:d7b53d548c33 | 178 | int i; |
masaaki_makabe | 33:d7b53d548c33 | 179 | pc.printf("TIME=>"); |
masaaki_makabe | 33:d7b53d548c33 | 180 | for(i = 0; i < sizeof(valueBytes); i++){ |
masaaki_makabe | 33:d7b53d548c33 | 181 | pc.printf("[%02X]", valueBytes[i]); |
masaaki_makabe | 33:d7b53d548c33 | 182 | } |
masaaki_makabe | 33:d7b53d548c33 | 183 | pc.printf("\r\n"); |
masaaki_makabe | 33:d7b53d548c33 | 184 | #endif |
masaaki_makabe | 31:b5e19d153db4 | 185 | } |
masaaki_makabe | 33:d7b53d548c33 | 186 | #ifdef UART_DEBUG |
masaaki_makabe | 33:d7b53d548c33 | 187 | //pc.printf("onDataWritten END\r\n"); |
masaaki_makabe | 33:d7b53d548c33 | 188 | #endif |
masaaki_makabe | 31:b5e19d153db4 | 189 | } |
masaaki_makabe | 31:b5e19d153db4 | 190 | |
masaaki_makabe | 31:b5e19d153db4 | 191 | int getCounter() const { return counter; } |
masaaki_makabe | 31:b5e19d153db4 | 192 | void setCounter(int val) { counter = val; } |
masaaki_makabe | 31:b5e19d153db4 | 193 | int getTm() const { return tmCnt; } |
masaaki_makabe | 31:b5e19d153db4 | 194 | void setTm(int val) { tmCnt = val; } |
masaaki_makabe | 31:b5e19d153db4 | 195 | |
masaaki_makabe | 31:b5e19d153db4 | 196 | protected: |
masaaki_makabe | 31:b5e19d153db4 | 197 | BLE &ble; |
masaaki_makabe | 31:b5e19d153db4 | 198 | uint8_t valueBytes[BLE_CURRENT_TIME_CHAR_VALUE_SIZE]; |
masaaki_makabe | 31:b5e19d153db4 | 199 | GattCharacteristic currentTimeCharacteristic; |
masaaki_makabe | 31:b5e19d153db4 | 200 | private: |
masaaki_makabe | 31:b5e19d153db4 | 201 | int counter; /*timer counter*/ |
masaaki_makabe | 31:b5e19d153db4 | 202 | int tmCnt; /*for timeout*/ |
masaaki_makabe | 31:b5e19d153db4 | 203 | }; |
masaaki_makabe | 31:b5e19d153db4 | 204 | |
masaaki_makabe | 31:b5e19d153db4 | 205 | #endif /* #ifndef __BLE_CURRENT_TIME_SERVICE_H__*/ |
masaaki_makabe | 31:b5e19d153db4 | 206 |