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 <BleSlaveService.h>
lorevee 0:1902469bdd2d 2
lorevee 0:1902469bdd2d 3
lorevee 0:1902469bdd2d 4 /* ----- Private variables ----- */
lorevee 0:1902469bdd2d 5 /* Struct of slave dev */
lorevee 0:1902469bdd2d 6 SlaveDevice_t slaveDev;
lorevee 0:1902469bdd2d 7
lorevee 0:1902469bdd2d 8
lorevee 0:1902469bdd2d 9 ChangeNotificationQueue notifyQ, *notifyP;
lorevee 0:1902469bdd2d 10
lorevee 0:1902469bdd2d 11
lorevee 0:1902469bdd2d 12 /* Struct of periph dev */
lorevee 0:1902469bdd2d 13 extern PeripheralDevices_t perDevs;
lorevee 0:1902469bdd2d 14
lorevee 0:1902469bdd2d 15 /* Notification frequency */
lorevee 0:1902469bdd2d 16 uint8_t notification_freq = NOTIFICATION_FREQ_WIFI_OFF;
lorevee 0:1902469bdd2d 17
lorevee 0:1902469bdd2d 18
lorevee 0:1902469bdd2d 19 /* Star Service and Characteristic */
lorevee 0:1902469bdd2d 20 uint8_t sUuid[16] = {0x00,0x00,0x00,0x00,0x00,0x01,0x11,0xe1,0x9a,0xb4,0x00,0x02,0xa5,0xd5,0xc5,0x1b};
lorevee 0:1902469bdd2d 21 uint8_t dataUuid[16] = {0x00,0x08,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b};
lorevee 0:1902469bdd2d 22 uint8_t confUuid[16] = {0x00,0x04,0x00,0x00,0x00,0x01,0x11,0xe1,0xac,0x36,0x00,0x02,0xa5,0xd5,0xc5,0x1b};
lorevee 0:1902469bdd2d 23
lorevee 0:1902469bdd2d 24
lorevee 0:1902469bdd2d 25 /*---- Create the two characteristic ----*/
lorevee 0:1902469bdd2d 26 /* Config char */
lorevee 0:1902469bdd2d 27 GattCharacteristic configChar(confUuid, slaveDev.star_config_value, STAR_CHAR_MAX_VALUE_LEN, STAR_CHAR_MAX_VALUE_LEN,
lorevee 0:1902469bdd2d 28 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE,
lorevee 0:1902469bdd2d 29 NULL, 0, true);
lorevee 0:1902469bdd2d 30
lorevee 0:1902469bdd2d 31
lorevee 0:1902469bdd2d 32 /* Data char */
lorevee 0:1902469bdd2d 33 GattCharacteristic dataChar(dataUuid, slaveDev.notification_data.attribute_value, STAR_CHAR_MAX_VALUE_LEN, STAR_CHAR_MAX_VALUE_LEN,
lorevee 0:1902469bdd2d 34 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE,
lorevee 0:1902469bdd2d 35 NULL, 0, true);
lorevee 0:1902469bdd2d 36
lorevee 0:1902469bdd2d 37
lorevee 0:1902469bdd2d 38 /* MANUFACTURER_SPECIFIC_DATA */
lorevee 0:1902469bdd2d 39 uint8_t manuf_data[6] = {
lorevee 0:1902469bdd2d 40 0x01, /*SKD version */
lorevee 0:1902469bdd2d 41 0x81, /* NUCLEO-Board remote */
lorevee 0:1902469bdd2d 42 0x00, /* Led Prox+Lux */ //Unused
lorevee 0:1902469bdd2d 43 0x0C, /* Star Config Char + Star Data Char */ //Unused
lorevee 0:1902469bdd2d 44 0x00, /* SensorFusionShort */ //Unused
lorevee 0:1902469bdd2d 45 0x00 /* SensorFusionFloat */ //Unused
lorevee 0:1902469bdd2d 46 };
lorevee 0:1902469bdd2d 47
lorevee 0:1902469bdd2d 48
lorevee 0:1902469bdd2d 49
lorevee 0:1902469bdd2d 50
lorevee 0:1902469bdd2d 51
lorevee 0:1902469bdd2d 52 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 53
lorevee 0:1902469bdd2d 54
lorevee 0:1902469bdd2d 55
lorevee 0:1902469bdd2d 56 /* Set the device as a slave in discoverable mode */
lorevee 0:1902469bdd2d 57 void setSlaveDiscoverable(void) {
lorevee 0:1902469bdd2d 58 //printf("\r\nsetSlaveDiscoverable\n");//DEBUG
lorevee 0:1902469bdd2d 59 BLE& ble = BLE::Instance();
lorevee 0:1902469bdd2d 60 ble_error_t e2;
lorevee 0:1902469bdd2d 61
lorevee 0:1902469bdd2d 62
lorevee 0:1902469bdd2d 63 //if-MAIN - discovery/reading/writing ops completed
lorevee 0:1902469bdd2d 64 if ((discoveryCompleted == 1) /*&& (readCompleted == 1) && (writeDescriptorCompleted == 1)*/){
lorevee 0:1902469bdd2d 65
lorevee 0:1902469bdd2d 66
lorevee 0:1902469bdd2d 67
lorevee 0:1902469bdd2d 68 /* Start advertisng */
lorevee 0:1902469bdd2d 69 if ((!ble.gap().getState().advertising)){
lorevee 0:1902469bdd2d 70 advEnds =0;
lorevee 0:1902469bdd2d 71
lorevee 0:1902469bdd2d 72 printf("\r\nSet Discoverable Mode (%d)\n", perDevs.status);
lorevee 0:1902469bdd2d 73 e2 = ble.gap().startAdvertising();
lorevee 0:1902469bdd2d 74 if ( e2 == BLE_ERROR_NONE ){
lorevee 0:1902469bdd2d 75 /* Giving some time to connect */
lorevee 0:1902469bdd2d 76 eventQ.call_in(7000, stopAdv);//N ms
lorevee 0:1902469bdd2d 77 }else{
lorevee 0:1902469bdd2d 78 printf("\r\nError while starting advertising (err: %d - stat: %d)\n", e2, perDevs.status);
lorevee 0:1902469bdd2d 79 advEnds=1;//terminated because not started
lorevee 0:1902469bdd2d 80 }
lorevee 0:1902469bdd2d 81
lorevee 0:1902469bdd2d 82 }//if-not-adv
lorevee 0:1902469bdd2d 83 }//if-MAIN
lorevee 0:1902469bdd2d 84
lorevee 0:1902469bdd2d 85
lorevee 0:1902469bdd2d 86 //Restart loop ops
lorevee 0:1902469bdd2d 87 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 88 perDevs.discovery_enabled = true;
lorevee 0:1902469bdd2d 89 //printf("\rstatus = CONN_INIT (%d)\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 90
lorevee 0:1902469bdd2d 91 }
lorevee 0:1902469bdd2d 92 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 93
lorevee 0:1902469bdd2d 94
lorevee 0:1902469bdd2d 95
lorevee 0:1902469bdd2d 96 void stopAdv(){
lorevee 0:1902469bdd2d 97
lorevee 0:1902469bdd2d 98 if ((slaveDev.is_connected == false) && (discoveryCompleted == 1)){
lorevee 0:1902469bdd2d 99 if (BLE::Instance().gap().getState().advertising){
lorevee 0:1902469bdd2d 100 ble_error_t e = BLE::Instance().gap().stopAdvertising();
lorevee 0:1902469bdd2d 101 if ( e != BLE_ERROR_NONE ) {
lorevee 0:1902469bdd2d 102 printf("\r\nError stopping ADV\n");//DEBUG
lorevee 0:1902469bdd2d 103 }
lorevee 0:1902469bdd2d 104 }
lorevee 0:1902469bdd2d 105 }//if
lorevee 0:1902469bdd2d 106
lorevee 0:1902469bdd2d 107 advEnds = 1;
lorevee 0:1902469bdd2d 108 }
lorevee 0:1902469bdd2d 109 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 110
lorevee 0:1902469bdd2d 111
lorevee 0:1902469bdd2d 112
lorevee 0:1902469bdd2d 113 /**
lorevee 0:1902469bdd2d 114 * @brief This function sets some notification properties (e.g. the
lorevee 0:1902469bdd2d 115 * notification period) by sending a command according to the
lorevee 0:1902469bdd2d 116 * following format:
lorevee 0:1902469bdd2d 117 * FEATURE_MASK (4bytes) + Command (1byte) + Data (1byte)
lorevee 0:1902469bdd2d 118 * In case of the notification period the command is 255 while the allowed data are:
lorevee 0:1902469bdd2d 119 * 50 @5S, 10 @1S, 1 @100mS, 0 @50mS (default).
lorevee 0:1902469bdd2d 120 * @param connection handle
lorevee 0:1902469bdd2d 121 * @param peripheral device index
lorevee 0:1902469bdd2d 122 * @param feature mask
lorevee 0:1902469bdd2d 123 * @param command
lorevee 0:1902469bdd2d 124 * @param data
lorevee 0:1902469bdd2d 125 * @retval None
lorevee 0:1902469bdd2d 126 */
lorevee 0:1902469bdd2d 127 void setNotificationProperty(uint16_t conn_handle, uint8_t i, uint32_t feature_mask,
lorevee 0:1902469bdd2d 128 uint8_t command, uint8_t data) {
lorevee 0:1902469bdd2d 129 //printf("\r\nsetNotificationProperty\n");//DEBUG
lorevee 0:1902469bdd2d 130
lorevee 0:1902469bdd2d 131 uint16_t attr_handle;
lorevee 0:1902469bdd2d 132 uint8_t value_len;
lorevee 0:1902469bdd2d 133 uint8_t attr_value[6];
lorevee 0:1902469bdd2d 134
lorevee 0:1902469bdd2d 135 attr_handle = perDevs.cfg_char_handle[i] + 1;
lorevee 0:1902469bdd2d 136 attr_value[0] = (uint8_t)((feature_mask) >> 24);
lorevee 0:1902469bdd2d 137 attr_value[1] = (uint8_t)((feature_mask) >> 16);
lorevee 0:1902469bdd2d 138 attr_value[2] = (uint8_t)((feature_mask) >> 8);
lorevee 0:1902469bdd2d 139 attr_value[3] = (uint8_t)((feature_mask));
lorevee 0:1902469bdd2d 140 attr_value[4] = command;
lorevee 0:1902469bdd2d 141 attr_value[5] = data;
lorevee 0:1902469bdd2d 142 value_len = 6; /* FEATURE_MASK len (4bytes) + Command len (1byte) + Data len (1byte) */
lorevee 0:1902469bdd2d 143
lorevee 0:1902469bdd2d 144
lorevee 0:1902469bdd2d 145 /* The gatt write function above is w/out response, so we just wait for a short time before going on */
lorevee 0:1902469bdd2d 146 writeCharacValueWithoutResp(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 147 HAL_Delay(2000);//N ms
lorevee 0:1902469bdd2d 148 }
lorevee 0:1902469bdd2d 149 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 150
lorevee 0:1902469bdd2d 151
lorevee 0:1902469bdd2d 152
lorevee 0:1902469bdd2d 153
lorevee 0:1902469bdd2d 154 /* Forwards to master all notifications from peripherals */
lorevee 0:1902469bdd2d 155 void notifyMaster(uint8_t data_length, uint8_t* attribute_value, uint16_t attribute_handle){
lorevee 0:1902469bdd2d 156 //printf("\r\nnotifyMaster\n");//DEBUG
lorevee 0:1902469bdd2d 157 ble_error_t notifyError;
lorevee 0:1902469bdd2d 158
lorevee 0:1902469bdd2d 159 if (discoveryCompleted == 1){
lorevee 0:1902469bdd2d 160
lorevee 0:1902469bdd2d 161 notifyError = BLE::Instance().gattServer().write(attribute_handle+1, attribute_value, data_length, false);
lorevee 0:1902469bdd2d 162
lorevee 0:1902469bdd2d 163 if (notifyError != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 164 printf("\r\n(notifyMaster) Error (%d) while updating characteristic\n", notifyError);//BLE_STACK_BUSY
lorevee 0:1902469bdd2d 165 //HAL_Delay(1000);//giving some time to slowdown the rate
lorevee 0:1902469bdd2d 166 return;
lorevee 0:1902469bdd2d 167 }
lorevee 0:1902469bdd2d 168
lorevee 0:1902469bdd2d 169 } else {
lorevee 0:1902469bdd2d 170 //HAL_Delay(1000);//giving some time to slowdown the rate
lorevee 0:1902469bdd2d 171 //dOING SOMETHING !
lorevee 0:1902469bdd2d 172 return;
lorevee 0:1902469bdd2d 173 }
lorevee 0:1902469bdd2d 174 }
lorevee 0:1902469bdd2d 175 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 176
lorevee 0:1902469bdd2d 177
lorevee 0:1902469bdd2d 178 /* Add all services using a vendor specific UUIDs */
lorevee 0:1902469bdd2d 179 void addAllServices(void){
lorevee 0:1902469bdd2d 180
lorevee 0:1902469bdd2d 181 ble_error_t error;
lorevee 0:1902469bdd2d 182 notifyP = &notifyQ;
lorevee 0:1902469bdd2d 183
lorevee 0:1902469bdd2d 184
lorevee 0:1902469bdd2d 185 GattCharacteristic *charTable[] = {&configChar, &dataChar};
lorevee 0:1902469bdd2d 186
lorevee 0:1902469bdd2d 187 /*---- Create the hw service ----*/
lorevee 0:1902469bdd2d 188 GattService starService(sUuid, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
lorevee 0:1902469bdd2d 189
lorevee 0:1902469bdd2d 190 /*---- Add the hw service ----*/
lorevee 0:1902469bdd2d 191 error = BLE::Instance().addService(starService);
lorevee 0:1902469bdd2d 192 slaveDev.star_hw_serv_handle = starService.getHandle();
lorevee 0:1902469bdd2d 193 slaveDev.star_config_char_handle = configChar.getValueHandle()-1; //-1 for decl handle
lorevee 0:1902469bdd2d 194 slaveDev.star_data_char_handle = dataChar.getValueHandle()-1; //-1 for decl handle
lorevee 0:1902469bdd2d 195
lorevee 0:1902469bdd2d 196
lorevee 0:1902469bdd2d 197
lorevee 0:1902469bdd2d 198 if ( error != BLE_ERROR_NONE ){
lorevee 0:1902469bdd2d 199 printf("\r\nError while creating starService(error: %d)\n", error);
lorevee 0:1902469bdd2d 200
lorevee 0:1902469bdd2d 201 } else {
lorevee 0:1902469bdd2d 202 printf("\r\nStar HW Gatt Service added (handle 0x%004x)\n", slaveDev.star_hw_serv_handle);
lorevee 0:1902469bdd2d 203 printf("\rStar HW Config Char added (handle 0x%004x)\n", slaveDev.star_config_char_handle);
lorevee 0:1902469bdd2d 204 printf("\rStar HW Data Char added (handle 0x%004x)", slaveDev.star_data_char_handle);
lorevee 0:1902469bdd2d 205 printf("\r\n");
lorevee 0:1902469bdd2d 206 }
lorevee 0:1902469bdd2d 207
lorevee 0:1902469bdd2d 208 }
lorevee 0:1902469bdd2d 209 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 210
lorevee 0:1902469bdd2d 211
lorevee 0:1902469bdd2d 212 /* Disable all notifications */
lorevee 0:1902469bdd2d 213 void disableAllNotifications(void){
lorevee 0:1902469bdd2d 214 //printf("\r\ndisableAllNotifications\n");//DEBUG
lorevee 0:1902469bdd2d 215
lorevee 0:1902469bdd2d 216
lorevee 0:1902469bdd2d 217 uint8_t j;
lorevee 0:1902469bdd2d 218 uint16_t attr_handle;
lorevee 0:1902469bdd2d 219 uint8_t value_len;
lorevee 0:1902469bdd2d 220 uint8_t attr_value[2];
lorevee 0:1902469bdd2d 221 char* feat = NULL;
lorevee 0:1902469bdd2d 222
lorevee 0:1902469bdd2d 223 for (j=0; j<(perDevs.connDevices+perDevs.discDevices); j++) {
lorevee 0:1902469bdd2d 224
lorevee 0:1902469bdd2d 225 if ((perDevs.mic_event[j]) && (perDevs.mic_event_enabled)) {
lorevee 0:1902469bdd2d 226 feat = "MIC";
lorevee 0:1902469bdd2d 227 perDevs.mic_event_enabled = 0;
lorevee 0:1902469bdd2d 228 perDevs.mic_event[j] = 0;
lorevee 0:1902469bdd2d 229 attr_handle = perDevs.mic_char_handle[j] + 2;
lorevee 0:1902469bdd2d 230
lorevee 0:1902469bdd2d 231 } else if ((perDevs.prx_event[j]) && (perDevs.prx_event_enabled)) {
lorevee 0:1902469bdd2d 232 feat = "PRX";
lorevee 0:1902469bdd2d 233 perDevs.prx_event_enabled = 0;
lorevee 0:1902469bdd2d 234 perDevs.prx_on[j] = 0;
lorevee 0:1902469bdd2d 235 attr_handle = perDevs.prx_char_handle[j] + 2;
lorevee 0:1902469bdd2d 236
lorevee 0:1902469bdd2d 237 } else if ((perDevs.agm_event[j]) && (perDevs.agm_event_enabled)) {
lorevee 0:1902469bdd2d 238 feat = "AGM";
lorevee 0:1902469bdd2d 239 perDevs.acc_event_enabled = 0;
lorevee 0:1902469bdd2d 240 perDevs.gyr_event_enabled = 0;
lorevee 0:1902469bdd2d 241 perDevs.mag_event_enabled = 0;
lorevee 0:1902469bdd2d 242 perDevs.agm_event_enabled = 0;
lorevee 0:1902469bdd2d 243 perDevs.agm_on[j] = 0;
lorevee 0:1902469bdd2d 244 attr_handle = perDevs.agm_char_handle[j] + 2;
lorevee 0:1902469bdd2d 245
lorevee 0:1902469bdd2d 246 } else if ((perDevs.sfusion_event[j]) && (perDevs.sfusion_event_enabled)) {
lorevee 0:1902469bdd2d 247 feat = "SFUSION";
lorevee 0:1902469bdd2d 248 perDevs.sfusion_event_enabled = 0;
lorevee 0:1902469bdd2d 249 perDevs.sfusion_on[j] = 0;
lorevee 0:1902469bdd2d 250 attr_handle = perDevs.sfusion_char_handle[j] + 2;
lorevee 0:1902469bdd2d 251
lorevee 0:1902469bdd2d 252 } else {
lorevee 0:1902469bdd2d 253 continue;
lorevee 0:1902469bdd2d 254 }
lorevee 0:1902469bdd2d 255
lorevee 0:1902469bdd2d 256 value_len = 2;
lorevee 0:1902469bdd2d 257 attr_value[0] = DISABLE;
lorevee 0:1902469bdd2d 258
lorevee 0:1902469bdd2d 259
lorevee 0:1902469bdd2d 260 writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 261 ble_error_t disableErr = writeCharacDescriptorWithError(perDevs.connection_handle[j], attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 262 printf("\r\nSet OFF the %s notifications on node %d\n", feat, j);
lorevee 0:1902469bdd2d 263
lorevee 0:1902469bdd2d 264 if (disableErr != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 265 printf("\r\n(disableAllNotifications) Write charac descriptor failed (%d)\n", disableErr);
lorevee 0:1902469bdd2d 266 writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 267 //HAL_Delay(500);
lorevee 0:1902469bdd2d 268 //disableAllNotifications();
lorevee 0:1902469bdd2d 269 }//if-error
lorevee 0:1902469bdd2d 270 }//for
lorevee 0:1902469bdd2d 271
lorevee 0:1902469bdd2d 272
lorevee 0:1902469bdd2d 273 }
lorevee 0:1902469bdd2d 274 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 275
lorevee 0:1902469bdd2d 276
lorevee 0:1902469bdd2d 277
lorevee 0:1902469bdd2d 278 /* This function enables or disables the new peripheral scanning */
lorevee 0:1902469bdd2d 279 void setNewNodesScanning(uint8_t enabled){
lorevee 0:1902469bdd2d 280
lorevee 0:1902469bdd2d 281 STORE_LE_16(slaveDev.star_config_value,(HAL_GetTick()>>3)); /* Timestamp */
lorevee 0:1902469bdd2d 282
lorevee 0:1902469bdd2d 283 switch (enabled) {
lorevee 0:1902469bdd2d 284 case 0x01:
lorevee 0:1902469bdd2d 285 perDevs.discovery_enabled = true;
lorevee 0:1902469bdd2d 286 //printf("\r\nScanning enabled (%d)\n", enabled);
lorevee 0:1902469bdd2d 287 break;
lorevee 0:1902469bdd2d 288
lorevee 0:1902469bdd2d 289 case 0x02:
lorevee 0:1902469bdd2d 290 perDevs.discovery_enabled = false;
lorevee 0:1902469bdd2d 291 //printf("\r\nScanning disabled (%d)\n", enabled);
lorevee 0:1902469bdd2d 292 break;
lorevee 0:1902469bdd2d 293
lorevee 0:1902469bdd2d 294 default:
lorevee 0:1902469bdd2d 295 //printf("\r\nScanning set to unrecognized value (%d)\n", enabled);
lorevee 0:1902469bdd2d 296 break;
lorevee 0:1902469bdd2d 297 }
lorevee 0:1902469bdd2d 298
lorevee 0:1902469bdd2d 299 slaveDev.star_config_value[2] = enabled;
lorevee 0:1902469bdd2d 300 slaveDev.star_config_value_len = 3;
lorevee 0:1902469bdd2d 301 //HAL_Delay(300);
lorevee 0:1902469bdd2d 302
lorevee 0:1902469bdd2d 303 /* Notify master for scanning */
lorevee 0:1902469bdd2d 304
lorevee 0:1902469bdd2d 305 /* Stack busy, solve this */
lorevee 0:1902469bdd2d 306 // notifyMaster(slaveDev.star_config_value_len, slaveDev.star_config_value,
lorevee 0:1902469bdd2d 307 // slaveDev.star_config_char_handle);
lorevee 0:1902469bdd2d 308
lorevee 0:1902469bdd2d 309 }
lorevee 0:1902469bdd2d 310 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 311
lorevee 0:1902469bdd2d 312
lorevee 0:1902469bdd2d 313 //NOT USED FOR NOW !!
lorevee 0:1902469bdd2d 314 /* This function forwards to the peripheral device the command coming from the Cloud */
lorevee 0:1902469bdd2d 315 void Forward_Command_To_BlueNRG(uint8_t* data_ptr, uint8_t data_length){
lorevee 0:1902469bdd2d 316
lorevee 0:1902469bdd2d 317 uint16_t handle;
lorevee 0:1902469bdd2d 318 uint8_t buffer[4] = {0, 0, 0, 0};
lorevee 0:1902469bdd2d 319 uint8_t num, even, odd;
lorevee 0:1902469bdd2d 320 uint8_t i;
lorevee 0:1902469bdd2d 321 uint8_t cmd_type;
lorevee 0:1902469bdd2d 322
lorevee 0:1902469bdd2d 323 cmd_type = (data_ptr[0] - '0') << 4 | (data_ptr[1] - '0');
lorevee 0:1902469bdd2d 324 //printf("\r\ncommand %d\n", cmd_type);
lorevee 0:1902469bdd2d 325
lorevee 0:1902469bdd2d 326 switch (cmd_type)
lorevee 0:1902469bdd2d 327 {
lorevee 0:1902469bdd2d 328 case 0:
lorevee 0:1902469bdd2d 329 printf("\rScan cmd type (%d)\n", cmd_type);
lorevee 0:1902469bdd2d 330 handle = slaveDev.star_config_char_handle + 1;
lorevee 0:1902469bdd2d 331 break;
lorevee 0:1902469bdd2d 332 case 1:
lorevee 0:1902469bdd2d 333 printf("\rLED/MIC/PRX cmd type (%d)\n", cmd_type);
lorevee 0:1902469bdd2d 334 handle = slaveDev.star_data_char_handle + 1;
lorevee 0:1902469bdd2d 335 break;
lorevee 0:1902469bdd2d 336 default:
lorevee 0:1902469bdd2d 337 printf("\rUnknown cmd type (%d)\n", cmd_type);
lorevee 0:1902469bdd2d 338 return;
lorevee 0:1902469bdd2d 339 //break;
lorevee 0:1902469bdd2d 340 }
lorevee 0:1902469bdd2d 341
lorevee 0:1902469bdd2d 342 /**
lorevee 0:1902469bdd2d 343 * For Scan cmd type:
lorevee 0:1902469bdd2d 344 * |Value |
lorevee 0:1902469bdd2d 345 * |1 byte |
lorevee 0:1902469bdd2d 346 * For LED/MIC/PRX cmd type:
lorevee 0:1902469bdd2d 347 * |Node ID | Type ID | Value |
lorevee 0:1902469bdd2d 348 * |2 bytes | 1 byte | x bytes |
lorevee 0:1902469bdd2d 349 */
lorevee 0:1902469bdd2d 350 for (i=2; i<data_length; i++) {
lorevee 0:1902469bdd2d 351 switch (data_ptr[i])
lorevee 0:1902469bdd2d 352 {
lorevee 0:1902469bdd2d 353 case 'A':
lorevee 0:1902469bdd2d 354 case 'a':
lorevee 0:1902469bdd2d 355 num = 10;
lorevee 0:1902469bdd2d 356 break;
lorevee 0:1902469bdd2d 357 case 'B':
lorevee 0:1902469bdd2d 358 case 'b':
lorevee 0:1902469bdd2d 359 num = 11;
lorevee 0:1902469bdd2d 360 break;
lorevee 0:1902469bdd2d 361 case 'C':
lorevee 0:1902469bdd2d 362 case 'c':
lorevee 0:1902469bdd2d 363 num = 12;
lorevee 0:1902469bdd2d 364 break;
lorevee 0:1902469bdd2d 365 case 'D':
lorevee 0:1902469bdd2d 366 case 'd':
lorevee 0:1902469bdd2d 367 num = 13;
lorevee 0:1902469bdd2d 368 break;
lorevee 0:1902469bdd2d 369 case 'E':
lorevee 0:1902469bdd2d 370 case 'e':
lorevee 0:1902469bdd2d 371 num = 14;
lorevee 0:1902469bdd2d 372 break;
lorevee 0:1902469bdd2d 373 case 'F':
lorevee 0:1902469bdd2d 374 case 'f':
lorevee 0:1902469bdd2d 375 num = 15;
lorevee 0:1902469bdd2d 376 break;
lorevee 0:1902469bdd2d 377 default:
lorevee 0:1902469bdd2d 378 num = data_ptr[i] - '0';
lorevee 0:1902469bdd2d 379 break;
lorevee 0:1902469bdd2d 380 }
lorevee 0:1902469bdd2d 381 if (!(i%2)) {
lorevee 0:1902469bdd2d 382 even = num << 4;
lorevee 0:1902469bdd2d 383 }
lorevee 0:1902469bdd2d 384 else {
lorevee 0:1902469bdd2d 385 odd = num;
lorevee 0:1902469bdd2d 386 buffer[(i-2)/2] = even | odd;
lorevee 0:1902469bdd2d 387 }
lorevee 0:1902469bdd2d 388 }
lorevee 0:1902469bdd2d 389
lorevee 0:1902469bdd2d 390 createAttribute_Modified_CB_Prototype(handle, (data_length-2)/2, buffer);
lorevee 0:1902469bdd2d 391 }
lorevee 0:1902469bdd2d 392 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 393
lorevee 0:1902469bdd2d 394
lorevee 0:1902469bdd2d 395 /* Function used to call AttributeModified_CB outside the callback call */
lorevee 0:1902469bdd2d 396 void createAttribute_Modified_CB_Prototype(uint16_t handle, uint8_t data_length, uint8_t *att_data){
lorevee 0:1902469bdd2d 397
lorevee 0:1902469bdd2d 398 GattWriteCallbackParams paramStruct, *pointerToParam;
lorevee 0:1902469bdd2d 399 pointerToParam = &paramStruct;
lorevee 0:1902469bdd2d 400
lorevee 0:1902469bdd2d 401 pointerToParam->handle = handle;
lorevee 0:1902469bdd2d 402 pointerToParam->len = data_length;
lorevee 0:1902469bdd2d 403 pointerToParam->data = att_data;
lorevee 0:1902469bdd2d 404
lorevee 0:1902469bdd2d 405 AttributeModified_CB(pointerToParam);
lorevee 0:1902469bdd2d 406 }
lorevee 0:1902469bdd2d 407 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 408
lorevee 0:1902469bdd2d 409
lorevee 0:1902469bdd2d 410
lorevee 0:1902469bdd2d 411
lorevee 0:1902469bdd2d 412 /* This function is called when a local attribute gets modified */
lorevee 0:1902469bdd2d 413 void AttributeModified_CB(const GattWriteCallbackParams* param){
lorevee 0:1902469bdd2d 414 // printf("\r\nAttributeModified_CB (%d)\n", perDevs.status);//DEBUG
lorevee 0:1902469bdd2d 415
lorevee 0:1902469bdd2d 416
lorevee 0:1902469bdd2d 417 /* Assign prototype vars */
lorevee 0:1902469bdd2d 418 uint16_t handle = param->handle;
lorevee 0:1902469bdd2d 419 //uint8_t data_length = param->len; //not used
lorevee 0:1902469bdd2d 420 uint8_t *att_data = (uint8_t *)param->data;
lorevee 0:1902469bdd2d 421
lorevee 0:1902469bdd2d 422
lorevee 0:1902469bdd2d 423 uint8_t i;
lorevee 0:1902469bdd2d 424 uint16_t conn_handle;
lorevee 0:1902469bdd2d 425 uint16_t attr_handle;
lorevee 0:1902469bdd2d 426 uint8_t value_len;
lorevee 0:1902469bdd2d 427 uint8_t attr_value[6];
lorevee 0:1902469bdd2d 428 char* mems;
lorevee 0:1902469bdd2d 429
lorevee 0:1902469bdd2d 430 if (handle == slaveDev.star_config_char_handle + 1) {
lorevee 0:1902469bdd2d 431
lorevee 0:1902469bdd2d 432 perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 433 if (att_data[0]==0x01) {
lorevee 0:1902469bdd2d 434 /* Disabling all previously enabled notifications */
lorevee 0:1902469bdd2d 435 disableAllNotifications();
lorevee 0:1902469bdd2d 436 }//if
lorevee 0:1902469bdd2d 437 setNewNodesScanning(att_data[0]);
lorevee 0:1902469bdd2d 438
lorevee 0:1902469bdd2d 439
lorevee 0:1902469bdd2d 440 } else if (handle == slaveDev.star_config_char_handle + 2) {
lorevee 0:1902469bdd2d 441 if (att_data[0]==0x01) {
lorevee 0:1902469bdd2d 442 //printf("\r\nEnable scanning notification\n");
lorevee 0:1902469bdd2d 443 STORE_LE_16(slaveDev.star_config_value,(HAL_GetTick()>>3)); /* Timestamp */
lorevee 0:1902469bdd2d 444 slaveDev.star_config_value[2] = perDevs.discovery_enabled;
lorevee 0:1902469bdd2d 445 slaveDev.star_config_value_len = 3;
lorevee 0:1902469bdd2d 446
lorevee 0:1902469bdd2d 447 /* send the status of the scanning when notifications are enabled */
lorevee 0:1902469bdd2d 448 notifyMaster(slaveDev.star_config_value_len, slaveDev.star_config_value,
lorevee 0:1902469bdd2d 449 slaveDev.star_config_char_handle);
lorevee 0:1902469bdd2d 450
lorevee 0:1902469bdd2d 451 /* enable here the data notifications since sometimes the relative command gets lost (FIXME) */
lorevee 0:1902469bdd2d 452 //printf("\r\nEnable data notification (0)\n");
lorevee 0:1902469bdd2d 453 slaveDev.star_data_char_notify = 1;
lorevee 0:1902469bdd2d 454
lorevee 0:1902469bdd2d 455 } else if (att_data[0]==0x00) {
lorevee 0:1902469bdd2d 456 //printf("\r\nDisable scanning notification\n");
lorevee 0:1902469bdd2d 457 }
lorevee 0:1902469bdd2d 458
lorevee 0:1902469bdd2d 459 } else if (handle == slaveDev.star_data_char_handle + 2) {
lorevee 0:1902469bdd2d 460 if (att_data[0]==0x01) {
lorevee 0:1902469bdd2d 461 //printf("\r\nEnable data notification (1)\n");
lorevee 0:1902469bdd2d 462 slaveDev.star_data_char_notify = 1;
lorevee 0:1902469bdd2d 463
lorevee 0:1902469bdd2d 464
lorevee 0:1902469bdd2d 465 } else if (att_data[0]==0x00) {
lorevee 0:1902469bdd2d 466 //printf("\r\nDisable data notification\n");
lorevee 0:1902469bdd2d 467 slaveDev.star_data_char_notify = 0;
lorevee 0:1902469bdd2d 468
lorevee 0:1902469bdd2d 469 }
lorevee 0:1902469bdd2d 470
lorevee 0:1902469bdd2d 471 } else if (handle == slaveDev.star_data_char_handle + 1) {
lorevee 0:1902469bdd2d 472
lorevee 0:1902469bdd2d 473 /*
lorevee 0:1902469bdd2d 474 * Forward the command to the proper peripheral node.
lorevee 0:1902469bdd2d 475 * It can be:
lorevee 0:1902469bdd2d 476 * - the ON/OFF of a LED
lorevee 0:1902469bdd2d 477 * - the notification enabling/disabling for a MIC Level or a Proximity Sensor
lorevee 0:1902469bdd2d 478 * The coming data are received according to the following format:
lorevee 0:1902469bdd2d 479 * |Node ID | Type ID | value |
lorevee 0:1902469bdd2d 480 * |2 bytes | 1 byte | x bytes |
lorevee 0:1902469bdd2d 481 */
lorevee 0:1902469bdd2d 482
lorevee 0:1902469bdd2d 483 i = Get_Device_Index_From_Addr(att_data);
lorevee 0:1902469bdd2d 484 if ((i < MAX_NUM_OF_NODES) && (!perDevs.is_disconnected[i]) && (perDevs.cfg_char_handle[i] != 0)) {
lorevee 0:1902469bdd2d 485 conn_handle = perDevs.connection_handle[i];
lorevee 0:1902469bdd2d 486
lorevee 0:1902469bdd2d 487 switch (att_data[2]) {
lorevee 0:1902469bdd2d 488
lorevee 0:1902469bdd2d 489
lorevee 0:1902469bdd2d 490 //LED_TYPE_ID
lorevee 0:1902469bdd2d 491 case LED_TYPE_ID:
lorevee 0:1902469bdd2d 492 attr_handle = perDevs.cfg_char_handle[i] + 1;
lorevee 0:1902469bdd2d 493 value_len = 5; /* 4 bytes for the feature mask + 1 byte for the command (0=ON, 1=OFF) */
lorevee 0:1902469bdd2d 494 attr_value[0] = (uint8_t)(((uint32_t)FEATURE_MASK_LED_EVENTS) >> 24);
lorevee 0:1902469bdd2d 495 attr_value[1] = (uint8_t)(((uint32_t)FEATURE_MASK_LED_EVENTS) >> 16);
lorevee 0:1902469bdd2d 496 attr_value[2] = (uint8_t)(((uint32_t)FEATURE_MASK_LED_EVENTS) >> 8);
lorevee 0:1902469bdd2d 497 attr_value[3] = (uint8_t)(((uint32_t)FEATURE_MASK_LED_EVENTS));
lorevee 0:1902469bdd2d 498 attr_value[4] = att_data[3];
lorevee 0:1902469bdd2d 499
lorevee 0:1902469bdd2d 500 writeCharacValueWithoutResp(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 501
lorevee 0:1902469bdd2d 502 perDevs.readDeviceIdx = i;
lorevee 0:1902469bdd2d 503 break;
lorevee 0:1902469bdd2d 504
lorevee 0:1902469bdd2d 505
lorevee 0:1902469bdd2d 506
lorevee 0:1902469bdd2d 507 //MICLEVEL_TYPE_ID
lorevee 0:1902469bdd2d 508 case MICLEVEL_TYPE_ID:
lorevee 0:1902469bdd2d 509 //perDevs.status = CHANGE_NOTIFICATION_STATUS;//47
lorevee 0:1902469bdd2d 510
lorevee 0:1902469bdd2d 511 if (readCompleted == 0){
lorevee 0:1902469bdd2d 512 notificationPending = 1;
lorevee 0:1902469bdd2d 513
lorevee 0:1902469bdd2d 514 /* Fill the temp struct */
lorevee 0:1902469bdd2d 515 notifyP->att_data = att_data;
lorevee 0:1902469bdd2d 516 notifyP->attr_value = attr_value;
lorevee 0:1902469bdd2d 517 notifyP->conn_handle = conn_handle;
lorevee 0:1902469bdd2d 518 notifyP->i = i;
lorevee 0:1902469bdd2d 519 notifyP->feature_mask = FEATURE_MASK_MIC;
lorevee 0:1902469bdd2d 520 notifyP->frequency = notification_freq;
lorevee 0:1902469bdd2d 521
lorevee 0:1902469bdd2d 522 /* Then, call the Change_Notification_Status from the readCallback with these params */
lorevee 0:1902469bdd2d 523
lorevee 0:1902469bdd2d 524 }else if (readCompleted == 1) {
lorevee 0:1902469bdd2d 525 notificationPending = 0;
lorevee 0:1902469bdd2d 526 Change_Notification_Status(att_data, attr_value, conn_handle, i, FEATURE_MASK_MIC, notification_freq);
lorevee 0:1902469bdd2d 527 }
lorevee 0:1902469bdd2d 528 perDevs.prx_on[i] = attr_value[0];
lorevee 0:1902469bdd2d 529 printf("\r\nMIC notifications [%d] %s (status %d, discovery %d)\n", i, (attr_value[0]==1 ? "ON" : "OFF"), perDevs.status, perDevs.discovery_enabled);
lorevee 0:1902469bdd2d 530
lorevee 0:1902469bdd2d 531 #if SCAN_AFTER_NOTIFICATION
lorevee 0:1902469bdd2d 532 /* Restart peripheral discovery and notification*/
lorevee 0:1902469bdd2d 533 if (attr_value[0]!=1){
lorevee 0:1902469bdd2d 534 perDevs.discovery_enabled = 1;
lorevee 0:1902469bdd2d 535 setNewNodesScanning(0x01);
lorevee 0:1902469bdd2d 536 //HAL_Delay(300);
lorevee 0:1902469bdd2d 537 }
lorevee 0:1902469bdd2d 538 #endif
lorevee 0:1902469bdd2d 539 break;
lorevee 0:1902469bdd2d 540
lorevee 0:1902469bdd2d 541
lorevee 0:1902469bdd2d 542
lorevee 0:1902469bdd2d 543
lorevee 0:1902469bdd2d 544
lorevee 0:1902469bdd2d 545 //PRX_TYPE_ID
lorevee 0:1902469bdd2d 546 case PRX_TYPE_ID:
lorevee 0:1902469bdd2d 547 //perDevs.status = CHANGE_NOTIFICATION_STATUS;//47
lorevee 0:1902469bdd2d 548
lorevee 0:1902469bdd2d 549 if (readCompleted == 0){
lorevee 0:1902469bdd2d 550 notificationPending = 1;
lorevee 0:1902469bdd2d 551
lorevee 0:1902469bdd2d 552 /* Fill the temp struct */
lorevee 0:1902469bdd2d 553 notifyP->att_data = att_data;
lorevee 0:1902469bdd2d 554 notifyP->attr_value = attr_value;
lorevee 0:1902469bdd2d 555 notifyP->conn_handle = conn_handle;
lorevee 0:1902469bdd2d 556 notifyP->i = i;
lorevee 0:1902469bdd2d 557 notifyP->feature_mask = FEATURE_MASK_PROX;
lorevee 0:1902469bdd2d 558 notifyP->frequency = SENDING_INTERVAL_100MS_MULTIPLE;
lorevee 0:1902469bdd2d 559
lorevee 0:1902469bdd2d 560 /* Then, call the Change_Notification_Status from the readCallback with these params */
lorevee 0:1902469bdd2d 561
lorevee 0:1902469bdd2d 562 }else if (readCompleted == 1) {
lorevee 0:1902469bdd2d 563 notificationPending = 0;
lorevee 0:1902469bdd2d 564 Change_Notification_Status(att_data, attr_value, conn_handle, i, FEATURE_MASK_PROX, SENDING_INTERVAL_100MS_MULTIPLE);
lorevee 0:1902469bdd2d 565 }
lorevee 0:1902469bdd2d 566 perDevs.prx_on[i] = attr_value[0];
lorevee 0:1902469bdd2d 567 printf("\r\nPRX notifications [%d] %s (status %d)\n", i, (attr_value[0]==1 ? "ON" : "OFF"), perDevs.status);
lorevee 0:1902469bdd2d 568
lorevee 0:1902469bdd2d 569 #if SCAN_AFTER_NOTIFICATION
lorevee 0:1902469bdd2d 570 /* Restart peripheral discovery and notification*/
lorevee 0:1902469bdd2d 571 if (attr_value[0]!=1){
lorevee 0:1902469bdd2d 572 perDevs.discovery_enabled = 1;
lorevee 0:1902469bdd2d 573 setNewNodesScanning(0x01);
lorevee 0:1902469bdd2d 574 //HAL_Delay(300);
lorevee 0:1902469bdd2d 575 }
lorevee 0:1902469bdd2d 576 #endif
lorevee 0:1902469bdd2d 577 break;
lorevee 0:1902469bdd2d 578
lorevee 0:1902469bdd2d 579
lorevee 0:1902469bdd2d 580
lorevee 0:1902469bdd2d 581 //ACC_TYPE_ID
lorevee 0:1902469bdd2d 582 //GYR_TYPE_ID
lorevee 0:1902469bdd2d 583 //MAG_TYPE_ID
lorevee 0:1902469bdd2d 584 case ACC_TYPE_ID:
lorevee 0:1902469bdd2d 585 case GYR_TYPE_ID:
lorevee 0:1902469bdd2d 586 case MAG_TYPE_ID:
lorevee 0:1902469bdd2d 587 //perDevs.status = CHANGE_NOTIFICATION_STATUS;//47
lorevee 0:1902469bdd2d 588
lorevee 0:1902469bdd2d 589 if (readCompleted == 0){
lorevee 0:1902469bdd2d 590 notificationPending = 1;
lorevee 0:1902469bdd2d 591
lorevee 0:1902469bdd2d 592 /* Fill the temp struct */
lorevee 0:1902469bdd2d 593 notifyP->att_data = att_data;
lorevee 0:1902469bdd2d 594 notifyP->attr_value = attr_value;
lorevee 0:1902469bdd2d 595 notifyP->conn_handle = conn_handle;
lorevee 0:1902469bdd2d 596 notifyP->i = i;
lorevee 0:1902469bdd2d 597 notifyP->feature_mask = FEATURE_MASK_ACC;
lorevee 0:1902469bdd2d 598 notifyP->frequency = SENDING_INTERVAL_100MS_MULTIPLE;
lorevee 0:1902469bdd2d 599
lorevee 0:1902469bdd2d 600
lorevee 0:1902469bdd2d 601 /* Then, call the Change_Notification_Status from the readCallback with these params */
lorevee 0:1902469bdd2d 602
lorevee 0:1902469bdd2d 603 }else if (readCompleted == 1) {
lorevee 0:1902469bdd2d 604 notificationPending = 0;
lorevee 0:1902469bdd2d 605 Change_Notification_Status(att_data, attr_value, conn_handle, i, FEATURE_MASK_ACC, SENDING_INTERVAL_100MS_MULTIPLE);
lorevee 0:1902469bdd2d 606 }
lorevee 0:1902469bdd2d 607 perDevs.agm_on[i] = attr_value[0];
lorevee 0:1902469bdd2d 608
lorevee 0:1902469bdd2d 609 if (att_data[2] == 0x09) {
lorevee 0:1902469bdd2d 610 perDevs.acc_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 611 mems = "ACC";
lorevee 0:1902469bdd2d 612
lorevee 0:1902469bdd2d 613 } else if (att_data[2] == 0x0A) {
lorevee 0:1902469bdd2d 614 perDevs.gyr_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 615 mems = "GYR";
lorevee 0:1902469bdd2d 616
lorevee 0:1902469bdd2d 617 } else if (att_data[2] == 0x0B) {
lorevee 0:1902469bdd2d 618 perDevs.mag_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 619 mems = "MAG";
lorevee 0:1902469bdd2d 620 }
lorevee 0:1902469bdd2d 621
lorevee 0:1902469bdd2d 622 printf("\r\nAGM notifications [%d] %s (%s) (status %d)\n", i, (attr_value[0]==1 ? "ON" : "OFF"), mems, perDevs.status);
lorevee 0:1902469bdd2d 623 #if SCAN_AFTER_NOTIFICATION
lorevee 0:1902469bdd2d 624 /* Restart peripheral discovery and notification*/
lorevee 0:1902469bdd2d 625 if (attr_value[0]!=1){
lorevee 0:1902469bdd2d 626 perDevs.discovery_enabled = 1;
lorevee 0:1902469bdd2d 627 setNewNodesScanning(0x01);
lorevee 0:1902469bdd2d 628 //HAL_Delay(300);
lorevee 0:1902469bdd2d 629 }
lorevee 0:1902469bdd2d 630 #endif
lorevee 0:1902469bdd2d 631 break;
lorevee 0:1902469bdd2d 632
lorevee 0:1902469bdd2d 633
lorevee 0:1902469bdd2d 634
lorevee 0:1902469bdd2d 635 //SFUSION_TYPE_ID
lorevee 0:1902469bdd2d 636 case SFUSION_TYPE_ID:
lorevee 0:1902469bdd2d 637 //perDevs.status = CHANGE_NOTIFICATION_STATUS;//47
lorevee 0:1902469bdd2d 638
lorevee 0:1902469bdd2d 639 if (readCompleted == 0){
lorevee 0:1902469bdd2d 640 notificationPending = 1;
lorevee 0:1902469bdd2d 641
lorevee 0:1902469bdd2d 642 /* Fill the temp struct */
lorevee 0:1902469bdd2d 643 notifyP->att_data = att_data;
lorevee 0:1902469bdd2d 644 notifyP->attr_value = attr_value;
lorevee 0:1902469bdd2d 645 notifyP->conn_handle = conn_handle;
lorevee 0:1902469bdd2d 646 notifyP->i = i;
lorevee 0:1902469bdd2d 647 notifyP->feature_mask = FEATURE_MASK_SENSORFUSION;
lorevee 0:1902469bdd2d 648 notifyP->frequency = SENDING_INTERVAL_100MS_MULTIPLE;
lorevee 0:1902469bdd2d 649
lorevee 0:1902469bdd2d 650 /* Then, call the Change_Notification_Status from the readCallback with these params */
lorevee 0:1902469bdd2d 651
lorevee 0:1902469bdd2d 652 }else if (readCompleted == 1) {
lorevee 0:1902469bdd2d 653 notificationPending = 0;
lorevee 0:1902469bdd2d 654 Change_Notification_Status(att_data, attr_value, conn_handle, i, FEATURE_MASK_SENSORFUSION, SENDING_INTERVAL_100MS_MULTIPLE);
lorevee 0:1902469bdd2d 655 }
lorevee 0:1902469bdd2d 656
lorevee 0:1902469bdd2d 657 perDevs.sfusion_on[i] = attr_value[0];
lorevee 0:1902469bdd2d 658 printf("\r\nSFUSION notifications [%d] %s (status %d)\n", i, (attr_value[0]==1 ? "ON" : "OFF"), perDevs.status);
lorevee 0:1902469bdd2d 659
lorevee 0:1902469bdd2d 660 #if SCAN_AFTER_NOTIFICATION
lorevee 0:1902469bdd2d 661 /* Restart peripheral discovery and notification*/
lorevee 0:1902469bdd2d 662 if (attr_value[0]!=1){
lorevee 0:1902469bdd2d 663 perDevs.discovery_enabled = 1;
lorevee 0:1902469bdd2d 664 setNewNodesScanning(0x01);
lorevee 0:1902469bdd2d 665 //HAL_Delay(300);
lorevee 0:1902469bdd2d 666
lorevee 0:1902469bdd2d 667 }
lorevee 0:1902469bdd2d 668 #endif
lorevee 0:1902469bdd2d 669 break;
lorevee 0:1902469bdd2d 670 }
lorevee 0:1902469bdd2d 671 }//if
lorevee 0:1902469bdd2d 672 }//if-main
lorevee 0:1902469bdd2d 673
lorevee 0:1902469bdd2d 674
lorevee 0:1902469bdd2d 675 }
lorevee 0:1902469bdd2d 676 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 677
lorevee 0:1902469bdd2d 678
lorevee 0:1902469bdd2d 679
lorevee 0:1902469bdd2d 680
lorevee 0:1902469bdd2d 681 /* Retrieve the device index from the peripheral device address */
lorevee 0:1902469bdd2d 682 uint8_t Get_Device_Index_From_Addr(uint8_t *addr){
lorevee 0:1902469bdd2d 683
lorevee 0:1902469bdd2d 684 uint8_t i;
lorevee 0:1902469bdd2d 685
lorevee 0:1902469bdd2d 686 for (i=0; i<MAX_NUM_OF_NODES; i++) {
lorevee 0:1902469bdd2d 687
lorevee 0:1902469bdd2d 688 if ((perDevs.devInfo[i].bdaddr[NODE_ID_B2] == addr[0]) && (perDevs.devInfo[i].bdaddr[NODE_ID_B1] == addr[1])) {
lorevee 0:1902469bdd2d 689 return i;
lorevee 0:1902469bdd2d 690 }
lorevee 0:1902469bdd2d 691 }
lorevee 0:1902469bdd2d 692 return MAX_NUM_OF_NODES;
lorevee 0:1902469bdd2d 693 }
lorevee 0:1902469bdd2d 694 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 695
lorevee 0:1902469bdd2d 696
lorevee 0:1902469bdd2d 697
lorevee 0:1902469bdd2d 698
lorevee 0:1902469bdd2d 699 /**
lorevee 0:1902469bdd2d 700 * @brief This function is called to Enable/Disable MIC/PRX/AGM/SFusion notifications
lorevee 0:1902469bdd2d 701 * @param att_data : pointer to the modified attribute data
lorevee 0:1902469bdd2d 702 * @param connection handle
lorevee 0:1902469bdd2d 703 * @param peripheral device index
lorevee 0:1902469bdd2d 704 * @param feature mask
lorevee 0:1902469bdd2d 705 * @param notification frequency
lorevee 0:1902469bdd2d 706 * @retval None
lorevee 0:1902469bdd2d 707 */
lorevee 0:1902469bdd2d 708 void Change_Notification_Status(uint8_t *att_data, uint8_t *attr_value, uint16_t conn_handle, uint8_t i,
lorevee 0:1902469bdd2d 709 uint32_t feature_mask, uint8_t frequency) {
lorevee 0:1902469bdd2d 710 printf("\r\nChange_Notification_Status (status: %d) (read: %s) (write: %s)\n", perDevs.status, (readCompleted == 1 ? "completed" : "pending"),(writeDescriptorCompleted == 1 ? "completed" : "pending"));//DEBUG
lorevee 0:1902469bdd2d 711
lorevee 0:1902469bdd2d 712
lorevee 0:1902469bdd2d 713
lorevee 0:1902469bdd2d 714 uint8_t value_len;
lorevee 0:1902469bdd2d 715 uint16_t attr_handle;
lorevee 0:1902469bdd2d 716
lorevee 0:1902469bdd2d 717
lorevee 0:1902469bdd2d 718 if (att_data[3] == 1) {
lorevee 0:1902469bdd2d 719
lorevee 0:1902469bdd2d 720 /* Setting notification frequency (wait of 2s for writing op)*/
lorevee 0:1902469bdd2d 721 setNotificationProperty(conn_handle, i, feature_mask, NOTIFICATION_FREQ_CMD, frequency);
lorevee 0:1902469bdd2d 722
lorevee 0:1902469bdd2d 723 /* Stopping the scanning for new peripheral nodes */
lorevee 0:1902469bdd2d 724 if (perDevs.discovery_enabled) {
lorevee 0:1902469bdd2d 725 //Disable scanning when notification is enabled
lorevee 0:1902469bdd2d 726 setNewNodesScanning(0x02);
lorevee 0:1902469bdd2d 727 }
lorevee 0:1902469bdd2d 728
lorevee 0:1902469bdd2d 729 /* Disabling all previously enabled notifications */
lorevee 0:1902469bdd2d 730 disableAllNotifications();
lorevee 0:1902469bdd2d 731
lorevee 0:1902469bdd2d 732 }//if
lorevee 0:1902469bdd2d 733
lorevee 0:1902469bdd2d 734
lorevee 0:1902469bdd2d 735
lorevee 0:1902469bdd2d 736
lorevee 0:1902469bdd2d 737 /* Enabling/Disabling notifications */
lorevee 0:1902469bdd2d 738 value_len = 2;
lorevee 0:1902469bdd2d 739 attr_value[0] = att_data[3];
lorevee 0:1902469bdd2d 740
lorevee 0:1902469bdd2d 741 if (feature_mask==FEATURE_MASK_MIC){
lorevee 0:1902469bdd2d 742 attr_handle = perDevs.mic_char_handle[i] + 2;
lorevee 0:1902469bdd2d 743 perDevs.mic_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 744
lorevee 0:1902469bdd2d 745 } else if (feature_mask==FEATURE_MASK_PROX){
lorevee 0:1902469bdd2d 746 attr_handle = perDevs.prx_char_handle[i] + 2;
lorevee 0:1902469bdd2d 747 perDevs.prx_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 748
lorevee 0:1902469bdd2d 749 } else if (feature_mask==FEATURE_MASK_ACC){
lorevee 0:1902469bdd2d 750 attr_handle = perDevs.agm_char_handle[i] + 2;
lorevee 0:1902469bdd2d 751 perDevs.agm_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 752
lorevee 0:1902469bdd2d 753 } else if (feature_mask==FEATURE_MASK_SENSORFUSION){
lorevee 0:1902469bdd2d 754 attr_handle = perDevs.sfusion_char_handle[i] + 2;
lorevee 0:1902469bdd2d 755 perDevs.sfusion_event_enabled = attr_value[0];
lorevee 0:1902469bdd2d 756 }
lorevee 0:1902469bdd2d 757
lorevee 0:1902469bdd2d 758
lorevee 0:1902469bdd2d 759 // if ((discoveryCompleted == 1)){
lorevee 0:1902469bdd2d 760
lorevee 0:1902469bdd2d 761 ble_error_t err;
lorevee 0:1902469bdd2d 762
lorevee 0:1902469bdd2d 763 writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 764 err = writeCharacDescriptorWithError(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 765
lorevee 0:1902469bdd2d 766 if (err != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 767 writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 768 printf("\r\nERROR Enabling/Disabling Notification (err: %d) (stat: %d)\n", err, perDevs.status);
lorevee 0:1902469bdd2d 769 // HAL_Delay(500);
lorevee 0:1902469bdd2d 770 // //retrying
lorevee 0:1902469bdd2d 771 // err = writeCharacDescriptorWithError(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 772 // if (err != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 773 // writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 774 // printf("\r\nERROR Enabling/Disabling Notification (err: %d) (stat: %d)\n", err, perDevs.status);
lorevee 0:1902469bdd2d 775 // }
lorevee 0:1902469bdd2d 776 }
lorevee 0:1902469bdd2d 777
lorevee 0:1902469bdd2d 778 //
lorevee 0:1902469bdd2d 779 //
lorevee 0:1902469bdd2d 780 // // discovery not completed
lorevee 0:1902469bdd2d 781 // }else {
lorevee 0:1902469bdd2d 782 // ble_error_t err;
lorevee 0:1902469bdd2d 783 //
lorevee 0:1902469bdd2d 784 // //waiting for scan stopping
lorevee 0:1902469bdd2d 785 // HAL_Delay(3000);
lorevee 0:1902469bdd2d 786 // writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 787 //
lorevee 0:1902469bdd2d 788 // //Send the enable/disable
lorevee 0:1902469bdd2d 789 // err = writeCharacDescriptorWithError(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 790 //
lorevee 0:1902469bdd2d 791 // if (err != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 792 // //printf("\r\nWrite charac descriptor failed! (%d)\n", err);
lorevee 0:1902469bdd2d 793 // HAL_Delay(500);
lorevee 0:1902469bdd2d 794 // //retrying
lorevee 0:1902469bdd2d 795 // err = writeCharacDescriptorWithError(conn_handle, attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 796 // if (err != BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 797 // writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 798 // printf("\r\nERROR Enabling/Disabling Notification (%d)\n", err);
lorevee 0:1902469bdd2d 799 // }
lorevee 0:1902469bdd2d 800 // }
lorevee 0:1902469bdd2d 801 // }//if-else-discovery-completed
lorevee 0:1902469bdd2d 802
lorevee 0:1902469bdd2d 803
lorevee 0:1902469bdd2d 804
lorevee 0:1902469bdd2d 805
lorevee 0:1902469bdd2d 806
lorevee 0:1902469bdd2d 807 /* WUP notification enable/disable */
lorevee 0:1902469bdd2d 808 // if(attr_value[0]==0x00){
lorevee 0:1902469bdd2d 809 // for (uint8_t j=0; j<(perDevs.connDevices+perDevs.discDevices); j++) {
lorevee 0:1902469bdd2d 810 // if (!perDevs.wup_event[j] && perDevs.devInfo[j].dev_v == NODE_ME1 && perDevs.is_connected[j]) {
lorevee 0:1902469bdd2d 811 // attr_handle = perDevs.wup_char_handle[j] + 2;
lorevee 0:1902469bdd2d 812 // attr_value[0] = 0x01;
lorevee 0:1902469bdd2d 813 //
lorevee 0:1902469bdd2d 814 // setNotificationProperty(perDevs.connection_handle[j], j, FEATURE_MASK_WAKEUP_EVENTS, WAKEUP_NOTIFICATION_CMD, 1);
lorevee 0:1902469bdd2d 815 //
lorevee 0:1902469bdd2d 816 // if (discoveryCompleted == 1){
lorevee 0:1902469bdd2d 817 //
lorevee 0:1902469bdd2d 818 // writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 819 // ble_error_t wupErrOn = writeCharacDescriptorWithError(perDevs.connection_handle[j], attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 820 //
lorevee 0:1902469bdd2d 821 // if (wupErrOn == BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 822 // perDevs.wup_event_enabled = 1;
lorevee 0:1902469bdd2d 823 // perDevs.wup_event[j] = 1;
lorevee 0:1902469bdd2d 824 // printf("\r\nWUP notification on node [%d] ON\n", j);
lorevee 0:1902469bdd2d 825 //
lorevee 0:1902469bdd2d 826 // } else {
lorevee 0:1902469bdd2d 827 // printf("\r\nWrite WUP char descriptor failed! (%d)\n", wupErrOn);
lorevee 0:1902469bdd2d 828 //
lorevee 0:1902469bdd2d 829 // }//if-else
lorevee 0:1902469bdd2d 830 // writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 831 //
lorevee 0:1902469bdd2d 832 // }//if-else-discovery-completed
lorevee 0:1902469bdd2d 833 // }//if
lorevee 0:1902469bdd2d 834 // }//for
lorevee 0:1902469bdd2d 835 //
lorevee 0:1902469bdd2d 836 //
lorevee 0:1902469bdd2d 837 // if (perDevs.wup_event_enabled == 1)
lorevee 0:1902469bdd2d 838 // //printf("\r\nAll WUP notifications turned ON\n");//DEBUG
lorevee 0:1902469bdd2d 839 // perDevs.status = ALL_DATA_READ;
lorevee 0:1902469bdd2d 840 //
lorevee 0:1902469bdd2d 841 //
lorevee 0:1902469bdd2d 842 // } else{
lorevee 0:1902469bdd2d 843 // for (uint8_t j=0; j<(perDevs.connDevices+perDevs.discDevices); j++) {
lorevee 0:1902469bdd2d 844 // if ((perDevs.wup_event[j]) && (perDevs.devInfo[j].dev_v == NODE_ME1) && (perDevs.is_connected[j])) {
lorevee 0:1902469bdd2d 845 // attr_handle = perDevs.wup_char_handle[j] + 2;
lorevee 0:1902469bdd2d 846 // attr_value[0] = 0x00;
lorevee 0:1902469bdd2d 847 //
lorevee 0:1902469bdd2d 848 //
lorevee 0:1902469bdd2d 849 // if (discoveryCompleted == 1){
lorevee 0:1902469bdd2d 850 //
lorevee 0:1902469bdd2d 851 // writeDescriptorCompleted=0;
lorevee 0:1902469bdd2d 852 // ble_error_t wupErrOff = writeCharacDescriptorWithError(perDevs.connection_handle[j], attr_handle, value_len, attr_value);
lorevee 0:1902469bdd2d 853 //
lorevee 0:1902469bdd2d 854 // if (wupErrOff == BLE_ERROR_NONE){
lorevee 0:1902469bdd2d 855 // perDevs.wup_event_enabled = 0;
lorevee 0:1902469bdd2d 856 // perDevs.wup_event[j] = 0;
lorevee 0:1902469bdd2d 857 // printf("\r\nWUP notification on node [%d] OFF\n", j);
lorevee 0:1902469bdd2d 858 //
lorevee 0:1902469bdd2d 859 // } else {
lorevee 0:1902469bdd2d 860 // printf("\r\nWrite WUP char descriptor failed! (%d)\n", wupErrOff);
lorevee 0:1902469bdd2d 861 //
lorevee 0:1902469bdd2d 862 // }
lorevee 0:1902469bdd2d 863 // writeDescriptorCompleted=1;
lorevee 0:1902469bdd2d 864 //
lorevee 0:1902469bdd2d 865 // }//if-discovery-completed
lorevee 0:1902469bdd2d 866 // }//if
lorevee 0:1902469bdd2d 867 // }//for
lorevee 0:1902469bdd2d 868 //
lorevee 0:1902469bdd2d 869 // perDevs.status = NOTIFICATIONS_DATA_READ;
lorevee 0:1902469bdd2d 870 //
lorevee 0:1902469bdd2d 871 // }//if-else-wup
lorevee 0:1902469bdd2d 872
lorevee 0:1902469bdd2d 873 attr_value[0] = att_data[3];
lorevee 0:1902469bdd2d 874 perDevs.readDeviceIdx = i;
lorevee 0:1902469bdd2d 875
lorevee 0:1902469bdd2d 876 notificationPending = 0;
lorevee 0:1902469bdd2d 877
lorevee 0:1902469bdd2d 878 //Return to connectionProcess
lorevee 0:1902469bdd2d 879 perDevs.status = CONN_INIT;
lorevee 0:1902469bdd2d 880
lorevee 0:1902469bdd2d 881
lorevee 0:1902469bdd2d 882
lorevee 0:1902469bdd2d 883
lorevee 0:1902469bdd2d 884 }
lorevee 0:1902469bdd2d 885 /*----------------------------------------------------------------------------*/