This software setup a central node of a star topology network

Dependencies:   MQTT target_st_bluenrg

Fork of ble-star-mbed by Lorenzo Invidia

Committer:
lorevee
Date:
Mon Feb 26 12:29:03 2018 +0000
Revision:
2:1525f4848cf2
Parent:
1:110b5e896bc9
Child:
3:3f35e80ed848
Ble Star release 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lorevee 0:1902469bdd2d 1 #include <BleMasterService.h>
lorevee 0:1902469bdd2d 2 #include <cstdint>
lorevee 0:1902469bdd2d 3 #include <cstdio>
lorevee 0:1902469bdd2d 4 #include <cstring>
lorevee 0:1902469bdd2d 5 #include "../inc/BleMasterService.h"
lorevee 0:1902469bdd2d 6 #include "../inc/BleSlaveService.h"
lorevee 0:1902469bdd2d 7
lorevee 0:1902469bdd2d 8 EventQueue eventQ(/* event count */ 128 * EVENTS_EVENT_SIZE);
lorevee 0:1902469bdd2d 9
lorevee 0:1902469bdd2d 10 /* This var defines the central role
lorevee 0:1902469bdd2d 11 * 0 if master
lorevee 0:1902469bdd2d 12 * 1 if slave */
lorevee 0:1902469bdd2d 13 uint8_t role = 1;
lorevee 0:1902469bdd2d 14
lorevee 0:1902469bdd2d 15
lorevee 0:1902469bdd2d 16
lorevee 0:1902469bdd2d 17 /* Flag to indicate that the characteristic read is completed successful
lorevee 0:1902469bdd2d 18 * 1 successful
lorevee 0:1902469bdd2d 19 * 0 or anything else failed */
lorevee 0:1902469bdd2d 20 uint8_t readCompleted;
lorevee 0:1902469bdd2d 21
lorevee 0:1902469bdd2d 22
lorevee 0:1902469bdd2d 23
lorevee 0:1902469bdd2d 24
lorevee 0:1902469bdd2d 25 /* Flag to indicate if the device discovery is completed successful
lorevee 0:1902469bdd2d 26 * 1 successful
lorevee 0:1902469bdd2d 27 * 0 or anything else failed */
lorevee 0:1902469bdd2d 28 uint8_t discoveryCompleted;
lorevee 0:1902469bdd2d 29
lorevee 0:1902469bdd2d 30
lorevee 0:1902469bdd2d 31 /* Flag to indicate if the ch descriptor write is completed successful
lorevee 0:1902469bdd2d 32 * 1 successful
lorevee 0:1902469bdd2d 33 * 0 or anything else failed */
lorevee 0:1902469bdd2d 34 uint8_t writeDescriptorCompleted = 1;
lorevee 0:1902469bdd2d 35
lorevee 0:1902469bdd2d 36
lorevee 0:1902469bdd2d 37 /* Flag to indicate if the advertising is completed
lorevee 0:1902469bdd2d 38 * 1 completed
lorevee 0:1902469bdd2d 39 * 0 or anything else not completed */
lorevee 0:1902469bdd2d 40 uint8_t advEnds = 1;
lorevee 0:1902469bdd2d 41
lorevee 0:1902469bdd2d 42
lorevee 0:1902469bdd2d 43 /* Flag to indicate if a change of notification is pending
lorevee 0:1902469bdd2d 44 * 1 pending
lorevee 0:1902469bdd2d 45 * 0 or anything else not pending */
lorevee 0:1902469bdd2d 46 uint8_t notificationPending = 0;
lorevee 0:1902469bdd2d 47
lorevee 0:1902469bdd2d 48
lorevee 1:110b5e896bc9 49
lorevee 1:110b5e896bc9 50 /* Flag to indicate if the ble stack is busy
lorevee 1:110b5e896bc9 51 * 1 busy
lorevee 1:110b5e896bc9 52 * 0 or anything else not busy */
lorevee 1:110b5e896bc9 53 uint8_t stackBusy = 0;
lorevee 1:110b5e896bc9 54
lorevee 1:110b5e896bc9 55
lorevee 1:110b5e896bc9 56
lorevee 0:1902469bdd2d 57 /* Header pointer of the DiscoveredCharacteristic list */
lorevee 0:1902469bdd2d 58 DiscoveredCharacteristicNode * headCharacteristic[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 59 DiscoveredCharacteristicNode * tmp[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 60
lorevee 0:1902469bdd2d 61 /* Primary Service UUID expected from Sensor demo peripherals */
lorevee 0:1902469bdd2d 62 UUID::ShortUUIDBytes_t GENERIC_ACCESS_PROFILE_UUID = 0x1800;
lorevee 0:1902469bdd2d 63 UUID::ShortUUIDBytes_t GENERIC_ATTRIBUTE_PROFILE_UUID = 0x1801;
lorevee 0:1902469bdd2d 64
lorevee 0:1902469bdd2d 65 /* Services UUID */
lorevee 0:1902469bdd2d 66 UUID::LongUUIDBytes_t HARDWARE_SERVICE_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0xb4,0x9a,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x00};
lorevee 0:1902469bdd2d 67 UUID::LongUUIDBytes_t CONFIG_SERVICE_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0xb4,0x9a,0xe1,0x11,0x0F,0x00,0x00,0x00,0x00,0x00};
lorevee 0:1902469bdd2d 68 UUID::LongUUIDBytes_t SOFTWARE_SERVICE_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0xb4,0x9a,0xe1,0x11,0x02,0x00,0x00,0x00,0x00,0x00};
lorevee 0:1902469bdd2d 69
lorevee 0:1902469bdd2d 70 /* Characteristics UUID */
lorevee 0:1902469bdd2d 71 UUID::LongUUIDBytes_t ENVIRONMENTAL_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x1d,0x00};
lorevee 0:1902469bdd2d 72 UUID::LongUUIDBytes_t ENVIRONMENTAL_ST_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x14,0x00};
lorevee 0:1902469bdd2d 73 UUID::LongUUIDBytes_t ACCGYROMAG_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0xE0,0x00};
lorevee 0:1902469bdd2d 74 UUID::LongUUIDBytes_t SFUSION_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x01,0x00,0x00};
lorevee 0:1902469bdd2d 75 UUID::LongUUIDBytes_t LED_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x20};
lorevee 0:1902469bdd2d 76 UUID::LongUUIDBytes_t WAKEUP_EVENT_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x04,0x00,0x00};
lorevee 0:1902469bdd2d 77 UUID::LongUUIDBytes_t MIC_EVENT_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x04};
lorevee 0:1902469bdd2d 78 UUID::LongUUIDBytes_t PROXIMITY_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x02};
lorevee 0:1902469bdd2d 79 UUID::LongUUIDBytes_t LUX_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x01,0x00,0x00,0x00,0x00,0x01};
lorevee 0:1902469bdd2d 80 UUID::LongUUIDBytes_t CONFIG_CHAR_UUID = {0x1b,0xc5,0xd5,0xa5,0x02,0x00,0x36,0xac,0xe1,0x11,0x0F,0x00,0x02,0x00,0x00,0x00};
lorevee 0:1902469bdd2d 81
lorevee 0:1902469bdd2d 82 /*----- -----*/
lorevee 0:1902469bdd2d 83 uint8_t wifi_data[256];
lorevee 0:1902469bdd2d 84 uint8_t new_data = 0;
lorevee 0:1902469bdd2d 85 uint8_t *data;
lorevee 0:1902469bdd2d 86 uint8_t wifi_present;
lorevee 0:1902469bdd2d 87
lorevee 0:1902469bdd2d 88 char print_msg_buff[512];
lorevee 0:1902469bdd2d 89 //UART_HandleTypeDef UartMsgHandle;
lorevee 0:1902469bdd2d 90
lorevee 0:1902469bdd2d 91 //uint16_t connection_handle = 0;
lorevee 0:1902469bdd2d 92
lorevee 0:1902469bdd2d 93 uint8_t attribute_value[20];
lorevee 0:1902469bdd2d 94 uint8_t star_attr_value[256];
lorevee 0:1902469bdd2d 95
lorevee 0:1902469bdd2d 96
lorevee 0:1902469bdd2d 97
lorevee 0:1902469bdd2d 98 PeripheralDevices_t perDevs;
lorevee 0:1902469bdd2d 99 extern SlaveDevice_t slaveDev;
lorevee 0:1902469bdd2d 100 extern ChangeNotificationQueue notifyQ, *notifyP;
lorevee 0:1902469bdd2d 101
lorevee 0:1902469bdd2d 102 /* Private variable set in discoveryTerminationCallback and used
lorevee 0:1902469bdd2d 103 * in connectionProcess for enabling notification */
lorevee 0:1902469bdd2d 104 uint8_t customDev_v;
lorevee 0:1902469bdd2d 105
lorevee 0:1902469bdd2d 106
lorevee 0:1902469bdd2d 107
lorevee 0:1902469bdd2d 108 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 109
lorevee 0:1902469bdd2d 110
lorevee 0:1902469bdd2d 111
lorevee 0:1902469bdd2d 112 /* Initialize the struct where all peripheral devices are stored */
lorevee 0:1902469bdd2d 113 void initProcess(void) {
lorevee 0:1902469bdd2d 114 //printf("\rinitProcess\n");//DEBUG
lorevee 0:1902469bdd2d 115
lorevee 0:1902469bdd2d 116 //Init the lists of characteristics
lorevee 0:1902469bdd2d 117 for(int i=0; i<MAX_NUM_OF_NODES; i++){
lorevee 0:1902469bdd2d 118 headCharacteristic[i] = NULL;
lorevee 0:1902469bdd2d 119 tmp[i] = NULL;
lorevee 0:1902469bdd2d 120 }
lorevee 0:1902469bdd2d 121
lorevee 0:1902469bdd2d 122
lorevee 0:1902469bdd2d 123
lorevee 0:1902469bdd2d 124 /* The first char read */
lorevee 0:1902469bdd2d 125 readCompleted = 1;
lorevee 0:1902469bdd2d 126
lorevee 0:1902469bdd2d 127 /* No discovery started */
lorevee 0:1902469bdd2d 128 discoveryCompleted = 1;
lorevee 0:1902469bdd2d 129
lorevee 0:1902469bdd2d 130
lorevee 0:1902469bdd2d 131 perDevs.discovery_enabled = true;
lorevee 0:1902469bdd2d 132 perDevs.device_found = false;
lorevee 0:1902469bdd2d 133 perDevs.connDevices = 0;
lorevee 0:1902469bdd2d 134 perDevs.discDevices = 0;
lorevee 0:1902469bdd2d 135 perDevs.connDeviceIdx = 0;
lorevee 0:1902469bdd2d 136 perDevs.readDeviceIdx = 0;
lorevee 0:1902469bdd2d 137
lorevee 0:1902469bdd2d 138 for(unsigned i=0;i<MAX_NUM_OF_NODES;i++){
lorevee 0:1902469bdd2d 139 perDevs.devInfo[i].dev_v = 0;
lorevee 0:1902469bdd2d 140 perDevs.connection_handle[i] = 0;
lorevee 0:1902469bdd2d 141 perDevs.is_connected[i] = false;
lorevee 0:1902469bdd2d 142 perDevs.is_disconnected[i] = true;
lorevee 0:1902469bdd2d 143 perDevs.is_unconnectable[i] = false;
lorevee 0:1902469bdd2d 144 perDevs.gen_access_profile_handle[i].start_h = 0;
lorevee 0:1902469bdd2d 145 perDevs.gen_access_profile_handle[i].end_h = 0;
lorevee 0:1902469bdd2d 146 perDevs.gen_attribute_profile_handle[i].start_h = 0;
lorevee 0:1902469bdd2d 147 perDevs.gen_attribute_profile_handle[i].end_h = 0;
lorevee 0:1902469bdd2d 148 perDevs.hardware_service_handle[i].start_h = 0;
lorevee 0:1902469bdd2d 149 perDevs.hardware_service_handle[i].end_h = 0;
lorevee 0:1902469bdd2d 150 perDevs.software_service_handle[i].start_h = 0;
lorevee 0:1902469bdd2d 151 perDevs.software_service_handle[i].end_h = 0;
lorevee 0:1902469bdd2d 152 perDevs.led_char_read[i] = 0;
lorevee 0:1902469bdd2d 153 perDevs.wup_char_read[i] = 0;
lorevee 0:1902469bdd2d 154 perDevs.mic_char_read[i] = 0;
lorevee 0:1902469bdd2d 155 perDevs.prx_char_read[i] = 0;
lorevee 0:1902469bdd2d 156 perDevs.agm_char_read[i] = 0;
lorevee 0:1902469bdd2d 157 perDevs.sfusion_char_read[i] = 0;
lorevee 0:1902469bdd2d 158 perDevs.wup_event[i] = 0;
lorevee 0:1902469bdd2d 159 perDevs.mic_event[i] = 0;
lorevee 0:1902469bdd2d 160 perDevs.prx_on[i] = 0;
lorevee 0:1902469bdd2d 161 perDevs.agm_on[i] = 0;
lorevee 0:1902469bdd2d 162 perDevs.sfusion_on[i] = 0;
lorevee 0:1902469bdd2d 163 }
lorevee 0:1902469bdd2d 164
lorevee 0:1902469bdd2d 165 perDevs.mic_event_enabled = 0;
lorevee 0:1902469bdd2d 166 perDevs.prx_event_enabled = 0;
lorevee 0:1902469bdd2d 167 perDevs.agm_event_enabled = 0;
lorevee 0:1902469bdd2d 168 perDevs.sfusion_event_enabled = 0;
lorevee 0:1902469bdd2d 169 perDevs.acc_event_enabled = 0;
lorevee 0:1902469bdd2d 170 perDevs.gyr_event_enabled = 0;
lorevee 0:1902469bdd2d 171 perDevs.mag_event_enabled = 0;
lorevee 0:1902469bdd2d 172 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 173 }
lorevee 0:1902469bdd2d 174 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 175
lorevee 0:1902469bdd2d 176
lorevee 0:1902469bdd2d 177
lorevee 0:1902469bdd2d 178 /* Called every 10 seconds to return the current status */
lorevee 0:1902469bdd2d 179 void checkStatus(){
lorevee 0:1902469bdd2d 180 if ((perDevs.status != 10) && (perDevs.status != 11) && (perDevs.status != 12) && (perDevs.status != 13) && (perDevs.status != 14)
lorevee 0:1902469bdd2d 181 && (perDevs.status != 15) && (perDevs.status != 16) && (perDevs.status != 17) && (perDevs.status != 18)
lorevee 0:1902469bdd2d 182 && (perDevs.status != 19) && (perDevs.status != 20) && (perDevs.status != 21)){
lorevee 0:1902469bdd2d 183 printf("\r\nCurrent Status (status: %d) (read: %s) (write: %s)\n", perDevs.status, (readCompleted == 1 ? "completed" : "pending"),(writeDescriptorCompleted == 1 ? "completed" : "pending"));
lorevee 0:1902469bdd2d 184 }
lorevee 0:1902469bdd2d 185 }
lorevee 0:1902469bdd2d 186 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 187
lorevee 0:1902469bdd2d 188
lorevee 0:1902469bdd2d 189
lorevee 0:1902469bdd2d 190 /* Print out device MAC address to the console*/
lorevee 0:1902469bdd2d 191 void printMacAddress()
lorevee 0:1902469bdd2d 192 {
lorevee 0:1902469bdd2d 193 Gap::AddressType_t addr_type;
lorevee 0:1902469bdd2d 194 Gap::Address_t address;
lorevee 0:1902469bdd2d 195 BLE::Instance().gap().getAddress(&addr_type, address);
lorevee 0:1902469bdd2d 196 printf("\rBLE CENTRAL MAC ADDRESS: ");
lorevee 0:1902469bdd2d 197 for (int i = 5; i >= 1; i--){
lorevee 0:1902469bdd2d 198 printf("%02x:", address[i]);
lorevee 0:1902469bdd2d 199 }
lorevee 0:1902469bdd2d 200 printf("%02x\n\n", address[0]);
lorevee 0:1902469bdd2d 201 }
lorevee 0:1902469bdd2d 202 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 203
lorevee 0:1902469bdd2d 204
lorevee 0:1902469bdd2d 205 void connectionProcess(void){
lorevee 0:1902469bdd2d 206 //printf("\r\nconnectionProcess(%d)\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 207
lorevee 0:1902469bdd2d 208
lorevee 0:1902469bdd2d 209
lorevee 0:1902469bdd2d 210
lorevee 0:1902469bdd2d 211 if ( perDevs.status == CONN_INIT ) {
lorevee 0:1902469bdd2d 212 if ( (perDevs.connDevices < MAX_NUM_OF_NODES) && (perDevs.discovery_enabled) ) {
lorevee 0:1902469bdd2d 213 /* Start discovery of new peripheral nodes and connect them */
lorevee 1:110b5e896bc9 214 //startDiscovery();
lorevee 1:110b5e896bc9 215 eventQ.call(startDiscovery);
lorevee 0:1902469bdd2d 216 }
lorevee 0:1902469bdd2d 217 else {
lorevee 0:1902469bdd2d 218 perDevs.status = DEVICE_CONNECTED;
lorevee 2:1525f4848cf2 219 }
lorevee 0:1902469bdd2d 220
lorevee 0:1902469bdd2d 221 }//if
lorevee 0:1902469bdd2d 222
lorevee 0:1902469bdd2d 223
lorevee 0:1902469bdd2d 224
lorevee 0:1902469bdd2d 225
lorevee 0:1902469bdd2d 226
lorevee 0:1902469bdd2d 227
lorevee 0:1902469bdd2d 228 if ( perDevs.status == DEVICE_DISCOVERY_COMPLETE ) {
lorevee 0:1902469bdd2d 229 if ( perDevs.device_found == true ) {
lorevee 0:1902469bdd2d 230 /* Establishing connection with a peripheral device */
lorevee 0:1902469bdd2d 231 perDevs.status = START_DEVICE_CONNECTION;
lorevee 0:1902469bdd2d 232 connectPeripheral();
lorevee 0:1902469bdd2d 233 }else {
lorevee 0:1902469bdd2d 234 perDevs.status = DEVICE_NOT_FOUND;
lorevee 0:1902469bdd2d 235 }
lorevee 0:1902469bdd2d 236 }//if
lorevee 0:1902469bdd2d 237
lorevee 0:1902469bdd2d 238
lorevee 0:1902469bdd2d 239
lorevee 0:1902469bdd2d 240
lorevee 0:1902469bdd2d 241
lorevee 0:1902469bdd2d 242
lorevee 0:1902469bdd2d 243 // if all devices are connected or no devices are discovered start reading
lorevee 0:1902469bdd2d 244 if ((perDevs.status == DEVICE_CONNECTED) || (perDevs.status == DEVICE_NOT_FOUND) ){
lorevee 2:1525f4848cf2 245
lorevee 0:1902469bdd2d 246 if (perDevs.device_found == true) {
lorevee 0:1902469bdd2d 247 perDevs.status = DISCOVERABLE_MODE_SET;
lorevee 0:1902469bdd2d 248 perDevs.device_found = false;
lorevee 0:1902469bdd2d 249 }
lorevee 0:1902469bdd2d 250
lorevee 0:1902469bdd2d 251 else {
lorevee 0:1902469bdd2d 252 perDevs.readDeviceIdx = perDevs.connDevices+perDevs.discDevices-1;
lorevee 0:1902469bdd2d 253 perDevs.status = READ_INIT;
lorevee 0:1902469bdd2d 254 }
lorevee 0:1902469bdd2d 255
lorevee 0:1902469bdd2d 256 }//if-main
lorevee 0:1902469bdd2d 257
lorevee 0:1902469bdd2d 258
lorevee 0:1902469bdd2d 259
lorevee 0:1902469bdd2d 260
lorevee 0:1902469bdd2d 261
lorevee 0:1902469bdd2d 262
lorevee 0:1902469bdd2d 263 if (perDevs.status == DISCOVERABLE_MODE_SET) {
lorevee 0:1902469bdd2d 264 /* Search for all services */
lorevee 0:1902469bdd2d 265 perDevs.status = START_SERVICE_DISCOVERY;
lorevee 0:1902469bdd2d 266 eventQ.call(discoverServices);
lorevee 0:1902469bdd2d 267 }//if
lorevee 0:1902469bdd2d 268
lorevee 0:1902469bdd2d 269
lorevee 0:1902469bdd2d 270
lorevee 0:1902469bdd2d 271
lorevee 0:1902469bdd2d 272
lorevee 0:1902469bdd2d 273
lorevee 0:1902469bdd2d 274 if ( ((perDevs.status == ENABLE_ME1_LED_NOTIFICATIONS) ||
lorevee 0:1902469bdd2d 275 (perDevs.status == ENABLE_ME1_WUP_NOTIFICATIONS)) && (writeDescriptorCompleted == 1) ) {
lorevee 0:1902469bdd2d 276
lorevee 0:1902469bdd2d 277 writeDescriptorCompleted =0;
lorevee 0:1902469bdd2d 278 /* Enabling notifications on peripheral node */
lorevee 0:1902469bdd2d 279 uint8_t i = perDevs.connDeviceIdx;
lorevee 0:1902469bdd2d 280 uint16_t connection_handle = perDevs.connection_handle[i];
lorevee 0:1902469bdd2d 281 enableNotifications(connection_handle, i, customDev_v, 1);
lorevee 0:1902469bdd2d 282 }//if
lorevee 0:1902469bdd2d 283
lorevee 0:1902469bdd2d 284
lorevee 0:1902469bdd2d 285
lorevee 0:1902469bdd2d 286
lorevee 0:1902469bdd2d 287
lorevee 0:1902469bdd2d 288
lorevee 0:1902469bdd2d 289
lorevee 0:1902469bdd2d 290 if (perDevs.status == NOTIFICATIONS_ENABLED) {
lorevee 0:1902469bdd2d 291 if (!perDevs.is_disconnected[perDevs.connDeviceIdx]) {
lorevee 0:1902469bdd2d 292 perDevs.is_connected[perDevs.connDeviceIdx] = true;
lorevee 0:1902469bdd2d 293 perDevs.connDeviceIdx++;
lorevee 0:1902469bdd2d 294 perDevs.connDevices++;
lorevee 0:1902469bdd2d 295 }
lorevee 0:1902469bdd2d 296
lorevee 0:1902469bdd2d 297 perDevs.readDeviceIdx = perDevs.connDevices-1;
lorevee 0:1902469bdd2d 298 perDevs.status = READ_INIT;
lorevee 0:1902469bdd2d 299 }//if
lorevee 0:1902469bdd2d 300
lorevee 0:1902469bdd2d 301
lorevee 0:1902469bdd2d 302
lorevee 0:1902469bdd2d 303
lorevee 0:1902469bdd2d 304
lorevee 0:1902469bdd2d 305 /* Start reading process */
lorevee 0:1902469bdd2d 306 eventQ.call(readingProcess);
lorevee 2:1525f4848cf2 307
lorevee 0:1902469bdd2d 308 }
lorevee 0:1902469bdd2d 309 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 310
lorevee 0:1902469bdd2d 311
lorevee 0:1902469bdd2d 312
lorevee 0:1902469bdd2d 313 /* Method called in advertingCallback when a device is found */
lorevee 0:1902469bdd2d 314 void saveDeviceFound (uint8_t adv_type, BLEProtocol::AddressBytes_t addr,
lorevee 0:1902469bdd2d 315 uint8_t data_length, const uint8_t* data_RSSI, uint8_t pos, uint8_t dev_v,
lorevee 0:1902469bdd2d 316 uint8_t wup_event, uint8_t mic_event, uint8_t prx_event,
lorevee 0:1902469bdd2d 317 uint8_t agm_event, uint8_t sfusion_event){
lorevee 0:1902469bdd2d 318
lorevee 0:1902469bdd2d 319 perDevs.devInfo[pos].dev_v = dev_v;
lorevee 0:1902469bdd2d 320 perDevs.wup_event[pos] = wup_event;
lorevee 0:1902469bdd2d 321 perDevs.mic_event[pos] = mic_event;
lorevee 0:1902469bdd2d 322 perDevs.prx_event[pos] = prx_event;
lorevee 0:1902469bdd2d 323 perDevs.agm_event[pos] = agm_event;
lorevee 0:1902469bdd2d 324 perDevs.sfusion_event[pos] = sfusion_event;
lorevee 0:1902469bdd2d 325 memcpy(perDevs.devInfo[pos].bdaddr, addr, 6);
lorevee 0:1902469bdd2d 326 }
lorevee 0:1902469bdd2d 327 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 328
lorevee 0:1902469bdd2d 329
lorevee 0:1902469bdd2d 330
lorevee 0:1902469bdd2d 331
lorevee 0:1902469bdd2d 332 /* Function called to connect a peripheral */
lorevee 0:1902469bdd2d 333 void connectPeripheral(void){
lorevee 0:1902469bdd2d 334
lorevee 0:1902469bdd2d 335 ble_error_t e0, e1;
lorevee 0:1902469bdd2d 336 BLE& ble = BLE::Instance();
lorevee 0:1902469bdd2d 337
lorevee 0:1902469bdd2d 338
lorevee 0:1902469bdd2d 339 /* if 1 to enable */
lorevee 0:1902469bdd2d 340 #if 1
lorevee 0:1902469bdd2d 341 e0 = ble.gap().stopScan();
lorevee 0:1902469bdd2d 342 if (e0 != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 343 printf("\r\nError while stopping scan\n");
lorevee 0:1902469bdd2d 344 }
lorevee 0:1902469bdd2d 345 #endif
lorevee 0:1902469bdd2d 346
lorevee 0:1902469bdd2d 347 uint8_t index;
lorevee 0:1902469bdd2d 348 index = perDevs.connDeviceIdx;
lorevee 0:1902469bdd2d 349
lorevee 0:1902469bdd2d 350 printf("\r\nClient create connection with peripheral %d at pos %d\n",
lorevee 0:1902469bdd2d 351 perDevs.connDevices+1, index+1);
lorevee 0:1902469bdd2d 352
lorevee 0:1902469bdd2d 353 //Connect as master (0)
lorevee 0:1902469bdd2d 354 role = 0;
lorevee 0:1902469bdd2d 355
lorevee 0:1902469bdd2d 356
lorevee 1:110b5e896bc9 357 e1 = ble.gap().connect(perDevs.devInfo[index].bdaddr, BLEProtocol::AddressType::RANDOM_STATIC, NULL, NULL);
lorevee 0:1902469bdd2d 358
lorevee 0:1902469bdd2d 359
lorevee 0:1902469bdd2d 360 if (e1 != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 361 printf("Error while starting connection with peripheral %d (%02x%02x).\n",
lorevee 0:1902469bdd2d 362 index+1, perDevs.devInfo[index].bdaddr[NODE_ID_B2], perDevs.devInfo[index].bdaddr[NODE_ID_B1]);
lorevee 0:1902469bdd2d 363 perDevs.is_unconnectable[index] = true;
lorevee 0:1902469bdd2d 364 }
lorevee 0:1902469bdd2d 365 }
lorevee 0:1902469bdd2d 366 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 367
lorevee 0:1902469bdd2d 368
lorevee 0:1902469bdd2d 369
lorevee 0:1902469bdd2d 370
lorevee 0:1902469bdd2d 371 /* Function called on disconnection event */
lorevee 0:1902469bdd2d 372 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
lorevee 0:1902469bdd2d 373 //printf("\r\ndisconnectionCallback (%d)\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 374 BLE& ble = BLE::Instance();
lorevee 0:1902469bdd2d 375
lorevee 0:1902469bdd2d 376 uint8_t i;
lorevee 0:1902469bdd2d 377
lorevee 0:1902469bdd2d 378 // current handle
lorevee 0:1902469bdd2d 379 uint16_t handle = params->handle;
lorevee 0:1902469bdd2d 380
lorevee 0:1902469bdd2d 381
lorevee 0:1902469bdd2d 382
lorevee 0:1902469bdd2d 383
lorevee 0:1902469bdd2d 384
lorevee 0:1902469bdd2d 385 for (unsigned i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 386
lorevee 0:1902469bdd2d 387 //if-MAIN
lorevee 0:1902469bdd2d 388 if (handle == perDevs.connection_handle[i]){
lorevee 2:1525f4848cf2 389
lorevee 0:1902469bdd2d 390 //Delete its DCList
lorevee 0:1902469bdd2d 391 deleteDCNList(headCharacteristic[i]);
lorevee 0:1902469bdd2d 392 headCharacteristic[i] = NULL;
lorevee 0:1902469bdd2d 393 tmp[i] = NULL;
lorevee 0:1902469bdd2d 394
lorevee 0:1902469bdd2d 395 if (perDevs.is_disconnected[i] == true){
lorevee 0:1902469bdd2d 396 perDevs.is_unconnectable[i] = true;
lorevee 0:1902469bdd2d 397
lorevee 0:1902469bdd2d 398 printf("\r\nPeripheral 0x%02x%02x disconnected (%d Ch in DCList)\n",
lorevee 0:1902469bdd2d 399 perDevs.devInfo[i].bdaddr[NODE_ID_B2], perDevs.devInfo[i].bdaddr[NODE_ID_B1], countElements(headCharacteristic[i]));
lorevee 0:1902469bdd2d 400
lorevee 0:1902469bdd2d 401 }else {
lorevee 0:1902469bdd2d 402 perDevs.is_disconnected[i] = true;
lorevee 0:1902469bdd2d 403 perDevs.is_unconnectable[i] = false;
lorevee 0:1902469bdd2d 404
lorevee 0:1902469bdd2d 405
lorevee 0:1902469bdd2d 406 if (perDevs.is_connected[i] == true){
lorevee 2:1525f4848cf2 407
lorevee 0:1902469bdd2d 408 perDevs.connDevices--;
lorevee 0:1902469bdd2d 409 //disconnected_devices
lorevee 0:1902469bdd2d 410 perDevs.discDevices++;
lorevee 0:1902469bdd2d 411 perDevs.is_connected[i] = false;
lorevee 0:1902469bdd2d 412 }
lorevee 0:1902469bdd2d 413
lorevee 0:1902469bdd2d 414 /* Notify device disconnection to client */
lorevee 0:1902469bdd2d 415 perDevs.status = READING_DISCONNECTION;
lorevee 0:1902469bdd2d 416
lorevee 0:1902469bdd2d 417 readCharacteristicCallback(nullGattReadCallbackP(perDevs.connection_handle[i]));
lorevee 0:1902469bdd2d 418
lorevee 2:1525f4848cf2 419
lorevee 2:1525f4848cf2 420 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 2:1525f4848cf2 421 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 422 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 423
lorevee 0:1902469bdd2d 424
lorevee 0:1902469bdd2d 425 printf("\r\nPeripheral 0x%02x%02x disconnected (%d still connected) (%d Ch in DCList)\n",
lorevee 0:1902469bdd2d 426 perDevs.devInfo[i].bdaddr[NODE_ID_B2], perDevs.devInfo[i].bdaddr[NODE_ID_B1],
lorevee 0:1902469bdd2d 427 perDevs.connDevices, countElements(headCharacteristic[i]));
lorevee 0:1902469bdd2d 428 }//if-else
lorevee 0:1902469bdd2d 429 break;
lorevee 0:1902469bdd2d 430
lorevee 0:1902469bdd2d 431 }//if-MAIN
lorevee 0:1902469bdd2d 432 }//for
lorevee 0:1902469bdd2d 433
lorevee 0:1902469bdd2d 434
lorevee 0:1902469bdd2d 435
lorevee 0:1902469bdd2d 436 /* SLAVE ROLE */
lorevee 0:1902469bdd2d 437 if (handle == slaveDev.conn_handle) {
lorevee 0:1902469bdd2d 438 printf("\r\nMaster disconnected (adv: %d - status %d)\n", ble.gap().getState().advertising, perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 439
lorevee 0:1902469bdd2d 440
lorevee 0:1902469bdd2d 441 slaveDev.is_discoverable = true;
lorevee 0:1902469bdd2d 442 slaveDev.is_connected = false;
lorevee 0:1902469bdd2d 443 slaveDev.conn_handle = 0;
lorevee 0:1902469bdd2d 444 slaveDev.star_data_char_notify = 0;
lorevee 0:1902469bdd2d 445
lorevee 0:1902469bdd2d 446 for (i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 447 perDevs.led_char_read[i] = 0;
lorevee 0:1902469bdd2d 448 perDevs.wup_char_read[i] = 0;
lorevee 0:1902469bdd2d 449 perDevs.mic_char_read[i] = 0;
lorevee 0:1902469bdd2d 450 perDevs.prx_char_read[i] = 0;
lorevee 0:1902469bdd2d 451 perDevs.agm_char_read[i] = 0;
lorevee 0:1902469bdd2d 452 perDevs.sfusion_char_read[i] = 0;
lorevee 0:1902469bdd2d 453 perDevs.prx_on[i] = 0;
lorevee 0:1902469bdd2d 454 perDevs.agm_on[i] = 0;
lorevee 0:1902469bdd2d 455 perDevs.sfusion_on[i] = 0;
lorevee 0:1902469bdd2d 456 }//for
lorevee 0:1902469bdd2d 457
lorevee 0:1902469bdd2d 458 perDevs.discovery_enabled = true;
lorevee 0:1902469bdd2d 459 perDevs.status = DISABLE_NOTIFICATIONS;
lorevee 0:1902469bdd2d 460
lorevee 0:1902469bdd2d 461
lorevee 0:1902469bdd2d 462 //setSlaveDiscoverable();//DEBUG_only
lorevee 0:1902469bdd2d 463
lorevee 0:1902469bdd2d 464 }//SLAVE-ROLE
lorevee 0:1902469bdd2d 465
lorevee 0:1902469bdd2d 466 }
lorevee 0:1902469bdd2d 467 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 468
lorevee 0:1902469bdd2d 469
lorevee 0:1902469bdd2d 470
lorevee 0:1902469bdd2d 471
lorevee 0:1902469bdd2d 472 /* Function called on connection */
lorevee 0:1902469bdd2d 473 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
lorevee 0:1902469bdd2d 474 //printf("\r\n----> connectionCallback\n\n");//DEBUG
lorevee 0:1902469bdd2d 475
lorevee 0:1902469bdd2d 476 BLE& ble = BLE::Instance();
lorevee 0:1902469bdd2d 477
lorevee 0:1902469bdd2d 478 static const size_t ADDR_LEN = 6;
lorevee 0:1902469bdd2d 479 //the current address
lorevee 0:1902469bdd2d 480 BLEProtocol::AddressBytes_t tempAddr;
lorevee 0:1902469bdd2d 481 //fill the address
lorevee 0:1902469bdd2d 482 for(unsigned i=0;i<ADDR_LEN;i++) {
lorevee 0:1902469bdd2d 483 tempAddr[i]=params->peerAddr[i];
lorevee 0:1902469bdd2d 484 }
lorevee 0:1902469bdd2d 485
lorevee 0:1902469bdd2d 486 // connection handle
lorevee 0:1902469bdd2d 487 uint16_t handle = params ->handle;
lorevee 0:1902469bdd2d 488
lorevee 0:1902469bdd2d 489 //ROLE uint8_t role
lorevee 0:1902469bdd2d 490 // 0 = master
lorevee 0:1902469bdd2d 491 // 1 = slave
lorevee 0:1902469bdd2d 492
lorevee 0:1902469bdd2d 493 uint8_t index = perDevs.connDeviceIdx;
lorevee 0:1902469bdd2d 494
lorevee 0:1902469bdd2d 495
lorevee 0:1902469bdd2d 496
lorevee 0:1902469bdd2d 497
lorevee 0:1902469bdd2d 498 /* MASTER ROLE */
lorevee 0:1902469bdd2d 499 if (role == 0) {
lorevee 0:1902469bdd2d 500
lorevee 0:1902469bdd2d 501 if (perDevs.is_unconnectable[index] == false) {
lorevee 0:1902469bdd2d 502 perDevs.connection_handle[index] = handle;
lorevee 0:1902469bdd2d 503 perDevs.is_disconnected[index] = false;
lorevee 0:1902469bdd2d 504
lorevee 0:1902469bdd2d 505 printf("\r\n\nConnected to peripheral: [%02x %02x %02x %02x %02x %02x] (%d/%d - 0x%04x) (role: %s)\n",
lorevee 0:1902469bdd2d 506 tempAddr[5], tempAddr[4], tempAddr[3], tempAddr[2],
lorevee 0:1902469bdd2d 507 tempAddr[1], tempAddr[0], index+1, perDevs.connDevices+1, handle, (role == 1 ? "slave" : "master"));
lorevee 0:1902469bdd2d 508
lorevee 0:1902469bdd2d 509 perDevs.status = DEVICE_CONNECTED;
lorevee 0:1902469bdd2d 510
lorevee 0:1902469bdd2d 511 } else {
lorevee 0:1902469bdd2d 512 perDevs.is_unconnectable[index] = false;
lorevee 0:1902469bdd2d 513 perDevs.device_found = false;
lorevee 0:1902469bdd2d 514 perDevs.status = DEVICE_NOT_FOUND;
lorevee 0:1902469bdd2d 515 }
lorevee 0:1902469bdd2d 516
lorevee 0:1902469bdd2d 517 }//if-MASTER
lorevee 0:1902469bdd2d 518
lorevee 0:1902469bdd2d 519
lorevee 0:1902469bdd2d 520
lorevee 0:1902469bdd2d 521
lorevee 0:1902469bdd2d 522 /* SLAVE ROLE */
lorevee 0:1902469bdd2d 523 if (role == 1) {
lorevee 0:1902469bdd2d 524 //When connected the adv seams disabled
lorevee 0:1902469bdd2d 525 slaveDev.conn_handle = handle;
lorevee 0:1902469bdd2d 526 slaveDev.is_connected = true;
lorevee 0:1902469bdd2d 527 slaveDev.is_discoverable = false;
lorevee 0:1902469bdd2d 528
lorevee 0:1902469bdd2d 529
lorevee 0:1902469bdd2d 530 printf("\r\n\nConnected to master: [%02x %02x %02x %02x %02x %02x] (role: %s) (adv: %d)\n",
lorevee 0:1902469bdd2d 531 tempAddr[5], tempAddr[4], tempAddr[3], tempAddr[2],
lorevee 0:1902469bdd2d 532 tempAddr[1], tempAddr[0], (role == 1 ? "slave" : "master"), ble.gap().getState().advertising);
lorevee 0:1902469bdd2d 533
lorevee 0:1902469bdd2d 534 }//if-SLAVE
lorevee 0:1902469bdd2d 535
lorevee 0:1902469bdd2d 536
lorevee 0:1902469bdd2d 537 role = 1;
lorevee 0:1902469bdd2d 538
lorevee 0:1902469bdd2d 539 }
lorevee 0:1902469bdd2d 540 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 541
lorevee 0:1902469bdd2d 542
lorevee 0:1902469bdd2d 543
lorevee 0:1902469bdd2d 544
lorevee 0:1902469bdd2d 545 /* Service discovery */
lorevee 0:1902469bdd2d 546 void discoverServices(void){
lorevee 0:1902469bdd2d 547
lorevee 0:1902469bdd2d 548 BLE& ble = BLE::Instance();
lorevee 0:1902469bdd2d 549 uint8_t index = perDevs.connDeviceIdx;
lorevee 0:1902469bdd2d 550 uint16_t conn_handle = perDevs.connection_handle[index];
lorevee 0:1902469bdd2d 551 ble_error_t e0;
lorevee 0:1902469bdd2d 552
lorevee 0:1902469bdd2d 553 printf("\r\nDiscovering services for peripheral %d (0x%04x)\n", index+1, conn_handle);
lorevee 0:1902469bdd2d 554
lorevee 0:1902469bdd2d 555 if (perDevs.is_disconnected[index]){
lorevee 0:1902469bdd2d 556 printf("\r\nPeripheral %d (0x%04x) disconnected\n", index+1, conn_handle);
lorevee 0:1902469bdd2d 557 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 558
lorevee 0:1902469bdd2d 559 }else {
lorevee 0:1902469bdd2d 560 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
lorevee 0:1902469bdd2d 561 e0 = ble.gattClient().launchServiceDiscovery(conn_handle, serviceDiscoveryCallback,
lorevee 0:1902469bdd2d 562 characteristicDiscoveryCallback);
lorevee 0:1902469bdd2d 563 if (e0 != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 564 printf("\r\nError while discovering primary services (error: %d)\n", e0);
lorevee 0:1902469bdd2d 565 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 566 }
lorevee 0:1902469bdd2d 567 }//if-else
lorevee 0:1902469bdd2d 568
lorevee 0:1902469bdd2d 569 }
lorevee 0:1902469bdd2d 570 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 571
lorevee 0:1902469bdd2d 572
lorevee 0:1902469bdd2d 573
lorevee 0:1902469bdd2d 574
lorevee 0:1902469bdd2d 575 void onStopScan(Gap::TimeoutSource_t t){
lorevee 0:1902469bdd2d 576 //printf("\r\nScanning ends\n");//DEBUG
lorevee 0:1902469bdd2d 577
lorevee 0:1902469bdd2d 578
lorevee 0:1902469bdd2d 579 if (perDevs.status == DEVICE_FOUND) {
lorevee 0:1902469bdd2d 580 perDevs.device_found = true;
lorevee 0:1902469bdd2d 581 }
lorevee 0:1902469bdd2d 582 else {
lorevee 0:1902469bdd2d 583 perDevs.device_found = false;
lorevee 0:1902469bdd2d 584 }
lorevee 0:1902469bdd2d 585 perDevs.status = DEVICE_DISCOVERY_COMPLETE;
lorevee 0:1902469bdd2d 586 printf("\r\nDevice Discovery Complete (%d)\n", perDevs.status);
lorevee 0:1902469bdd2d 587
lorevee 0:1902469bdd2d 588 discoveryCompleted = 1;
lorevee 0:1902469bdd2d 589
lorevee 0:1902469bdd2d 590 }
lorevee 0:1902469bdd2d 591 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 592
lorevee 0:1902469bdd2d 593
lorevee 0:1902469bdd2d 594
lorevee 0:1902469bdd2d 595 void startDiscovery(void) {
lorevee 0:1902469bdd2d 596 //printf("\r\nstartDiscovery - status: %d\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 597
lorevee 0:1902469bdd2d 598
lorevee 0:1902469bdd2d 599
lorevee 0:1902469bdd2d 600
lorevee 0:1902469bdd2d 601 BLE &ble = BLE::Instance();
lorevee 0:1902469bdd2d 602 ble_error_t e1;
lorevee 0:1902469bdd2d 603
lorevee 0:1902469bdd2d 604
lorevee 0:1902469bdd2d 605 //if-MAIN
lorevee 0:1902469bdd2d 606 if ((perDevs.status == CONN_INIT) && (discoveryCompleted == 1) && (advEnds == 1)){
lorevee 0:1902469bdd2d 607
lorevee 0:1902469bdd2d 608 discoveryCompleted = 0;
lorevee 0:1902469bdd2d 609
lorevee 0:1902469bdd2d 610 /* if 1 to enable
lorevee 0:1902469bdd2d 611 * if 0 default because of the adv timer setup */
lorevee 0:1902469bdd2d 612
lorevee 0:1902469bdd2d 613 #if 0
lorevee 0:1902469bdd2d 614 if ((slaveDev.is_connected == false) && (slaveDev.is_discoverable == true)){
lorevee 0:1902469bdd2d 615 //printf("\r\nslaveDev.is_discoverable == true\n");//DEBUG
lorevee 0:1902469bdd2d 616
lorevee 0:1902469bdd2d 617 ble_error_t e0;
lorevee 0:1902469bdd2d 618 e0= ble.gap().stopAdvertising();
lorevee 0:1902469bdd2d 619 if ( e0 == BLE_ERROR_NONE ) {
lorevee 0:1902469bdd2d 620 }else {
lorevee 0:1902469bdd2d 621 printf("\r\nERROR stopping advertising\n");//DEBUG
lorevee 0:1902469bdd2d 622 }
lorevee 0:1902469bdd2d 623 slaveDev.is_discoverable = false;
lorevee 0:1902469bdd2d 624 }//stopAdv
lorevee 0:1902469bdd2d 625 #endif
lorevee 0:1902469bdd2d 626
lorevee 0:1902469bdd2d 627 /* MASTER ROLE */
lorevee 0:1902469bdd2d 628 perDevs.status = START_DEVICE_DISCOVERY;
lorevee 0:1902469bdd2d 629 printf("\r\nStart Device Discovery (%d)\n", perDevs.status);
lorevee 0:1902469bdd2d 630
lorevee 0:1902469bdd2d 631 e1 = ble.gap().startScan(advertisementCallback);
lorevee 0:1902469bdd2d 632
lorevee 0:1902469bdd2d 633 if ( e1 == BLE_ERROR_NONE ) {
lorevee 0:1902469bdd2d 634 //printf("\r\nScan started correctly\n");//DEBUG
lorevee 0:1902469bdd2d 635 }else {
lorevee 2:1525f4848cf2 636 //perDevs.status = DEVICE_DISCOVERY_COMPLETE;
lorevee 2:1525f4848cf2 637 //discoveryCompleted = 1;
lorevee 2:1525f4848cf2 638
lorevee 2:1525f4848cf2 639 /* Set the same timeout */
lorevee 2:1525f4848cf2 640 eventQ.call_in(3000, scanTimeOut);
lorevee 0:1902469bdd2d 641 }
lorevee 0:1902469bdd2d 642
lorevee 0:1902469bdd2d 643 }//if-MAIN
lorevee 0:1902469bdd2d 644 }
lorevee 0:1902469bdd2d 645 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 646
lorevee 0:1902469bdd2d 647
lorevee 2:1525f4848cf2 648 void scanTimeOut(void){
lorevee 2:1525f4848cf2 649 if (perDevs.status == DEVICE_FOUND) {
lorevee 2:1525f4848cf2 650 perDevs.device_found = true;
lorevee 2:1525f4848cf2 651 }
lorevee 2:1525f4848cf2 652 else {
lorevee 2:1525f4848cf2 653 perDevs.device_found = false;
lorevee 2:1525f4848cf2 654 }
lorevee 2:1525f4848cf2 655 perDevs.status = DEVICE_DISCOVERY_COMPLETE;
lorevee 2:1525f4848cf2 656 printf("\r\nDevice Discovery Complete (%d)\n", perDevs.status);
lorevee 2:1525f4848cf2 657
lorevee 2:1525f4848cf2 658 discoveryCompleted = 1;
lorevee 2:1525f4848cf2 659 }
lorevee 2:1525f4848cf2 660 /*----------------------------------------------------------------------------*/
lorevee 2:1525f4848cf2 661
lorevee 2:1525f4848cf2 662
lorevee 0:1902469bdd2d 663
lorevee 0:1902469bdd2d 664
lorevee 0:1902469bdd2d 665 /* Function called as response of advertising */
lorevee 0:1902469bdd2d 666 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { //defined in Gap.h
lorevee 0:1902469bdd2d 667 //printf("\r----> advertisementCallback\n");//DEBUG
lorevee 0:1902469bdd2d 668
lorevee 0:1902469bdd2d 669 static const size_t ADDR_LEN = 6;
lorevee 0:1902469bdd2d 670 //the current address
lorevee 0:1902469bdd2d 671 BLEProtocol::AddressBytes_t tempAddr;
lorevee 0:1902469bdd2d 672 //fill the address
lorevee 0:1902469bdd2d 673 for(unsigned i=0;i<ADDR_LEN;i++) {
lorevee 0:1902469bdd2d 674 tempAddr[i]=params->peerAddr[i];
lorevee 0:1902469bdd2d 675 }
lorevee 0:1902469bdd2d 676
lorevee 0:1902469bdd2d 677
lorevee 0:1902469bdd2d 678 uint8_t alreadyIn = 1;
lorevee 0:1902469bdd2d 679 uint8_t index;
lorevee 0:1902469bdd2d 680 //uint8_t i;
lorevee 0:1902469bdd2d 681 uint8_t found_zero_pos = 0;
lorevee 0:1902469bdd2d 682 BLEProtocol::AddressBytes_t zeroAddr;
lorevee 0:1902469bdd2d 683 memset(zeroAddr, 0, 6);
lorevee 0:1902469bdd2d 684
lorevee 0:1902469bdd2d 685
lorevee 0:1902469bdd2d 686
lorevee 0:1902469bdd2d 687 if (perDevs.status != DEVICE_FOUND) {
lorevee 0:1902469bdd2d 688
lorevee 0:1902469bdd2d 689
lorevee 0:1902469bdd2d 690 for (uint8_t i = 0; i < params->advertisingDataLen; ++i) {
lorevee 0:1902469bdd2d 691
lorevee 0:1902469bdd2d 692 const uint8_t record_length = params->advertisingData[i];
lorevee 0:1902469bdd2d 693 if (record_length == 0) {
lorevee 0:1902469bdd2d 694 continue;
lorevee 0:1902469bdd2d 695 }
lorevee 0:1902469bdd2d 696 const uint8_t type = params->advertisingData[i + 1];
lorevee 0:1902469bdd2d 697 const uint8_t* value = params->advertisingData + i + 2;
lorevee 0:1902469bdd2d 698 const uint8_t value_length = record_length - 1;
lorevee 0:1902469bdd2d 699
lorevee 0:1902469bdd2d 700
lorevee 0:1902469bdd2d 701
lorevee 0:1902469bdd2d 702
lorevee 0:1902469bdd2d 703
lorevee 0:1902469bdd2d 704
lorevee 0:1902469bdd2d 705
lorevee 0:1902469bdd2d 706 /* Switch because per NAMES */
lorevee 0:1902469bdd2d 707 if(type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
lorevee 0:1902469bdd2d 708
lorevee 0:1902469bdd2d 709
lorevee 0:1902469bdd2d 710
lorevee 0:1902469bdd2d 711 /* Switch the peripheral nodes */
lorevee 0:1902469bdd2d 712
lorevee 0:1902469bdd2d 713 // M O T E N V
lorevee 0:1902469bdd2d 714 if (((value_length == sizeof(NODE_MOTENV)-1) && (memcmp(value, NODE_MOTENV, value_length) == 0))) {
lorevee 2:1525f4848cf2 715
lorevee 0:1902469bdd2d 716
lorevee 0:1902469bdd2d 717 //initial per data
lorevee 0:1902469bdd2d 718 uint8_t peripheral_v;
lorevee 0:1902469bdd2d 719 uint8_t wup_event = 0;
lorevee 0:1902469bdd2d 720 uint8_t mic_event = 0;
lorevee 0:1902469bdd2d 721 uint8_t prx_event = 0;
lorevee 0:1902469bdd2d 722 uint8_t agm_event = 0;
lorevee 0:1902469bdd2d 723 uint8_t sfusion_event = 0;
lorevee 0:1902469bdd2d 724
lorevee 0:1902469bdd2d 725 uint8_t peripheral_name_len = params->advertisingData[3];
lorevee 0:1902469bdd2d 726 const uint8_t * manuf_data = params->advertisingData+4+peripheral_name_len;
lorevee 0:1902469bdd2d 727 uint32_t features = 0;
lorevee 0:1902469bdd2d 728
lorevee 0:1902469bdd2d 729
lorevee 0:1902469bdd2d 730 features = (manuf_data[4]<<24) | (manuf_data[5]<<16) | (manuf_data[6]<<8) | manuf_data[7];
lorevee 0:1902469bdd2d 731 wup_event = (features & FEATURE_MASK_WAKEUP_EVENTS) >> WUP_POS;
lorevee 0:1902469bdd2d 732 mic_event = (features & FEATURE_MASK_MIC) >> MIC_POS;
lorevee 0:1902469bdd2d 733 prx_event = (features & FEATURE_MASK_PROX) >> PRX_POS;
lorevee 0:1902469bdd2d 734 agm_event = (features & FEATURE_MASK_ACC) >> ACC_POS;
lorevee 0:1902469bdd2d 735 sfusion_event = (features & FEATURE_MASK_SENSORFUSION) >> SFUS_POS;
lorevee 0:1902469bdd2d 736 peripheral_v = NODE_ME1;//MOTENV
lorevee 0:1902469bdd2d 737
lorevee 0:1902469bdd2d 738
lorevee 0:1902469bdd2d 739 for (i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 740 if (perDevs.is_disconnected[i]) {
lorevee 0:1902469bdd2d 741 if (memcmp(zeroAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 742 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 743 index = i;
lorevee 0:1902469bdd2d 744 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 745 found_zero_pos = 1;
lorevee 0:1902469bdd2d 746 alreadyIn = 0;
lorevee 0:1902469bdd2d 747 }
lorevee 0:1902469bdd2d 748 }
lorevee 0:1902469bdd2d 749 else if (memcmp(tempAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 750 index = i;
lorevee 0:1902469bdd2d 751 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 752 alreadyIn = 0;
lorevee 0:1902469bdd2d 753 perDevs.discDevices--;
lorevee 0:1902469bdd2d 754 break;
lorevee 0:1902469bdd2d 755 }
lorevee 0:1902469bdd2d 756 else {
lorevee 0:1902469bdd2d 757 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 758 index = i;
lorevee 0:1902469bdd2d 759 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 760 alreadyIn = 0;
lorevee 0:1902469bdd2d 761 }
lorevee 0:1902469bdd2d 762 }
lorevee 0:1902469bdd2d 763 }
lorevee 0:1902469bdd2d 764 }//for
lorevee 0:1902469bdd2d 765
lorevee 0:1902469bdd2d 766
lorevee 0:1902469bdd2d 767 if ((!alreadyIn) && (perDevs.connDevices < MAX_NUM_OF_NODES)) {
lorevee 0:1902469bdd2d 768
lorevee 0:1902469bdd2d 769
lorevee 0:1902469bdd2d 770 /* Save the found peripheral device in the struct containing all the found peripheral devices */
lorevee 0:1902469bdd2d 771 saveDeviceFound(params->type, tempAddr, params->advertisingDataLen, params->advertisingData, index,
lorevee 0:1902469bdd2d 772 peripheral_v, wup_event, mic_event, prx_event, agm_event, sfusion_event);
lorevee 0:1902469bdd2d 773
lorevee 0:1902469bdd2d 774 perDevs.status = DEVICE_FOUND;
lorevee 0:1902469bdd2d 775
lorevee 1:110b5e896bc9 776 printf("\r\nPeripheral (MOTENV) %d inserted [%02x %02x %02x %02x %02x %02x] \n", perDevs.connDevices+1,
lorevee 0:1902469bdd2d 777 tempAddr[5], tempAddr[4], tempAddr[3], tempAddr[2], tempAddr[1], tempAddr[0]);
lorevee 0:1902469bdd2d 778
lorevee 0:1902469bdd2d 779 }//if-alreadyIn
lorevee 0:1902469bdd2d 780
lorevee 0:1902469bdd2d 781
lorevee 0:1902469bdd2d 782 }//IF-MOTENV
lorevee 0:1902469bdd2d 783
lorevee 0:1902469bdd2d 784
lorevee 0:1902469bdd2d 785
lorevee 0:1902469bdd2d 786
lorevee 0:1902469bdd2d 787 // F L I G H T
lorevee 0:1902469bdd2d 788 if ((value_length == sizeof(NODE_FLIGHT)-1) && (memcmp(value, NODE_FLIGHT, value_length) == 0)) {
lorevee 2:1525f4848cf2 789
lorevee 0:1902469bdd2d 790 //initial per data
lorevee 0:1902469bdd2d 791 uint8_t peripheral_v;
lorevee 0:1902469bdd2d 792 uint8_t wup_event = 0;
lorevee 0:1902469bdd2d 793 uint8_t mic_event = 0;
lorevee 0:1902469bdd2d 794 uint8_t prx_event = 0;
lorevee 0:1902469bdd2d 795 uint8_t agm_event = 0;
lorevee 0:1902469bdd2d 796 uint8_t sfusion_event = 0;
lorevee 0:1902469bdd2d 797
lorevee 0:1902469bdd2d 798 uint8_t peripheral_name_len = params->advertisingData[3];
lorevee 0:1902469bdd2d 799 const uint8_t * manuf_data = params->advertisingData+4+peripheral_name_len;
lorevee 0:1902469bdd2d 800 uint32_t features = 0;
lorevee 0:1902469bdd2d 801
lorevee 0:1902469bdd2d 802
lorevee 0:1902469bdd2d 803 features = (manuf_data[4]<<24) | (manuf_data[5]<<16) | (manuf_data[6]<<8) | manuf_data[7];
lorevee 0:1902469bdd2d 804 wup_event = (features & FEATURE_MASK_WAKEUP_EVENTS) >> WUP_POS;
lorevee 0:1902469bdd2d 805 mic_event = (features & FEATURE_MASK_MIC) >> MIC_POS;
lorevee 0:1902469bdd2d 806 prx_event = (features & FEATURE_MASK_PROX) >> PRX_POS;
lorevee 0:1902469bdd2d 807 agm_event = (features & FEATURE_MASK_ACC) >> ACC_POS;
lorevee 0:1902469bdd2d 808 sfusion_event = (features & FEATURE_MASK_SENSORFUSION) >> SFUS_POS;
lorevee 0:1902469bdd2d 809 peripheral_v = NODE_FL1;//FLIGHT
lorevee 0:1902469bdd2d 810
lorevee 0:1902469bdd2d 811
lorevee 0:1902469bdd2d 812
lorevee 0:1902469bdd2d 813 for (i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 814 if (perDevs.is_disconnected[i]) {
lorevee 0:1902469bdd2d 815 if (memcmp(zeroAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 816 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 817 index = i;
lorevee 0:1902469bdd2d 818 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 819 found_zero_pos = 1;
lorevee 0:1902469bdd2d 820 alreadyIn = 0;
lorevee 0:1902469bdd2d 821 }
lorevee 0:1902469bdd2d 822 }
lorevee 0:1902469bdd2d 823 else if (memcmp(tempAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 824 index = i;
lorevee 0:1902469bdd2d 825 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 826 alreadyIn = 0;
lorevee 0:1902469bdd2d 827 perDevs.discDevices--;
lorevee 0:1902469bdd2d 828 break;
lorevee 0:1902469bdd2d 829 }
lorevee 0:1902469bdd2d 830 else {
lorevee 0:1902469bdd2d 831 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 832 index = i;
lorevee 0:1902469bdd2d 833 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 834 alreadyIn = 0;
lorevee 0:1902469bdd2d 835 }
lorevee 0:1902469bdd2d 836 }
lorevee 0:1902469bdd2d 837 }
lorevee 0:1902469bdd2d 838 }//for
lorevee 0:1902469bdd2d 839
lorevee 0:1902469bdd2d 840
lorevee 0:1902469bdd2d 841 if ((!alreadyIn) && (perDevs.connDevices < MAX_NUM_OF_NODES)) {
lorevee 0:1902469bdd2d 842
lorevee 0:1902469bdd2d 843
lorevee 0:1902469bdd2d 844 /* Save the found peripheral device in the struct containing all the found peripheral devices */
lorevee 0:1902469bdd2d 845 saveDeviceFound(params->type, tempAddr, params->advertisingDataLen, params->advertisingData, index,
lorevee 0:1902469bdd2d 846 peripheral_v, wup_event, mic_event, prx_event, agm_event, sfusion_event);
lorevee 0:1902469bdd2d 847
lorevee 0:1902469bdd2d 848 perDevs.status = DEVICE_FOUND;
lorevee 0:1902469bdd2d 849
lorevee 1:110b5e896bc9 850 printf("\r\nPeripheral (FLIGHT) %d inserted [%02x %02x %02x %02x %02x %02x] \n", perDevs.connDevices+1,
lorevee 0:1902469bdd2d 851 tempAddr[5], tempAddr[4], tempAddr[3], tempAddr[2], tempAddr[1], tempAddr[0]);
lorevee 0:1902469bdd2d 852 }//if-alreadyIn
lorevee 0:1902469bdd2d 853
lorevee 0:1902469bdd2d 854 }//IF-FLIGHT
lorevee 0:1902469bdd2d 855
lorevee 0:1902469bdd2d 856
lorevee 0:1902469bdd2d 857
lorevee 0:1902469bdd2d 858
lorevee 0:1902469bdd2d 859
lorevee 0:1902469bdd2d 860
lorevee 0:1902469bdd2d 861
lorevee 0:1902469bdd2d 862 // A L L M E M S
lorevee 0:1902469bdd2d 863 if ((value_length == sizeof(NODE_ALLMEMS)-1) && (memcmp(value, NODE_ALLMEMS, value_length) == 0)){
lorevee 0:1902469bdd2d 864
lorevee 0:1902469bdd2d 865
lorevee 0:1902469bdd2d 866 //initial per data
lorevee 0:1902469bdd2d 867 uint8_t peripheral_v;
lorevee 0:1902469bdd2d 868 uint8_t wup_event = 0;
lorevee 0:1902469bdd2d 869 uint8_t mic_event = 0;
lorevee 0:1902469bdd2d 870 uint8_t prx_event = 0;
lorevee 0:1902469bdd2d 871 uint8_t agm_event = 0;
lorevee 0:1902469bdd2d 872 uint8_t sfusion_event = 0;
lorevee 0:1902469bdd2d 873
lorevee 0:1902469bdd2d 874 uint8_t peripheral_name_len = params->advertisingData[3];
lorevee 0:1902469bdd2d 875 const uint8_t * manuf_data = params->advertisingData+4+peripheral_name_len;
lorevee 0:1902469bdd2d 876 uint32_t features = 0;
lorevee 0:1902469bdd2d 877
lorevee 0:1902469bdd2d 878
lorevee 0:1902469bdd2d 879 features = (manuf_data[4]<<24) | (manuf_data[5]<<16) | (manuf_data[6]<<8) | manuf_data[7];
lorevee 0:1902469bdd2d 880 wup_event = (features & FEATURE_MASK_WAKEUP_EVENTS) >> WUP_POS;
lorevee 0:1902469bdd2d 881 mic_event = (features & FEATURE_MASK_MIC) >> MIC_POS;
lorevee 0:1902469bdd2d 882 prx_event = (features & FEATURE_MASK_PROX) >> PRX_POS;
lorevee 0:1902469bdd2d 883 agm_event = (features & FEATURE_MASK_ACC) >> ACC_POS;
lorevee 0:1902469bdd2d 884 sfusion_event = (features & FEATURE_MASK_SENSORFUSION) >> SFUS_POS;
lorevee 0:1902469bdd2d 885 peripheral_v = NODE_AM1;//ALLMEMS
lorevee 0:1902469bdd2d 886
lorevee 0:1902469bdd2d 887
lorevee 0:1902469bdd2d 888 for (i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 889 if (perDevs.is_disconnected[i]) {
lorevee 0:1902469bdd2d 890 if (memcmp(zeroAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 891 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 892 index = i;
lorevee 0:1902469bdd2d 893 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 894 found_zero_pos = 1;
lorevee 0:1902469bdd2d 895 alreadyIn = 0;
lorevee 0:1902469bdd2d 896 }
lorevee 0:1902469bdd2d 897 }
lorevee 0:1902469bdd2d 898 else if (memcmp(tempAddr, perDevs.devInfo[i].bdaddr, 6)==0) {
lorevee 0:1902469bdd2d 899 index = i;
lorevee 0:1902469bdd2d 900 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 901 alreadyIn = 0;
lorevee 0:1902469bdd2d 902 perDevs.discDevices--;
lorevee 0:1902469bdd2d 903 break;
lorevee 0:1902469bdd2d 904 }
lorevee 0:1902469bdd2d 905 else {
lorevee 0:1902469bdd2d 906 if (!found_zero_pos) {
lorevee 0:1902469bdd2d 907 index = i;
lorevee 0:1902469bdd2d 908 perDevs.connDeviceIdx = i;
lorevee 0:1902469bdd2d 909 alreadyIn = 0;
lorevee 0:1902469bdd2d 910 }
lorevee 0:1902469bdd2d 911 }
lorevee 0:1902469bdd2d 912 }
lorevee 0:1902469bdd2d 913 }//for
lorevee 0:1902469bdd2d 914
lorevee 0:1902469bdd2d 915
lorevee 0:1902469bdd2d 916 if ((!alreadyIn) && (perDevs.connDevices < MAX_NUM_OF_NODES)) {
lorevee 0:1902469bdd2d 917
lorevee 0:1902469bdd2d 918
lorevee 0:1902469bdd2d 919 /* Save the found peripheral device in the struct containing all the found peripheral devices */
lorevee 0:1902469bdd2d 920 saveDeviceFound(params->type, tempAddr, params->advertisingDataLen, params->advertisingData, index,
lorevee 0:1902469bdd2d 921 peripheral_v, wup_event, mic_event, prx_event, agm_event, sfusion_event);
lorevee 0:1902469bdd2d 922
lorevee 0:1902469bdd2d 923 perDevs.status = DEVICE_FOUND;
lorevee 0:1902469bdd2d 924
lorevee 0:1902469bdd2d 925
lorevee 1:110b5e896bc9 926 printf("\r\nPeripheral (ALLMEMS) %d inserted [%02x %02x %02x %02x %02x %02x] \n", perDevs.connDevices+1,
lorevee 0:1902469bdd2d 927 tempAddr[5], tempAddr[4], tempAddr[3], tempAddr[2], tempAddr[1], tempAddr[0]);
lorevee 0:1902469bdd2d 928
lorevee 0:1902469bdd2d 929 }//if-alreadyIn
lorevee 0:1902469bdd2d 930
lorevee 0:1902469bdd2d 931
lorevee 0:1902469bdd2d 932 }//IF-ALLMEMS
lorevee 0:1902469bdd2d 933
lorevee 0:1902469bdd2d 934
lorevee 0:1902469bdd2d 935 }//IF-typeCOMPLETE_LOCAL_NAME
lorevee 0:1902469bdd2d 936
lorevee 0:1902469bdd2d 937
lorevee 0:1902469bdd2d 938 i += record_length;
lorevee 0:1902469bdd2d 939 }//for-MAIN
lorevee 0:1902469bdd2d 940
lorevee 0:1902469bdd2d 941 }//if status != DEVICE_FOUND
lorevee 0:1902469bdd2d 942
lorevee 0:1902469bdd2d 943 }
lorevee 0:1902469bdd2d 944 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 945
lorevee 0:1902469bdd2d 946
lorevee 0:1902469bdd2d 947
lorevee 0:1902469bdd2d 948
lorevee 0:1902469bdd2d 949 /* Function called after the discovery of a service */
lorevee 0:1902469bdd2d 950 void serviceDiscoveryCallback(const DiscoveredService *service) {
lorevee 0:1902469bdd2d 951 //printf("\r\n\n----> serviceDiscoveryCallback\n\n");//DEBUG
lorevee 0:1902469bdd2d 952 printf("\r\n");
lorevee 0:1902469bdd2d 953
lorevee 0:1902469bdd2d 954
lorevee 0:1902469bdd2d 955 //printf("\r\nstatus: SERVICE_DISCOVERED\n\n");
lorevee 0:1902469bdd2d 956 perDevs.status = SERVICE_DISCOVERED;
lorevee 0:1902469bdd2d 957
lorevee 0:1902469bdd2d 958 //length of the long uuid
lorevee 0:1902469bdd2d 959 unsigned uuidLength = UUID::LENGTH_OF_LONG_UUID; //16
lorevee 0:1902469bdd2d 960 //pointer to the current service uuid
lorevee 0:1902469bdd2d 961 const uint8_t * pointerToUUID = service->getUUID().getBaseUUID();
lorevee 0:1902469bdd2d 962 //temp long array
lorevee 0:1902469bdd2d 963 UUID::LongUUIDBytes_t tempUUID;
lorevee 0:1902469bdd2d 964 //temp short array
lorevee 0:1902469bdd2d 965 UUID::ShortUUIDBytes_t shortTempUUID;
lorevee 0:1902469bdd2d 966
lorevee 0:1902469bdd2d 967
lorevee 0:1902469bdd2d 968 /* Switch the known services */
lorevee 0:1902469bdd2d 969 //create the temp array
lorevee 0:1902469bdd2d 970 for (unsigned i=0;i<uuidLength;i++){
lorevee 0:1902469bdd2d 971 tempUUID[i]=pointerToUUID[i];
lorevee 0:1902469bdd2d 972 }
lorevee 0:1902469bdd2d 973
lorevee 0:1902469bdd2d 974
lorevee 0:1902469bdd2d 975
lorevee 0:1902469bdd2d 976 /* Switch the known services */
lorevee 0:1902469bdd2d 977 // HARDWARE_SERVICE_UUID
lorevee 0:1902469bdd2d 978 if ((memcmp(tempUUID, HARDWARE_SERVICE_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 979 printf("\r\nHARDWARE service: [ ");
lorevee 0:1902469bdd2d 980
lorevee 0:1902469bdd2d 981 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 982 printf("%02x ", tempUUID[i]);
lorevee 0:1902469bdd2d 983 }
lorevee 0:1902469bdd2d 984
lorevee 0:1902469bdd2d 985 //handles
lorevee 0:1902469bdd2d 986 perDevs.hardware_service_handle[perDevs.connDeviceIdx].start_h = service->getStartHandle();
lorevee 0:1902469bdd2d 987 perDevs.hardware_service_handle[perDevs.connDeviceIdx].end_h = service->getEndHandle();
lorevee 0:1902469bdd2d 988
lorevee 0:1902469bdd2d 989 //status HW
lorevee 0:1902469bdd2d 990 perDevs.status = START_HARDWARE_SERV_CHARS_DISCOVERY;
lorevee 0:1902469bdd2d 991 //prinft("\r\nstatus = START_HARDWARE_SERV_CHARS_DISCOVERY\n");
lorevee 0:1902469bdd2d 992
lorevee 0:1902469bdd2d 993
lorevee 0:1902469bdd2d 994
lorevee 0:1902469bdd2d 995
lorevee 0:1902469bdd2d 996
lorevee 0:1902469bdd2d 997
lorevee 0:1902469bdd2d 998 // CONFIG_SERVICE_UUID
lorevee 0:1902469bdd2d 999 }else if ((memcmp(tempUUID, CONFIG_SERVICE_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1000 printf("\r\nCFG service: [ ");
lorevee 0:1902469bdd2d 1001
lorevee 0:1902469bdd2d 1002 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1003 printf("%02x ", tempUUID[i]);
lorevee 0:1902469bdd2d 1004 }
lorevee 0:1902469bdd2d 1005
lorevee 0:1902469bdd2d 1006 //handles
lorevee 0:1902469bdd2d 1007 perDevs.configuration_service_handle[perDevs.connDeviceIdx].start_h = service->getStartHandle();
lorevee 0:1902469bdd2d 1008 perDevs.configuration_service_handle[perDevs.connDeviceIdx].end_h = service->getEndHandle();
lorevee 0:1902469bdd2d 1009
lorevee 0:1902469bdd2d 1010 //status CFG
lorevee 0:1902469bdd2d 1011 perDevs.status = START_CONFIGURATION_SERV_CHARS_DISCOVERY;
lorevee 0:1902469bdd2d 1012 //prinft("\r\nstatus = START_CONFIGURATION_SERV_CHARS_DISCOVERY\n");
lorevee 0:1902469bdd2d 1013
lorevee 0:1902469bdd2d 1014
lorevee 0:1902469bdd2d 1015
lorevee 0:1902469bdd2d 1016
lorevee 0:1902469bdd2d 1017
lorevee 0:1902469bdd2d 1018 // SOFTWARE_SERVICE_UUID
lorevee 0:1902469bdd2d 1019 }else if ((memcmp(tempUUID, SOFTWARE_SERVICE_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1020 printf("\r\nSOFTWARE service: [ ");
lorevee 0:1902469bdd2d 1021
lorevee 0:1902469bdd2d 1022 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1023 printf("%02x ", tempUUID[i]);
lorevee 0:1902469bdd2d 1024 }
lorevee 0:1902469bdd2d 1025
lorevee 0:1902469bdd2d 1026 //handles
lorevee 0:1902469bdd2d 1027 perDevs.software_service_handle[perDevs.connDeviceIdx].start_h = service->getStartHandle();
lorevee 0:1902469bdd2d 1028 perDevs.software_service_handle[perDevs.connDeviceIdx].end_h = service->getEndHandle();
lorevee 0:1902469bdd2d 1029
lorevee 0:1902469bdd2d 1030 //status SW
lorevee 0:1902469bdd2d 1031 perDevs.status = START_SOFTWARE_SERV_CHARS_DISCOVERY;
lorevee 0:1902469bdd2d 1032 //prinft("\r\nstatus = START_SOFTWARE_SERV_CHARS_DISCOVERY\n");
lorevee 0:1902469bdd2d 1033
lorevee 0:1902469bdd2d 1034
lorevee 0:1902469bdd2d 1035
lorevee 0:1902469bdd2d 1036
lorevee 0:1902469bdd2d 1037
lorevee 0:1902469bdd2d 1038 // Short UUID services
lorevee 0:1902469bdd2d 1039 } else if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
lorevee 0:1902469bdd2d 1040 //get the short uuid
lorevee 0:1902469bdd2d 1041 shortTempUUID = service->getUUID().getShortUUID();
lorevee 0:1902469bdd2d 1042 // printf("\r\n\n\nS UUID [ %x ", service->getUUID().getShortUUID());//DEBUG
lorevee 0:1902469bdd2d 1043
lorevee 0:1902469bdd2d 1044
lorevee 0:1902469bdd2d 1045
lorevee 0:1902469bdd2d 1046
lorevee 0:1902469bdd2d 1047
lorevee 0:1902469bdd2d 1048
lorevee 0:1902469bdd2d 1049
lorevee 0:1902469bdd2d 1050 // GENERIC_ACCESS_PROFILE_UUID
lorevee 0:1902469bdd2d 1051 if (shortTempUUID == GENERIC_ACCESS_PROFILE_UUID) {
lorevee 0:1902469bdd2d 1052 printf("\r\nGeneric Access Profile (GAP): [ %x ", shortTempUUID);
lorevee 0:1902469bdd2d 1053
lorevee 0:1902469bdd2d 1054 //handles
lorevee 0:1902469bdd2d 1055 perDevs.gen_access_profile_handle[perDevs.connDeviceIdx].start_h = service->getStartHandle();
lorevee 0:1902469bdd2d 1056 perDevs.gen_access_profile_handle[perDevs.connDeviceIdx].end_h = service->getEndHandle();
lorevee 0:1902469bdd2d 1057
lorevee 0:1902469bdd2d 1058
lorevee 0:1902469bdd2d 1059
lorevee 0:1902469bdd2d 1060
lorevee 0:1902469bdd2d 1061
lorevee 0:1902469bdd2d 1062
lorevee 0:1902469bdd2d 1063
lorevee 0:1902469bdd2d 1064 // GENERIC_ATTRIBUTE_PROFILE_UUID
lorevee 0:1902469bdd2d 1065 } else if (shortTempUUID == GENERIC_ATTRIBUTE_PROFILE_UUID) {
lorevee 0:1902469bdd2d 1066 printf("\r\nGeneric Attribute Profile (GATT): [ %x ", shortTempUUID);
lorevee 0:1902469bdd2d 1067
lorevee 0:1902469bdd2d 1068 //handles
lorevee 0:1902469bdd2d 1069 perDevs.gen_attribute_profile_handle[perDevs.connDeviceIdx].start_h = service->getStartHandle();
lorevee 0:1902469bdd2d 1070 perDevs.gen_attribute_profile_handle[perDevs.connDeviceIdx].end_h = service->getEndHandle();
lorevee 0:1902469bdd2d 1071
lorevee 0:1902469bdd2d 1072
lorevee 0:1902469bdd2d 1073
lorevee 0:1902469bdd2d 1074
lorevee 0:1902469bdd2d 1075
lorevee 0:1902469bdd2d 1076
lorevee 0:1902469bdd2d 1077 // UNKNOWN short service
lorevee 0:1902469bdd2d 1078 } else {
lorevee 0:1902469bdd2d 1079 printf("\r\nUNKNOWN service: [ %x", shortTempUUID);
lorevee 0:1902469bdd2d 1080 }
lorevee 0:1902469bdd2d 1081
lorevee 0:1902469bdd2d 1082
lorevee 0:1902469bdd2d 1083
lorevee 0:1902469bdd2d 1084
lorevee 0:1902469bdd2d 1085
lorevee 0:1902469bdd2d 1086
lorevee 0:1902469bdd2d 1087 // UNKNOWN long service
lorevee 0:1902469bdd2d 1088 } else {
lorevee 0:1902469bdd2d 1089 printf("\r\nUNKNOWN service: [ ");
lorevee 0:1902469bdd2d 1090
lorevee 0:1902469bdd2d 1091 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1092 printf("%02x ", tempUUID[i]);
lorevee 0:1902469bdd2d 1093 }
lorevee 0:1902469bdd2d 1094 }
lorevee 0:1902469bdd2d 1095
lorevee 0:1902469bdd2d 1096
lorevee 0:1902469bdd2d 1097
lorevee 0:1902469bdd2d 1098
lorevee 0:1902469bdd2d 1099 printf("]");
lorevee 0:1902469bdd2d 1100 printf("\r\n\n");
lorevee 0:1902469bdd2d 1101 }
lorevee 0:1902469bdd2d 1102 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1103
lorevee 0:1902469bdd2d 1104
lorevee 0:1902469bdd2d 1105
lorevee 0:1902469bdd2d 1106
lorevee 0:1902469bdd2d 1107
lorevee 0:1902469bdd2d 1108 /* Function called after the discovery of a characteristic */
lorevee 0:1902469bdd2d 1109 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
lorevee 0:1902469bdd2d 1110 //printf("\r----> characteristicDiscoveryCallback\n\n");//DEBUG
lorevee 0:1902469bdd2d 1111
lorevee 0:1902469bdd2d 1112 //current characteristic handles
lorevee 0:1902469bdd2d 1113 uint16_t declHandle = characteristicP->getDeclHandle(); //identify chars
lorevee 0:1902469bdd2d 1114 uint16_t valueHandle = characteristicP->getValueHandle();
lorevee 0:1902469bdd2d 1115
lorevee 0:1902469bdd2d 1116
lorevee 0:1902469bdd2d 1117 //-----> index of current device
lorevee 0:1902469bdd2d 1118 uint8_t idx = perDevs.connDeviceIdx;
lorevee 2:1525f4848cf2 1119
lorevee 0:1902469bdd2d 1120 //Prepend the DiscoveredCharacteristic into the list
lorevee 0:1902469bdd2d 1121 headCharacteristic[idx] = prependDCNode(headCharacteristic[idx], characteristicP);
lorevee 0:1902469bdd2d 1122
lorevee 0:1902469bdd2d 1123
lorevee 0:1902469bdd2d 1124
lorevee 0:1902469bdd2d 1125 //length of the long uuid
lorevee 0:1902469bdd2d 1126 unsigned uuidLength = UUID::LENGTH_OF_LONG_UUID; //16
lorevee 0:1902469bdd2d 1127 //pointer to the current service uuid
lorevee 0:1902469bdd2d 1128 const uint8_t * pointerToUUID = characteristicP->getUUID().getBaseUUID();
lorevee 0:1902469bdd2d 1129 //temp array
lorevee 0:1902469bdd2d 1130 UUID::LongUUIDBytes_t tempUUID;
lorevee 0:1902469bdd2d 1131
lorevee 0:1902469bdd2d 1132 //create the temp uuid array
lorevee 0:1902469bdd2d 1133 for (unsigned i=0;i<uuidLength;i++){
lorevee 0:1902469bdd2d 1134 tempUUID[i]=pointerToUUID[i];
lorevee 0:1902469bdd2d 1135 }
lorevee 0:1902469bdd2d 1136
lorevee 0:1902469bdd2d 1137
lorevee 0:1902469bdd2d 1138
lorevee 0:1902469bdd2d 1139
lorevee 0:1902469bdd2d 1140
lorevee 0:1902469bdd2d 1141
lorevee 0:1902469bdd2d 1142
lorevee 0:1902469bdd2d 1143 /* switch the known characteristic */
lorevee 0:1902469bdd2d 1144 // ENVIRONMENTAL_CHAR_UUID
lorevee 0:1902469bdd2d 1145 // ENVIRONMENTAL_ST_CHAR_UUID
lorevee 0:1902469bdd2d 1146 if (((memcmp(tempUUID, ENVIRONMENTAL_CHAR_UUID, uuidLength)) == 0) ||
lorevee 0:1902469bdd2d 1147 ((memcmp(tempUUID, ENVIRONMENTAL_ST_CHAR_UUID, uuidLength)) == 0)){
lorevee 0:1902469bdd2d 1148
lorevee 0:1902469bdd2d 1149 //HW
lorevee 0:1902469bdd2d 1150 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1151
lorevee 0:1902469bdd2d 1152 // Set the handle
lorevee 0:1902469bdd2d 1153 perDevs.environmental_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1154
lorevee 0:1902469bdd2d 1155 printf("\r\n - Enviromental Ch: [ ");
lorevee 0:1902469bdd2d 1156
lorevee 0:1902469bdd2d 1157 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1158 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1159 }
lorevee 0:1902469bdd2d 1160
lorevee 0:1902469bdd2d 1161
lorevee 0:1902469bdd2d 1162
lorevee 0:1902469bdd2d 1163
lorevee 0:1902469bdd2d 1164
lorevee 0:1902469bdd2d 1165
lorevee 0:1902469bdd2d 1166
lorevee 0:1902469bdd2d 1167 // ACCGYROMAG_CHAR_UUID
lorevee 0:1902469bdd2d 1168 }else if ((memcmp(tempUUID, ACCGYROMAG_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1169
lorevee 0:1902469bdd2d 1170 //HW
lorevee 0:1902469bdd2d 1171 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 0:1902469bdd2d 1172 // Set the handle
lorevee 0:1902469bdd2d 1173 perDevs.agm_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1174
lorevee 0:1902469bdd2d 1175
lorevee 0:1902469bdd2d 1176 printf("\r\n - Acc-Gyro-Mag Ch: [ ");
lorevee 0:1902469bdd2d 1177
lorevee 0:1902469bdd2d 1178 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1179 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1180 }
lorevee 0:1902469bdd2d 1181
lorevee 0:1902469bdd2d 1182
lorevee 0:1902469bdd2d 1183
lorevee 0:1902469bdd2d 1184
lorevee 0:1902469bdd2d 1185
lorevee 0:1902469bdd2d 1186
lorevee 0:1902469bdd2d 1187
lorevee 0:1902469bdd2d 1188 // SFUSION_CHAR_UUID
lorevee 0:1902469bdd2d 1189 }else if ((memcmp(tempUUID, SFUSION_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1190
lorevee 0:1902469bdd2d 1191 //SW
lorevee 0:1902469bdd2d 1192 perDevs.status = SOFTWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1193
lorevee 0:1902469bdd2d 1194 //Set the handle
lorevee 0:1902469bdd2d 1195 perDevs.sfusion_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1196 //Init value
lorevee 0:1902469bdd2d 1197 perDevs.sfusion_char_read[idx] = 0;
lorevee 0:1902469bdd2d 1198 perDevs.sfusion_on[idx] = 0;
lorevee 0:1902469bdd2d 1199
lorevee 0:1902469bdd2d 1200
lorevee 0:1902469bdd2d 1201
lorevee 0:1902469bdd2d 1202 printf("\r\n - SFusion Ch: [ ");
lorevee 0:1902469bdd2d 1203
lorevee 0:1902469bdd2d 1204 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1205 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1206 }
lorevee 0:1902469bdd2d 1207
lorevee 0:1902469bdd2d 1208
lorevee 0:1902469bdd2d 1209
lorevee 0:1902469bdd2d 1210
lorevee 0:1902469bdd2d 1211
lorevee 0:1902469bdd2d 1212
lorevee 0:1902469bdd2d 1213 // LED_CHAR_UUID
lorevee 0:1902469bdd2d 1214 }else if ((memcmp(tempUUID, LED_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1215
lorevee 0:1902469bdd2d 1216 //HW
lorevee 0:1902469bdd2d 1217 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1218
lorevee 0:1902469bdd2d 1219 // Set the handle
lorevee 0:1902469bdd2d 1220 perDevs.led_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1221 // Init value
lorevee 0:1902469bdd2d 1222 perDevs.led_char_read[idx] = 0;
lorevee 0:1902469bdd2d 1223 printf("\r\n - Led Ch: [ ");
lorevee 0:1902469bdd2d 1224
lorevee 0:1902469bdd2d 1225 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1226 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1227 }
lorevee 0:1902469bdd2d 1228
lorevee 0:1902469bdd2d 1229
lorevee 0:1902469bdd2d 1230
lorevee 0:1902469bdd2d 1231
lorevee 0:1902469bdd2d 1232
lorevee 0:1902469bdd2d 1233 // WAKEUP_EVENT_CHAR_UUID
lorevee 0:1902469bdd2d 1234 }else if ((memcmp(tempUUID, WAKEUP_EVENT_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1235
lorevee 0:1902469bdd2d 1236 //HW
lorevee 0:1902469bdd2d 1237 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1238
lorevee 0:1902469bdd2d 1239 // Set the handle
lorevee 0:1902469bdd2d 1240 perDevs.wup_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1241 // Init value
lorevee 0:1902469bdd2d 1242 perDevs.wup_char_read[idx] = 0;
lorevee 0:1902469bdd2d 1243 printf("\r\n - Wakeup Event Ch: [ ");
lorevee 0:1902469bdd2d 1244
lorevee 0:1902469bdd2d 1245 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1246 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1247 }
lorevee 0:1902469bdd2d 1248
lorevee 0:1902469bdd2d 1249
lorevee 0:1902469bdd2d 1250
lorevee 0:1902469bdd2d 1251
lorevee 0:1902469bdd2d 1252
lorevee 0:1902469bdd2d 1253
lorevee 0:1902469bdd2d 1254 // MIC_EVENT_CHAR_UUID
lorevee 0:1902469bdd2d 1255 }else if ((memcmp(tempUUID, MIC_EVENT_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1256
lorevee 0:1902469bdd2d 1257 //HW
lorevee 0:1902469bdd2d 1258 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1259
lorevee 0:1902469bdd2d 1260 // Set the handle
lorevee 0:1902469bdd2d 1261 perDevs.mic_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1262 // Init value
lorevee 0:1902469bdd2d 1263 perDevs.mic_char_read[idx] = 0;
lorevee 0:1902469bdd2d 1264 printf("\r\n - Mic Event Ch: [ ");
lorevee 0:1902469bdd2d 1265
lorevee 0:1902469bdd2d 1266 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1267 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1268 }
lorevee 0:1902469bdd2d 1269
lorevee 0:1902469bdd2d 1270
lorevee 0:1902469bdd2d 1271
lorevee 0:1902469bdd2d 1272
lorevee 0:1902469bdd2d 1273
lorevee 0:1902469bdd2d 1274 // PROXIMITY_CHAR_UUID
lorevee 0:1902469bdd2d 1275 }else if ((memcmp(tempUUID, PROXIMITY_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1276
lorevee 0:1902469bdd2d 1277 //HW
lorevee 0:1902469bdd2d 1278 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1279
lorevee 0:1902469bdd2d 1280 // Set the handle
lorevee 0:1902469bdd2d 1281 perDevs.prx_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1282 // Init value
lorevee 0:1902469bdd2d 1283 perDevs.prx_char_read[idx] = 0;
lorevee 0:1902469bdd2d 1284 perDevs.prx_on[idx] = 0;
lorevee 0:1902469bdd2d 1285 printf("\r\n - Proximity Ch: [ ");
lorevee 0:1902469bdd2d 1286
lorevee 0:1902469bdd2d 1287 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1288 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1289 }
lorevee 0:1902469bdd2d 1290
lorevee 0:1902469bdd2d 1291
lorevee 0:1902469bdd2d 1292
lorevee 0:1902469bdd2d 1293
lorevee 0:1902469bdd2d 1294
lorevee 0:1902469bdd2d 1295
lorevee 0:1902469bdd2d 1296 // LUX_CHAR_UUID
lorevee 0:1902469bdd2d 1297 }else if ((memcmp(tempUUID, LUX_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1298
lorevee 0:1902469bdd2d 1299 //HW
lorevee 0:1902469bdd2d 1300 perDevs.status = HARDWARE_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1301
lorevee 0:1902469bdd2d 1302 // Set the handle
lorevee 0:1902469bdd2d 1303 perDevs.lux_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1304
lorevee 0:1902469bdd2d 1305
lorevee 0:1902469bdd2d 1306 printf("\r\n - Lux Ch: [ ");
lorevee 0:1902469bdd2d 1307
lorevee 0:1902469bdd2d 1308 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1309 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1310 }
lorevee 0:1902469bdd2d 1311
lorevee 0:1902469bdd2d 1312
lorevee 0:1902469bdd2d 1313
lorevee 0:1902469bdd2d 1314
lorevee 0:1902469bdd2d 1315
lorevee 0:1902469bdd2d 1316
lorevee 0:1902469bdd2d 1317 // CONFIG_CHAR_UUID
lorevee 0:1902469bdd2d 1318 }else if ((memcmp(tempUUID, CONFIG_CHAR_UUID, uuidLength)) == 0){
lorevee 0:1902469bdd2d 1319
lorevee 0:1902469bdd2d 1320 //CFG
lorevee 0:1902469bdd2d 1321 perDevs.status = CONFIGURATION_SERV_CHARS_DISCOVERED;
lorevee 2:1525f4848cf2 1322
lorevee 0:1902469bdd2d 1323
lorevee 0:1902469bdd2d 1324 // Set the handle
lorevee 0:1902469bdd2d 1325 perDevs.cfg_char_handle[idx] = declHandle;
lorevee 0:1902469bdd2d 1326
lorevee 0:1902469bdd2d 1327 printf("\r\n - Config Ch: [ ");
lorevee 0:1902469bdd2d 1328
lorevee 0:1902469bdd2d 1329 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1330 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1331 }
lorevee 0:1902469bdd2d 1332
lorevee 0:1902469bdd2d 1333
lorevee 0:1902469bdd2d 1334
lorevee 0:1902469bdd2d 1335
lorevee 0:1902469bdd2d 1336
lorevee 0:1902469bdd2d 1337 // UNKNOWN
lorevee 0:1902469bdd2d 1338 }else {
lorevee 0:1902469bdd2d 1339
lorevee 0:1902469bdd2d 1340 printf("\r\n - Unknown Ch: [ ");
lorevee 0:1902469bdd2d 1341
lorevee 0:1902469bdd2d 1342 for (unsigned i = 0; i < uuidLength; i++) {
lorevee 0:1902469bdd2d 1343 printf("%02x ", pointerToUUID[i]);
lorevee 0:1902469bdd2d 1344 }
lorevee 0:1902469bdd2d 1345 }
lorevee 0:1902469bdd2d 1346
lorevee 0:1902469bdd2d 1347
lorevee 0:1902469bdd2d 1348
lorevee 0:1902469bdd2d 1349
lorevee 0:1902469bdd2d 1350 printf("] ");
lorevee 0:1902469bdd2d 1351 printf("(declH 0x%04x), r: %x\n", declHandle, (uint8_t)characteristicP->getProperties().read());
lorevee 0:1902469bdd2d 1352 }
lorevee 0:1902469bdd2d 1353 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1354
lorevee 0:1902469bdd2d 1355
lorevee 0:1902469bdd2d 1356
lorevee 0:1902469bdd2d 1357 /* Function called when discovery is terminated */
lorevee 0:1902469bdd2d 1358 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
lorevee 0:1902469bdd2d 1359 //printf("\r----> discoveryTerminationCallback\n\n");//DEBUG
lorevee 0:1902469bdd2d 1360
lorevee 0:1902469bdd2d 1361 uint8_t * pointerToCustomDev_v;
lorevee 0:1902469bdd2d 1362 pointerToCustomDev_v = &customDev_v;
lorevee 0:1902469bdd2d 1363
lorevee 0:1902469bdd2d 1364 uint8_t idx = perDevs.connDeviceIdx; //idx
lorevee 0:1902469bdd2d 1365
lorevee 0:1902469bdd2d 1366 printf("\r\n\n%d characteristics discovered and added into the DCList \n", countElements(headCharacteristic[idx]));
lorevee 0:1902469bdd2d 1367 printf("\r\nTerminated SERVICE DISCOVERY for Handle 0x%04x\n\n", connectionHandle);
lorevee 0:1902469bdd2d 1368
lorevee 0:1902469bdd2d 1369
lorevee 0:1902469bdd2d 1370
lorevee 0:1902469bdd2d 1371
lorevee 0:1902469bdd2d 1372 ////Enable notifications after the discovery of the configuration characteristics
lorevee 0:1902469bdd2d 1373 ////------------
lorevee 0:1902469bdd2d 1374 if (!perDevs.is_disconnected[perDevs.connDeviceIdx]) {
lorevee 0:1902469bdd2d 1375 *pointerToCustomDev_v = perDevs.devInfo[perDevs.connDeviceIdx].dev_v;
lorevee 0:1902469bdd2d 1376
lorevee 0:1902469bdd2d 1377 if (perDevs.devInfo[perDevs.connDeviceIdx].dev_v == NODE_ME1) {
lorevee 0:1902469bdd2d 1378 perDevs.status = ENABLE_ME1_LED_NOTIFICATIONS;
lorevee 0:1902469bdd2d 1379
lorevee 0:1902469bdd2d 1380 }else if (perDevs.devInfo[perDevs.connDeviceIdx].dev_v == NODE_AM1) {
lorevee 0:1902469bdd2d 1381 perDevs.status = NOTIFICATIONS_ENABLED;
lorevee 0:1902469bdd2d 1382
lorevee 0:1902469bdd2d 1383 }else if (perDevs.devInfo[perDevs.connDeviceIdx].dev_v == NODE_FL1) {
lorevee 0:1902469bdd2d 1384 perDevs.status = NOTIFICATIONS_ENABLED;
lorevee 0:1902469bdd2d 1385 }
lorevee 0:1902469bdd2d 1386 } else {
lorevee 0:1902469bdd2d 1387 perDevs.status = NOTIFICATIONS_ENABLED;
lorevee 0:1902469bdd2d 1388 }
lorevee 0:1902469bdd2d 1389
lorevee 0:1902469bdd2d 1390
lorevee 0:1902469bdd2d 1391 ////------------
lorevee 0:1902469bdd2d 1392
lorevee 0:1902469bdd2d 1393
lorevee 0:1902469bdd2d 1394 }
lorevee 0:1902469bdd2d 1395 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1396
lorevee 0:1902469bdd2d 1397
lorevee 0:1902469bdd2d 1398 /* Method called when there is a notification from the sever */
lorevee 0:1902469bdd2d 1399 void onNotificationCallback(const GattHVXCallbackParams* event){
lorevee 0:1902469bdd2d 1400 //printf("\r\nonNotificationCallback\n");//DEBUG
lorevee 0:1902469bdd2d 1401
lorevee 0:1902469bdd2d 1402 /* GATT Notification params */
lorevee 0:1902469bdd2d 1403 uint16_t conn_handle = event->connHandle;
lorevee 0:1902469bdd2d 1404 uint16_t attr_handle = event->handle;
lorevee 0:1902469bdd2d 1405 uint8_t attr_len = event->len;
lorevee 0:1902469bdd2d 1406 uint8_t *attr_value = (uint8_t *)event->data;
lorevee 0:1902469bdd2d 1407
lorevee 0:1902469bdd2d 1408
lorevee 0:1902469bdd2d 1409 int32_t tmp = 0;
lorevee 0:1902469bdd2d 1410 uint8_t tmp_data[256];
lorevee 0:1902469bdd2d 1411 uint8_t notify = 0;
lorevee 0:1902469bdd2d 1412 tBDAddr devAddr;
lorevee 0:1902469bdd2d 1413 uint8_t index;
lorevee 0:1902469bdd2d 1414 uint16_t slave_attr_handle;
lorevee 0:1902469bdd2d 1415 static uint8_t wupevt_value = 0;
lorevee 0:1902469bdd2d 1416
lorevee 0:1902469bdd2d 1417 /* Retrieving the peripheral device index and address from the connection handle */
lorevee 0:1902469bdd2d 1418 getDeviceFromConnHandle(conn_handle, &index, devAddr);
lorevee 0:1902469bdd2d 1419 slave_attr_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 1420
lorevee 0:1902469bdd2d 1421
lorevee 0:1902469bdd2d 1422
lorevee 0:1902469bdd2d 1423 /* Build buffer in JSON format */
lorevee 0:1902469bdd2d 1424 if (attr_handle == perDevs.wup_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1425
lorevee 0:1902469bdd2d 1426 /**
lorevee 0:1902469bdd2d 1427 * The motion is detected when a WakeUp event notification is received.
lorevee 0:1902469bdd2d 1428 * The received data is composed by 2 bytes for the tstamp + 2 bytes
lorevee 0:1902469bdd2d 1429 * for the value. Since we transmit only information about the detected
lorevee 0:1902469bdd2d 1430 * motion, we don't care of the last 2 bytes.
lorevee 0:1902469bdd2d 1431 */
lorevee 0:1902469bdd2d 1432 if (attr_len != TSTAMP_LEN+2)
lorevee 0:1902469bdd2d 1433 printf("\r\n(NC)WUP Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+2));
lorevee 0:1902469bdd2d 1434
lorevee 0:1902469bdd2d 1435 wupevt_value = !wupevt_value;
lorevee 0:1902469bdd2d 1436 tmp = wupevt_value;
lorevee 0:1902469bdd2d 1437 sprintf((char *)wifi_data, "\"WUpEvt_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1438 notify = 1;
lorevee 0:1902469bdd2d 1439
lorevee 0:1902469bdd2d 1440 /*
lorevee 0:1902469bdd2d 1441 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1442 * Timestamp | Node ID | WakeUp Type ID |
lorevee 0:1902469bdd2d 1443 * 2 bytes | 2 bytes | 1 byte |
lorevee 0:1902469bdd2d 1444 */
lorevee 0:1902469bdd2d 1445 Create_New_Attr_Value(attr_value, devAddr, WUP_TYPE_ID, NULL, WUP_DATA_LEN);
lorevee 0:1902469bdd2d 1446
lorevee 0:1902469bdd2d 1447 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 1448 perDevs.status = ALL_DATA_READ;
lorevee 1:110b5e896bc9 1449
lorevee 1:110b5e896bc9 1450 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1451 notifyMaster(ATTR_HEAD_LEN+WUP_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1452 }else {
lorevee 1:110b5e896bc9 1453 //disableAllNotifications();
lorevee 1:110b5e896bc9 1454 return;
lorevee 1:110b5e896bc9 1455 }
lorevee 1:110b5e896bc9 1456
lorevee 0:1902469bdd2d 1457 }
lorevee 0:1902469bdd2d 1458
lorevee 0:1902469bdd2d 1459
lorevee 0:1902469bdd2d 1460 } else if (attr_handle == perDevs.mic_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1461
lorevee 0:1902469bdd2d 1462 /* The level in dB (the mic level is detected when a mic event notification is received) */
lorevee 0:1902469bdd2d 1463 /* The Sensor Tile board has only Mic1 so it sends 3 bytes */
lorevee 0:1902469bdd2d 1464 if ((attr_len != TSTAMP_LEN+(2*MIC_DATA_LEN)) && (attr_len != TSTAMP_LEN+MIC_DATA_LEN))
lorevee 0:1902469bdd2d 1465 printf("\r\n(NC)MIC Warning: received data length is %d (while expecting %d or %d)\n", attr_len, (TSTAMP_LEN+MIC_DATA_LEN), (TSTAMP_LEN+(2*MIC_DATA_LEN)));
lorevee 0:1902469bdd2d 1466
lorevee 0:1902469bdd2d 1467 tmp = attr_value[2];
lorevee 0:1902469bdd2d 1468 sprintf((char *)wifi_data, "\"Mic1_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1469 /* We do not send the audio level from Mic2 anyway */
lorevee 0:1902469bdd2d 1470 //tmp = attr_value[3];
lorevee 0:1902469bdd2d 1471 //sprintf((char *)tmp_data, ",\"Mic2_0x%02x%02x\":%d", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1472 //strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1473 notify = 1;
lorevee 0:1902469bdd2d 1474
lorevee 0:1902469bdd2d 1475 /*
lorevee 0:1902469bdd2d 1476 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1477 * Timestamp | Node ID | MIC Event Type ID | value |
lorevee 0:1902469bdd2d 1478 * 2 bytes | 2 bytes | 1 byte | 1 byte |
lorevee 0:1902469bdd2d 1479 */
lorevee 0:1902469bdd2d 1480 Create_New_Attr_Value(attr_value, devAddr, MICLEVEL_TYPE_ID, attr_value+TSTAMP_LEN, MIC_DATA_LEN);
lorevee 0:1902469bdd2d 1481
lorevee 0:1902469bdd2d 1482 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 1483 perDevs.status = ALL_DATA_READ;
lorevee 1:110b5e896bc9 1484 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1485 notifyMaster(ATTR_HEAD_LEN+MIC_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1486 }else {
lorevee 1:110b5e896bc9 1487 //disableAllNotifications();
lorevee 1:110b5e896bc9 1488 return;
lorevee 1:110b5e896bc9 1489 }
lorevee 0:1902469bdd2d 1490 }
lorevee 0:1902469bdd2d 1491
lorevee 0:1902469bdd2d 1492
lorevee 0:1902469bdd2d 1493 } else if (attr_handle == perDevs.prx_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1494 /* the distance value (in mm) */
lorevee 0:1902469bdd2d 1495 if (attr_len != TSTAMP_LEN+PRX_DATA_LEN)
lorevee 0:1902469bdd2d 1496 printf("\r\n(NC)PRX Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+PRX_DATA_LEN));
lorevee 0:1902469bdd2d 1497
lorevee 0:1902469bdd2d 1498 tmp = (attr_value[3]<<8) | attr_value[2];
lorevee 0:1902469bdd2d 1499 sprintf((char *)wifi_data, "\"PRX_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1500 notify = 1;
lorevee 0:1902469bdd2d 1501
lorevee 0:1902469bdd2d 1502 /*
lorevee 0:1902469bdd2d 1503 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1504 * Timestamp | Node ID | Proximity Type ID | value |
lorevee 0:1902469bdd2d 1505 * 2 bytes | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 1506 */
lorevee 0:1902469bdd2d 1507 Create_New_Attr_Value(attr_value, devAddr, PRX_TYPE_ID, attr_value+TSTAMP_LEN, PRX_DATA_LEN); /* Timestamp, Node ID, Proximity Type ID, data, len */
lorevee 0:1902469bdd2d 1508
lorevee 0:1902469bdd2d 1509 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 1510 perDevs.status = ALL_DATA_READ;
lorevee 1:110b5e896bc9 1511 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1512 notifyMaster(ATTR_HEAD_LEN+PRX_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1513 }else {
lorevee 1:110b5e896bc9 1514 //disableAllNotifications();
lorevee 1:110b5e896bc9 1515 return;
lorevee 1:110b5e896bc9 1516 }
lorevee 0:1902469bdd2d 1517 }
lorevee 0:1902469bdd2d 1518
lorevee 0:1902469bdd2d 1519
lorevee 0:1902469bdd2d 1520 } else if (attr_handle == perDevs.agm_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1521 uint8_t type_id;
lorevee 0:1902469bdd2d 1522 uint8_t data_len;
lorevee 0:1902469bdd2d 1523 uint8_t value_offset;
lorevee 0:1902469bdd2d 1524
lorevee 0:1902469bdd2d 1525 /* Acc values in mg, Gyro values in dps, Mag values in mGa */
lorevee 0:1902469bdd2d 1526 if (attr_len != TSTAMP_LEN+MEMS_DATA_LEN)
lorevee 0:1902469bdd2d 1527 printf("\r\n(NC)AGM Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+MEMS_DATA_LEN));
lorevee 0:1902469bdd2d 1528
lorevee 0:1902469bdd2d 1529 if (perDevs.acc_event_enabled) {
lorevee 0:1902469bdd2d 1530 Build_MEMS_Packet(attr_value+2, "Acc", devAddr, INT_VALUE);
lorevee 0:1902469bdd2d 1531 type_id = ACC_TYPE_ID;
lorevee 0:1902469bdd2d 1532 data_len = ACC_DATA_LEN;
lorevee 0:1902469bdd2d 1533 value_offset = TSTAMP_LEN;
lorevee 0:1902469bdd2d 1534
lorevee 0:1902469bdd2d 1535 } else if (perDevs.gyr_event_enabled) {
lorevee 0:1902469bdd2d 1536 Build_MEMS_Packet(attr_value+8, "Gyr", devAddr, FLOAT_VALUE);
lorevee 0:1902469bdd2d 1537 type_id = GYR_TYPE_ID;
lorevee 0:1902469bdd2d 1538 data_len = GYR_DATA_LEN;
lorevee 0:1902469bdd2d 1539 value_offset = TSTAMP_LEN+ACC_DATA_LEN;
lorevee 0:1902469bdd2d 1540
lorevee 0:1902469bdd2d 1541 } else if (perDevs.mag_event_enabled) {
lorevee 0:1902469bdd2d 1542 Build_MEMS_Packet(attr_value+14, "Mag", devAddr, INT_VALUE);
lorevee 0:1902469bdd2d 1543 type_id = MAG_TYPE_ID;
lorevee 0:1902469bdd2d 1544 data_len = MAG_DATA_LEN;
lorevee 0:1902469bdd2d 1545 value_offset = TSTAMP_LEN+ACC_DATA_LEN+GYR_DATA_LEN;
lorevee 0:1902469bdd2d 1546 }
lorevee 0:1902469bdd2d 1547 notify = 1;
lorevee 0:1902469bdd2d 1548
lorevee 0:1902469bdd2d 1549 /*
lorevee 0:1902469bdd2d 1550 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1551 * Timestamp | Node ID | Acc/Gyro/Mag Type ID | value |
lorevee 0:1902469bdd2d 1552 * 2 bytes | 2 bytes | 1 byte | 6 bytes |
lorevee 0:1902469bdd2d 1553 */
lorevee 0:1902469bdd2d 1554 Create_New_Attr_Value(attr_value, devAddr, type_id, attr_value+value_offset, data_len);
lorevee 0:1902469bdd2d 1555
lorevee 0:1902469bdd2d 1556 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) && (perDevs.agm_on[index])) {
lorevee 0:1902469bdd2d 1557 perDevs.status = NOTIFICATIONS_DATA_READ;
lorevee 1:110b5e896bc9 1558 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1559 notifyMaster(ATTR_HEAD_LEN+data_len, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1560 }else {
lorevee 1:110b5e896bc9 1561 //disableAllNotifications();
lorevee 1:110b5e896bc9 1562 return;
lorevee 1:110b5e896bc9 1563 }
lorevee 0:1902469bdd2d 1564
lorevee 0:1902469bdd2d 1565 } else {
lorevee 0:1902469bdd2d 1566 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 1567 }
lorevee 0:1902469bdd2d 1568
lorevee 0:1902469bdd2d 1569
lorevee 0:1902469bdd2d 1570
lorevee 0:1902469bdd2d 1571 } else if (attr_handle == perDevs.sfusion_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1572
lorevee 0:1902469bdd2d 1573 /* Quaternion values */
lorevee 0:1902469bdd2d 1574 tmp = (int8_t)attr_value[3]<<8 | attr_value[2];
lorevee 0:1902469bdd2d 1575 sprintf((char *)wifi_data, "\"Q1_0x%02x%02x\":%s0.%.4d; ", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], (tmp<0 ? "-" : ""), (tmp<0 ? -tmp : tmp));
lorevee 0:1902469bdd2d 1576 tmp = (int8_t)attr_value[5]<<8 | attr_value[4];
lorevee 0:1902469bdd2d 1577 sprintf((char *)tmp_data, "\"Q2_0x%02x%02x\":%s0.%.4d; ", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], (tmp<0 ? "-" : ""), (tmp<0 ? -tmp : tmp));
lorevee 0:1902469bdd2d 1578 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1579 tmp = (int8_t)attr_value[7]<<8 | attr_value[6];
lorevee 0:1902469bdd2d 1580 sprintf((char *)tmp_data, "\"Q3_0x%02x%02x\":%s0.%.4d; ", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], (tmp<0 ? "-" : ""), (tmp<0 ? -tmp : tmp));
lorevee 0:1902469bdd2d 1581 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1582 notify = 1;
lorevee 0:1902469bdd2d 1583
lorevee 0:1902469bdd2d 1584 /*
lorevee 0:1902469bdd2d 1585 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1586 * Timestamp | Node ID | SFusion Type ID | value |
lorevee 0:1902469bdd2d 1587 * 2 bytes | 2 bytes | 1 byte | 6 bytes |
lorevee 0:1902469bdd2d 1588 */
lorevee 0:1902469bdd2d 1589 Create_New_Attr_Value(attr_value, devAddr, SFUSION_TYPE_ID, attr_value+TSTAMP_LEN, SFUSION_DATA_LEN);
lorevee 0:1902469bdd2d 1590
lorevee 0:1902469bdd2d 1591 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) && (perDevs.sfusion_on[index])) {
lorevee 0:1902469bdd2d 1592 perDevs.status = NOTIFICATIONS_DATA_READ;
lorevee 1:110b5e896bc9 1593 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1594 notifyMaster(ATTR_HEAD_LEN+SFUSION_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1595 }else {
lorevee 1:110b5e896bc9 1596 //disableAllNotifications();
lorevee 1:110b5e896bc9 1597 return;
lorevee 1:110b5e896bc9 1598 }
lorevee 0:1902469bdd2d 1599 perDevs.sfusion_char_read[index] = 1;
lorevee 0:1902469bdd2d 1600
lorevee 0:1902469bdd2d 1601 } else {
lorevee 0:1902469bdd2d 1602 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 1603 }
lorevee 0:1902469bdd2d 1604 } else if (attr_handle == perDevs.environmental_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1605 /* P value in mBar, H value in percentage, T2 and T1 values in Celtius degree */
lorevee 0:1902469bdd2d 1606 if (attr_len != TSTAMP_LEN+ENV_DATA_LEN)
lorevee 0:1902469bdd2d 1607 printf("\r\n(NC)SFUSION Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+ENV_DATA_LEN));
lorevee 0:1902469bdd2d 1608
lorevee 0:1902469bdd2d 1609 tmp = (attr_value[5]<<24) | (attr_value[4]<<16) | (attr_value[3]<<8) | attr_value[2];
lorevee 0:1902469bdd2d 1610 sprintf((char *)wifi_data, "\"Pressure_0x%02x%02x\":%ld.%ld,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/100, tmp%100);
lorevee 0:1902469bdd2d 1611 tmp = (attr_value[7]<<8) | attr_value[6];
lorevee 0:1902469bdd2d 1612 sprintf((char *)tmp_data, "\"Humidity_0x%02x%02x\":%ld.%ld,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 1613 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1614
lorevee 0:1902469bdd2d 1615 /* Showing only one Temperature from the same peripheral node */
lorevee 0:1902469bdd2d 1616 //tmp = (attr_value[9]<<8) | attr_value[8];
lorevee 0:1902469bdd2d 1617 //sprintf((char *)tmp_data, "\"Temperature2_0x%02x%02x\":%d.%d,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 1618 //strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1619 tmp = (attr_value[11]<<8) | attr_value[10];
lorevee 0:1902469bdd2d 1620 sprintf((char *)tmp_data, "\"Temperature1_0x%02x%02x\":%ld.%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 1621 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1622 notify = 1;
lorevee 0:1902469bdd2d 1623
lorevee 0:1902469bdd2d 1624 /*
lorevee 0:1902469bdd2d 1625 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1626 * Tstamp | Node ID | P Type ID | value | H Type ID | value | T Type ID | value | T Type ID | value |
lorevee 0:1902469bdd2d 1627 * 2 bytes | 2 bytes | 1 byte | 4 bytes | 1 byte | 2 bytes | 1 byte | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 1628 */
lorevee 0:1902469bdd2d 1629 Create_New_Attr_Value(attr_value, devAddr, PRESS_TYPE_ID, attr_value+TSTAMP_LEN, attr_len-TSTAMP_LEN);
lorevee 0:1902469bdd2d 1630
lorevee 0:1902469bdd2d 1631 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 1:110b5e896bc9 1632 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1633 notifyMaster(ATTR_HEAD_LEN+PRESS_DATA_LEN+(3*TYPE_ID_LEN)+HUM_DATA_LEN+(2*TEMP_DATA_LEN),
lorevee 1:110b5e896bc9 1634 star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1635 }else {
lorevee 1:110b5e896bc9 1636 //disableAllNotifications();
lorevee 1:110b5e896bc9 1637 return;
lorevee 1:110b5e896bc9 1638 }
lorevee 0:1902469bdd2d 1639 }
lorevee 0:1902469bdd2d 1640
lorevee 0:1902469bdd2d 1641
lorevee 0:1902469bdd2d 1642 } else if (attr_handle == perDevs.led_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1643 /* the status (0x01 = ON, 0x00 = OFF) */
lorevee 0:1902469bdd2d 1644 if (attr_len != TSTAMP_LEN+LED_DATA_LEN)
lorevee 0:1902469bdd2d 1645 printf("\r\n(NC)LED Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+LED_DATA_LEN));
lorevee 0:1902469bdd2d 1646
lorevee 0:1902469bdd2d 1647 tmp = attr_value[2];
lorevee 0:1902469bdd2d 1648 sprintf((char *)wifi_data, "\"LED_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1649 notify = 1;
lorevee 0:1902469bdd2d 1650
lorevee 0:1902469bdd2d 1651 /*
lorevee 0:1902469bdd2d 1652 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1653 * Timestamp | Node ID | LED Type ID | value |
lorevee 0:1902469bdd2d 1654 * 2 bytes | 2 bytes | 1 byte | 1 byte |
lorevee 0:1902469bdd2d 1655 */
lorevee 0:1902469bdd2d 1656 Create_New_Attr_Value(attr_value, devAddr, LED_TYPE_ID, attr_value+TSTAMP_LEN, LED_DATA_LEN);
lorevee 0:1902469bdd2d 1657
lorevee 0:1902469bdd2d 1658 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 1659 if (perDevs.led_char_read[index]==1) {
lorevee 0:1902469bdd2d 1660 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 1661 }
lorevee 1:110b5e896bc9 1662 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1663 notifyMaster(ATTR_HEAD_LEN+LED_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1664 }else {
lorevee 1:110b5e896bc9 1665 //disableAllNotifications();
lorevee 1:110b5e896bc9 1666 return;
lorevee 1:110b5e896bc9 1667 }
lorevee 0:1902469bdd2d 1668 }
lorevee 0:1902469bdd2d 1669
lorevee 0:1902469bdd2d 1670
lorevee 0:1902469bdd2d 1671 } else if (attr_handle == perDevs.lux_char_handle[index]+1) {
lorevee 0:1902469bdd2d 1672 /* Lux value */
lorevee 0:1902469bdd2d 1673 if (attr_len != TSTAMP_LEN+LUX_DATA_LEN)
lorevee 0:1902469bdd2d 1674 printf("\r\n(NC)LUX Warning: received data length is %d (while expecting %d)\n", attr_len, (TSTAMP_LEN+LUX_DATA_LEN));
lorevee 0:1902469bdd2d 1675
lorevee 0:1902469bdd2d 1676 tmp = (attr_value[3]<<8) | attr_value[2];
lorevee 0:1902469bdd2d 1677 sprintf((char *)wifi_data, "\"LUX_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1678 notify = 1;
lorevee 0:1902469bdd2d 1679
lorevee 0:1902469bdd2d 1680 /*
lorevee 0:1902469bdd2d 1681 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 1682 * Timestamp | Node ID | LUX Type ID | value |
lorevee 0:1902469bdd2d 1683 * 2 bytes | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 1684 */
lorevee 0:1902469bdd2d 1685 Create_New_Attr_Value(attr_value, devAddr, LUX_TYPE_ID, attr_value+TSTAMP_LEN, LUX_DATA_LEN);
lorevee 0:1902469bdd2d 1686
lorevee 0:1902469bdd2d 1687 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 1:110b5e896bc9 1688 if ((stackBusy == 0) && (writeDescriptorCompleted ==1)){
lorevee 1:110b5e896bc9 1689 notifyMaster(ATTR_HEAD_LEN+LUX_DATA_LEN, star_attr_value, slave_attr_handle);
lorevee 1:110b5e896bc9 1690 }else {
lorevee 1:110b5e896bc9 1691 //disableAllNotifications();
lorevee 1:110b5e896bc9 1692 return;
lorevee 1:110b5e896bc9 1693 }
lorevee 0:1902469bdd2d 1694 }
lorevee 0:1902469bdd2d 1695
lorevee 0:1902469bdd2d 1696
lorevee 0:1902469bdd2d 1697 }//if-else-MAIN
lorevee 0:1902469bdd2d 1698
lorevee 0:1902469bdd2d 1699 if (notify == 1) {
lorevee 0:1902469bdd2d 1700 strcat((char *)wifi_data, "\n");
lorevee 0:1902469bdd2d 1701
lorevee 0:1902469bdd2d 1702 if (discoveryCompleted == 1){
lorevee 0:1902469bdd2d 1703 printf("\r\nNOTIFICATION => %s", (char *)wifi_data); /* print locally the buffer in JSON format */
lorevee 0:1902469bdd2d 1704 }
lorevee 0:1902469bdd2d 1705
lorevee 0:1902469bdd2d 1706 data = wifi_data;
lorevee 0:1902469bdd2d 1707 if ((attr_handle!=perDevs.sfusion_char_handle[index]+1) && (attr_handle!=perDevs.agm_char_handle[index]+1))
lorevee 0:1902469bdd2d 1708 new_data = 1;
lorevee 0:1902469bdd2d 1709 }//notify=1
lorevee 0:1902469bdd2d 1710
lorevee 0:1902469bdd2d 1711 if (readCompleted != 1){
lorevee 0:1902469bdd2d 1712 readCompleted = 1;
lorevee 0:1902469bdd2d 1713 }
lorevee 0:1902469bdd2d 1714
lorevee 0:1902469bdd2d 1715 }
lorevee 0:1902469bdd2d 1716 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1717
lorevee 0:1902469bdd2d 1718
lorevee 0:1902469bdd2d 1719
lorevee 0:1902469bdd2d 1720 /**
lorevee 0:1902469bdd2d 1721 * @brief Enable characteristic notifications
lorevee 0:1902469bdd2d 1722 * @param Connection Handle
lorevee 0:1902469bdd2d 1723 * @param Position of the peripheral in the struct containing all peripherals
lorevee 0:1902469bdd2d 1724 * @param Peripheral node type
lorevee 0:1902469bdd2d 1725 * @param uint8_t indicating if the notification has to be enabled (1) or disabled (0)
lorevee 0:1902469bdd2d 1726 * @retval None
lorevee 0:1902469bdd2d 1727 */
lorevee 0:1902469bdd2d 1728 void enableNotifications(uint16_t conn_handle, uint8_t index, uint8_t dev_v, uint8_t set_mode) {
lorevee 0:1902469bdd2d 1729 //printf("\r\nenableNotifications\n");//DEBUG
lorevee 0:1902469bdd2d 1730
lorevee 0:1902469bdd2d 1731
lorevee 0:1902469bdd2d 1732 uint16_t attr_handle;
lorevee 0:1902469bdd2d 1733 uint8_t attr_value[6]={0,0,0,0,0,0};
lorevee 0:1902469bdd2d 1734 uint8_t attr_len;
lorevee 0:1902469bdd2d 1735
lorevee 0:1902469bdd2d 1736
lorevee 0:1902469bdd2d 1737 const char * event_type;
lorevee 0:1902469bdd2d 1738
lorevee 0:1902469bdd2d 1739 switch (perDevs.status) {
lorevee 0:1902469bdd2d 1740 case ENABLE_ME1_LED_NOTIFICATIONS:
lorevee 0:1902469bdd2d 1741 {
lorevee 0:1902469bdd2d 1742 event_type = "LED";
lorevee 0:1902469bdd2d 1743 attr_handle = perDevs.led_char_handle[index] + 2;
lorevee 0:1902469bdd2d 1744 }
lorevee 0:1902469bdd2d 1745 break;
lorevee 0:1902469bdd2d 1746
lorevee 0:1902469bdd2d 1747 case ENABLE_ME1_WUP_NOTIFICATIONS:
lorevee 0:1902469bdd2d 1748 {
lorevee 0:1902469bdd2d 1749 event_type = "WUPEVT";
lorevee 0:1902469bdd2d 1750
lorevee 1:110b5e896bc9 1751 //Enable/Disable the WakeUp notifications on the Motenv1
lorevee 0:1902469bdd2d 1752 setNotificationProperty(conn_handle, index, FEATURE_MASK_WAKEUP_EVENTS, WAKEUP_NOTIFICATION_CMD, set_mode);
lorevee 0:1902469bdd2d 1753
lorevee 0:1902469bdd2d 1754 attr_handle = perDevs.wup_char_handle[index] + 2;
lorevee 0:1902469bdd2d 1755 }
lorevee 0:1902469bdd2d 1756 break;
lorevee 0:1902469bdd2d 1757 default:
lorevee 0:1902469bdd2d 1758 break;
lorevee 0:1902469bdd2d 1759 }
lorevee 0:1902469bdd2d 1760
lorevee 0:1902469bdd2d 1761 attr_value[0] = set_mode;
lorevee 0:1902469bdd2d 1762 attr_len = 2;
lorevee 0:1902469bdd2d 1763
lorevee 0:1902469bdd2d 1764
lorevee 0:1902469bdd2d 1765 if (perDevs.status == ENABLE_ME1_LED_NOTIFICATIONS){
lorevee 0:1902469bdd2d 1766 writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 1767 printf("\r\n%s notifications set to %d for periph %d (0x%04x)\n", event_type, set_mode, index+1, conn_handle);
lorevee 0:1902469bdd2d 1768 writeCharacDescriptor(conn_handle, attr_handle, attr_len, attr_value);
lorevee 0:1902469bdd2d 1769
lorevee 0:1902469bdd2d 1770 }
lorevee 0:1902469bdd2d 1771
lorevee 0:1902469bdd2d 1772 if ((perDevs.status == ENABLE_ME1_WUP_NOTIFICATIONS)/* && (writeDescriptorCompleted == 1)*/){
lorevee 0:1902469bdd2d 1773 writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 1774 printf("\r\n%s notifications set to %d for periph %d (0x%04x)\n", event_type, set_mode, index+1, conn_handle);
lorevee 0:1902469bdd2d 1775 writeCharacDescriptor(conn_handle, attr_handle, attr_len, attr_value);
lorevee 0:1902469bdd2d 1776 }
lorevee 0:1902469bdd2d 1777
lorevee 0:1902469bdd2d 1778 }
lorevee 0:1902469bdd2d 1779 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1780
lorevee 0:1902469bdd2d 1781
lorevee 0:1902469bdd2d 1782
lorevee 0:1902469bdd2d 1783 /* Method called after a periph descriptor is written */
lorevee 0:1902469bdd2d 1784 void perDescriptorWrittenCallback(const GattWriteCallbackParams* event){
lorevee 0:1902469bdd2d 1785 //printf("\r\nperDescriptorWrittenCallback\n");//DEBUG
lorevee 1:110b5e896bc9 1786
lorevee 0:1902469bdd2d 1787 writeDescriptorCompleted = 1;
lorevee 1:110b5e896bc9 1788 eventQ.call(setNewStatus);
lorevee 1:110b5e896bc9 1789 //writeDescriptorCompleted = 1;
lorevee 0:1902469bdd2d 1790 }
lorevee 0:1902469bdd2d 1791 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1792
lorevee 0:1902469bdd2d 1793
lorevee 0:1902469bdd2d 1794
lorevee 0:1902469bdd2d 1795 /* Write a characteristic descriptor */
lorevee 0:1902469bdd2d 1796 //cmd == GattClient::GATT_OP_WRITE_REQ
lorevee 0:1902469bdd2d 1797 void writeCharacDescriptor(uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 1798 uint8_t* attr_value){
lorevee 0:1902469bdd2d 1799
lorevee 0:1902469bdd2d 1800 ble_error_t error = BLE::Instance().gattClient().write( GattClient::GATT_OP_WRITE_REQ,
lorevee 0:1902469bdd2d 1801 conn_handle,
lorevee 0:1902469bdd2d 1802 attr_handle,
lorevee 0:1902469bdd2d 1803 attr_len,
lorevee 0:1902469bdd2d 1804 attr_value );
lorevee 0:1902469bdd2d 1805
lorevee 0:1902469bdd2d 1806 if (error != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 1807 printf("\r\nWrite charac descriptor failed!\n");
lorevee 0:1902469bdd2d 1808 writeDescriptorCompleted = 1;
lorevee 0:1902469bdd2d 1809 }
lorevee 0:1902469bdd2d 1810 }
lorevee 0:1902469bdd2d 1811 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1812
lorevee 0:1902469bdd2d 1813
lorevee 0:1902469bdd2d 1814
lorevee 0:1902469bdd2d 1815
lorevee 0:1902469bdd2d 1816
lorevee 0:1902469bdd2d 1817 /* Get error */
lorevee 0:1902469bdd2d 1818 ble_error_t writeCharacDescriptorWithError(uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 1819 uint8_t* attr_value){
lorevee 0:1902469bdd2d 1820
lorevee 0:1902469bdd2d 1821 ble_error_t error = BLE::Instance().gattClient().write( GattClient::GATT_OP_WRITE_REQ,
lorevee 0:1902469bdd2d 1822 conn_handle,
lorevee 0:1902469bdd2d 1823 attr_handle,
lorevee 0:1902469bdd2d 1824 attr_len,
lorevee 0:1902469bdd2d 1825 attr_value );
lorevee 0:1902469bdd2d 1826 return error;
lorevee 0:1902469bdd2d 1827 }
lorevee 0:1902469bdd2d 1828 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1829
lorevee 0:1902469bdd2d 1830
lorevee 0:1902469bdd2d 1831
lorevee 0:1902469bdd2d 1832
lorevee 0:1902469bdd2d 1833 /* Write a characteristic value without waiting for any response */
lorevee 0:1902469bdd2d 1834 //cmd == GATT_OP_WRITE_CMD
lorevee 0:1902469bdd2d 1835 void writeCharacValueWithoutResp(uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 1836 uint8_t* attr_value){
lorevee 0:1902469bdd2d 1837
lorevee 0:1902469bdd2d 1838 ble_error_t error = BLE::Instance().gattClient().write( GattClient::GATT_OP_WRITE_CMD,
lorevee 0:1902469bdd2d 1839 conn_handle,
lorevee 0:1902469bdd2d 1840 attr_handle,
lorevee 0:1902469bdd2d 1841 attr_len,
lorevee 0:1902469bdd2d 1842 attr_value );
lorevee 0:1902469bdd2d 1843
lorevee 0:1902469bdd2d 1844 if (error != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 1845 printf("\r\nWrite charac descriptor wo resp failed!\n");
lorevee 0:1902469bdd2d 1846 writeDescriptorCompleted = 1;
lorevee 0:1902469bdd2d 1847 }
lorevee 0:1902469bdd2d 1848 }
lorevee 0:1902469bdd2d 1849 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1850
lorevee 0:1902469bdd2d 1851
lorevee 0:1902469bdd2d 1852
lorevee 0:1902469bdd2d 1853
lorevee 0:1902469bdd2d 1854 /* Get error */
lorevee 0:1902469bdd2d 1855 ble_error_t writeCharacValueWithoutRespWithError(uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 1856 uint8_t* attr_value){
lorevee 0:1902469bdd2d 1857
lorevee 0:1902469bdd2d 1858 ble_error_t error = BLE::Instance().gattClient().write( GattClient::GATT_OP_WRITE_CMD,
lorevee 0:1902469bdd2d 1859 conn_handle,
lorevee 0:1902469bdd2d 1860 attr_handle,
lorevee 0:1902469bdd2d 1861 attr_len,
lorevee 0:1902469bdd2d 1862 attr_value );
lorevee 0:1902469bdd2d 1863 return error;
lorevee 0:1902469bdd2d 1864
lorevee 0:1902469bdd2d 1865 }
lorevee 0:1902469bdd2d 1866 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1867
lorevee 0:1902469bdd2d 1868
lorevee 0:1902469bdd2d 1869
lorevee 0:1902469bdd2d 1870
lorevee 0:1902469bdd2d 1871 /**
lorevee 0:1902469bdd2d 1872 * @brief This function builds a Jason format string
lorevee 0:1902469bdd2d 1873 * @param attribute value
lorevee 0:1902469bdd2d 1874 * @param string indicating the data type (Acc, Gyr or Mag)
lorevee 0:1902469bdd2d 1875 * @param address of the device
lorevee 0:1902469bdd2d 1876 * @param data type (integer or float)
lorevee 0:1902469bdd2d 1877 * @retval None
lorevee 0:1902469bdd2d 1878 */
lorevee 0:1902469bdd2d 1879 void Build_MEMS_Packet(uint8_t *attr_value, char *data_type, tBDAddr devAddr, uint8_t num_type){
lorevee 0:1902469bdd2d 1880
lorevee 0:1902469bdd2d 1881 int32_t tmp = 0;
lorevee 0:1902469bdd2d 1882 uint8_t tmp_data[256];
lorevee 0:1902469bdd2d 1883 const char* sign = "";
lorevee 0:1902469bdd2d 1884 char axes[3] = {'X','Y','Z'};
lorevee 0:1902469bdd2d 1885 uint8_t i, j = 0;
lorevee 0:1902469bdd2d 1886
lorevee 0:1902469bdd2d 1887 for (i=0; i<5; i++) {
lorevee 0:1902469bdd2d 1888 tmp = ((int8_t)attr_value[i+1]<<8) | attr_value[i];
lorevee 0:1902469bdd2d 1889
lorevee 0:1902469bdd2d 1890 if (num_type==1) {
lorevee 0:1902469bdd2d 1891 if (i==0) {
lorevee 0:1902469bdd2d 1892 sprintf((char *)wifi_data, "\"%s%c_0x%02x%02x\":%ld; ", data_type, axes[j], devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1893
lorevee 0:1902469bdd2d 1894 } else {
lorevee 0:1902469bdd2d 1895 sprintf((char *)tmp_data, "\"%s%c_0x%02x%02x\":%ld; ", data_type, axes[j], devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 1896 strcat ((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1897 }
lorevee 0:1902469bdd2d 1898
lorevee 0:1902469bdd2d 1899 } else {
lorevee 0:1902469bdd2d 1900 sign = (tmp < 0) ? "-" : "";
lorevee 0:1902469bdd2d 1901 tmp = (tmp < 0) ? (-tmp) : (tmp);
lorevee 0:1902469bdd2d 1902 if (i==0) {
lorevee 0:1902469bdd2d 1903 sprintf((char *)wifi_data, "\"%s%c_0x%02x%02x\":%s%ld.%ld; ", data_type, axes[j], devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], sign, tmp/10, tmp%10);
lorevee 0:1902469bdd2d 1904
lorevee 0:1902469bdd2d 1905 } else {
lorevee 0:1902469bdd2d 1906 sprintf((char *)tmp_data, "\"%s%c_0x%02x%02x\":%s%ld.%ld; ", data_type, axes[j], devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], sign, tmp/10, tmp%10);
lorevee 0:1902469bdd2d 1907 strcat ((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 1908 }
lorevee 0:1902469bdd2d 1909 }//if-MAIN
lorevee 0:1902469bdd2d 1910
lorevee 0:1902469bdd2d 1911 i++;
lorevee 0:1902469bdd2d 1912 j++;
lorevee 0:1902469bdd2d 1913
lorevee 0:1902469bdd2d 1914 }//for
lorevee 0:1902469bdd2d 1915 }
lorevee 0:1902469bdd2d 1916 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 1917
lorevee 0:1902469bdd2d 1918
lorevee 0:1902469bdd2d 1919 /**
lorevee 0:1902469bdd2d 1920 * @brief This function creates, from an attribute value received from a
lorevee 0:1902469bdd2d 1921 * peripheral node, a new attribute value to be sent to the client
lorevee 0:1902469bdd2d 1922 * @param tstamp Timestamp
lorevee 0:1902469bdd2d 1923 * @param data_type_id Data Type ID
lorevee 0:1902469bdd2d 1924 * @param devAddr Device address
lorevee 0:1902469bdd2d 1925 * @param data_length Data Length
lorevee 0:1902469bdd2d 1926 * @retval None
lorevee 0:1902469bdd2d 1927 */
lorevee 0:1902469bdd2d 1928 void Create_New_Attr_Value (uint8_t *tstamp, tBDAddr devAddr, uint8_t data_type_id, uint8_t *data, uint8_t data_length){
lorevee 0:1902469bdd2d 1929 //printf("\r\nCreate_New_Attr_Value\n");//DEBUG
lorevee 0:1902469bdd2d 1930
lorevee 0:1902469bdd2d 1931
lorevee 0:1902469bdd2d 1932
lorevee 0:1902469bdd2d 1933 uint8_t* new_attr_value = star_attr_value;
lorevee 0:1902469bdd2d 1934
lorevee 0:1902469bdd2d 1935 memcpy(new_attr_value, tstamp, TSTAMP_LEN); /* Timestamp */
lorevee 0:1902469bdd2d 1936 new_attr_value += TSTAMP_LEN;
lorevee 0:1902469bdd2d 1937
lorevee 0:1902469bdd2d 1938 memcpy(new_attr_value, devAddr+NODE_ID_OFFSET, NODE_ID_LEN); /* Node ID */
lorevee 0:1902469bdd2d 1939 new_attr_value += NODE_ID_LEN;
lorevee 0:1902469bdd2d 1940
lorevee 0:1902469bdd2d 1941 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* Data Type ID */
lorevee 0:1902469bdd2d 1942 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 1943
lorevee 0:1902469bdd2d 1944 switch(data_type_id)
lorevee 0:1902469bdd2d 1945 {
lorevee 0:1902469bdd2d 1946
lorevee 0:1902469bdd2d 1947 //
lorevee 0:1902469bdd2d 1948 case PRESS_TYPE_ID:
lorevee 0:1902469bdd2d 1949 {
lorevee 0:1902469bdd2d 1950 memcpy(new_attr_value, data, PRESS_DATA_LEN); /* Pressure value */
lorevee 0:1902469bdd2d 1951 new_attr_value += PRESS_DATA_LEN;
lorevee 0:1902469bdd2d 1952 data += PRESS_DATA_LEN;
lorevee 0:1902469bdd2d 1953
lorevee 0:1902469bdd2d 1954 if (data_length == ENV_DATA_LEN_LONG-TSTAMP_LEN) {
lorevee 0:1902469bdd2d 1955 data_type_id = HUM_TYPE_ID;
lorevee 0:1902469bdd2d 1956
lorevee 0:1902469bdd2d 1957 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* Humidity Type ID */
lorevee 0:1902469bdd2d 1958 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 1959
lorevee 0:1902469bdd2d 1960 memcpy(new_attr_value, data, HUM_DATA_LEN); /* Humidity value */
lorevee 0:1902469bdd2d 1961 new_attr_value += HUM_DATA_LEN;
lorevee 0:1902469bdd2d 1962 data += HUM_DATA_LEN;
lorevee 0:1902469bdd2d 1963 data_type_id = TEMP_TYPE_ID;
lorevee 0:1902469bdd2d 1964
lorevee 0:1902469bdd2d 1965 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* Temperature Type ID */
lorevee 0:1902469bdd2d 1966 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 1967
lorevee 0:1902469bdd2d 1968 memcpy(new_attr_value, data, TEMP_DATA_LEN); /* Temperature value */
lorevee 0:1902469bdd2d 1969 new_attr_value += TEMP_DATA_LEN;
lorevee 0:1902469bdd2d 1970 data += TEMP_DATA_LEN;
lorevee 0:1902469bdd2d 1971
lorevee 0:1902469bdd2d 1972 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* Temperature Type ID */
lorevee 0:1902469bdd2d 1973 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 1974 memcpy(new_attr_value, data, TEMP_DATA_LEN); /* Temperature value */
lorevee 0:1902469bdd2d 1975 }
lorevee 0:1902469bdd2d 1976
lorevee 0:1902469bdd2d 1977 else { /* Sensor Tile */
lorevee 0:1902469bdd2d 1978 data_type_id = TEMP_TYPE_ID;
lorevee 0:1902469bdd2d 1979 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* Temperature Type ID */
lorevee 0:1902469bdd2d 1980 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 1981 memcpy(new_attr_value, data, TEMP_DATA_LEN); /* Temperature value */
lorevee 0:1902469bdd2d 1982 }
lorevee 0:1902469bdd2d 1983 }
lorevee 0:1902469bdd2d 1984 break;
lorevee 0:1902469bdd2d 1985 case LED_TYPE_ID:
lorevee 0:1902469bdd2d 1986 case MICLEVEL_TYPE_ID:
lorevee 0:1902469bdd2d 1987 {
lorevee 0:1902469bdd2d 1988 memcpy(new_attr_value, data, ONE_BYTE_LEN); /* LED or MIC value */
lorevee 0:1902469bdd2d 1989 }
lorevee 0:1902469bdd2d 1990 break;
lorevee 0:1902469bdd2d 1991 case PRX_TYPE_ID:
lorevee 0:1902469bdd2d 1992 case LUX_TYPE_ID:
lorevee 0:1902469bdd2d 1993 {
lorevee 0:1902469bdd2d 1994 memcpy(new_attr_value, data, TWO_BYTES_LEN); /* LUX or PRX value */
lorevee 0:1902469bdd2d 1995 }
lorevee 0:1902469bdd2d 1996 break;
lorevee 0:1902469bdd2d 1997 case ACC_TYPE_ID:
lorevee 0:1902469bdd2d 1998 {
lorevee 0:1902469bdd2d 1999 memcpy(new_attr_value, data, X_DATA_LEN); /* ACC value */
lorevee 0:1902469bdd2d 2000 new_attr_value += X_DATA_LEN;
lorevee 0:1902469bdd2d 2001 data += X_DATA_LEN;
lorevee 0:1902469bdd2d 2002 memcpy(new_attr_value, data, Y_DATA_LEN);
lorevee 0:1902469bdd2d 2003 new_attr_value += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2004 data += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2005 memcpy(new_attr_value, data, Z_DATA_LEN);
lorevee 0:1902469bdd2d 2006 new_attr_value += Z_DATA_LEN;
lorevee 0:1902469bdd2d 2007 data += Z_DATA_LEN;
lorevee 0:1902469bdd2d 2008 if (data_length == MEMS_DATA_LEN) {
lorevee 0:1902469bdd2d 2009 data_type_id = GYR_TYPE_ID;
lorevee 0:1902469bdd2d 2010 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* GYR Type ID */
lorevee 0:1902469bdd2d 2011 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 2012 memcpy(new_attr_value, data, X_DATA_LEN); /* GYR value */
lorevee 0:1902469bdd2d 2013 new_attr_value += X_DATA_LEN;
lorevee 0:1902469bdd2d 2014 data += X_DATA_LEN;
lorevee 0:1902469bdd2d 2015 memcpy(new_attr_value, data, Y_DATA_LEN);
lorevee 0:1902469bdd2d 2016 new_attr_value += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2017 data += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2018 memcpy(new_attr_value, data, Z_DATA_LEN);
lorevee 0:1902469bdd2d 2019 new_attr_value += Z_DATA_LEN;
lorevee 0:1902469bdd2d 2020 data += Z_DATA_LEN;
lorevee 0:1902469bdd2d 2021
lorevee 0:1902469bdd2d 2022 data_type_id = MAG_TYPE_ID;
lorevee 0:1902469bdd2d 2023 memcpy(new_attr_value, &data_type_id, TYPE_ID_LEN); /* MAG Type ID */
lorevee 0:1902469bdd2d 2024 new_attr_value += TYPE_ID_LEN;
lorevee 0:1902469bdd2d 2025 memcpy(new_attr_value, data, X_DATA_LEN); /* MAG value */
lorevee 0:1902469bdd2d 2026 new_attr_value += X_DATA_LEN;
lorevee 0:1902469bdd2d 2027 data += X_DATA_LEN;
lorevee 0:1902469bdd2d 2028 memcpy(new_attr_value, data, Y_DATA_LEN);
lorevee 0:1902469bdd2d 2029 new_attr_value += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2030 data += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2031 memcpy(new_attr_value, data, Z_DATA_LEN);
lorevee 0:1902469bdd2d 2032 }
lorevee 0:1902469bdd2d 2033 }
lorevee 0:1902469bdd2d 2034 break;
lorevee 0:1902469bdd2d 2035 case GYR_TYPE_ID:
lorevee 0:1902469bdd2d 2036 case MAG_TYPE_ID:
lorevee 0:1902469bdd2d 2037 case SFUSION_TYPE_ID:
lorevee 0:1902469bdd2d 2038 {
lorevee 0:1902469bdd2d 2039 memcpy(new_attr_value, data, X_DATA_LEN); /* X or Q1 value */
lorevee 0:1902469bdd2d 2040 new_attr_value += X_DATA_LEN;
lorevee 0:1902469bdd2d 2041 data += X_DATA_LEN;
lorevee 0:1902469bdd2d 2042 memcpy(new_attr_value, data, Y_DATA_LEN); /* Y or Q2 value */
lorevee 0:1902469bdd2d 2043 new_attr_value += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2044 data += Y_DATA_LEN;
lorevee 0:1902469bdd2d 2045 memcpy(new_attr_value, data, Z_DATA_LEN); /* Z or Q3 value */
lorevee 0:1902469bdd2d 2046 }
lorevee 0:1902469bdd2d 2047 break;
lorevee 0:1902469bdd2d 2048 default:
lorevee 0:1902469bdd2d 2049 break;
lorevee 0:1902469bdd2d 2050 }
lorevee 0:1902469bdd2d 2051 }
lorevee 0:1902469bdd2d 2052 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2053
lorevee 0:1902469bdd2d 2054
lorevee 0:1902469bdd2d 2055
lorevee 0:1902469bdd2d 2056 /* Method called after the reading of a characteristic */
lorevee 0:1902469bdd2d 2057 void readCharacteristicCallback(const GattReadCallbackParams *response) {
lorevee 0:1902469bdd2d 2058 //printf("\r\nreadCharacteristicCallback - status (%d)\n\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 2059
lorevee 0:1902469bdd2d 2060
lorevee 0:1902469bdd2d 2061
lorevee 0:1902469bdd2d 2062 uint16_t handle = response->connHandle;
lorevee 0:1902469bdd2d 2063 uint8_t data_length = response->len;
lorevee 0:1902469bdd2d 2064 uint8_t * attr_value = (uint8_t *)response->data;
lorevee 0:1902469bdd2d 2065
lorevee 0:1902469bdd2d 2066
lorevee 0:1902469bdd2d 2067 int32_t tmp = 0;
lorevee 0:1902469bdd2d 2068 uint8_t tmp_data[256];
lorevee 0:1902469bdd2d 2069 uint8_t index;
lorevee 0:1902469bdd2d 2070 tBDAddr devAddr;
lorevee 0:1902469bdd2d 2071 uint16_t attribute_handle; //slave
lorevee 0:1902469bdd2d 2072 uint8_t new_buffer = 0;
lorevee 0:1902469bdd2d 2073 getDeviceFromConnHandle(handle, &index, devAddr);
lorevee 0:1902469bdd2d 2074
lorevee 0:1902469bdd2d 2075
lorevee 0:1902469bdd2d 2076 /* Building the buffer in JSON format */
lorevee 0:1902469bdd2d 2077 switch (perDevs.status) {
lorevee 0:1902469bdd2d 2078
lorevee 0:1902469bdd2d 2079 case READING_ENVIRONMENTAL:
lorevee 0:1902469bdd2d 2080 {
lorevee 0:1902469bdd2d 2081 /* P in mBar, H in percentage, T2 and T1 value in Celtius degree */
lorevee 0:1902469bdd2d 2082 if ((data_length != ENV_DATA_LEN_LONG) && (data_length != ENV_DATA_LEN_SHORT)) {
lorevee 0:1902469bdd2d 2083 printf("\rENV Warning: received data length is %d (while expecting %d or %d) - status=%d\n\n", data_length, (ENV_DATA_LEN_LONG), (ENV_DATA_LEN_SHORT), perDevs.status);
lorevee 0:1902469bdd2d 2084 }
lorevee 0:1902469bdd2d 2085 else {
lorevee 0:1902469bdd2d 2086 tmp = (attr_value[5]<<24) | (attr_value[4]<<16) | (attr_value[3]<<8) | attr_value[2];
lorevee 0:1902469bdd2d 2087 sprintf((char *)wifi_data, "\"Pressure_0x%02x%02x\":%ld.%ld,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/100, tmp%100);
lorevee 0:1902469bdd2d 2088 if (data_length == ENV_DATA_LEN_LONG) {
lorevee 0:1902469bdd2d 2089 tmp = (attr_value[7]<<8) | attr_value[6];
lorevee 0:1902469bdd2d 2090 sprintf((char *)tmp_data, "\"Humidity_0x%02x%02x\":%ld.%ld,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 2091 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 2092 //Showing only one Temperature from the same peripheral node
lorevee 0:1902469bdd2d 2093 //tmp = (attr_value[9]<<8) | attr_value[8];
lorevee 0:1902469bdd2d 2094 //sprintf((char *)tmp_data, "\"Temperature2_0x%02x%02x\":%ld.%ld,", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 2095 //strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 2096 tmp = (attr_value[11]<<8) | attr_value[10];
lorevee 0:1902469bdd2d 2097 sprintf((char *)tmp_data, "\"Temperature1_0x%02x%02x\":%ld.%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 2098 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 2099 }
lorevee 0:1902469bdd2d 2100 else { /* ENV_DATA_LEN_SHORT (that is when using the Sensor Tile) */
lorevee 0:1902469bdd2d 2101 tmp = (attr_value[7]<<8) | attr_value[6];
lorevee 0:1902469bdd2d 2102 sprintf((char *)tmp_data, "\"Temperature1_0x%02x%02x\":%ld.%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp/10, tmp%10);
lorevee 0:1902469bdd2d 2103 strcat((char *)wifi_data, (char *)tmp_data);
lorevee 0:1902469bdd2d 2104 }
lorevee 0:1902469bdd2d 2105
lorevee 0:1902469bdd2d 2106
lorevee 0:1902469bdd2d 2107
lorevee 0:1902469bdd2d 2108
lorevee 0:1902469bdd2d 2109 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2110
lorevee 0:1902469bdd2d 2111 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2112 /*
lorevee 0:1902469bdd2d 2113 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2114 * Tstamp | Node ID | P Type ID | value | H Type ID | value | T Type ID | value | T Type ID | value |
lorevee 0:1902469bdd2d 2115 * 2 bytes | 2 bytes | 1 byte | 4 bytes | 1 byte | 2 bytes | 1 byte | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 2116 */
lorevee 0:1902469bdd2d 2117 Create_New_Attr_Value(attr_value, devAddr, PRESS_TYPE_ID, attr_value+TSTAMP_LEN, data_length-TSTAMP_LEN);
lorevee 0:1902469bdd2d 2118 if (data_length == ENV_DATA_LEN_LONG) {
lorevee 0:1902469bdd2d 2119 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+PRESS_DATA_LEN+(3*TYPE_ID_LEN)+HUM_DATA_LEN+(2*TEMP_DATA_LEN);
lorevee 0:1902469bdd2d 2120 }
lorevee 0:1902469bdd2d 2121 else { /* ENV_DATA_LEN_SHORT (that is when using the Sensor Tile) */
lorevee 0:1902469bdd2d 2122 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+PRESS_DATA_LEN+TYPE_ID_LEN+TEMP_DATA_LEN;
lorevee 0:1902469bdd2d 2123 }
lorevee 0:1902469bdd2d 2124
lorevee 0:1902469bdd2d 2125 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2126 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2127 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2128 }
lorevee 0:1902469bdd2d 2129
lorevee 0:1902469bdd2d 2130 new_buffer = 1;
lorevee 0:1902469bdd2d 2131 }
lorevee 0:1902469bdd2d 2132 }
lorevee 0:1902469bdd2d 2133 break;
lorevee 0:1902469bdd2d 2134
lorevee 0:1902469bdd2d 2135
lorevee 0:1902469bdd2d 2136
lorevee 0:1902469bdd2d 2137 case READING_LED:
lorevee 0:1902469bdd2d 2138 {
lorevee 0:1902469bdd2d 2139 /* the status (0=OFF, 1=ON) */
lorevee 0:1902469bdd2d 2140 if (data_length != TSTAMP_LEN+LED_DATA_LEN) {
lorevee 0:1902469bdd2d 2141 printf("\rLED Warning: received data length is %d (while expecting %d) - status=%d\n\n", data_length, (TSTAMP_LEN+LED_DATA_LEN), perDevs.status);
lorevee 0:1902469bdd2d 2142 }
lorevee 0:1902469bdd2d 2143 else {
lorevee 0:1902469bdd2d 2144 tmp = attr_value[2];
lorevee 0:1902469bdd2d 2145 sprintf((char *)wifi_data, "\"LED_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2146
lorevee 0:1902469bdd2d 2147
lorevee 0:1902469bdd2d 2148 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2149 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2150 /*
lorevee 0:1902469bdd2d 2151 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2152 * Timestamp | Node ID | LED Type ID | value |
lorevee 0:1902469bdd2d 2153 * 2 bytes | 2 bytes | 1 byte | 1 byte |
lorevee 0:1902469bdd2d 2154 */
lorevee 0:1902469bdd2d 2155 Create_New_Attr_Value(attr_value, devAddr, LED_TYPE_ID, attr_value+TSTAMP_LEN, LED_DATA_LEN);
lorevee 0:1902469bdd2d 2156
lorevee 0:1902469bdd2d 2157 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+LED_DATA_LEN;
lorevee 0:1902469bdd2d 2158 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2159 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2160 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2161 }
lorevee 0:1902469bdd2d 2162 new_buffer = 1;
lorevee 0:1902469bdd2d 2163 }
lorevee 0:1902469bdd2d 2164 }
lorevee 0:1902469bdd2d 2165 break;
lorevee 0:1902469bdd2d 2166
lorevee 0:1902469bdd2d 2167
lorevee 0:1902469bdd2d 2168
lorevee 0:1902469bdd2d 2169 case READING_MIC:
lorevee 0:1902469bdd2d 2170 {
lorevee 0:1902469bdd2d 2171 tmp = 0; /* fake value used to just notify the mic presence */
lorevee 0:1902469bdd2d 2172 sprintf((char *)wifi_data, "\"Mic1_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2173
lorevee 0:1902469bdd2d 2174 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2175 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2176 uint8_t val = tmp;
lorevee 0:1902469bdd2d 2177 /*
lorevee 0:1902469bdd2d 2178 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2179 * Timestamp | Node ID | MIC Type ID | value |
lorevee 0:1902469bdd2d 2180 * 2 bytes | 2 bytes | 1 byte | 1 byte |
lorevee 0:1902469bdd2d 2181 */
lorevee 0:1902469bdd2d 2182 // STORE_LE_16(star_attr_value, (HAL_GetTick()>>3)); /* Timestamp */
lorevee 0:1902469bdd2d 2183 Create_New_Attr_Value(attr_value, devAddr, MICLEVEL_TYPE_ID, &val, MIC_DATA_LEN);
lorevee 0:1902469bdd2d 2184
lorevee 0:1902469bdd2d 2185 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+MIC_DATA_LEN;
lorevee 0:1902469bdd2d 2186 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2187 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2188 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2189 }
lorevee 0:1902469bdd2d 2190 new_buffer = 1;
lorevee 0:1902469bdd2d 2191 }
lorevee 0:1902469bdd2d 2192 break;
lorevee 0:1902469bdd2d 2193
lorevee 0:1902469bdd2d 2194
lorevee 0:1902469bdd2d 2195
lorevee 0:1902469bdd2d 2196 case READING_LUX:
lorevee 0:1902469bdd2d 2197 {
lorevee 0:1902469bdd2d 2198 /* Lux value */
lorevee 0:1902469bdd2d 2199 if (data_length != TSTAMP_LEN+LUX_DATA_LEN) {
lorevee 0:1902469bdd2d 2200 printf("\rLUX Warning: received data length is %d (while expecting %d) - status=%d\n\n", data_length, (TSTAMP_LEN+LUX_DATA_LEN), perDevs.status);
lorevee 0:1902469bdd2d 2201 }
lorevee 0:1902469bdd2d 2202 else {
lorevee 0:1902469bdd2d 2203 tmp = (attr_value[3]<<8) | attr_value[2];
lorevee 0:1902469bdd2d 2204 sprintf((char *)wifi_data, "\"LUX_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2205
lorevee 0:1902469bdd2d 2206 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2207 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2208 /*
lorevee 0:1902469bdd2d 2209 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2210 * Timestamp | Node ID | LUX Type ID | value |
lorevee 0:1902469bdd2d 2211 * 2 bytes | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 2212 */
lorevee 0:1902469bdd2d 2213 Create_New_Attr_Value(attr_value, devAddr, LUX_TYPE_ID, attr_value+TSTAMP_LEN, LUX_DATA_LEN);
lorevee 0:1902469bdd2d 2214
lorevee 0:1902469bdd2d 2215 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+LUX_DATA_LEN;
lorevee 0:1902469bdd2d 2216 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2217 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2218 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2219 }
lorevee 0:1902469bdd2d 2220 new_buffer = 1;
lorevee 0:1902469bdd2d 2221 }
lorevee 0:1902469bdd2d 2222 }
lorevee 0:1902469bdd2d 2223 break;
lorevee 0:1902469bdd2d 2224
lorevee 0:1902469bdd2d 2225
lorevee 0:1902469bdd2d 2226
lorevee 0:1902469bdd2d 2227 case READING_PRX:
lorevee 0:1902469bdd2d 2228 {
lorevee 0:1902469bdd2d 2229 /* the distance value in mm */
lorevee 0:1902469bdd2d 2230 tmp = 0; /* fake value used to just notify the prx presence */
lorevee 0:1902469bdd2d 2231 sprintf((char *)wifi_data, "\"PRX_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2232
lorevee 0:1902469bdd2d 2233 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2234 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2235 uint8_t val[PRX_DATA_LEN];
lorevee 0:1902469bdd2d 2236 memcpy((void *)val, (void *)tmp, sizeof(val));
lorevee 0:1902469bdd2d 2237 /*
lorevee 0:1902469bdd2d 2238 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2239 * Timestamp | Node ID | Proximity Type ID | value |
lorevee 0:1902469bdd2d 2240 * 2 bytes | 2 bytes | 1 byte | 2 bytes |
lorevee 0:1902469bdd2d 2241 */
lorevee 0:1902469bdd2d 2242 Create_New_Attr_Value(attr_value, devAddr, PRX_TYPE_ID, val, PRX_DATA_LEN);
lorevee 0:1902469bdd2d 2243
lorevee 0:1902469bdd2d 2244 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+PRX_DATA_LEN;
lorevee 0:1902469bdd2d 2245 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2246 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2247 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2248 }
lorevee 0:1902469bdd2d 2249 new_buffer = 1;
lorevee 0:1902469bdd2d 2250 }
lorevee 0:1902469bdd2d 2251 break;
lorevee 0:1902469bdd2d 2252
lorevee 0:1902469bdd2d 2253
lorevee 0:1902469bdd2d 2254
lorevee 0:1902469bdd2d 2255 case READING_DISCONNECTION:
lorevee 0:1902469bdd2d 2256 {
lorevee 0:1902469bdd2d 2257 /* Device disconnected */
lorevee 0:1902469bdd2d 2258 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2259 /*
lorevee 0:1902469bdd2d 2260 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2261 * Timestamp | Node ID | Status Type ID |
lorevee 0:1902469bdd2d 2262 * 2 bytes | 2 bytes | 1 byte |
lorevee 0:1902469bdd2d 2263 */
lorevee 0:1902469bdd2d 2264 Create_New_Attr_Value(attr_value, devAddr, STATUS_TYPE_ID, NULL, STATUS_DATA_LEN);
lorevee 0:1902469bdd2d 2265
lorevee 0:1902469bdd2d 2266 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+STATUS_DATA_LEN;
lorevee 0:1902469bdd2d 2267 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2268 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2269 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2270
lorevee 0:1902469bdd2d 2271 new_buffer = 1;
lorevee 0:1902469bdd2d 2272 }
lorevee 0:1902469bdd2d 2273 break;
lorevee 0:1902469bdd2d 2274
lorevee 0:1902469bdd2d 2275
lorevee 0:1902469bdd2d 2276
lorevee 0:1902469bdd2d 2277 case READING_AGM:
lorevee 0:1902469bdd2d 2278 {
lorevee 0:1902469bdd2d 2279 /* the acceleration value in mg */
lorevee 0:1902469bdd2d 2280 tmp = 0; /* fake value used to just notify the agm presence */
lorevee 0:1902469bdd2d 2281 sprintf((char *)wifi_data, "\"AGM_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2282
lorevee 0:1902469bdd2d 2283 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2284 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2285 uint8_t val[MEMS_DATA_LEN];
lorevee 0:1902469bdd2d 2286 memcpy((void *)val, (void *)tmp, sizeof(val));
lorevee 0:1902469bdd2d 2287 /*
lorevee 0:1902469bdd2d 2288 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2289 * Timestamp | Node ID | ACC Type ID | value | GYR Type ID | value | MAG Type ID | value |
lorevee 0:1902469bdd2d 2290 * 2 bytes | 2 bytes | 1 byte | 6 bytes | 1 byte | 6 bytes | 1 byte | 6 bytes |
lorevee 0:1902469bdd2d 2291 */
lorevee 0:1902469bdd2d 2292 Create_New_Attr_Value(attr_value, devAddr, ACC_TYPE_ID, val, MEMS_DATA_LEN);
lorevee 0:1902469bdd2d 2293
lorevee 0:1902469bdd2d 2294 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+ACC_DATA_LEN+(2*TYPE_ID_LEN)+GYR_DATA_LEN+MAG_DATA_LEN;
lorevee 0:1902469bdd2d 2295 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2296 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2297 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2298 }
lorevee 0:1902469bdd2d 2299 new_buffer = 1;
lorevee 0:1902469bdd2d 2300 }
lorevee 0:1902469bdd2d 2301 break;
lorevee 0:1902469bdd2d 2302
lorevee 0:1902469bdd2d 2303
lorevee 0:1902469bdd2d 2304
lorevee 0:1902469bdd2d 2305 case READING_SFUSION:
lorevee 0:1902469bdd2d 2306 {
lorevee 0:1902469bdd2d 2307 /* the mems sensor fusion value */
lorevee 0:1902469bdd2d 2308 tmp = 0; /* fake value used to just notify the sensor fusion presence */
lorevee 0:1902469bdd2d 2309 sprintf((char *)wifi_data, "\"SFUSION_0x%02x%02x\":%ld", devAddr[NODE_ID_B2], devAddr[NODE_ID_B1], tmp);
lorevee 0:1902469bdd2d 2310
lorevee 0:1902469bdd2d 2311 attribute_handle = slaveDev.star_data_char_handle;
lorevee 0:1902469bdd2d 2312 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2313 uint8_t val[3];
lorevee 0:1902469bdd2d 2314 memcpy((void *)val, (void *)tmp, sizeof(val));
lorevee 0:1902469bdd2d 2315 /*
lorevee 0:1902469bdd2d 2316 * Modify the attribute value according to the following format:
lorevee 0:1902469bdd2d 2317 * Timestamp | Node ID | SFUSION Type ID | value |
lorevee 0:1902469bdd2d 2318 * 2 bytes | 2 bytes | 1 byte | 6 bytes |
lorevee 0:1902469bdd2d 2319 */
lorevee 0:1902469bdd2d 2320 Create_New_Attr_Value(attr_value, devAddr, SFUSION_TYPE_ID, val, SFUSION_DATA_LEN);
lorevee 0:1902469bdd2d 2321
lorevee 0:1902469bdd2d 2322 slaveDev.notification_data.data_length = ATTR_HEAD_LEN+SFUSION_DATA_LEN;
lorevee 0:1902469bdd2d 2323 slaveDev.notification_data.attribute_value = star_attr_value;
lorevee 0:1902469bdd2d 2324 memcpy(slaveDev.notification_data.devAddr, devAddr, 6);
lorevee 0:1902469bdd2d 2325 slaveDev.notification_data.attribute_handle = attribute_handle;
lorevee 0:1902469bdd2d 2326 }
lorevee 0:1902469bdd2d 2327 new_buffer = 1;
lorevee 0:1902469bdd2d 2328 }
lorevee 0:1902469bdd2d 2329 break;
lorevee 0:1902469bdd2d 2330
lorevee 0:1902469bdd2d 2331
lorevee 0:1902469bdd2d 2332
lorevee 0:1902469bdd2d 2333 default:
lorevee 0:1902469bdd2d 2334 break;
lorevee 0:1902469bdd2d 2335
lorevee 0:1902469bdd2d 2336 }
lorevee 0:1902469bdd2d 2337
lorevee 0:1902469bdd2d 2338
lorevee 0:1902469bdd2d 2339
lorevee 0:1902469bdd2d 2340 if (new_buffer == 1){
lorevee 0:1902469bdd2d 2341 strcat((char *)wifi_data, "\n");
lorevee 0:1902469bdd2d 2342 printf("\r\n%s", (char *)wifi_data); /* print locally the buffer in JSON format */
lorevee 0:1902469bdd2d 2343
lorevee 0:1902469bdd2d 2344 data = wifi_data;
lorevee 0:1902469bdd2d 2345 new_data = 1;
lorevee 0:1902469bdd2d 2346 }
lorevee 0:1902469bdd2d 2347
lorevee 0:1902469bdd2d 2348
lorevee 0:1902469bdd2d 2349 if (notificationPending == 1){
lorevee 0:1902469bdd2d 2350 readCompleted = 1;
lorevee 0:1902469bdd2d 2351 Change_Notification_Status(notifyP->att_data, notifyP->attr_value, notifyP->conn_handle, notifyP->i, notifyP->feature_mask, notifyP->frequency);
lorevee 1:110b5e896bc9 2352 }else {
lorevee 1:110b5e896bc9 2353 readCompleted = 1;
lorevee 1:110b5e896bc9 2354 setNewStatus();
lorevee 0:1902469bdd2d 2355 }
lorevee 0:1902469bdd2d 2356 }
lorevee 0:1902469bdd2d 2357 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2358
lorevee 0:1902469bdd2d 2359
lorevee 0:1902469bdd2d 2360
lorevee 0:1902469bdd2d 2361 /* This function retrieves the peripheral device index and address
lorevee 0:1902469bdd2d 2362 * from the connection handle */
lorevee 0:1902469bdd2d 2363 void getDeviceFromConnHandle(uint16_t handle, uint8_t *index, tBDAddr devAddr){
lorevee 0:1902469bdd2d 2364
lorevee 0:1902469bdd2d 2365 //printf("\r\ngetDeviceFromConnHandle\n\n");//DEBUG
lorevee 0:1902469bdd2d 2366
lorevee 0:1902469bdd2d 2367 uint8_t i;
lorevee 0:1902469bdd2d 2368
lorevee 0:1902469bdd2d 2369 for (i=0; i<MAX_NUM_OF_NODES; i++){
lorevee 0:1902469bdd2d 2370 if (perDevs.connection_handle[i] == handle){
lorevee 0:1902469bdd2d 2371 memcpy(devAddr, perDevs.devInfo[i].bdaddr, 6);
lorevee 0:1902469bdd2d 2372 *index = i;
lorevee 0:1902469bdd2d 2373 break;
lorevee 0:1902469bdd2d 2374 }
lorevee 0:1902469bdd2d 2375 }
lorevee 0:1902469bdd2d 2376 }
lorevee 0:1902469bdd2d 2377 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2378
lorevee 0:1902469bdd2d 2379
lorevee 0:1902469bdd2d 2380 /* Create a null gatt read pointer */
lorevee 0:1902469bdd2d 2381 GattReadCallbackParams * nullGattReadCallbackP(uint16_t connection_handle){
lorevee 0:1902469bdd2d 2382 GattReadCallbackParams gattReadCallbackParamsStruct, *pointer;
lorevee 0:1902469bdd2d 2383 pointer = &gattReadCallbackParamsStruct;
lorevee 0:1902469bdd2d 2384
lorevee 0:1902469bdd2d 2385 pointer->connHandle = connection_handle;
lorevee 0:1902469bdd2d 2386 pointer->len = 0;
lorevee 0:1902469bdd2d 2387 pointer->data = NULL;
lorevee 0:1902469bdd2d 2388
lorevee 0:1902469bdd2d 2389 return pointer;
lorevee 0:1902469bdd2d 2390
lorevee 0:1902469bdd2d 2391 }
lorevee 0:1902469bdd2d 2392 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2393
lorevee 0:1902469bdd2d 2394
lorevee 0:1902469bdd2d 2395
lorevee 0:1902469bdd2d 2396 void readingProcess(void) {
lorevee 0:1902469bdd2d 2397 //printf("\r\nreadingProcess - status: %d - connDevices: %d\n", perDevs.status, perDevs.connDevices);//DEBUG
lorevee 0:1902469bdd2d 2398
lorevee 0:1902469bdd2d 2399
lorevee 0:1902469bdd2d 2400 /* This index defines which peripheral is going to be read */
lorevee 0:1902469bdd2d 2401 uint8_t i = perDevs.readDeviceIdx;
lorevee 0:1902469bdd2d 2402 //fetch the current connection handle
lorevee 0:1902469bdd2d 2403 uint16_t connHandle = perDevs.connection_handle[i];
lorevee 0:1902469bdd2d 2404
lorevee 0:1902469bdd2d 2405
lorevee 0:1902469bdd2d 2406
lorevee 0:1902469bdd2d 2407
lorevee 0:1902469bdd2d 2408 if ((perDevs.status == NOTIFICATIONS_DATA_READ) && (perDevs.sfusion_event_enabled) && (!perDevs.sfusion_char_read[i])){
lorevee 0:1902469bdd2d 2409 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2410 }
lorevee 0:1902469bdd2d 2411
lorevee 0:1902469bdd2d 2412
lorevee 0:1902469bdd2d 2413
lorevee 0:1902469bdd2d 2414 //READ_INIT
lorevee 0:1902469bdd2d 2415 if ((perDevs.status == READ_INIT)) {
lorevee 0:1902469bdd2d 2416 if (perDevs.connDevices > 0) {
lorevee 0:1902469bdd2d 2417 slaveDev.is_discoverable = true;
lorevee 0:1902469bdd2d 2418 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2419 if (!perDevs.is_disconnected[i]) {
lorevee 0:1902469bdd2d 2420 switch (perDevs.devInfo[i].dev_v) {
lorevee 0:1902469bdd2d 2421 case NODE_ME1:
lorevee 0:1902469bdd2d 2422 case NODE_AM1:
lorevee 0:1902469bdd2d 2423 case NODE_FL1:
lorevee 0:1902469bdd2d 2424 /* start to read sensors data from environmental */
lorevee 0:1902469bdd2d 2425
lorevee 0:1902469bdd2d 2426 if ((perDevs.mic_event_enabled) || (perDevs.prx_event_enabled) || (perDevs.agm_event_enabled)
lorevee 0:1902469bdd2d 2427 || (perDevs.sfusion_event_enabled)){
lorevee 0:1902469bdd2d 2428 //printf("\r\nNotification event enabled, skip reading\n");//DEBUG
lorevee 1:110b5e896bc9 2429
lorevee 1:110b5e896bc9 2430 if (stackBusy == 1){
lorevee 1:110b5e896bc9 2431 uint8_t j;
lorevee 1:110b5e896bc9 2432 uint16_t attr_handle;
lorevee 1:110b5e896bc9 2433 uint8_t value_len;
lorevee 1:110b5e896bc9 2434 uint8_t attr_value[2];
lorevee 1:110b5e896bc9 2435 char* feat = NULL;
lorevee 1:110b5e896bc9 2436
lorevee 1:110b5e896bc9 2437 for (j=0; j<(perDevs.connDevices+perDevs.discDevices); j++) {
lorevee 1:110b5e896bc9 2438
lorevee 1:110b5e896bc9 2439 if ((perDevs.prx_event[j]) && (perDevs.prx_event_enabled)) {
lorevee 1:110b5e896bc9 2440 feat = "PRX";
lorevee 1:110b5e896bc9 2441 perDevs.prx_event_enabled = 0;
lorevee 1:110b5e896bc9 2442 perDevs.prx_on[j] = 0;
lorevee 1:110b5e896bc9 2443 attr_handle = perDevs.prx_char_handle[j] + 2;
lorevee 1:110b5e896bc9 2444
lorevee 1:110b5e896bc9 2445 } else {
lorevee 1:110b5e896bc9 2446 continue;
lorevee 1:110b5e896bc9 2447 }
lorevee 1:110b5e896bc9 2448
lorevee 1:110b5e896bc9 2449 value_len = 2;
lorevee 1:110b5e896bc9 2450 attr_value[0] = DISABLE;
lorevee 2:1525f4848cf2 2451
lorevee 2:1525f4848cf2 2452 writeDescriptorCompleted=0;
lorevee 2:1525f4848cf2 2453 ble_error_t disableErr = writeCharacDescriptorWithError(perDevs.connection_handle[j], attr_handle, value_len, attr_value);
lorevee 2:1525f4848cf2 2454 printf("\r\nSet OFF the %s notifications on node %d\n", feat, j);
lorevee 2:1525f4848cf2 2455
lorevee 2:1525f4848cf2 2456 if (disableErr != BLE_ERROR_NONE){
lorevee 2:1525f4848cf2 2457 printf("\r\n(readingProcess) Write charac descriptor failed (err: %d, stat: %d)\n", disableErr, perDevs.status);
lorevee 2:1525f4848cf2 2458 writeDescriptorCompleted=1;
lorevee 2:1525f4848cf2 2459
lorevee 2:1525f4848cf2 2460 }//if-error
lorevee 1:110b5e896bc9 2461 }//for
lorevee 1:110b5e896bc9 2462 }//if-stackBusy
lorevee 1:110b5e896bc9 2463
lorevee 0:1902469bdd2d 2464 } else {
lorevee 0:1902469bdd2d 2465 perDevs.status = READING_ENVIRONMENTAL;
lorevee 0:1902469bdd2d 2466 }
lorevee 0:1902469bdd2d 2467 break;
lorevee 0:1902469bdd2d 2468 default:
lorevee 0:1902469bdd2d 2469 break;
lorevee 0:1902469bdd2d 2470 }
lorevee 0:1902469bdd2d 2471 }
lorevee 0:1902469bdd2d 2472 } else {
lorevee 0:1902469bdd2d 2473 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 2474 }
lorevee 0:1902469bdd2d 2475 }//if-READ_INIT
lorevee 0:1902469bdd2d 2476
lorevee 0:1902469bdd2d 2477
lorevee 0:1902469bdd2d 2478
lorevee 0:1902469bdd2d 2479
lorevee 0:1902469bdd2d 2480
lorevee 0:1902469bdd2d 2481
lorevee 0:1902469bdd2d 2482 //ENVIRONMENTAL
lorevee 1:110b5e896bc9 2483 if ((perDevs.status == READING_ENVIRONMENTAL) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2484 //reading is starting
lorevee 0:1902469bdd2d 2485 readCompleted = 0;
lorevee 0:1902469bdd2d 2486 //fetch the characteristic declHandle
lorevee 0:1902469bdd2d 2487 uint16_t declHandle = perDevs.environmental_char_handle[i];
lorevee 0:1902469bdd2d 2488 //current data pointer
lorevee 0:1902469bdd2d 2489 DiscoveredCharacteristic c = searchDCNode(headCharacteristic[i], declHandle)->data;
lorevee 0:1902469bdd2d 2490 //pass characteristic and connection handle
lorevee 0:1902469bdd2d 2491 readSensorData(c, connHandle, i);
lorevee 0:1902469bdd2d 2492
lorevee 0:1902469bdd2d 2493
lorevee 0:1902469bdd2d 2494 }//if-ENVIRONMENTAL
lorevee 0:1902469bdd2d 2495
lorevee 0:1902469bdd2d 2496
lorevee 0:1902469bdd2d 2497
lorevee 0:1902469bdd2d 2498
lorevee 0:1902469bdd2d 2499
lorevee 0:1902469bdd2d 2500
lorevee 0:1902469bdd2d 2501
lorevee 0:1902469bdd2d 2502 //NOTIFY_ENV_TO_CLIENT
lorevee 1:110b5e896bc9 2503 if ((perDevs.status == NOTIFY_ENV_TO_CLIENT) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2504 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2505 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2506 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2507 }//if-NOTIFY_ENV_TO_CLIENT
lorevee 0:1902469bdd2d 2508
lorevee 0:1902469bdd2d 2509
lorevee 0:1902469bdd2d 2510
lorevee 0:1902469bdd2d 2511
lorevee 0:1902469bdd2d 2512
lorevee 0:1902469bdd2d 2513
lorevee 0:1902469bdd2d 2514
lorevee 0:1902469bdd2d 2515 //READING_LED
lorevee 1:110b5e896bc9 2516 if ((perDevs.status == READING_LED) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2517 //reading is starting
lorevee 0:1902469bdd2d 2518 readCompleted = 0;
lorevee 0:1902469bdd2d 2519 //fetch the characteristic declHandle
lorevee 0:1902469bdd2d 2520 uint16_t declHandle = perDevs.led_char_handle[i];
lorevee 0:1902469bdd2d 2521 //current data pointer
lorevee 0:1902469bdd2d 2522 DiscoveredCharacteristic c = searchDCNode(headCharacteristic[i], declHandle)->data;
lorevee 0:1902469bdd2d 2523 //pass characteristic and connection handle
lorevee 0:1902469bdd2d 2524 readSensorData(c, connHandle, i);
lorevee 0:1902469bdd2d 2525 }
lorevee 0:1902469bdd2d 2526
lorevee 0:1902469bdd2d 2527
lorevee 0:1902469bdd2d 2528
lorevee 0:1902469bdd2d 2529
lorevee 0:1902469bdd2d 2530
lorevee 0:1902469bdd2d 2531
lorevee 0:1902469bdd2d 2532 //NOTIFY_LED_TO_CLIENT
lorevee 1:110b5e896bc9 2533 if ((perDevs.status == NOTIFY_LED_TO_CLIENT) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2534 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2535 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2536 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2537 }//if-NOTIFY_LED_TO_CLIENT
lorevee 0:1902469bdd2d 2538
lorevee 0:1902469bdd2d 2539
lorevee 0:1902469bdd2d 2540
lorevee 0:1902469bdd2d 2541
lorevee 0:1902469bdd2d 2542
lorevee 0:1902469bdd2d 2543
lorevee 0:1902469bdd2d 2544 //READING_LUX
lorevee 1:110b5e896bc9 2545 if ((perDevs.status == READING_LUX) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2546 //reading is starting
lorevee 0:1902469bdd2d 2547 readCompleted = 0;
lorevee 0:1902469bdd2d 2548 //fetch the characteristic declHandle
lorevee 0:1902469bdd2d 2549 uint16_t declHandle = perDevs.lux_char_handle[i];
lorevee 0:1902469bdd2d 2550 //current data pointer
lorevee 0:1902469bdd2d 2551 DiscoveredCharacteristic c = searchDCNode(headCharacteristic[i], declHandle)->data;
lorevee 0:1902469bdd2d 2552 //pass characteristic and connection handle
lorevee 0:1902469bdd2d 2553 readSensorData(c, connHandle, i);
lorevee 0:1902469bdd2d 2554 }//if-READING_LUX
lorevee 0:1902469bdd2d 2555
lorevee 0:1902469bdd2d 2556
lorevee 0:1902469bdd2d 2557
lorevee 0:1902469bdd2d 2558
lorevee 0:1902469bdd2d 2559
lorevee 0:1902469bdd2d 2560
lorevee 0:1902469bdd2d 2561 //NOTIFY_LUX_TO_CLIENT
lorevee 1:110b5e896bc9 2562 if ((perDevs.status == NOTIFY_LUX_TO_CLIENT) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2563 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2564 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2565 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2566 }//if-NOTIFY_LUX_TO_CLIENT
lorevee 0:1902469bdd2d 2567
lorevee 0:1902469bdd2d 2568
lorevee 0:1902469bdd2d 2569
lorevee 0:1902469bdd2d 2570
lorevee 0:1902469bdd2d 2571
lorevee 0:1902469bdd2d 2572
lorevee 0:1902469bdd2d 2573
lorevee 0:1902469bdd2d 2574 //READING_MIC
lorevee 1:110b5e896bc9 2575 if ((perDevs.status == READING_MIC) && (readCompleted == 1) && (writeDescriptorCompleted ==1)){
lorevee 0:1902469bdd2d 2576 //reading is starting
lorevee 0:1902469bdd2d 2577 readCompleted = 0;
lorevee 0:1902469bdd2d 2578 HAL_Delay(300);
lorevee 0:1902469bdd2d 2579 /* Sending a 0 value to master just to notify the MIC sensor presence */
lorevee 0:1902469bdd2d 2580 readCharacteristicCallback(nullGattReadCallbackP(connHandle));
lorevee 0:1902469bdd2d 2581
lorevee 0:1902469bdd2d 2582 perDevs.status = NOTIFY_MIC_TO_CLIENT;
lorevee 0:1902469bdd2d 2583 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2584 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2585 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2586 }//if-READING_MIC
lorevee 0:1902469bdd2d 2587
lorevee 0:1902469bdd2d 2588
lorevee 0:1902469bdd2d 2589
lorevee 0:1902469bdd2d 2590
lorevee 0:1902469bdd2d 2591
lorevee 0:1902469bdd2d 2592
lorevee 0:1902469bdd2d 2593 //READING_PRX
lorevee 0:1902469bdd2d 2594 if ((perDevs.status == READING_PRX) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2595 //reading is starting
lorevee 0:1902469bdd2d 2596 readCompleted = 0;
lorevee 0:1902469bdd2d 2597 HAL_Delay(300);
lorevee 0:1902469bdd2d 2598 /* Sending a 0 value to master just to notify the PRX sensor presence */
lorevee 0:1902469bdd2d 2599 readCharacteristicCallback(nullGattReadCallbackP(connHandle));
lorevee 0:1902469bdd2d 2600
lorevee 0:1902469bdd2d 2601 perDevs.status = NOTIFY_PRX_TO_CLIENT;
lorevee 0:1902469bdd2d 2602 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2603 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2604 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2605 }//if-READING_PRX
lorevee 0:1902469bdd2d 2606
lorevee 0:1902469bdd2d 2607
lorevee 0:1902469bdd2d 2608
lorevee 0:1902469bdd2d 2609
lorevee 0:1902469bdd2d 2610
lorevee 0:1902469bdd2d 2611
lorevee 0:1902469bdd2d 2612
lorevee 0:1902469bdd2d 2613 //READING_AGM
lorevee 0:1902469bdd2d 2614 if ((perDevs.status == READING_AGM) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2615 //reading is starting
lorevee 0:1902469bdd2d 2616 readCompleted = 0;
lorevee 0:1902469bdd2d 2617 HAL_Delay(300);
lorevee 0:1902469bdd2d 2618 /* Sending a 0 value to master just to notify the AGM sensors presence */
lorevee 0:1902469bdd2d 2619 readCharacteristicCallback(nullGattReadCallbackP(connHandle));
lorevee 0:1902469bdd2d 2620
lorevee 0:1902469bdd2d 2621 perDevs.status = NOTIFY_AGM_TO_CLIENT;
lorevee 0:1902469bdd2d 2622 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2623 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2624 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2625 }//if-READING_AGM
lorevee 0:1902469bdd2d 2626
lorevee 0:1902469bdd2d 2627
lorevee 0:1902469bdd2d 2628
lorevee 0:1902469bdd2d 2629
lorevee 0:1902469bdd2d 2630
lorevee 0:1902469bdd2d 2631
lorevee 0:1902469bdd2d 2632 //READING_SFUSION
lorevee 0:1902469bdd2d 2633 if ((perDevs.status == READING_SFUSION) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2634 //reading is starting
lorevee 0:1902469bdd2d 2635 readCompleted = 0;
lorevee 0:1902469bdd2d 2636 HAL_Delay(300);
lorevee 0:1902469bdd2d 2637 /* Sending a 0 value to master just to notify the SFusion feature presence */
lorevee 0:1902469bdd2d 2638 readCharacteristicCallback(nullGattReadCallbackP(connHandle));
lorevee 0:1902469bdd2d 2639
lorevee 0:1902469bdd2d 2640 perDevs.status = NOTIFY_SFUSION_TO_CLIENT;
lorevee 0:1902469bdd2d 2641 notifyMaster(slaveDev.notification_data.data_length, slaveDev.notification_data.attribute_value,
lorevee 0:1902469bdd2d 2642 slaveDev.notification_data.attribute_handle);
lorevee 0:1902469bdd2d 2643 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2644 }//if-READING_SFUSION
lorevee 0:1902469bdd2d 2645
lorevee 0:1902469bdd2d 2646
lorevee 0:1902469bdd2d 2647
lorevee 0:1902469bdd2d 2648
lorevee 0:1902469bdd2d 2649
lorevee 0:1902469bdd2d 2650
lorevee 0:1902469bdd2d 2651
lorevee 0:1902469bdd2d 2652
lorevee 0:1902469bdd2d 2653
lorevee 0:1902469bdd2d 2654 //ALL_DATA_READ
lorevee 0:1902469bdd2d 2655 if ((perDevs.status == ALL_DATA_READ) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2656 if (i>0) {
lorevee 0:1902469bdd2d 2657 perDevs.readDeviceIdx--;
lorevee 0:1902469bdd2d 2658 }
lorevee 0:1902469bdd2d 2659 perDevs.status = READ_INIT;
lorevee 2:1525f4848cf2 2660
lorevee 0:1902469bdd2d 2661 // All peripherals are read!
lorevee 0:1902469bdd2d 2662 if (i==0) {
lorevee 0:1902469bdd2d 2663
lorevee 0:1902469bdd2d 2664 if ((slaveDev.is_connected == false) && (slaveDev.is_discoverable == true)) {
lorevee 0:1902469bdd2d 2665 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2666 disableAllNotifications(); /* Called here to disable the SFUSION notifications */
lorevee 0:1902469bdd2d 2667 #endif
lorevee 0:1902469bdd2d 2668 setSlaveDiscoverable();
lorevee 0:1902469bdd2d 2669
lorevee 0:1902469bdd2d 2670 } else {
lorevee 0:1902469bdd2d 2671 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 2672 }//if-else-adv
lorevee 0:1902469bdd2d 2673
lorevee 0:1902469bdd2d 2674 }//if-i=0
lorevee 0:1902469bdd2d 2675 }//if-ALL_DATA_READ
lorevee 0:1902469bdd2d 2676
lorevee 0:1902469bdd2d 2677
lorevee 0:1902469bdd2d 2678
lorevee 0:1902469bdd2d 2679
lorevee 0:1902469bdd2d 2680
lorevee 0:1902469bdd2d 2681
lorevee 0:1902469bdd2d 2682
lorevee 0:1902469bdd2d 2683 //DISABLE_NOTIFICATIONS
lorevee 0:1902469bdd2d 2684 if ((perDevs.status == DISABLE_NOTIFICATIONS) && (readCompleted == 1) && (writeDescriptorCompleted ==1)) {
lorevee 0:1902469bdd2d 2685 //printf("\r\nperDevs.status == DISABLE_NOTIFICATIONS\n");//DEBUG
lorevee 0:1902469bdd2d 2686 disableAllNotifications();
lorevee 0:1902469bdd2d 2687 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2688 perDevs.readDeviceIdx = i;
lorevee 0:1902469bdd2d 2689
lorevee 0:1902469bdd2d 2690 }//if-DISABLE_NOTIFICATIONS
lorevee 0:1902469bdd2d 2691
lorevee 0:1902469bdd2d 2692
lorevee 0:1902469bdd2d 2693
lorevee 0:1902469bdd2d 2694
lorevee 0:1902469bdd2d 2695
lorevee 0:1902469bdd2d 2696 /* Start connection process */
lorevee 0:1902469bdd2d 2697 eventQ.call(connectionProcess);
lorevee 0:1902469bdd2d 2698
lorevee 0:1902469bdd2d 2699 }
lorevee 0:1902469bdd2d 2700 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2701
lorevee 0:1902469bdd2d 2702
lorevee 0:1902469bdd2d 2703
lorevee 0:1902469bdd2d 2704 /* This method reads the characteristic in input */
lorevee 0:1902469bdd2d 2705 void readSensorData(const DiscoveredCharacteristic &characteristic, uint16_t connection_handle, uint8_t index){
lorevee 0:1902469bdd2d 2706 //printf("\r\nreadSensorData\n");//DEBUG
lorevee 0:1902469bdd2d 2707
lorevee 0:1902469bdd2d 2708 ble_error_t error;
lorevee 0:1902469bdd2d 2709
lorevee 0:1902469bdd2d 2710
lorevee 0:1902469bdd2d 2711
lorevee 0:1902469bdd2d 2712
lorevee 0:1902469bdd2d 2713 if (!perDevs.is_disconnected[index] && characteristic.getDeclHandle()){
lorevee 0:1902469bdd2d 2714 // printf("\r\n\nReading sensor data from periph %d (0x%04x - 0x%04x) - status=%d\n", index+1,
lorevee 0:1902469bdd2d 2715 // connection_handle, characteristic.getDeclHandle(), perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 2716
lorevee 0:1902469bdd2d 2717 error = characteristic.read();
lorevee 0:1902469bdd2d 2718
lorevee 0:1902469bdd2d 2719 if (error != BLE_ERROR_NONE){
lorevee 1:110b5e896bc9 2720 printf("\r\nUnable to read data from periph %d (err %d, cHndl 0x%04x - dHdl 0x%04x)\n", index+1,
lorevee 0:1902469bdd2d 2721 error, connection_handle, characteristic.getDeclHandle());
lorevee 0:1902469bdd2d 2722
lorevee 0:1902469bdd2d 2723 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2724 readCompleted = 1;
lorevee 0:1902469bdd2d 2725 }//if-failed
lorevee 0:1902469bdd2d 2726
lorevee 0:1902469bdd2d 2727
lorevee 0:1902469bdd2d 2728 } else {
lorevee 0:1902469bdd2d 2729 eventQ.call(setNewStatus);
lorevee 0:1902469bdd2d 2730
lorevee 0:1902469bdd2d 2731 }//if-else-isConnected
lorevee 0:1902469bdd2d 2732
lorevee 0:1902469bdd2d 2733 }
lorevee 0:1902469bdd2d 2734 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 2735
lorevee 0:1902469bdd2d 2736
lorevee 0:1902469bdd2d 2737
lorevee 0:1902469bdd2d 2738 /* Set the new status */
lorevee 0:1902469bdd2d 2739 void setNewStatus(void) {
lorevee 0:1902469bdd2d 2740 //printf("\r\nsetNewStatus\n");//DEBUG
lorevee 0:1902469bdd2d 2741
lorevee 0:1902469bdd2d 2742
lorevee 0:1902469bdd2d 2743 uint8_t i = perDevs.readDeviceIdx;
lorevee 0:1902469bdd2d 2744
lorevee 0:1902469bdd2d 2745
lorevee 0:1902469bdd2d 2746 //Switch status
lorevee 0:1902469bdd2d 2747 switch (perDevs.status) {
lorevee 0:1902469bdd2d 2748
lorevee 0:1902469bdd2d 2749
lorevee 0:1902469bdd2d 2750
lorevee 0:1902469bdd2d 2751
lorevee 0:1902469bdd2d 2752
lorevee 0:1902469bdd2d 2753 //
lorevee 0:1902469bdd2d 2754 case ENABLE_ME1_LED_NOTIFICATIONS:
lorevee 0:1902469bdd2d 2755 if (perDevs.wup_event[perDevs.connDeviceIdx]) {
lorevee 0:1902469bdd2d 2756 perDevs.status = ENABLE_ME1_WUP_NOTIFICATIONS;
lorevee 0:1902469bdd2d 2757 }else {
lorevee 0:1902469bdd2d 2758 perDevs.status = NOTIFICATIONS_ENABLED;
lorevee 0:1902469bdd2d 2759 }
lorevee 0:1902469bdd2d 2760 break;
lorevee 0:1902469bdd2d 2761
lorevee 0:1902469bdd2d 2762
lorevee 0:1902469bdd2d 2763
lorevee 0:1902469bdd2d 2764
lorevee 0:1902469bdd2d 2765
lorevee 0:1902469bdd2d 2766
lorevee 0:1902469bdd2d 2767 //
lorevee 0:1902469bdd2d 2768 case ENABLE_ME1_WUP_NOTIFICATIONS:
lorevee 0:1902469bdd2d 2769 perDevs.status = NOTIFICATIONS_ENABLED;
lorevee 0:1902469bdd2d 2770 break;
lorevee 0:1902469bdd2d 2771
lorevee 0:1902469bdd2d 2772
lorevee 0:1902469bdd2d 2773
lorevee 0:1902469bdd2d 2774
lorevee 0:1902469bdd2d 2775
lorevee 0:1902469bdd2d 2776
lorevee 0:1902469bdd2d 2777
lorevee 0:1902469bdd2d 2778 //
lorevee 0:1902469bdd2d 2779 case READING_ENVIRONMENTAL:
lorevee 0:1902469bdd2d 2780 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2781 perDevs.status = NOTIFY_ENV_TO_CLIENT;
lorevee 0:1902469bdd2d 2782 }else {
lorevee 0:1902469bdd2d 2783 if ((perDevs.devInfo[i].dev_v == NODE_FL1) && (perDevs.prx_on[i]==0)) {
lorevee 0:1902469bdd2d 2784 perDevs.status = READING_LUX;
lorevee 0:1902469bdd2d 2785 }else {
lorevee 0:1902469bdd2d 2786 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2787 }
lorevee 0:1902469bdd2d 2788 }//if-MAIN
lorevee 0:1902469bdd2d 2789 break;
lorevee 0:1902469bdd2d 2790
lorevee 0:1902469bdd2d 2791
lorevee 0:1902469bdd2d 2792
lorevee 0:1902469bdd2d 2793
lorevee 0:1902469bdd2d 2794
lorevee 0:1902469bdd2d 2795
lorevee 0:1902469bdd2d 2796
lorevee 0:1902469bdd2d 2797
lorevee 0:1902469bdd2d 2798 //
lorevee 0:1902469bdd2d 2799 case NOTIFY_ENV_TO_CLIENT:
lorevee 0:1902469bdd2d 2800
lorevee 0:1902469bdd2d 2801 //NODE_FL1
lorevee 0:1902469bdd2d 2802 if (perDevs.devInfo[i].dev_v == NODE_FL1) {
lorevee 0:1902469bdd2d 2803
lorevee 0:1902469bdd2d 2804 if (perDevs.prx_on[i]==0) {
lorevee 0:1902469bdd2d 2805 perDevs.status = READING_LUX;
lorevee 0:1902469bdd2d 2806 }
lorevee 0:1902469bdd2d 2807 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2808 (perDevs.prx_event[i]) && (!perDevs.prx_char_read[i])) {
lorevee 0:1902469bdd2d 2809 perDevs.status = READING_PRX;
lorevee 0:1902469bdd2d 2810 }
lorevee 0:1902469bdd2d 2811
lorevee 0:1902469bdd2d 2812 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2813 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2814 (perDevs.agm_event[i]) && (!perDevs.agm_char_read[i])) {
lorevee 0:1902469bdd2d 2815 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2816 }
lorevee 0:1902469bdd2d 2817 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2818 (perDevs.sfusion_event[i]) && (!perDevs.sfusion_char_read[i])) {
lorevee 0:1902469bdd2d 2819 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 2820 }
lorevee 0:1902469bdd2d 2821 #endif
lorevee 0:1902469bdd2d 2822 else {
lorevee 0:1902469bdd2d 2823 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2824 }
lorevee 0:1902469bdd2d 2825 }//if-NODE_FL1
lorevee 0:1902469bdd2d 2826
lorevee 0:1902469bdd2d 2827
lorevee 0:1902469bdd2d 2828 //NODE_ME1
lorevee 0:1902469bdd2d 2829 else if (perDevs.devInfo[i].dev_v == NODE_ME1) {
lorevee 0:1902469bdd2d 2830 if (!perDevs.led_char_read[i]) {
lorevee 0:1902469bdd2d 2831 perDevs.status = READING_LED;
lorevee 0:1902469bdd2d 2832 }
lorevee 0:1902469bdd2d 2833 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2834 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2835 (perDevs.agm_event[i]) && (!perDevs.agm_char_read[i])) {
lorevee 0:1902469bdd2d 2836 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2837 }
lorevee 0:1902469bdd2d 2838 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2839 (perDevs.sfusion_event[i]) && (!perDevs.sfusion_char_read[i])) {
lorevee 0:1902469bdd2d 2840 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 2841 }
lorevee 0:1902469bdd2d 2842 #endif
lorevee 0:1902469bdd2d 2843 else {
lorevee 0:1902469bdd2d 2844 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2845 }
lorevee 0:1902469bdd2d 2846 }//if-NODE_ME1
lorevee 0:1902469bdd2d 2847
lorevee 0:1902469bdd2d 2848
lorevee 0:1902469bdd2d 2849 //NODE_AM1
lorevee 0:1902469bdd2d 2850 else if (perDevs.devInfo[i].dev_v == NODE_AM1) {
lorevee 0:1902469bdd2d 2851 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2852 (perDevs.mic_event[i]) && (!perDevs.mic_char_read[i])) {
lorevee 0:1902469bdd2d 2853 perDevs.status = READING_MIC;
lorevee 0:1902469bdd2d 2854 }
lorevee 0:1902469bdd2d 2855 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2856 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2857 (perDevs.agm_event[i]) && (!perDevs.agm_char_read[i])) {
lorevee 0:1902469bdd2d 2858 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2859 }
lorevee 0:1902469bdd2d 2860 else if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2861 (perDevs.sfusion_event[i]) && (!perDevs.sfusion_char_read[i])) {
lorevee 0:1902469bdd2d 2862 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 2863 }
lorevee 0:1902469bdd2d 2864 #endif
lorevee 0:1902469bdd2d 2865 else {
lorevee 0:1902469bdd2d 2866 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2867 }
lorevee 0:1902469bdd2d 2868 }//if-NODE_AM1
lorevee 0:1902469bdd2d 2869 break;
lorevee 0:1902469bdd2d 2870
lorevee 0:1902469bdd2d 2871
lorevee 0:1902469bdd2d 2872
lorevee 0:1902469bdd2d 2873
lorevee 0:1902469bdd2d 2874
lorevee 0:1902469bdd2d 2875
lorevee 0:1902469bdd2d 2876
lorevee 0:1902469bdd2d 2877 //
lorevee 0:1902469bdd2d 2878 case READING_LED:
lorevee 0:1902469bdd2d 2879 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2880 perDevs.status = NOTIFY_LED_TO_CLIENT;
lorevee 0:1902469bdd2d 2881 }else {
lorevee 0:1902469bdd2d 2882 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2883 }
lorevee 0:1902469bdd2d 2884 break;
lorevee 0:1902469bdd2d 2885
lorevee 0:1902469bdd2d 2886
lorevee 0:1902469bdd2d 2887
lorevee 0:1902469bdd2d 2888
lorevee 0:1902469bdd2d 2889
lorevee 0:1902469bdd2d 2890
lorevee 0:1902469bdd2d 2891
lorevee 0:1902469bdd2d 2892 //
lorevee 0:1902469bdd2d 2893 case NOTIFY_LED_TO_CLIENT:
lorevee 0:1902469bdd2d 2894 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2895 (!perDevs.led_char_read[i])) {
lorevee 0:1902469bdd2d 2896 perDevs.led_char_read[i] = 1;
lorevee 0:1902469bdd2d 2897 }
lorevee 0:1902469bdd2d 2898 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2899 else if (perDevs.agm_event[i]) {
lorevee 0:1902469bdd2d 2900 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2901 }
lorevee 0:1902469bdd2d 2902 #endif
lorevee 0:1902469bdd2d 2903 else {
lorevee 0:1902469bdd2d 2904 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2905 }
lorevee 0:1902469bdd2d 2906 break;
lorevee 0:1902469bdd2d 2907
lorevee 0:1902469bdd2d 2908
lorevee 0:1902469bdd2d 2909
lorevee 0:1902469bdd2d 2910
lorevee 0:1902469bdd2d 2911
lorevee 0:1902469bdd2d 2912
lorevee 0:1902469bdd2d 2913
lorevee 0:1902469bdd2d 2914
lorevee 0:1902469bdd2d 2915 //
lorevee 0:1902469bdd2d 2916 case READING_LUX:
lorevee 0:1902469bdd2d 2917 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify)) {
lorevee 0:1902469bdd2d 2918 perDevs.status = NOTIFY_LUX_TO_CLIENT;
lorevee 0:1902469bdd2d 2919 }else {
lorevee 0:1902469bdd2d 2920 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2921 }
lorevee 0:1902469bdd2d 2922 break;
lorevee 0:1902469bdd2d 2923
lorevee 0:1902469bdd2d 2924
lorevee 0:1902469bdd2d 2925
lorevee 0:1902469bdd2d 2926
lorevee 0:1902469bdd2d 2927
lorevee 0:1902469bdd2d 2928
lorevee 0:1902469bdd2d 2929
lorevee 0:1902469bdd2d 2930
lorevee 0:1902469bdd2d 2931 //
lorevee 0:1902469bdd2d 2932 case NOTIFY_LUX_TO_CLIENT:
lorevee 0:1902469bdd2d 2933 if ((slaveDev.is_connected) && (slaveDev.star_data_char_notify) &&
lorevee 0:1902469bdd2d 2934 (perDevs.prx_event[i]) && (!perDevs.prx_char_read[i])) {
lorevee 0:1902469bdd2d 2935 perDevs.status = READING_PRX;
lorevee 0:1902469bdd2d 2936 }else {
lorevee 0:1902469bdd2d 2937 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2938 }
lorevee 0:1902469bdd2d 2939 break;
lorevee 0:1902469bdd2d 2940
lorevee 0:1902469bdd2d 2941
lorevee 0:1902469bdd2d 2942
lorevee 0:1902469bdd2d 2943
lorevee 0:1902469bdd2d 2944
lorevee 0:1902469bdd2d 2945
lorevee 0:1902469bdd2d 2946
lorevee 0:1902469bdd2d 2947 //
lorevee 0:1902469bdd2d 2948 case NOTIFY_MIC_TO_CLIENT:
lorevee 0:1902469bdd2d 2949 perDevs.mic_char_read[i] = 1;
lorevee 0:1902469bdd2d 2950
lorevee 0:1902469bdd2d 2951 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2952 if (perDevs.agm_event[i]) {
lorevee 0:1902469bdd2d 2953 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2954 }
lorevee 0:1902469bdd2d 2955 else if (perDevs.sfusion_event[i]) {
lorevee 0:1902469bdd2d 2956 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 2957 }else {
lorevee 0:1902469bdd2d 2958 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2959 }
lorevee 0:1902469bdd2d 2960 #else
lorevee 0:1902469bdd2d 2961 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2962 #endif
lorevee 0:1902469bdd2d 2963 break;
lorevee 0:1902469bdd2d 2964
lorevee 0:1902469bdd2d 2965
lorevee 0:1902469bdd2d 2966
lorevee 0:1902469bdd2d 2967
lorevee 0:1902469bdd2d 2968
lorevee 0:1902469bdd2d 2969
lorevee 0:1902469bdd2d 2970
lorevee 0:1902469bdd2d 2971 //
lorevee 0:1902469bdd2d 2972 case NOTIFY_PRX_TO_CLIENT:
lorevee 0:1902469bdd2d 2973 perDevs.prx_char_read[i] = 1;
lorevee 0:1902469bdd2d 2974
lorevee 0:1902469bdd2d 2975 #if ENABLE_MEMS
lorevee 0:1902469bdd2d 2976 if (perDevs.agm_event[i]) {
lorevee 0:1902469bdd2d 2977 perDevs.status = READING_AGM;
lorevee 0:1902469bdd2d 2978 }
lorevee 0:1902469bdd2d 2979 else if (perDevs.sfusion_event[i]) {
lorevee 0:1902469bdd2d 2980 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 2981 }else {
lorevee 0:1902469bdd2d 2982 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2983 }
lorevee 0:1902469bdd2d 2984 #else
lorevee 0:1902469bdd2d 2985 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 2986 #endif
lorevee 0:1902469bdd2d 2987 break;
lorevee 0:1902469bdd2d 2988
lorevee 0:1902469bdd2d 2989
lorevee 0:1902469bdd2d 2990
lorevee 0:1902469bdd2d 2991
lorevee 0:1902469bdd2d 2992
lorevee 0:1902469bdd2d 2993
lorevee 0:1902469bdd2d 2994
lorevee 0:1902469bdd2d 2995 //
lorevee 0:1902469bdd2d 2996 case NOTIFY_AGM_TO_CLIENT:
lorevee 0:1902469bdd2d 2997 perDevs.agm_char_read[i] = 1;
lorevee 0:1902469bdd2d 2998 if (perDevs.sfusion_event[i]) {
lorevee 0:1902469bdd2d 2999 perDevs.status = READING_SFUSION;
lorevee 0:1902469bdd2d 3000 }else {
lorevee 0:1902469bdd2d 3001 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 3002 }
lorevee 0:1902469bdd2d 3003 break;
lorevee 0:1902469bdd2d 3004
lorevee 0:1902469bdd2d 3005
lorevee 0:1902469bdd2d 3006
lorevee 0:1902469bdd2d 3007
lorevee 0:1902469bdd2d 3008
lorevee 0:1902469bdd2d 3009 //
lorevee 0:1902469bdd2d 3010 case NOTIFY_SFUSION_TO_CLIENT:
lorevee 0:1902469bdd2d 3011 perDevs.sfusion_char_read[i] = 1;
lorevee 0:1902469bdd2d 3012 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 3013 break;
lorevee 0:1902469bdd2d 3014
lorevee 0:1902469bdd2d 3015
lorevee 0:1902469bdd2d 3016
lorevee 0:1902469bdd2d 3017 //
lorevee 0:1902469bdd2d 3018 default:
lorevee 0:1902469bdd2d 3019 break;
lorevee 0:1902469bdd2d 3020 }
lorevee 0:1902469bdd2d 3021 }
lorevee 0:1902469bdd2d 3022 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3023
lorevee 0:1902469bdd2d 3024
lorevee 0:1902469bdd2d 3025
lorevee 0:1902469bdd2d 3026 /* Creating a new DiscoveredCharacteristicNode */
lorevee 0:1902469bdd2d 3027 DiscoveredCharacteristicNode * createDCNode(const DiscoveredCharacteristic &ch, DiscoveredCharacteristicNode *next){
lorevee 0:1902469bdd2d 3028
lorevee 0:1902469bdd2d 3029 DiscoveredCharacteristicNode *newNode = (DiscoveredCharacteristicNode *)malloc(sizeof(DiscoveredCharacteristicNode));
lorevee 0:1902469bdd2d 3030
lorevee 0:1902469bdd2d 3031 if(newNode == NULL){
lorevee 0:1902469bdd2d 3032 printf("\r\nError creating a new node\n\n");
lorevee 0:1902469bdd2d 3033 }
lorevee 0:1902469bdd2d 3034 newNode->data = ch;
lorevee 0:1902469bdd2d 3035 newNode->next = next;
lorevee 0:1902469bdd2d 3036
lorevee 0:1902469bdd2d 3037 return newNode;
lorevee 0:1902469bdd2d 3038 }
lorevee 0:1902469bdd2d 3039 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3040
lorevee 0:1902469bdd2d 3041
lorevee 0:1902469bdd2d 3042
lorevee 0:1902469bdd2d 3043 /* Prepend a DiscoveredCharacteristicNode */
lorevee 0:1902469bdd2d 3044 DiscoveredCharacteristicNode * prependDCNode(DiscoveredCharacteristicNode *head, const DiscoveredCharacteristic *characteristic){
lorevee 0:1902469bdd2d 3045
lorevee 0:1902469bdd2d 3046 DiscoveredCharacteristicNode * newNode = createDCNode(*characteristic, head);
lorevee 0:1902469bdd2d 3047 head = newNode;
lorevee 0:1902469bdd2d 3048
lorevee 0:1902469bdd2d 3049 return head;
lorevee 0:1902469bdd2d 3050 }
lorevee 0:1902469bdd2d 3051 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3052
lorevee 0:1902469bdd2d 3053
lorevee 0:1902469bdd2d 3054
lorevee 0:1902469bdd2d 3055 /* Append a DiscoveredCharacteristicNode */
lorevee 0:1902469bdd2d 3056 DiscoveredCharacteristicNode * appendDCNode(DiscoveredCharacteristicNode *head, const DiscoveredCharacteristic *characteristic){
lorevee 0:1902469bdd2d 3057
lorevee 0:1902469bdd2d 3058 DiscoveredCharacteristicNode * cursor = head;
lorevee 0:1902469bdd2d 3059 // find the last node
lorevee 0:1902469bdd2d 3060 while(cursor->next != NULL){
lorevee 0:1902469bdd2d 3061 cursor = cursor->next;
lorevee 0:1902469bdd2d 3062 }
lorevee 0:1902469bdd2d 3063
lorevee 0:1902469bdd2d 3064 DiscoveredCharacteristicNode * newNode = createDCNode(*characteristic, NULL);
lorevee 0:1902469bdd2d 3065 cursor->next = newNode;
lorevee 0:1902469bdd2d 3066
lorevee 0:1902469bdd2d 3067 return head;
lorevee 0:1902469bdd2d 3068 }
lorevee 0:1902469bdd2d 3069 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3070
lorevee 0:1902469bdd2d 3071
lorevee 0:1902469bdd2d 3072
lorevee 0:1902469bdd2d 3073 /* Number of DiscoveredCharacteristic nodes */
lorevee 0:1902469bdd2d 3074 int countElements(DiscoveredCharacteristicNode *head){
lorevee 0:1902469bdd2d 3075
lorevee 0:1902469bdd2d 3076 DiscoveredCharacteristicNode * cursor = head;
lorevee 0:1902469bdd2d 3077
lorevee 0:1902469bdd2d 3078 int c=0;
lorevee 0:1902469bdd2d 3079 //cursor because starts from 0
lorevee 0:1902469bdd2d 3080 while (cursor != NULL){
lorevee 0:1902469bdd2d 3081 c++;
lorevee 0:1902469bdd2d 3082 cursor = cursor->next;
lorevee 0:1902469bdd2d 3083 }
lorevee 0:1902469bdd2d 3084
lorevee 0:1902469bdd2d 3085 return c;
lorevee 0:1902469bdd2d 3086 }
lorevee 0:1902469bdd2d 3087 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3088
lorevee 0:1902469bdd2d 3089
lorevee 0:1902469bdd2d 3090
lorevee 0:1902469bdd2d 3091 /* Search for a DiscoveredCharacteristic node by declaration handle */
lorevee 0:1902469bdd2d 3092 DiscoveredCharacteristicNode * searchDCNode(DiscoveredCharacteristicNode *head, uint16_t declHandle) {
lorevee 0:1902469bdd2d 3093
lorevee 0:1902469bdd2d 3094 DiscoveredCharacteristicNode * cursor = head;
lorevee 0:1902469bdd2d 3095
lorevee 0:1902469bdd2d 3096 while(cursor != NULL){
lorevee 0:1902469bdd2d 3097
lorevee 0:1902469bdd2d 3098 // search for declaration handle
lorevee 0:1902469bdd2d 3099 if(cursor->data.getDeclHandle() == declHandle){
lorevee 0:1902469bdd2d 3100 return cursor;
lorevee 0:1902469bdd2d 3101 }
lorevee 0:1902469bdd2d 3102 cursor = cursor->next;
lorevee 0:1902469bdd2d 3103 }
lorevee 0:1902469bdd2d 3104 return NULL;
lorevee 0:1902469bdd2d 3105 }
lorevee 0:1902469bdd2d 3106 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 3107
lorevee 0:1902469bdd2d 3108
lorevee 0:1902469bdd2d 3109
lorevee 0:1902469bdd2d 3110 /* Delete the DCN list */
lorevee 0:1902469bdd2d 3111 void deleteDCNList(DiscoveredCharacteristicNode *head){
lorevee 0:1902469bdd2d 3112
lorevee 0:1902469bdd2d 3113 DiscoveredCharacteristicNode * cursor, *tmp;
lorevee 0:1902469bdd2d 3114
lorevee 0:1902469bdd2d 3115 if (head != NULL){
lorevee 0:1902469bdd2d 3116 cursor = head->next;
lorevee 0:1902469bdd2d 3117 head->next = NULL;
lorevee 0:1902469bdd2d 3118
lorevee 0:1902469bdd2d 3119 while(cursor != NULL) {
lorevee 0:1902469bdd2d 3120 tmp = cursor->next;
lorevee 0:1902469bdd2d 3121 free(cursor);
lorevee 0:1902469bdd2d 3122 cursor = tmp;
lorevee 0:1902469bdd2d 3123 }
lorevee 0:1902469bdd2d 3124 }
lorevee 0:1902469bdd2d 3125 }
lorevee 0:1902469bdd2d 3126 /*----------------------------------------------------------------------------*/