BLE Lightning sensor for Nordic NRF51822 based module
Dependencies: AS3935 AS3935_ext BLE_API mbed nRF51822 nrf51_rtc
main.cpp@4:8f815f8d804e, 2015-08-30 (annotated)
- Committer:
- takafuminaka
- Date:
- Sun Aug 30 12:20:29 2015 +0000
- Revision:
- 4:8f815f8d804e
- Parent:
- 3:2ea547dab8a8
- Child:
- 5:b8961da0d06a
?????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
takafuminaka | 0:371bcac81ea2 | 1 | /* |
takafuminaka | 0:371bcac81ea2 | 2 | |
takafuminaka | 0:371bcac81ea2 | 3 | */ |
takafuminaka | 0:371bcac81ea2 | 4 | |
takafuminaka | 4:8f815f8d804e | 5 | #include "string.h" |
takafuminaka | 4:8f815f8d804e | 6 | |
takafuminaka | 0:371bcac81ea2 | 7 | #include "mbed.h" |
takafuminaka | 0:371bcac81ea2 | 8 | #include "nrf51_rtc.h" |
takafuminaka | 0:371bcac81ea2 | 9 | #include "AS3935_ext.h" |
takafuminaka | 0:371bcac81ea2 | 10 | |
takafuminaka | 3:2ea547dab8a8 | 11 | #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console; |
takafuminaka | 3:2ea547dab8a8 | 12 | #define NEED_BLE_CONSOLE 1 |
takafuminaka | 1:a4119049dd99 | 13 | |
takafuminaka | 1:a4119049dd99 | 14 | #if NEED_CONSOLE_OUTPUT |
takafuminaka | 1:a4119049dd99 | 15 | Serial pc(USBTX, USBRX); |
takafuminaka | 1:a4119049dd99 | 16 | #define DEBUG(...) { pc.printf(__VA_ARGS__); } |
takafuminaka | 1:a4119049dd99 | 17 | #else |
takafuminaka | 1:a4119049dd99 | 18 | #define DEBUG(...) /* nothing */ |
takafuminaka | 1:a4119049dd99 | 19 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
takafuminaka | 1:a4119049dd99 | 20 | |
takafuminaka | 3:2ea547dab8a8 | 21 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 22 | #include "BLE.h" |
takafuminaka | 3:2ea547dab8a8 | 23 | #include "UARTService.h" |
takafuminaka | 3:2ea547dab8a8 | 24 | #define BLEC(...) { char __blecstr[32]; sprintf(__blecstr,__VA_ARGS__); if (uart) uart->write(__blecstr, strlen(__blecstr)); } |
takafuminaka | 3:2ea547dab8a8 | 25 | #else |
takafuminaka | 3:2ea547dab8a8 | 26 | #define BLEC(...) /* nothing */ |
takafuminaka | 3:2ea547dab8a8 | 27 | #endif /* #if NEED_BLE_CONSOLE */ |
takafuminaka | 1:a4119049dd99 | 28 | |
takafuminaka | 3:2ea547dab8a8 | 29 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 30 | // Prepare BLE device |
takafuminaka | 3:2ea547dab8a8 | 31 | const uint8_t DEVICE_NAME[] = "BLE Ligttning Sensor"; |
takafuminaka | 3:2ea547dab8a8 | 32 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 33 | |
takafuminaka | 1:a4119049dd99 | 34 | |
takafuminaka | 1:a4119049dd99 | 35 | // Prepare LED device |
takafuminaka | 1:a4119049dd99 | 36 | DigitalOut led1(LED1); |
takafuminaka | 1:a4119049dd99 | 37 | DigitalOut led2(LED2); |
takafuminaka | 1:a4119049dd99 | 38 | |
takafuminaka | 0:371bcac81ea2 | 39 | AS3935_ext Lightning(I2C_SDA0,I2C_SCL0,0x00,P0_23); |
takafuminaka | 0:371bcac81ea2 | 40 | InterruptIn IntLightning(P0_23); //IRQ AS3935 |
takafuminaka | 0:371bcac81ea2 | 41 | |
takafuminaka | 0:371bcac81ea2 | 42 | // used for the example only, not required for rtc use |
takafuminaka | 0:371bcac81ea2 | 43 | DigitalIn button1(BUTTON1); // used to trigger the time report |
takafuminaka | 0:371bcac81ea2 | 44 | InterruptIn button1Press(BUTTON1); |
takafuminaka | 0:371bcac81ea2 | 45 | |
takafuminaka | 3:2ea547dab8a8 | 46 | // event record buffer struct |
takafuminaka | 3:2ea547dab8a8 | 47 | const int s_evrecord=10; |
takafuminaka | 3:2ea547dab8a8 | 48 | struct t_evrecord { |
takafuminaka | 3:2ea547dab8a8 | 49 | public: |
takafuminaka | 3:2ea547dab8a8 | 50 | int event; |
takafuminaka | 3:2ea547dab8a8 | 51 | time_t time; |
takafuminaka | 3:2ea547dab8a8 | 52 | int distance; |
takafuminaka | 3:2ea547dab8a8 | 53 | |
takafuminaka | 3:2ea547dab8a8 | 54 | t_evrecord() { |
takafuminaka | 3:2ea547dab8a8 | 55 | event = 0; |
takafuminaka | 3:2ea547dab8a8 | 56 | time = 0; |
takafuminaka | 3:2ea547dab8a8 | 57 | distance = 0; |
takafuminaka | 3:2ea547dab8a8 | 58 | } |
takafuminaka | 3:2ea547dab8a8 | 59 | } evrecord[s_evrecord]; |
takafuminaka | 0:371bcac81ea2 | 60 | |
takafuminaka | 0:371bcac81ea2 | 61 | time_t example_time() { |
takafuminaka | 0:371bcac81ea2 | 62 | // set an intial time |
takafuminaka | 0:371bcac81ea2 | 63 | // ...not really necessary for this example, but it beats setting it to 0 or some non-obvious large integer (# of seconds since 1/1/1970) |
takafuminaka | 0:371bcac81ea2 | 64 | time_t rawtime=0; |
takafuminaka | 0:371bcac81ea2 | 65 | |
takafuminaka | 0:371bcac81ea2 | 66 | struct tm * init_timeinfo; |
takafuminaka | 0:371bcac81ea2 | 67 | |
takafuminaka | 0:371bcac81ea2 | 68 | // initialize time |
takafuminaka | 0:371bcac81ea2 | 69 | init_timeinfo = localtime(&rawtime); // note: must initialize the struct with this before trying to set components |
takafuminaka | 0:371bcac81ea2 | 70 | // ...else code goes into the weeds!! |
takafuminaka | 0:371bcac81ea2 | 71 | init_timeinfo->tm_sec = 0; |
takafuminaka | 0:371bcac81ea2 | 72 | init_timeinfo->tm_min = 0; |
takafuminaka | 0:371bcac81ea2 | 73 | init_timeinfo->tm_hour = 0; |
takafuminaka | 0:371bcac81ea2 | 74 | init_timeinfo->tm_mon = 0; |
takafuminaka | 0:371bcac81ea2 | 75 | init_timeinfo->tm_mday = 1; |
takafuminaka | 2:e1e638cbf972 | 76 | init_timeinfo->tm_year = 70; |
takafuminaka | 0:371bcac81ea2 | 77 | |
takafuminaka | 0:371bcac81ea2 | 78 | char date[24]; |
takafuminaka | 0:371bcac81ea2 | 79 | strftime(date,sizeof(date),"%H:%M:%S on %m/%d/%G",init_timeinfo); |
takafuminaka | 1:a4119049dd99 | 80 | DEBUG("Initial time set is %s.\r\n",date); |
takafuminaka | 0:371bcac81ea2 | 81 | |
takafuminaka | 0:371bcac81ea2 | 82 | // compute the proper value for time in time_t type |
takafuminaka | 0:371bcac81ea2 | 83 | rawtime = mktime(init_timeinfo); |
takafuminaka | 0:371bcac81ea2 | 84 | return rawtime; |
takafuminaka | 0:371bcac81ea2 | 85 | } |
takafuminaka | 1:a4119049dd99 | 86 | |
takafuminaka | 0:371bcac81ea2 | 87 | void print_time() { |
takafuminaka | 0:371bcac81ea2 | 88 | // called when a button is pushed, this prints the current time to the USB-connected console |
takafuminaka | 0:371bcac81ea2 | 89 | |
takafuminaka | 0:371bcac81ea2 | 90 | time_t rawtime=rtc.time(); |
takafuminaka | 0:371bcac81ea2 | 91 | |
takafuminaka | 0:371bcac81ea2 | 92 | // massage the time into a human-friendly format for printing |
takafuminaka | 0:371bcac81ea2 | 93 | struct tm * timeinfo; |
takafuminaka | 0:371bcac81ea2 | 94 | timeinfo = localtime(&rawtime); |
takafuminaka | 0:371bcac81ea2 | 95 | char date[24]; |
takafuminaka | 0:371bcac81ea2 | 96 | strftime(date,sizeof(date),"%H:%M:%S on %m/%d/%G",timeinfo); |
takafuminaka | 1:a4119049dd99 | 97 | DEBUG("The current time is %s.(%d)\r\n",date,rawtime); |
takafuminaka | 0:371bcac81ea2 | 98 | } |
takafuminaka | 0:371bcac81ea2 | 99 | |
takafuminaka | 1:a4119049dd99 | 100 | void periodic_update() { |
takafuminaka | 0:371bcac81ea2 | 101 | // for use as interrupt routine, to insure that RTC is updated periodically |
takafuminaka | 0:371bcac81ea2 | 102 | // ...if rtc is not read before the underlying counter rolls over (typically 512 seconds), the RTC value will be wrong |
takafuminaka | 0:371bcac81ea2 | 103 | // ...ideally this would be done as part of the nrf51_rtc method, but I couldn't get it to behave (see nrf51_rtc.cpp for details) |
takafuminaka | 0:371bcac81ea2 | 104 | rtc.time(); |
takafuminaka | 1:a4119049dd99 | 105 | Lightning.lightningDistanceKm(); |
takafuminaka | 1:a4119049dd99 | 106 | led1 = !led1; |
takafuminaka | 1:a4119049dd99 | 107 | |
takafuminaka | 0:371bcac81ea2 | 108 | // print_time(); |
takafuminaka | 0:371bcac81ea2 | 109 | } |
takafuminaka | 0:371bcac81ea2 | 110 | |
takafuminaka | 3:2ea547dab8a8 | 111 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 112 | BLEDevice ble; |
takafuminaka | 3:2ea547dab8a8 | 113 | UARTService *uart; |
takafuminaka | 3:2ea547dab8a8 | 114 | static Gap::ConnectionParams_t connectionParams; |
takafuminaka | 3:2ea547dab8a8 | 115 | int buff_flash_flag; |
takafuminaka | 3:2ea547dab8a8 | 116 | |
takafuminaka | 3:2ea547dab8a8 | 117 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) // Mod |
takafuminaka | 3:2ea547dab8a8 | 118 | { |
takafuminaka | 3:2ea547dab8a8 | 119 | DEBUG("Disconnected handle %u!\n\r", handle); |
takafuminaka | 3:2ea547dab8a8 | 120 | DEBUG("Restarting the advertising process\n\r"); |
takafuminaka | 3:2ea547dab8a8 | 121 | led2 = 0; |
takafuminaka | 3:2ea547dab8a8 | 122 | ble.gap().startAdvertising(); |
takafuminaka | 3:2ea547dab8a8 | 123 | |
takafuminaka | 3:2ea547dab8a8 | 124 | |
takafuminaka | 3:2ea547dab8a8 | 125 | } |
takafuminaka | 3:2ea547dab8a8 | 126 | |
takafuminaka | 3:2ea547dab8a8 | 127 | void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) |
takafuminaka | 3:2ea547dab8a8 | 128 | { |
takafuminaka | 3:2ea547dab8a8 | 129 | DEBUG("connected. Got handle %u\r\n", params->handle); |
takafuminaka | 3:2ea547dab8a8 | 130 | |
takafuminaka | 3:2ea547dab8a8 | 131 | connectionParams.slaveLatency = 1; |
takafuminaka | 3:2ea547dab8a8 | 132 | led2 = 1; |
takafuminaka | 3:2ea547dab8a8 | 133 | if (ble.gap().updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) { |
takafuminaka | 3:2ea547dab8a8 | 134 | DEBUG("failed to update connection paramter\r\n"); |
takafuminaka | 3:2ea547dab8a8 | 135 | } |
takafuminaka | 3:2ea547dab8a8 | 136 | buff_flash_flag = 1; |
takafuminaka | 3:2ea547dab8a8 | 137 | |
takafuminaka | 3:2ea547dab8a8 | 138 | } |
takafuminaka | 3:2ea547dab8a8 | 139 | |
takafuminaka | 3:2ea547dab8a8 | 140 | void onDataWritten(const GattWriteCallbackParams *params) |
takafuminaka | 3:2ea547dab8a8 | 141 | { |
takafuminaka | 4:8f815f8d804e | 142 | char buff[21]; |
takafuminaka | 3:2ea547dab8a8 | 143 | if ((uart != NULL) && (params->handle == uart->getTXCharacteristicHandle())) { |
takafuminaka | 3:2ea547dab8a8 | 144 | uint16_t bytesRead = params->len; |
takafuminaka | 3:2ea547dab8a8 | 145 | DEBUG("received %u bytes\n\r", bytesRead); |
takafuminaka | 3:2ea547dab8a8 | 146 | strncpy((char*)buff,(char*)params->data,bytesRead); |
takafuminaka | 3:2ea547dab8a8 | 147 | // ble.updateCharacteristicValue(uart->getRXCharacteristicHandle(), params->data, bytesRead); |
takafuminaka | 4:8f815f8d804e | 148 | // ble.updateCharacteristicValue(uart->getRXCharacteristicHandle(), buff, bytesRead); |
takafuminaka | 4:8f815f8d804e | 149 | |
takafuminaka | 4:8f815f8d804e | 150 | if ( strncmp("get time",buff,bytesRead) == 0 ) { |
takafuminaka | 4:8f815f8d804e | 151 | time_t rawtime=rtc.time(); |
takafuminaka | 4:8f815f8d804e | 152 | BLEC("Current Time:%d\n",rawtime); |
takafuminaka | 4:8f815f8d804e | 153 | } else if ( strncmp("get record ",buff,strlen("Get Record ")) == 0 ) { |
takafuminaka | 4:8f815f8d804e | 154 | int i=atoi(&buff[strlen("Get Record ")]); |
takafuminaka | 4:8f815f8d804e | 155 | if ( i >= 0 && i < s_evrecord ) { |
takafuminaka | 4:8f815f8d804e | 156 | BLEC("record %1d:%d:%1x:%2x\n",i,evrecord[i].time,evrecord[i].event,evrecord[i].distance); |
takafuminaka | 4:8f815f8d804e | 157 | } |
takafuminaka | 4:8f815f8d804e | 158 | } |
takafuminaka | 3:2ea547dab8a8 | 159 | } |
takafuminaka | 3:2ea547dab8a8 | 160 | } |
takafuminaka | 3:2ea547dab8a8 | 161 | |
takafuminaka | 3:2ea547dab8a8 | 162 | #endif // if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 163 | |
takafuminaka | 0:371bcac81ea2 | 164 | void DetectLightning() |
takafuminaka | 0:371bcac81ea2 | 165 | { |
takafuminaka | 0:371bcac81ea2 | 166 | char OriginInt; |
takafuminaka | 0:371bcac81ea2 | 167 | time_t rawtime=rtc.time(); |
takafuminaka | 0:371bcac81ea2 | 168 | struct tm * timeinfo; |
takafuminaka | 0:371bcac81ea2 | 169 | timeinfo = localtime(&rawtime); |
takafuminaka | 3:2ea547dab8a8 | 170 | char date[24],sdate[9]; |
takafuminaka | 0:371bcac81ea2 | 171 | int distance; |
takafuminaka | 0:371bcac81ea2 | 172 | |
takafuminaka | 0:371bcac81ea2 | 173 | strftime(date,sizeof(date),"%H:%M:%S on %m/%d/%G",timeinfo); |
takafuminaka | 3:2ea547dab8a8 | 174 | strftime(sdate,sizeof(sdate),"%H%M%S",timeinfo); |
takafuminaka | 0:371bcac81ea2 | 175 | |
takafuminaka | 0:371bcac81ea2 | 176 | wait_ms(2); //on attend 2ms préconisation constructeur |
takafuminaka | 0:371bcac81ea2 | 177 | OriginInt = Lightning.interruptSource(); |
takafuminaka | 0:371bcac81ea2 | 178 | distance = Lightning.lightningDistanceKm(); |
takafuminaka | 0:371bcac81ea2 | 179 | |
takafuminaka | 4:8f815f8d804e | 180 | for(int i=1;i<s_evrecord;i++) { |
takafuminaka | 4:8f815f8d804e | 181 | evrecord[i] = evrecord[i-1]; |
takafuminaka | 4:8f815f8d804e | 182 | } |
takafuminaka | 4:8f815f8d804e | 183 | evrecord[0].time = rawtime; |
takafuminaka | 4:8f815f8d804e | 184 | evrecord[0].event = OriginInt; |
takafuminaka | 4:8f815f8d804e | 185 | evrecord[0].distance = distance; |
takafuminaka | 4:8f815f8d804e | 186 | |
takafuminaka | 1:a4119049dd99 | 187 | if (OriginInt == 1) { |
takafuminaka | 1:a4119049dd99 | 188 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 189 | DEBUG("%24s : Noise level too high. %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 190 | } |
takafuminaka | 0:371bcac81ea2 | 191 | if (OriginInt == 4) { |
takafuminaka | 1:a4119049dd99 | 192 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 193 | DEBUG("%24s : Disturber detected. %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 194 | } |
takafuminaka | 0:371bcac81ea2 | 195 | if (OriginInt == 8) { |
takafuminaka | 1:a4119049dd99 | 196 | led2 = !led2; |
takafuminaka | 1:a4119049dd99 | 197 | DEBUG("%24s : Lightning interrupt %d km\r\n",date,distance); |
takafuminaka | 0:371bcac81ea2 | 198 | } |
takafuminaka | 0:371bcac81ea2 | 199 | } |
takafuminaka | 0:371bcac81ea2 | 200 | |
takafuminaka | 0:371bcac81ea2 | 201 | |
takafuminaka | 0:371bcac81ea2 | 202 | int main(void) |
takafuminaka | 0:371bcac81ea2 | 203 | { |
takafuminaka | 3:2ea547dab8a8 | 204 | #if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 205 | ble.init(); |
takafuminaka | 3:2ea547dab8a8 | 206 | ble.gap().onDisconnection(disconnectionCallback); |
takafuminaka | 3:2ea547dab8a8 | 207 | ble.gap().onConnection(onConnectionCallback); |
takafuminaka | 3:2ea547dab8a8 | 208 | ble.gattServer().onDataWritten(onDataWritten); |
takafuminaka | 3:2ea547dab8a8 | 209 | ble.gap().getPreferredConnectionParams(&connectionParams); |
takafuminaka | 3:2ea547dab8a8 | 210 | |
takafuminaka | 3:2ea547dab8a8 | 211 | uart = new UARTService(ble); |
takafuminaka | 3:2ea547dab8a8 | 212 | buff_flash_flag = 0; |
takafuminaka | 3:2ea547dab8a8 | 213 | |
takafuminaka | 3:2ea547dab8a8 | 214 | #endif // if NEED_BLE_CONSOLE |
takafuminaka | 3:2ea547dab8a8 | 215 | |
takafuminaka | 3:2ea547dab8a8 | 216 | |
takafuminaka | 1:a4119049dd99 | 217 | led1=0; |
takafuminaka | 1:a4119049dd99 | 218 | led2=0; |
takafuminaka | 0:371bcac81ea2 | 219 | int hz=0; |
takafuminaka | 0:371bcac81ea2 | 220 | |
takafuminaka | 0:371bcac81ea2 | 221 | //initialisations |
takafuminaka | 2:e1e638cbf972 | 222 | wait(1); |
takafuminaka | 1:a4119049dd99 | 223 | DEBUG("reset\r\n"); |
takafuminaka | 0:371bcac81ea2 | 224 | Lightning.reset(); |
takafuminaka | 1:a4119049dd99 | 225 | DEBUG("setTuneCap as 5\r\n"); |
takafuminaka | 0:371bcac81ea2 | 226 | Lightning.setTuneCap(5); // Tuning Parameter |
takafuminaka | 1:a4119049dd99 | 227 | DEBUG("powerup\r\n"); |
takafuminaka | 0:371bcac81ea2 | 228 | Lightning.powerUp(); |
takafuminaka | 2:e1e638cbf972 | 229 | |
takafuminaka | 2:e1e638cbf972 | 230 | DEBUG("set Indoor Mode as 0x0d\r\n"); |
takafuminaka | 2:e1e638cbf972 | 231 | Lightning.registerWrite(AS3935_AFE_GB,0x0d); |
takafuminaka | 2:e1e638cbf972 | 232 | |
takafuminaka | 1:a4119049dd99 | 233 | DEBUG("Auto Calibration Start\r\n"); |
takafuminaka | 0:371bcac81ea2 | 234 | float minerr = 100; |
takafuminaka | 0:371bcac81ea2 | 235 | int fincap = 7; |
takafuminaka | 0:371bcac81ea2 | 236 | for(int i=0;i<16;i++) { |
takafuminaka | 0:371bcac81ea2 | 237 | Lightning.setTuneCap(i); // Tuning Parameter |
takafuminaka | 0:371bcac81ea2 | 238 | hz = Lightning.MeasureLCOFreq(); |
takafuminaka | 0:371bcac81ea2 | 239 | float err = (hz-500000.)/500000.*100.; |
takafuminaka | 1:a4119049dd99 | 240 | DEBUG("%d : hz=%10d Hz (%5.2f%%)\r\n",i,hz,err); |
takafuminaka | 0:371bcac81ea2 | 241 | if ( abs(err) < minerr ) { |
takafuminaka | 0:371bcac81ea2 | 242 | minerr = abs(err); |
takafuminaka | 0:371bcac81ea2 | 243 | fincap = i; |
takafuminaka | 0:371bcac81ea2 | 244 | } |
takafuminaka | 0:371bcac81ea2 | 245 | } |
takafuminaka | 0:371bcac81ea2 | 246 | Lightning.setTuneCap(fincap); // Tuning Parameter |
takafuminaka | 0:371bcac81ea2 | 247 | wait_ms(100); |
takafuminaka | 0:371bcac81ea2 | 248 | hz = Lightning.MeasureLCOFreq(); |
takafuminaka | 0:371bcac81ea2 | 249 | float err = (hz-500000.)/500000.*100.; |
takafuminaka | 1:a4119049dd99 | 250 | DEBUG("Final %d : hz=%10d Hz (%5.2f%%)\r\n",fincap,hz,err); |
takafuminaka | 3:2ea547dab8a8 | 251 | BLEC("%1x:%10dHz:%5.2f:final\n",fincap,hz,err); |
takafuminaka | 0:371bcac81ea2 | 252 | |
takafuminaka | 1:a4119049dd99 | 253 | DEBUG("Auto Calibration finished\r\n"); |
takafuminaka | 0:371bcac81ea2 | 254 | |
takafuminaka | 0:371bcac81ea2 | 255 | // user selectable, any time < 512 seconds is OK |
takafuminaka | 0:371bcac81ea2 | 256 | #define PERIODIC_UPDATE 1 |
takafuminaka | 0:371bcac81ea2 | 257 | Ticker rtc_ticker; |
takafuminaka | 1:a4119049dd99 | 258 | rtc_ticker.attach(&periodic_update, PERIODIC_UPDATE); |
takafuminaka | 0:371bcac81ea2 | 259 | |
takafuminaka | 0:371bcac81ea2 | 260 | time_t initial_time = example_time(); |
takafuminaka | 0:371bcac81ea2 | 261 | rtc.set_time(initial_time); |
takafuminaka | 0:371bcac81ea2 | 262 | |
takafuminaka | 0:371bcac81ea2 | 263 | button1Press.fall(&print_time); // when button1 is pressed, this calls rtc.time() and prints it |
takafuminaka | 0:371bcac81ea2 | 264 | |
takafuminaka | 0:371bcac81ea2 | 265 | IntLightning.rise(&DetectLightning); |
takafuminaka | 0:371bcac81ea2 | 266 | |
takafuminaka | 3:2ea547dab8a8 | 267 | #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 268 | /* setup advertising */ |
takafuminaka | 3:2ea547dab8a8 | 269 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
takafuminaka | 3:2ea547dab8a8 | 270 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
takafuminaka | 3:2ea547dab8a8 | 271 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
takafuminaka | 3:2ea547dab8a8 | 272 | DEVICE_NAME, sizeof(DEVICE_NAME) - 1); |
takafuminaka | 3:2ea547dab8a8 | 273 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
takafuminaka | 3:2ea547dab8a8 | 274 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
takafuminaka | 1:a4119049dd99 | 275 | |
takafuminaka | 1:a4119049dd99 | 276 | ble.gap().setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
takafuminaka | 1:a4119049dd99 | 277 | ble.gap().startAdvertising(); |
takafuminaka | 3:2ea547dab8a8 | 278 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 1:a4119049dd99 | 279 | |
takafuminaka | 0:371bcac81ea2 | 280 | while (true) { |
takafuminaka | 4:8f815f8d804e | 281 | #if NEED_BLE_CONSOLE |
takafuminaka | 4:8f815f8d804e | 282 | ble.waitForEvent(); |
takafuminaka | 4:8f815f8d804e | 283 | #endif // #if NEED_BLE_CONSOLE |
takafuminaka | 0:371bcac81ea2 | 284 | } |
takafuminaka | 0:371bcac81ea2 | 285 | } |
takafuminaka | 1:a4119049dd99 | 286 |