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 10:10:37 2018 +0000
Revision:
1:110b5e896bc9
Parent:
0:1902469bdd2d
Child:
2:1525f4848cf2
Notification frequency fixes

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