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 Feb 20 11:21:41 2018 +0000
Revision:
0:1902469bdd2d
Child:
1:110b5e896bc9
First commit of Ble Star demo

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