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:
Sat Mar 31 15:10:54 2018 +0000
Revision:
4:4af40af2530e
Parent:
3:3f35e80ed848
first release of ble-star-mbed with cloud support

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