This software setup a central node of a star topology network

Dependencies:   MQTT target_st_bluenrg

Fork of ble-star-mbed by Lorenzo Invidia

Committer:
lorevee
Date:
Mon Feb 26 10:10:37 2018 +0000
Revision:
1:110b5e896bc9
Parent:
0:1902469bdd2d
Child:
2:1525f4848cf2
Notification frequency fixes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lorevee 0:1902469bdd2d 1 #ifndef __BLEMASTERSERVICE_H__
lorevee 0:1902469bdd2d 2 #define __BLEMASTERSERVICE_H__
lorevee 0:1902469bdd2d 3
lorevee 0:1902469bdd2d 4 #include <events/mbed_events.h>
lorevee 0:1902469bdd2d 5 #include <mbed.h>
lorevee 0:1902469bdd2d 6 #include "ble/BLE.h"
lorevee 0:1902469bdd2d 7 #include "ble/Gap.h"
lorevee 0:1902469bdd2d 8 #include "ble/DiscoveredCharacteristic.h"
lorevee 0:1902469bdd2d 9 #include "ble/DiscoveredService.h"
lorevee 0:1902469bdd2d 10 #include <UUID.h>
lorevee 0:1902469bdd2d 11 #include <BleSlaveService.h>
lorevee 0:1902469bdd2d 12
lorevee 0:1902469bdd2d 13
lorevee 0:1902469bdd2d 14
lorevee 0:1902469bdd2d 15 /* Max number of connectable nodes */
lorevee 0:1902469bdd2d 16 #define MAX_NUM_OF_NODES 7
lorevee 0:1902469bdd2d 17
lorevee 0:1902469bdd2d 18 /* brief Data type length */
lorevee 0:1902469bdd2d 19 #define ONE_BYTE_LEN 1
lorevee 0:1902469bdd2d 20 #define TWO_BYTES_LEN 2
lorevee 0:1902469bdd2d 21
lorevee 0:1902469bdd2d 22 #define ENV_DATA_LEN_SHORT 8
lorevee 0:1902469bdd2d 23 #define ENV_DATA_LEN_LONG 12
lorevee 0:1902469bdd2d 24 #define PRESS_DATA_LEN 4
lorevee 0:1902469bdd2d 25 #define HUM_DATA_LEN 2
lorevee 0:1902469bdd2d 26 #define TEMP_DATA_LEN 2
lorevee 0:1902469bdd2d 27 #define LED_DATA_LEN ONE_BYTE_LEN
lorevee 0:1902469bdd2d 28 #define MIC_DATA_LEN ONE_BYTE_LEN
lorevee 0:1902469bdd2d 29 #define LUX_DATA_LEN TWO_BYTES_LEN
lorevee 0:1902469bdd2d 30 #define PRX_DATA_LEN TWO_BYTES_LEN
lorevee 0:1902469bdd2d 31 #define ACC_DATA_LEN 6
lorevee 0:1902469bdd2d 32 #define GYR_DATA_LEN 6
lorevee 0:1902469bdd2d 33 #define MAG_DATA_LEN 6
lorevee 0:1902469bdd2d 34 #define SFUSION_DATA_LEN 6
lorevee 0:1902469bdd2d 35 #define X_DATA_LEN 2
lorevee 0:1902469bdd2d 36 #define Y_DATA_LEN 2
lorevee 0:1902469bdd2d 37 #define Z_DATA_LEN 2
lorevee 0:1902469bdd2d 38 #define WUP_DATA_LEN 0
lorevee 0:1902469bdd2d 39 #define STATUS_DATA_LEN 0
lorevee 0:1902469bdd2d 40
lorevee 0:1902469bdd2d 41 #define TSTAMP_LEN 2
lorevee 0:1902469bdd2d 42 #define NODE_ID_LEN 2
lorevee 0:1902469bdd2d 43 #define TYPE_ID_LEN 1
lorevee 0:1902469bdd2d 44
lorevee 0:1902469bdd2d 45 #define ATTR_HEAD_LEN TSTAMP_LEN+NODE_ID_LEN+TYPE_ID_LEN
lorevee 0:1902469bdd2d 46 #define ENV_DATA_LEN PRESS_DATA_LEN+HUM_DATA_LEN+TEMP_DATA_LEN+TEMP_DATA_LEN
lorevee 0:1902469bdd2d 47 #define MEMS_DATA_LEN ACC_DATA_LEN+GYR_DATA_LEN+MAG_DATA_LEN
lorevee 0:1902469bdd2d 48
lorevee 0:1902469bdd2d 49 #define INT_VALUE 1
lorevee 0:1902469bdd2d 50 #define FLOAT_VALUE 2
lorevee 0:1902469bdd2d 51
lorevee 0:1902469bdd2d 52
lorevee 0:1902469bdd2d 53 /* Supported peripheral nodes ID */
lorevee 0:1902469bdd2d 54 #define NODE_ME1 0x01 /* MOTENV1 */
lorevee 0:1902469bdd2d 55 #define NODE_FL1 0x02 /* FLIGHT1 */
lorevee 0:1902469bdd2d 56 #define NODE_AM1 0x03 /* ALLMEMS1 */
lorevee 0:1902469bdd2d 57
lorevee 0:1902469bdd2d 58 #define BDADDR_SIZE 6
lorevee 0:1902469bdd2d 59 #define NODE_ID_B1 0 /* byte of the node BLE address used as 1st byte of the node ID */
lorevee 0:1902469bdd2d 60 #define NODE_ID_B2 1 /* byte of the node BLE address used as 2nd byte of the node ID */
lorevee 0:1902469bdd2d 61 #define NODE_ID_OFFSET NODE_ID_B1
lorevee 0:1902469bdd2d 62
lorevee 0:1902469bdd2d 63 #define ME1_WUP_EVENT_ENABLED 1 /* To enable/disable Wake Up events from MOTENV1 nodes */
lorevee 0:1902469bdd2d 64 #define AM1_WUP_EVENT_ENABLED 0 /* To enable/disable Wake Up events from ALLMEMS1 nodes */
lorevee 0:1902469bdd2d 65 /* It is present, without the need of any additional board, on the X-NUCLEO-IKS01A2. */
lorevee 0:1902469bdd2d 66 #define MIC_PRESENT (0x20 | 0x04) /* MIC on the X-NUCLEO-CCA02M1 (in this case the fw running on the node is the ALLMEMS1). */
lorevee 0:1902469bdd2d 67 #define PLUX_PRESENT (0x03) /* Proximity and Lux sensor on X-NUCLEO-6180XA1 (in this case the fw running on the node */
lorevee 0:1902469bdd2d 68 /* is the FLIGHT1). */
lorevee 0:1902469bdd2d 69
lorevee 0:1902469bdd2d 70 #define BDADDR_SIZE 6
lorevee 0:1902469bdd2d 71 #define NODE_ID_B1 0 /* byte of the node BLE address used as 1st byte of the node ID */
lorevee 0:1902469bdd2d 72 #define NODE_ID_B2 1 /* byte of the node BLE address used as 2nd byte of the node ID */
lorevee 0:1902469bdd2d 73 #define NODE_ID_OFFSET NODE_ID_B1
lorevee 0:1902469bdd2d 74
lorevee 0:1902469bdd2d 75 #define BUF_LEN 27
lorevee 0:1902469bdd2d 76
lorevee 0:1902469bdd2d 77 #define ENABLE 1
lorevee 0:1902469bdd2d 78 #define DISABLE 0
lorevee 0:1902469bdd2d 79
lorevee 0:1902469bdd2d 80 #define MANUF_SPECIFIC_TYPE 0xFF
lorevee 0:1902469bdd2d 81 #define STM32_NUCLEO 0x80
lorevee 0:1902469bdd2d 82 #define SENSOR_TILE 0x02
lorevee 0:1902469bdd2d 83 #define BLUE_COIN 0x03
lorevee 0:1902469bdd2d 84 #define WUP_POS 0x0A
lorevee 0:1902469bdd2d 85 #define MIC_POS 0x1A
lorevee 0:1902469bdd2d 86 #define PRX_POS 0x19
lorevee 0:1902469bdd2d 87 #define ACC_POS 0x17
lorevee 0:1902469bdd2d 88 #define SFUS_POS 0x07
lorevee 0:1902469bdd2d 89
lorevee 0:1902469bdd2d 90 /* Feature mask for Temperature1 */
lorevee 0:1902469bdd2d 91 #define FEATURE_MASK_TEMP1 0x00040000
lorevee 0:1902469bdd2d 92 /* Feature mask for Temperature2 */
lorevee 0:1902469bdd2d 93 #define FEATURE_MASK_TEMP2 0x00010000
lorevee 0:1902469bdd2d 94 /* Feature mask for Pressure */
lorevee 0:1902469bdd2d 95 #define FEATURE_MASK_PRESS 0x00100000
lorevee 0:1902469bdd2d 96 /* Feature mask for Humidity */
lorevee 0:1902469bdd2d 97 #define FEATURE_MASK_HUM 0x00080000
lorevee 0:1902469bdd2d 98 /* Feature mask for Accelerometer */
lorevee 0:1902469bdd2d 99 #define FEATURE_MASK_ACC 0x00800000
lorevee 0:1902469bdd2d 100 /* Feature mask for Gyroscope */
lorevee 0:1902469bdd2d 101 #define FEATURE_MASK_GYR 0x00400000
lorevee 0:1902469bdd2d 102 /* Feature mask for Magnetometer */
lorevee 0:1902469bdd2d 103 #define FEATURE_MASK_MAG 0x00200000
lorevee 0:1902469bdd2d 104 /* Feature mask for Sensor fusion */
lorevee 0:1902469bdd2d 105 #define FEATURE_MASK_SENSORFUSION 0x00000100
lorevee 0:1902469bdd2d 106 /* Feature mask for LED */
lorevee 0:1902469bdd2d 107 #define FEATURE_MASK_LED_EVENTS 0x20000000
lorevee 0:1902469bdd2d 108 /* Feature mask for WakeUp EVENT (here used as Motion Detector) */
lorevee 0:1902469bdd2d 109 #define FEATURE_MASK_WAKEUP_EVENTS 0x00000400
lorevee 0:1902469bdd2d 110 /* Feature mask for PROXIMITY EVENT */
lorevee 0:1902469bdd2d 111 #define FEATURE_MASK_PROX 0x02000000
lorevee 0:1902469bdd2d 112 /* Feature mask for MICROPHONE */
lorevee 0:1902469bdd2d 113 #define FEATURE_MASK_MIC 0x04000000
lorevee 0:1902469bdd2d 114 /* Command to set the WakeUp notification (here used as Motion Detector) */
lorevee 0:1902469bdd2d 115 #define WAKEUP_NOTIFICATION_CMD 'w'
lorevee 0:1902469bdd2d 116 /* Command to set the notification frequency */
lorevee 0:1902469bdd2d 117 #define NOTIFICATION_FREQ_CMD 255
lorevee 0:1902469bdd2d 118 /* Notification frequency @50mS (default) */
lorevee 0:1902469bdd2d 119 #define NOTIFICATION_FREQ_50 0
lorevee 0:1902469bdd2d 120 /* Notification frequency @100mS */
lorevee 0:1902469bdd2d 121 #define NOTIFICATION_FREQ_100 1
lorevee 0:1902469bdd2d 122 /* Notification frequency @1S */
lorevee 0:1902469bdd2d 123 #define NOTIFICATION_FREQ_1000 10
lorevee 0:1902469bdd2d 124 /* Notification frequency @5S */
lorevee 0:1902469bdd2d 125 #define NOTIFICATION_FREQ_5000 50
lorevee 0:1902469bdd2d 126 /* Set the notification frequency to 100ms multiple */
lorevee 0:1902469bdd2d 127 #define SENDING_INTERVAL_100MS_MULTIPLE 10
lorevee 0:1902469bdd2d 128 /* Notification frequency when wifi is enabled */
lorevee 0:1902469bdd2d 129 #define NOTIFICATION_FREQ_WIFI_ON NOTIFICATION_FREQ_1000 /* reduced to 1000 from NOTIFICATION_FREQ_5000 */
lorevee 0:1902469bdd2d 130 /* Notification frequency when wifi is disabled */
lorevee 0:1902469bdd2d 131 #define NOTIFICATION_FREQ_WIFI_OFF NOTIFICATION_FREQ_1000
lorevee 0:1902469bdd2d 132 /* 1 to enable mems noifications */
lorevee 0:1902469bdd2d 133 #define ENABLE_MEMS 0
lorevee 0:1902469bdd2d 134 /* 1 to enable the scanning after disabling a notification */
lorevee 0:1902469bdd2d 135 #define SCAN_AFTER_NOTIFICATION 1
lorevee 0:1902469bdd2d 136
lorevee 0:1902469bdd2d 137 extern EventQueue eventQ;
lorevee 0:1902469bdd2d 138
lorevee 0:1902469bdd2d 139
lorevee 0:1902469bdd2d 140
lorevee 0:1902469bdd2d 141 /* This var defines the central role
lorevee 0:1902469bdd2d 142 * 0 if master
lorevee 0:1902469bdd2d 143 * 1 if slave */
lorevee 0:1902469bdd2d 144 extern uint8_t role;
lorevee 0:1902469bdd2d 145
lorevee 0:1902469bdd2d 146 /* Pointer to var (uint8_t role) */
lorevee 0:1902469bdd2d 147 //uint8_t * pRole;
lorevee 0:1902469bdd2d 148
lorevee 0:1902469bdd2d 149
lorevee 0:1902469bdd2d 150
lorevee 0:1902469bdd2d 151 /* Flag to indicate that the characteristic read is completed successful
lorevee 0:1902469bdd2d 152 * 1 successful
lorevee 0:1902469bdd2d 153 * 0 or anything else failed */
lorevee 0:1902469bdd2d 154 extern uint8_t readCompleted;
lorevee 0:1902469bdd2d 155
lorevee 0:1902469bdd2d 156
lorevee 0:1902469bdd2d 157
lorevee 0:1902469bdd2d 158 /* Flag to indicate if the device discovery is completed successful
lorevee 0:1902469bdd2d 159 * 1 successful
lorevee 0:1902469bdd2d 160 * 0 or anything else failed */
lorevee 0:1902469bdd2d 161 extern uint8_t discoveryCompleted;
lorevee 0:1902469bdd2d 162
lorevee 0:1902469bdd2d 163
lorevee 0:1902469bdd2d 164
lorevee 0:1902469bdd2d 165 /* Flag to indicate if the ch descriptor write is completed successful
lorevee 0:1902469bdd2d 166 * 1 successful
lorevee 0:1902469bdd2d 167 * 0 or anything else failed */
lorevee 0:1902469bdd2d 168 extern uint8_t writeDescriptorCompleted;
lorevee 0:1902469bdd2d 169
lorevee 0:1902469bdd2d 170
lorevee 0:1902469bdd2d 171
lorevee 0:1902469bdd2d 172 /* Flag to indicate if the advertising is completed
lorevee 0:1902469bdd2d 173 * 1 completed
lorevee 0:1902469bdd2d 174 * 0 or anything else not completed */
lorevee 0:1902469bdd2d 175 extern uint8_t advEnds;
lorevee 0:1902469bdd2d 176
lorevee 0:1902469bdd2d 177
lorevee 0:1902469bdd2d 178 /* Flag to indicate if a change of notification is pending
lorevee 0:1902469bdd2d 179 * 1 pending
lorevee 0:1902469bdd2d 180 * 0 or anything else not pending */
lorevee 0:1902469bdd2d 181 extern uint8_t notificationPending;
lorevee 0:1902469bdd2d 182
lorevee 0:1902469bdd2d 183
lorevee 1:110b5e896bc9 184 /* Flag to indicate if the ble stack is busy
lorevee 1:110b5e896bc9 185 * 1 busy
lorevee 1:110b5e896bc9 186 * 0 or anything else not busy */
lorevee 1:110b5e896bc9 187 extern uint8_t stackBusy;
lorevee 1:110b5e896bc9 188
lorevee 1:110b5e896bc9 189
lorevee 0:1902469bdd2d 190
lorevee 0:1902469bdd2d 191
lorevee 0:1902469bdd2d 192 /* Supported peripheral nodes name */
lorevee 0:1902469bdd2d 193 const char NODE_MOTENV[] = "ME1V310";
lorevee 0:1902469bdd2d 194 const char NODE_FLIGHT[] = "FL1V310";
lorevee 0:1902469bdd2d 195 const char NODE_ALLMEMS[] = "AM1V320";
lorevee 0:1902469bdd2d 196
lorevee 0:1902469bdd2d 197
lorevee 0:1902469bdd2d 198 /* Properties mask */
lorevee 0:1902469bdd2d 199 static uint8_t props_mask[] = {
lorevee 0:1902469bdd2d 200 0x01,
lorevee 0:1902469bdd2d 201 0x02,
lorevee 0:1902469bdd2d 202 0x04,
lorevee 0:1902469bdd2d 203 0x08,
lorevee 0:1902469bdd2d 204 0x10,
lorevee 0:1902469bdd2d 205 0x20,
lorevee 0:1902469bdd2d 206 0x40,
lorevee 0:1902469bdd2d 207 0x80
lorevee 0:1902469bdd2d 208 };
lorevee 0:1902469bdd2d 209
lorevee 0:1902469bdd2d 210
lorevee 0:1902469bdd2d 211 /* Enum of different states */
lorevee 0:1902469bdd2d 212 typedef enum {
lorevee 0:1902469bdd2d 213 CONN_INIT, // 0
lorevee 0:1902469bdd2d 214 START_DEVICE_DISCOVERY, // 1
lorevee 0:1902469bdd2d 215 DEVICE_FOUND, // 2
lorevee 0:1902469bdd2d 216 DEVICE_NOT_FOUND, // 3
lorevee 0:1902469bdd2d 217 DEVICE_DISCOVERY_COMPLETE, // 4
lorevee 0:1902469bdd2d 218 START_DEVICE_CONNECTION, // 5
lorevee 0:1902469bdd2d 219 DEVICE_CONNECTED, // 6
lorevee 0:1902469bdd2d 220 DEVICE_CONNECTION_COMPLETE, // 7
lorevee 0:1902469bdd2d 221 START_DISCOVERABLE_MODE, // 8
lorevee 0:1902469bdd2d 222 DISCOVERABLE_MODE_SET, // 9
lorevee 0:1902469bdd2d 223 START_SERVICE_DISCOVERY, //10
lorevee 0:1902469bdd2d 224 SERVICE_DISCOVERED, //11
lorevee 0:1902469bdd2d 225 SERVICE_DISCOVERY_COMPLETE, //12
lorevee 0:1902469bdd2d 226 START_HARDWARE_SERV_CHARS_DISCOVERY, //13
lorevee 0:1902469bdd2d 227 HARDWARE_SERV_CHARS_DISCOVERED, //14
lorevee 0:1902469bdd2d 228 HARDWARE_SERV_CHARS_DISCOVERY_COMPLETE, //15
lorevee 0:1902469bdd2d 229 START_SOFTWARE_SERV_CHARS_DISCOVERY, //16
lorevee 0:1902469bdd2d 230 SOFTWARE_SERV_CHARS_DISCOVERED, //17
lorevee 0:1902469bdd2d 231 SOFTWARE_SERV_CHARS_DISCOVERY_COMPLETE, //18
lorevee 0:1902469bdd2d 232 START_CONFIGURATION_SERV_CHARS_DISCOVERY, //19
lorevee 0:1902469bdd2d 233 CONFIGURATION_SERV_CHARS_DISCOVERED, //20
lorevee 0:1902469bdd2d 234 CONFIGURATION_SERV_CHARS_DISCOVERY_COMPLETE, //21
lorevee 0:1902469bdd2d 235 ENABLE_ME1_LED_NOTIFICATIONS, //22
lorevee 0:1902469bdd2d 236 ENABLE_ME1_WUP_NOTIFICATIONS, //23
lorevee 0:1902469bdd2d 237 NOTIFICATIONS_ENABLED, //24
lorevee 0:1902469bdd2d 238 READ_INIT, //25
lorevee 0:1902469bdd2d 239 READING_PRX, //26
lorevee 0:1902469bdd2d 240 NOTIFY_PRX_TO_CLIENT, //27
lorevee 0:1902469bdd2d 241 READING_ENVIRONMENTAL, //28
lorevee 0:1902469bdd2d 242 NOTIFY_ENV_TO_CLIENT, //29
lorevee 0:1902469bdd2d 243 READING_LED, //30
lorevee 0:1902469bdd2d 244 NOTIFY_LED_TO_CLIENT, //31
lorevee 0:1902469bdd2d 245 READING_LUX, //32
lorevee 0:1902469bdd2d 246 NOTIFY_LUX_TO_CLIENT, //33
lorevee 0:1902469bdd2d 247 READING_MIC, //34
lorevee 0:1902469bdd2d 248 NOTIFY_MIC_TO_CLIENT, //35
lorevee 0:1902469bdd2d 249 READING_AGM, //36
lorevee 0:1902469bdd2d 250 NOTIFY_AGM_TO_CLIENT, //37
lorevee 0:1902469bdd2d 251 READING_SFUSION, //38
lorevee 0:1902469bdd2d 252 NOTIFY_SFUSION_TO_CLIENT, //39
lorevee 0:1902469bdd2d 253 READING_PRESSURE, //40
lorevee 0:1902469bdd2d 254 READING_HUMIDITY, //41
lorevee 0:1902469bdd2d 255 READING_TEMPERATURE, //42
lorevee 0:1902469bdd2d 256 ALL_DATA_READ, //43
lorevee 0:1902469bdd2d 257 NOTIFICATIONS_DATA_READ, //44
lorevee 0:1902469bdd2d 258 DISABLE_NOTIFICATIONS, //45
lorevee 0:1902469bdd2d 259 READING_DISCONNECTION, //46
lorevee 0:1902469bdd2d 260 CHANGE_NOTIFICATION_STATUS //47
lorevee 0:1902469bdd2d 261 } Status_t;
lorevee 0:1902469bdd2d 262
lorevee 0:1902469bdd2d 263
lorevee 0:1902469bdd2d 264 /* (Service) Handle struct */
lorevee 0:1902469bdd2d 265 typedef struct {
lorevee 0:1902469bdd2d 266 uint16_t start_h;
lorevee 0:1902469bdd2d 267 uint16_t end_h;
lorevee 0:1902469bdd2d 268 } Handle_t;
lorevee 0:1902469bdd2d 269
lorevee 0:1902469bdd2d 270 typedef DiscoveredCharacteristic::Properties_t Properties_t;
lorevee 0:1902469bdd2d 271
lorevee 0:1902469bdd2d 272 typedef BLEProtocol::AddressBytes_t tBDAddr;
lorevee 0:1902469bdd2d 273
lorevee 0:1902469bdd2d 274 /* Peripheral device info struct */
lorevee 0:1902469bdd2d 275 typedef struct {
lorevee 0:1902469bdd2d 276 uint8_t dev_v; // per device ID
lorevee 0:1902469bdd2d 277 tBDAddr bdaddr; // per device addr
lorevee 0:1902469bdd2d 278 } devInfo_t;
lorevee 0:1902469bdd2d 279
lorevee 0:1902469bdd2d 280
lorevee 0:1902469bdd2d 281 /* Struct contains the peripheral devices informations */
lorevee 0:1902469bdd2d 282 typedef struct {
lorevee 0:1902469bdd2d 283 devInfo_t devInfo[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 284 uint8_t discovery_enabled;
lorevee 0:1902469bdd2d 285 bool device_found;
lorevee 0:1902469bdd2d 286 uint8_t connDevices;
lorevee 0:1902469bdd2d 287 uint8_t discDevices;
lorevee 0:1902469bdd2d 288 uint8_t connDeviceIdx;
lorevee 0:1902469bdd2d 289 uint8_t readDeviceIdx;
lorevee 0:1902469bdd2d 290 uint16_t connection_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 291 bool is_connected[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 292 bool is_disconnected[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 293 bool is_unconnectable[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 294
lorevee 0:1902469bdd2d 295 Handle_t gen_access_profile_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 296 Handle_t gen_attribute_profile_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 297 Handle_t hardware_service_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 298 Handle_t configuration_service_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 299 Handle_t software_service_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 300
lorevee 0:1902469bdd2d 301 // Characteristic handles
lorevee 0:1902469bdd2d 302 uint16_t environmental_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 303 uint16_t pressure_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 304 uint16_t humidity_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 305 uint16_t temperature_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 306 uint16_t led_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 307 uint16_t cfg_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 308 uint16_t wup_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 309 uint16_t mic_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 310 uint16_t prx_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 311 uint16_t lux_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 312 uint16_t agm_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 313 uint16_t sfusion_char_handle[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 314
lorevee 0:1902469bdd2d 315 uint8_t led_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 316 uint8_t wup_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 317 uint8_t mic_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 318 uint8_t prx_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 319 uint8_t agm_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 320 uint8_t sfusion_char_read[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 321 uint8_t wup_event[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 322 uint8_t mic_event[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 323 uint8_t prx_event[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 324 uint8_t agm_event[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 325 uint8_t sfusion_event[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 326 uint8_t prx_on[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 327 uint8_t agm_on[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 328 uint8_t sfusion_on[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 329 uint8_t mic_event_enabled;
lorevee 0:1902469bdd2d 330 uint8_t prx_event_enabled;
lorevee 0:1902469bdd2d 331 uint8_t agm_event_enabled;
lorevee 0:1902469bdd2d 332 uint8_t sfusion_event_enabled;
lorevee 0:1902469bdd2d 333 uint8_t wup_event_enabled;
lorevee 0:1902469bdd2d 334 uint8_t acc_event_enabled;
lorevee 0:1902469bdd2d 335 uint8_t gyr_event_enabled;
lorevee 0:1902469bdd2d 336 uint8_t mag_event_enabled;
lorevee 0:1902469bdd2d 337 Status_t status;
lorevee 0:1902469bdd2d 338
lorevee 0:1902469bdd2d 339 } PeripheralDevices_t;
lorevee 0:1902469bdd2d 340
lorevee 0:1902469bdd2d 341
lorevee 0:1902469bdd2d 342
lorevee 0:1902469bdd2d 343
lorevee 0:1902469bdd2d 344 /* List of type id */
lorevee 0:1902469bdd2d 345 typedef enum {
lorevee 0:1902469bdd2d 346 UNKNOWN_TYPE_ID, //0
lorevee 0:1902469bdd2d 347 PRESS_TYPE_ID, //1 (its data value is 4 bytes long)
lorevee 0:1902469bdd2d 348 HUM_TYPE_ID, //2 (its data value is 2 bytes long)
lorevee 0:1902469bdd2d 349 TEMP_TYPE_ID, //3 (its data value is 2 bytes long)
lorevee 0:1902469bdd2d 350 LED_TYPE_ID, //4 (its data value is 1 byte long)
lorevee 0:1902469bdd2d 351 PRX_TYPE_ID, //5 (its data value is 2 bytes long)
lorevee 0:1902469bdd2d 352 WUP_TYPE_ID, //6 (no data value)
lorevee 0:1902469bdd2d 353 MICLEVEL_TYPE_ID, //7 (its data value is 1 byte long)
lorevee 0:1902469bdd2d 354 LUX_TYPE_ID, //8 (its data value is 2 bytes long)
lorevee 0:1902469bdd2d 355 ACC_TYPE_ID, //9 (its data value is 6 bytes long)
lorevee 0:1902469bdd2d 356 GYR_TYPE_ID, //10 (its data value is 6 bytes long)
lorevee 0:1902469bdd2d 357 MAG_TYPE_ID, //11 (its data value is 6 bytes long)
lorevee 0:1902469bdd2d 358 STATUS_TYPE_ID, //12 (no data value)
lorevee 0:1902469bdd2d 359 SFUSION_TYPE_ID //13 (its data value is 8 bytes long)
lorevee 0:1902469bdd2d 360 // (increase the enum to add new data type IDs)
lorevee 0:1902469bdd2d 361 } Data_Type_ID_t;
lorevee 0:1902469bdd2d 362
lorevee 0:1902469bdd2d 363
lorevee 0:1902469bdd2d 364
lorevee 0:1902469bdd2d 365 /* Struct of the generic DiscoveredCharacteristic node */
lorevee 0:1902469bdd2d 366 struct DiscoveredCharacteristicNode{
lorevee 0:1902469bdd2d 367 //data
lorevee 0:1902469bdd2d 368 DiscoveredCharacteristic data;
lorevee 0:1902469bdd2d 369 //pointer to next node
lorevee 0:1902469bdd2d 370 DiscoveredCharacteristicNode * next;
lorevee 0:1902469bdd2d 371 };
lorevee 0:1902469bdd2d 372
lorevee 0:1902469bdd2d 373
lorevee 0:1902469bdd2d 374 /* Header pointer of the DiscoveredCharacteristic list */
lorevee 0:1902469bdd2d 375 extern DiscoveredCharacteristicNode * headCharacteristic[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 376 extern DiscoveredCharacteristicNode * tmp[MAX_NUM_OF_NODES];
lorevee 0:1902469bdd2d 377
lorevee 0:1902469bdd2d 378
lorevee 0:1902469bdd2d 379 /* Primary Service UUID expected from Sensor demo peripherals */
lorevee 0:1902469bdd2d 380 extern UUID::ShortUUIDBytes_t GENERIC_ACCESS_PROFILE_UUID;
lorevee 0:1902469bdd2d 381 extern UUID::ShortUUIDBytes_t GENERIC_ATTRIBUTE_PROFILE_UUID;
lorevee 0:1902469bdd2d 382
lorevee 0:1902469bdd2d 383
lorevee 0:1902469bdd2d 384
lorevee 0:1902469bdd2d 385
lorevee 0:1902469bdd2d 386 /* Services UUID */ // 1b:c5:d5:a5:02:00:b4:9a:e1:11:XX:XX:XX:XX:XX:XX
lorevee 0:1902469bdd2d 387 extern UUID::LongUUIDBytes_t HARDWARE_SERVICE_UUID;
lorevee 0:1902469bdd2d 388
lorevee 0:1902469bdd2d 389 extern UUID::LongUUIDBytes_t CONFIG_SERVICE_UUID;
lorevee 0:1902469bdd2d 390
lorevee 0:1902469bdd2d 391 extern UUID::LongUUIDBytes_t SOFTWARE_SERVICE_UUID;
lorevee 0:1902469bdd2d 392
lorevee 0:1902469bdd2d 393
lorevee 0:1902469bdd2d 394
lorevee 0:1902469bdd2d 395
lorevee 0:1902469bdd2d 396 /* Characteristics UUID */
lorevee 0:1902469bdd2d 397 /* ENVIRONMENTAL */
lorevee 0:1902469bdd2d 398 extern UUID::LongUUIDBytes_t ENVIRONMENTAL_CHAR_UUID;
lorevee 0:1902469bdd2d 399
lorevee 0:1902469bdd2d 400 /* ENVIRONMENTAL for Sensor Tile */
lorevee 0:1902469bdd2d 401 extern UUID::LongUUIDBytes_t ENVIRONMENTAL_ST_CHAR_UUID;
lorevee 0:1902469bdd2d 402
lorevee 0:1902469bdd2d 403 /* ACC + GYRO + MAG */
lorevee 0:1902469bdd2d 404 extern UUID::LongUUIDBytes_t ACCGYROMAG_CHAR_UUID;
lorevee 0:1902469bdd2d 405
lorevee 0:1902469bdd2d 406 /* MEMS SENSOR FUSION */
lorevee 0:1902469bdd2d 407 extern UUID::LongUUIDBytes_t SFUSION_CHAR_UUID;
lorevee 0:1902469bdd2d 408
lorevee 0:1902469bdd2d 409 /* LED */
lorevee 0:1902469bdd2d 410 extern UUID::LongUUIDBytes_t LED_CHAR_UUID;
lorevee 0:1902469bdd2d 411
lorevee 0:1902469bdd2d 412 /* WAKEUP */
lorevee 0:1902469bdd2d 413 extern UUID::LongUUIDBytes_t WAKEUP_EVENT_CHAR_UUID;
lorevee 0:1902469bdd2d 414
lorevee 0:1902469bdd2d 415 /* MICROPHONE */
lorevee 0:1902469bdd2d 416 extern UUID::LongUUIDBytes_t MIC_EVENT_CHAR_UUID;
lorevee 0:1902469bdd2d 417
lorevee 0:1902469bdd2d 418 /* PROXIMITY */
lorevee 0:1902469bdd2d 419 extern UUID::LongUUIDBytes_t PROXIMITY_CHAR_UUID;
lorevee 0:1902469bdd2d 420
lorevee 0:1902469bdd2d 421 /* LUX */
lorevee 0:1902469bdd2d 422 extern UUID::LongUUIDBytes_t LUX_CHAR_UUID;
lorevee 0:1902469bdd2d 423
lorevee 0:1902469bdd2d 424 /* CONFIGURATION */
lorevee 0:1902469bdd2d 425 extern UUID::LongUUIDBytes_t CONFIG_CHAR_UUID;
lorevee 0:1902469bdd2d 426
lorevee 0:1902469bdd2d 427
lorevee 0:1902469bdd2d 428 /*----- -----*/
lorevee 0:1902469bdd2d 429 extern uint8_t wifi_data[256];
lorevee 0:1902469bdd2d 430 extern uint8_t new_data;
lorevee 0:1902469bdd2d 431 extern uint8_t *data;
lorevee 0:1902469bdd2d 432 extern uint8_t wifi_present;
lorevee 0:1902469bdd2d 433
lorevee 0:1902469bdd2d 434 extern char print_msg_buff[512];
lorevee 0:1902469bdd2d 435 //extern UART_HandleTypeDef UartMsgHandle;
lorevee 0:1902469bdd2d 436
lorevee 0:1902469bdd2d 437 //extern uint16_t connection_handle = 0;
lorevee 0:1902469bdd2d 438
lorevee 0:1902469bdd2d 439 extern uint8_t attribute_value[20];
lorevee 0:1902469bdd2d 440 extern uint8_t star_attr_value[256];
lorevee 0:1902469bdd2d 441 //extern uint8_t bnrg_expansion_board_type = IDB04A1; /* at startup, suppose the X-NUCLEO-IDB04A1 is used */
lorevee 0:1902469bdd2d 442 extern uint8_t notification_freq;
lorevee 0:1902469bdd2d 443
lorevee 0:1902469bdd2d 444
lorevee 0:1902469bdd2d 445 /*---- Main functions declaration ----*/
lorevee 0:1902469bdd2d 446 /* Complete the initialization of ble module */
lorevee 0:1902469bdd2d 447 void bleInitComplete (BLE::InitializationCompleteCallbackContext *params);
lorevee 0:1902469bdd2d 448
lorevee 0:1902469bdd2d 449 /* scheduleBleEventsProcessing */
lorevee 0:1902469bdd2d 450 void scheduleBleEventsProcessing (BLE::OnEventsToProcessCallbackContext* context);
lorevee 0:1902469bdd2d 451
lorevee 0:1902469bdd2d 452 /* Initialization error handling */
lorevee 0:1902469bdd2d 453 void onBleInitError (BLE &ble, ble_error_t error);
lorevee 0:1902469bdd2d 454
lorevee 0:1902469bdd2d 455 void checkStatus (void);
lorevee 0:1902469bdd2d 456
lorevee 0:1902469bdd2d 457
lorevee 0:1902469bdd2d 458 /*---- Master service functions declarations ----*/
lorevee 0:1902469bdd2d 459 /* Scan for new peripheral nodes and establish new connections */
lorevee 0:1902469bdd2d 460 void connectionProcess (void);
lorevee 0:1902469bdd2d 461
lorevee 0:1902469bdd2d 462 /* Read data from peripheral nodes */
lorevee 0:1902469bdd2d 463 void readingProcess (void);
lorevee 0:1902469bdd2d 464
lorevee 0:1902469bdd2d 465 /* Create a null gatt read pointer */
lorevee 0:1902469bdd2d 466 GattReadCallbackParams * nullGattReadCallbackP (uint16_t connection_handle);
lorevee 0:1902469bdd2d 467
lorevee 0:1902469bdd2d 468
lorevee 0:1902469bdd2d 469 /* Print the central mac addr */
lorevee 0:1902469bdd2d 470 void printMacAddress (void);
lorevee 0:1902469bdd2d 471
lorevee 0:1902469bdd2d 472 /* Complete the initialization of ble module */
lorevee 0:1902469bdd2d 473 void bleInitComplete (BLE::InitializationCompleteCallbackContext *params);
lorevee 0:1902469bdd2d 474
lorevee 0:1902469bdd2d 475 /* Callback functions */
lorevee 0:1902469bdd2d 476 void disconnectionCallback (const Gap::DisconnectionCallbackParams_t *);
lorevee 0:1902469bdd2d 477
lorevee 0:1902469bdd2d 478 void connectionCallback (const Gap::ConnectionCallbackParams_t *params);
lorevee 0:1902469bdd2d 479
lorevee 0:1902469bdd2d 480 void advertisementCallback (const Gap::AdvertisementCallbackParams_t *params);
lorevee 0:1902469bdd2d 481
lorevee 0:1902469bdd2d 482 void onStopScan (Gap::TimeoutSource_t t);
lorevee 0:1902469bdd2d 483
lorevee 0:1902469bdd2d 484 void serviceDiscoveryCallback (const DiscoveredService *service);
lorevee 0:1902469bdd2d 485
lorevee 0:1902469bdd2d 486 void characteristicDiscoveryCallback (const DiscoveredCharacteristic *characteristicP);
lorevee 0:1902469bdd2d 487
lorevee 0:1902469bdd2d 488 void discoveryTerminationCallback (Gap::Handle_t connectionHandle);
lorevee 0:1902469bdd2d 489
lorevee 0:1902469bdd2d 490 /* Method called after the reading of a characteristic */
lorevee 0:1902469bdd2d 491 void readCharacteristicCallback (const GattReadCallbackParams *response);
lorevee 0:1902469bdd2d 492
lorevee 0:1902469bdd2d 493 /* Method called after a periph descriptor is written */
lorevee 0:1902469bdd2d 494 void perDescriptorWrittenCallback (const GattWriteCallbackParams* event);
lorevee 0:1902469bdd2d 495
lorevee 0:1902469bdd2d 496
lorevee 0:1902469bdd2d 497
lorevee 0:1902469bdd2d 498 /* Save the found peripheral device in the struct containing all the
lorevee 0:1902469bdd2d 499 found peripheral devices. */
lorevee 0:1902469bdd2d 500 void saveDeviceFound (uint8_t adv_type, BLEProtocol::AddressBytes_t addr,
lorevee 0:1902469bdd2d 501 uint8_t data_length, const uint8_t* data_RSSI, uint8_t pos, uint8_t dev_v,
lorevee 0:1902469bdd2d 502 uint8_t wup_event, uint8_t mic_event, uint8_t prx_event,
lorevee 0:1902469bdd2d 503 uint8_t agm_event, uint8_t sfusion_event);
lorevee 0:1902469bdd2d 504
lorevee 0:1902469bdd2d 505 /* Connect the device as Master to a peripheral device */
lorevee 0:1902469bdd2d 506 void connectPeripheral (void);
lorevee 0:1902469bdd2d 507
lorevee 0:1902469bdd2d 508 /* Service discovery */
lorevee 0:1902469bdd2d 509 void discoverServices (void);
lorevee 0:1902469bdd2d 510
lorevee 0:1902469bdd2d 511 /* Initialize the struct where all peripheral devices are stored */
lorevee 0:1902469bdd2d 512 void initProcess (void);
lorevee 0:1902469bdd2d 513
lorevee 0:1902469bdd2d 514 /* Start the discovery of new peripheral nodes */
lorevee 0:1902469bdd2d 515 void startDiscovery (void);
lorevee 0:1902469bdd2d 516
lorevee 0:1902469bdd2d 517 /* This function retrieves the peripheral device index from the connection handle */
lorevee 0:1902469bdd2d 518 void getDeviceFromConnHandle (uint16_t handle, uint8_t *index, tBDAddr devAddr);
lorevee 0:1902469bdd2d 519
lorevee 0:1902469bdd2d 520 /* This method reads the characteristic in input */
lorevee 0:1902469bdd2d 521 void readSensorData (const DiscoveredCharacteristic &characteristic,
lorevee 0:1902469bdd2d 522 uint16_t connection_handle, uint8_t index);
lorevee 0:1902469bdd2d 523
lorevee 0:1902469bdd2d 524 /* Set the new status */
lorevee 0:1902469bdd2d 525 void setNewStatus (void);
lorevee 0:1902469bdd2d 526
lorevee 0:1902469bdd2d 527 /* Method that enables characteristic notifications */
lorevee 0:1902469bdd2d 528 void enableNotifications (uint16_t conn_handle, uint8_t index, uint8_t dev_v, uint8_t set_mode);
lorevee 0:1902469bdd2d 529
lorevee 0:1902469bdd2d 530 /* Write a characteristic descriptor */
lorevee 0:1902469bdd2d 531 void writeCharacDescriptor (uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 532 uint8_t* attr_value);
lorevee 0:1902469bdd2d 533
lorevee 0:1902469bdd2d 534 /* Get error */
lorevee 0:1902469bdd2d 535 ble_error_t writeCharacDescriptorWithError (uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 536 uint8_t* attr_value);
lorevee 0:1902469bdd2d 537
lorevee 0:1902469bdd2d 538 /* Write a characteristic value without waiting for any response */
lorevee 0:1902469bdd2d 539 void writeCharacValueWithoutResp (uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 540 uint8_t* attr_value);
lorevee 0:1902469bdd2d 541
lorevee 0:1902469bdd2d 542 /* Get error */
lorevee 0:1902469bdd2d 543 ble_error_t writeCharacValueWithoutRespWithError (uint16_t conn_handle, uint16_t attr_handle, uint8_t attr_len,
lorevee 0:1902469bdd2d 544 uint8_t* attr_value);
lorevee 0:1902469bdd2d 545
lorevee 0:1902469bdd2d 546 /* Builds a Jason format string */
lorevee 0:1902469bdd2d 547 void Build_MEMS_Packet (uint8_t *attr_value, char *data_type, tBDAddr devAddr, uint8_t num_type);
lorevee 0:1902469bdd2d 548
lorevee 0:1902469bdd2d 549
lorevee 0:1902469bdd2d 550 /* Create new attr value for the master */
lorevee 0:1902469bdd2d 551 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 552
lorevee 0:1902469bdd2d 553 /* Method called when there is a notification from the sever */
lorevee 0:1902469bdd2d 554 void onNotificationCallback (const GattHVXCallbackParams* event);
lorevee 0:1902469bdd2d 555
lorevee 0:1902469bdd2d 556
lorevee 0:1902469bdd2d 557 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 558
lorevee 0:1902469bdd2d 559
lorevee 0:1902469bdd2d 560
lorevee 0:1902469bdd2d 561
lorevee 0:1902469bdd2d 562 /* DiscoveredCharacteristic List methods */
lorevee 0:1902469bdd2d 563
lorevee 0:1902469bdd2d 564 /* Creating a new DiscoveredCharacteristicNode (struct r308)*/
lorevee 0:1902469bdd2d 565 DiscoveredCharacteristicNode * createDCNode (const DiscoveredCharacteristic &ch, DiscoveredCharacteristicNode *next);
lorevee 0:1902469bdd2d 566
lorevee 0:1902469bdd2d 567 /* Prepend a DiscoveredCharacteristicNode (struct r308)*/
lorevee 0:1902469bdd2d 568 DiscoveredCharacteristicNode * prependDCNode (DiscoveredCharacteristicNode *head, const DiscoveredCharacteristic *characteristic);
lorevee 0:1902469bdd2d 569
lorevee 0:1902469bdd2d 570 /* Append a DiscoveredCharacteristicNode (struct r308)*/
lorevee 0:1902469bdd2d 571 DiscoveredCharacteristicNode * appendDCNode (DiscoveredCharacteristicNode *head, const DiscoveredCharacteristic *characteristic);
lorevee 0:1902469bdd2d 572
lorevee 0:1902469bdd2d 573 /* Number of DiscoveredCharacteristic nodes */
lorevee 0:1902469bdd2d 574 int countElements (DiscoveredCharacteristicNode *head);
lorevee 0:1902469bdd2d 575
lorevee 0:1902469bdd2d 576 /* Search for a DiscoveredCharacteristic node by declaration handle */
lorevee 0:1902469bdd2d 577 DiscoveredCharacteristicNode * searchDCNode (DiscoveredCharacteristicNode *head, uint16_t declHandle);
lorevee 0:1902469bdd2d 578
lorevee 0:1902469bdd2d 579 /* Delete the DCN list */
lorevee 0:1902469bdd2d 580 void deleteDCNList (DiscoveredCharacteristicNode *head);
lorevee 0:1902469bdd2d 581
lorevee 0:1902469bdd2d 582 /*----------------------------------------------------------------------------*/
lorevee 0:1902469bdd2d 583
lorevee 0:1902469bdd2d 584
lorevee 0:1902469bdd2d 585
lorevee 0:1902469bdd2d 586
lorevee 0:1902469bdd2d 587
lorevee 0:1902469bdd2d 588
lorevee 0:1902469bdd2d 589
lorevee 0:1902469bdd2d 590 #endif /*__BLEMASTERSERVICE_H__*/