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:
Tue Mar 13 16:31:07 2018 +0000
Revision:
3:3f35e80ed848
Parent:
2:1525f4848cf2
Child:
4:4af40af2530e
Bug fixing 1

Who changed what in which revision?

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