Javier Vargas
/
ControllerBLE
Test
source/main.cpp@79:9f3aca04de4e, 2019-01-31 (annotated)
- Committer:
- HelGast95
- Date:
- Thu Jan 31 12:55:00 2019 +0000
- Revision:
- 79:9f3aca04de4e
- Parent:
- 78:bb7e309408a2
- Child:
- 80:5e52c5847273
Primera version de GATT Server
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
HelGast95 | 77:48c622bf903f | 1 | #define END_OF_JSON 0xFE |
HelGast95 | 79:9f3aca04de4e | 2 | #define MAC_FILTER 0x8E |
HelGast95 | 79:9f3aca04de4e | 3 | #define VERBOSE_MODE 1 // Habilita la generacion de logs por el puerto USB |
mbed_official | 1:72c60abef7e7 | 4 | |
HelGast95 | 73:a91805f9e9f0 | 5 | #include "mbed.h" |
HelGast95 | 73:a91805f9e9f0 | 6 | #include "picojson.h" |
HelGast95 | 73:a91805f9e9f0 | 7 | #include "stats_report.h" |
HelGast95 | 73:a91805f9e9f0 | 8 | |
HelGast95 | 73:a91805f9e9f0 | 9 | /* Librerías para BLE - Servicio GATT */ |
mbed_official | 1:72c60abef7e7 | 10 | #include "ble/BLE.h" |
mbed_official | 1:72c60abef7e7 | 11 | #include "ble/Gap.h" |
HelGast95 | 79:9f3aca04de4e | 12 | #include "TOFService.h" |
HelGast95 | 73:a91805f9e9f0 | 13 | #include "ble/DiscoveredCharacteristic.h" |
HelGast95 | 73:a91805f9e9f0 | 14 | #include "ble/DiscoveredService.h" |
HelGast95 | 73:a91805f9e9f0 | 15 | |
HelGast95 | 79:9f3aca04de4e | 16 | const static char DEVICE_NAME[] = "BLE_CONTROLLER"; |
HelGast95 | 79:9f3aca04de4e | 17 | static const uint16_t uuid16_list[] = {TOFService::CUSTOM_TOF_SERVICE_UUID}; |
HelGast95 | 79:9f3aca04de4e | 18 | |
HelGast95 | 78:bb7e309408a2 | 19 | bool serviceDiscovered = false; |
HelGast95 | 77:48c622bf903f | 20 | char finalCharacterJSON = END_OF_JSON; |
HelGast95 | 73:a91805f9e9f0 | 21 | |
HelGast95 | 74:12b9444a2fb4 | 22 | typedef struct { |
HelGast95 | 79:9f3aca04de4e | 23 | string MAC; /* Dirección MAC */ |
HelGast95 | 79:9f3aca04de4e | 24 | float ToF; /* Tiempo de vuelo */ |
HelGast95 | 74:12b9444a2fb4 | 25 | } BLEdata_t; |
HelGast95 | 73:a91805f9e9f0 | 26 | |
HelGast95 | 73:a91805f9e9f0 | 27 | DigitalOut led3Test(LED3); |
HelGast95 | 73:a91805f9e9f0 | 28 | DigitalOut led4BLE(LED4); |
HelGast95 | 73:a91805f9e9f0 | 29 | Serial pcSerial(USBTX, USBRX); // Abrimos conexión serial con el puerto USB |
HelGast95 | 79:9f3aca04de4e | 30 | |
HelGast95 | 79:9f3aca04de4e | 31 | TOFService* tofService; |
HelGast95 | 73:a91805f9e9f0 | 32 | |
HelGast95 | 73:a91805f9e9f0 | 33 | EventQueue eventQueue; |
HelGast95 | 74:12b9444a2fb4 | 34 | Queue<BLEdata_t, 32> BLEqueue; |
HelGast95 | 74:12b9444a2fb4 | 35 | MemoryPool<BLEdata_t, 32> BLEmpool; |
mbed_official | 1:72c60abef7e7 | 36 | |
HelGast95 | 79:9f3aca04de4e | 37 | Thread threadLED(osPriorityAboveNormal1, 1000); |
HelGast95 | 74:12b9444a2fb4 | 38 | Thread threadSerial(osPriorityAboveNormal2, 2500); |
HelGast95 | 74:12b9444a2fb4 | 39 | Thread threadBLE(osPriorityRealtime3, 1000); |
HelGast95 | 73:a91805f9e9f0 | 40 | |
HelGast95 | 79:9f3aca04de4e | 41 | template<typename arg> |
HelGast95 | 79:9f3aca04de4e | 42 | void printLog(const char * log, arg data) { |
HelGast95 | 79:9f3aca04de4e | 43 | if(VERBOSE_MODE) printf(log, data); |
HelGast95 | 79:9f3aca04de4e | 44 | } |
HelGast95 | 79:9f3aca04de4e | 45 | |
HelGast95 | 79:9f3aca04de4e | 46 | void printLog(const char * log) { |
HelGast95 | 79:9f3aca04de4e | 47 | if(VERBOSE_MODE) printf(log); |
HelGast95 | 79:9f3aca04de4e | 48 | } |
HelGast95 | 79:9f3aca04de4e | 49 | |
HelGast95 | 73:a91805f9e9f0 | 50 | /** |
HelGast95 | 77:48c622bf903f | 51 | * Thread encargado de parpadear un LED continuamente |
HelGast95 | 73:a91805f9e9f0 | 52 | */ |
HelGast95 | 73:a91805f9e9f0 | 53 | void blinkLED3() { |
HelGast95 | 73:a91805f9e9f0 | 54 | while(true) { |
HelGast95 | 73:a91805f9e9f0 | 55 | led3Test = !led3Test; |
HelGast95 | 74:12b9444a2fb4 | 56 | wait(0.8); |
HelGast95 | 73:a91805f9e9f0 | 57 | } |
HelGast95 | 73:a91805f9e9f0 | 58 | } |
HelGast95 | 73:a91805f9e9f0 | 59 | |
HelGast95 | 73:a91805f9e9f0 | 60 | /** |
HelGast95 | 73:a91805f9e9f0 | 61 | * Método encargado de enviar un string por el puerto serie char a char |
HelGast95 | 73:a91805f9e9f0 | 62 | */ |
HelGast95 | 73:a91805f9e9f0 | 63 | void sendCharArrayToSerial(char const *array, Serial *serial) { |
HelGast95 | 74:12b9444a2fb4 | 64 | uint32_t i = 0; |
HelGast95 | 73:a91805f9e9f0 | 65 | while(array[i] != '\0') { |
HelGast95 | 73:a91805f9e9f0 | 66 | serial->putc(array[i]); |
HelGast95 | 73:a91805f9e9f0 | 67 | i++; |
HelGast95 | 73:a91805f9e9f0 | 68 | } |
HelGast95 | 73:a91805f9e9f0 | 69 | serial->putc('\0'); |
HelGast95 | 73:a91805f9e9f0 | 70 | } |
mbed_official | 1:72c60abef7e7 | 71 | |
HelGast95 | 73:a91805f9e9f0 | 72 | /** |
HelGast95 | 74:12b9444a2fb4 | 73 | * Thread encargado de enviar JSONs por el puerto serie |
HelGast95 | 73:a91805f9e9f0 | 74 | */ |
HelGast95 | 73:a91805f9e9f0 | 75 | void sendJsonOverSerial() { |
HelGast95 | 76:596c9924e51b | 76 | char tmp[512]; // Vble auxiliar para el tratamiento de cadenas de char. |
HelGast95 | 74:12b9444a2fb4 | 77 | string str; |
HelGast95 | 74:12b9444a2fb4 | 78 | while(true) { |
HelGast95 | 74:12b9444a2fb4 | 79 | // Esperamos a un mensaje en la cola |
HelGast95 | 77:48c622bf903f | 80 | picojson::object json; |
HelGast95 | 76:596c9924e51b | 81 | picojson::object event; |
HelGast95 | 76:596c9924e51b | 82 | picojson::object extraInfo; |
HelGast95 | 77:48c622bf903f | 83 | |
HelGast95 | 79:9f3aca04de4e | 84 | osEvent evt = BLEqueue.get(); |
HelGast95 | 79:9f3aca04de4e | 85 | if (evt.status == osEventMessage) { |
HelGast95 | 79:9f3aca04de4e | 86 | BLEdata_t *BLEdata = (BLEdata_t*)evt.value.p; |
HelGast95 | 79:9f3aca04de4e | 87 | |
HelGast95 | 79:9f3aca04de4e | 88 | BLEmpool.free(BLEdata); |
HelGast95 | 79:9f3aca04de4e | 89 | |
HelGast95 | 79:9f3aca04de4e | 90 | int type = rand() % 4; |
HelGast95 | 79:9f3aca04de4e | 91 | event["idEvent"] = picojson::value(BLEdata->MAC); |
HelGast95 | 79:9f3aca04de4e | 92 | event["type"] = picojson::value((double) type); |
HelGast95 | 79:9f3aca04de4e | 93 | str = "E9:ED:F4:AC:BF:8E"; |
HelGast95 | 79:9f3aca04de4e | 94 | extraInfo["hazardousDevice"] = picojson::value(str); |
HelGast95 | 79:9f3aca04de4e | 95 | str = "D5:62:12:BF:B8:45"; |
HelGast95 | 79:9f3aca04de4e | 96 | |
HelGast95 | 79:9f3aca04de4e | 97 | if(type != 0) extraInfo["affectedDevice"] = picojson::value(str); |
HelGast95 | 79:9f3aca04de4e | 98 | event["extraInfo"] = picojson::value(extraInfo); |
HelGast95 | 79:9f3aca04de4e | 99 | json["Event"] = picojson::value(event); |
HelGast95 | 79:9f3aca04de4e | 100 | |
HelGast95 | 79:9f3aca04de4e | 101 | str = picojson::value(json).serialize(); |
HelGast95 | 79:9f3aca04de4e | 102 | |
HelGast95 | 79:9f3aca04de4e | 103 | // Convertimos el string a char * |
HelGast95 | 79:9f3aca04de4e | 104 | strncpy(tmp, str.c_str(), sizeof(tmp)); |
HelGast95 | 79:9f3aca04de4e | 105 | strncat(tmp, &finalCharacterJSON, sizeof(finalCharacterJSON)); // Añadimos el caracter al final |
HelGast95 | 79:9f3aca04de4e | 106 | tmp[sizeof(tmp) - 1] = 0; |
HelGast95 | 79:9f3aca04de4e | 107 | |
HelGast95 | 79:9f3aca04de4e | 108 | sendCharArrayToSerial(tmp, &pcSerial); |
HelGast95 | 79:9f3aca04de4e | 109 | } |
HelGast95 | 74:12b9444a2fb4 | 110 | } |
HelGast95 | 73:a91805f9e9f0 | 111 | } |
HelGast95 | 73:a91805f9e9f0 | 112 | |
HelGast95 | 79:9f3aca04de4e | 113 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { |
HelGast95 | 79:9f3aca04de4e | 114 | printLog("Desconectado. Se comienza la fase de Advertising de nuevo\r\n"); |
HelGast95 | 79:9f3aca04de4e | 115 | BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); |
HelGast95 | 73:a91805f9e9f0 | 116 | } |
HelGast95 | 73:a91805f9e9f0 | 117 | |
HelGast95 | 73:a91805f9e9f0 | 118 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { |
HelGast95 | 79:9f3aca04de4e | 119 | printLog("Conectado al servidor\r\n"); |
HelGast95 | 73:a91805f9e9f0 | 120 | } |
mbed_official | 1:72c60abef7e7 | 121 | |
HelGast95 | 79:9f3aca04de4e | 122 | void writeCharCallback(const GattWriteCallbackParams *params) { |
HelGast95 | 79:9f3aca04de4e | 123 | if(params->handle == tofService->getValueHandle()) { |
HelGast95 | 79:9f3aca04de4e | 124 | char toChar [TOFService::TOF_CHAR_ARRAY_SIZE + 1]; |
HelGast95 | 79:9f3aca04de4e | 125 | printLog("Data received: length = %d, data = 0x", params->len); |
HelGast95 | 79:9f3aca04de4e | 126 | for(int x=0; x < params->len; x++) { |
HelGast95 | 79:9f3aca04de4e | 127 | toChar[x] = (char) params->data[x]; |
HelGast95 | 79:9f3aca04de4e | 128 | printLog("%x", params->data[x]); |
HelGast95 | 73:a91805f9e9f0 | 129 | } |
HelGast95 | 79:9f3aca04de4e | 130 | toChar[params->len] = '\0'; |
HelGast95 | 79:9f3aca04de4e | 131 | string str(toChar); |
HelGast95 | 79:9f3aca04de4e | 132 | printLog("\n\r"); |
HelGast95 | 79:9f3aca04de4e | 133 | printLog("Dato parseado a string: %s\n\r", str); |
mbed_official | 1:72c60abef7e7 | 134 | } |
mbed_official | 1:72c60abef7e7 | 135 | } |
mbed_official | 1:72c60abef7e7 | 136 | |
HelGast95 | 73:a91805f9e9f0 | 137 | /** |
HelGast95 | 73:a91805f9e9f0 | 138 | * Esta función se llama si ha habido algún error en el proceso de inicialización del BLE |
HelGast95 | 73:a91805f9e9f0 | 139 | */ |
HelGast95 | 73:a91805f9e9f0 | 140 | void onBleInitError(BLE &ble, ble_error_t error) { |
HelGast95 | 79:9f3aca04de4e | 141 | printLog("Ha ocurrido un error al inicializar la configuracion del BLE\n"); |
mbed_official | 1:72c60abef7e7 | 142 | } |
mbed_official | 1:72c60abef7e7 | 143 | |
HelGast95 | 73:a91805f9e9f0 | 144 | void printMacAddress() { |
mbed_official | 43:fb2855f7754b | 145 | /* Print out device MAC address to the console*/ |
mbed_official | 43:fb2855f7754b | 146 | Gap::AddressType_t addr_type; |
mbed_official | 43:fb2855f7754b | 147 | Gap::Address_t address; |
mbed_official | 43:fb2855f7754b | 148 | BLE::Instance().gap().getAddress(&addr_type, address); |
HelGast95 | 79:9f3aca04de4e | 149 | printLog("DEVICE MAC ADDRESS: "); |
mbed_official | 43:fb2855f7754b | 150 | for (int i = 5; i >= 1; i--){ |
HelGast95 | 79:9f3aca04de4e | 151 | printLog("%02x:", address[i]); |
mbed_official | 43:fb2855f7754b | 152 | } |
HelGast95 | 79:9f3aca04de4e | 153 | printLog("%02x\r\n", address[0]); |
mbed_official | 43:fb2855f7754b | 154 | } |
mbed_official | 43:fb2855f7754b | 155 | |
HelGast95 | 73:a91805f9e9f0 | 156 | /** |
HelGast95 | 73:a91805f9e9f0 | 157 | * Callback triggered when the ble initialization process has finished |
HelGast95 | 73:a91805f9e9f0 | 158 | */ |
HelGast95 | 79:9f3aca04de4e | 159 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { |
HelGast95 | 79:9f3aca04de4e | 160 | BLE &ble = params->ble; |
mbed_official | 1:72c60abef7e7 | 161 | ble_error_t error = params->error; |
HelGast95 | 79:9f3aca04de4e | 162 | |
mbed_official | 1:72c60abef7e7 | 163 | if (error != BLE_ERROR_NONE) { |
mbed_official | 1:72c60abef7e7 | 164 | return; |
mbed_official | 1:72c60abef7e7 | 165 | } |
mbed_official | 1:72c60abef7e7 | 166 | |
HelGast95 | 79:9f3aca04de4e | 167 | ble.gap().onDisconnection(disconnectionCallback); |
HelGast95 | 73:a91805f9e9f0 | 168 | ble.gap().onConnection(connectionCallback); |
HelGast95 | 79:9f3aca04de4e | 169 | ble.gattServer().onDataWritten(writeCharCallback); |
HelGast95 | 79:9f3aca04de4e | 170 | |
HelGast95 | 79:9f3aca04de4e | 171 | tofService = new TOFService(ble); |
HelGast95 | 79:9f3aca04de4e | 172 | |
HelGast95 | 79:9f3aca04de4e | 173 | /* Setup advertising */ |
HelGast95 | 79:9f3aca04de4e | 174 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT |
HelGast95 | 79:9f3aca04de4e | 175 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type |
HelGast95 | 79:9f3aca04de4e | 176 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name |
HelGast95 | 79:9f3aca04de4e | 177 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet |
HelGast95 | 79:9f3aca04de4e | 178 | ble.gap().setAdvertisingInterval(100); // 100ms. |
mbed_official | 1:72c60abef7e7 | 179 | |
HelGast95 | 79:9f3aca04de4e | 180 | /* Start advertising */ |
HelGast95 | 79:9f3aca04de4e | 181 | ble.gap().startAdvertising(); |
mbed_official | 1:72c60abef7e7 | 182 | } |
mbed_official | 1:72c60abef7e7 | 183 | |
mbed_official | 1:72c60abef7e7 | 184 | void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { |
mbed_official | 1:72c60abef7e7 | 185 | BLE &ble = BLE::Instance(); |
mbed_official | 10:ac3615194d04 | 186 | eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); |
HelGast95 | 73:a91805f9e9f0 | 187 | } |
HelGast95 | 73:a91805f9e9f0 | 188 | |
HelGast95 | 73:a91805f9e9f0 | 189 | void BLEServiceManagment() { |
mbed_official | 1:72c60abef7e7 | 190 | BLE &ble = BLE::Instance(); |
HelGast95 | 73:a91805f9e9f0 | 191 | ble.onEventsToProcess(scheduleBleEventsProcessing); |
mbed_official | 1:72c60abef7e7 | 192 | ble.init(bleInitComplete); |
HelGast95 | 73:a91805f9e9f0 | 193 | |
mbed_official | 10:ac3615194d04 | 194 | eventQueue.dispatch_forever(); |
HelGast95 | 73:a91805f9e9f0 | 195 | } |
mbed_official | 1:72c60abef7e7 | 196 | |
HelGast95 | 73:a91805f9e9f0 | 197 | int main() { |
HelGast95 | 74:12b9444a2fb4 | 198 | srand(time(NULL)); |
HelGast95 | 77:48c622bf903f | 199 | threadLED.start(callback(blinkLED3)); |
HelGast95 | 79:9f3aca04de4e | 200 | threadBLE.start(callback(BLEServiceManagment)); |
HelGast95 | 79:9f3aca04de4e | 201 | //threadSerial.start(callback(sendJsonOverSerial)); |
HelGast95 | 74:12b9444a2fb4 | 202 | |
HelGast95 | 73:a91805f9e9f0 | 203 | threadLED.join(); |
HelGast95 | 73:a91805f9e9f0 | 204 | threadBLE.join(); |
HelGast95 | 79:9f3aca04de4e | 205 | //threadSerial.join(); |
HelGast95 | 73:a91805f9e9f0 | 206 | } |