Javier Vargas
/
ControllerBLE
Test
source/main.cpp@81:dded8c042cca, 2019-02-04 (annotated)
- Committer:
- HelGast95
- Date:
- Mon Feb 04 12:35:18 2019 +0000
- Revision:
- 81:dded8c042cca
- Parent:
- 80:5e52c5847273
Se mete thread para el calculo del tipo de evento y comunicacion con colas - WIP
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 VERBOSE_MODE 1 // Habilita la generacion de logs por el puerto USB |
mbed_official | 1:72c60abef7e7 | 3 | |
HelGast95 | 73:a91805f9e9f0 | 4 | #include "mbed.h" |
HelGast95 | 73:a91805f9e9f0 | 5 | #include "picojson.h" |
HelGast95 | 73:a91805f9e9f0 | 6 | #include "stats_report.h" |
HelGast95 | 73:a91805f9e9f0 | 7 | |
HelGast95 | 73:a91805f9e9f0 | 8 | /* Librerías para BLE - Servicio GATT */ |
mbed_official | 1:72c60abef7e7 | 9 | #include "ble/BLE.h" |
mbed_official | 1:72c60abef7e7 | 10 | #include "ble/Gap.h" |
HelGast95 | 79:9f3aca04de4e | 11 | #include "TOFService.h" |
HelGast95 | 73:a91805f9e9f0 | 12 | #include "ble/DiscoveredCharacteristic.h" |
HelGast95 | 73:a91805f9e9f0 | 13 | #include "ble/DiscoveredService.h" |
HelGast95 | 73:a91805f9e9f0 | 14 | |
HelGast95 | 79:9f3aca04de4e | 15 | const static char DEVICE_NAME[] = "BLE_CONTROLLER"; |
HelGast95 | 79:9f3aca04de4e | 16 | static const uint16_t uuid16_list[] = {TOFService::CUSTOM_TOF_SERVICE_UUID}; |
HelGast95 | 79:9f3aca04de4e | 17 | |
HelGast95 | 78:bb7e309408a2 | 18 | bool serviceDiscovered = false; |
HelGast95 | 77:48c622bf903f | 19 | char finalCharacterJSON = END_OF_JSON; |
HelGast95 | 73:a91805f9e9f0 | 20 | |
HelGast95 | 74:12b9444a2fb4 | 21 | typedef struct { |
HelGast95 | 80:5e52c5847273 | 22 | string MAC1; /* Dirección MAC1*/ |
HelGast95 | 80:5e52c5847273 | 23 | string MAC2; /* Dirección MAC2*/ |
HelGast95 | 80:5e52c5847273 | 24 | double ToF; /* Tiempo de vuelo*/ |
HelGast95 | 74:12b9444a2fb4 | 25 | } BLEdata_t; |
HelGast95 | 73:a91805f9e9f0 | 26 | |
HelGast95 | 81:dded8c042cca | 27 | typedef struct { |
HelGast95 | 81:dded8c042cca | 28 | string hazardousDevice; /* MAC dispositvo peligroso */ |
HelGast95 | 81:dded8c042cca | 29 | string affectedDevice; /* MAC dispositivo afectado */ |
HelGast95 | 81:dded8c042cca | 30 | uint8_t type; /* Tipo de evento */ |
HelGast95 | 81:dded8c042cca | 31 | } JSONdata_t; |
HelGast95 | 81:dded8c042cca | 32 | |
HelGast95 | 73:a91805f9e9f0 | 33 | DigitalOut led3Test(LED3); |
HelGast95 | 73:a91805f9e9f0 | 34 | DigitalOut led4BLE(LED4); |
HelGast95 | 73:a91805f9e9f0 | 35 | Serial pcSerial(USBTX, USBRX); // Abrimos conexión serial con el puerto USB |
HelGast95 | 79:9f3aca04de4e | 36 | |
HelGast95 | 79:9f3aca04de4e | 37 | TOFService* tofService; |
HelGast95 | 73:a91805f9e9f0 | 38 | |
HelGast95 | 73:a91805f9e9f0 | 39 | EventQueue eventQueue; |
HelGast95 | 81:dded8c042cca | 40 | Queue<JSONdata_t, 32> JSONqueue; |
HelGast95 | 74:12b9444a2fb4 | 41 | Queue<BLEdata_t, 32> BLEqueue; |
HelGast95 | 81:dded8c042cca | 42 | Mail<BLEdata_t, 16> BLEMail; |
mbed_official | 1:72c60abef7e7 | 43 | |
HelGast95 | 80:5e52c5847273 | 44 | Thread threadLED(osPriorityAboveNormal1, 400); |
HelGast95 | 74:12b9444a2fb4 | 45 | Thread threadSerial(osPriorityAboveNormal2, 2500); |
HelGast95 | 80:5e52c5847273 | 46 | Thread threadBLE(osPriorityRealtime3, 2500); |
HelGast95 | 81:dded8c042cca | 47 | Thread threadCalculateEvent(osPriorityRealtime2, 1500); |
HelGast95 | 73:a91805f9e9f0 | 48 | |
HelGast95 | 79:9f3aca04de4e | 49 | template<typename arg> |
HelGast95 | 79:9f3aca04de4e | 50 | void printLog(const char * log, arg data) { |
HelGast95 | 79:9f3aca04de4e | 51 | if(VERBOSE_MODE) printf(log, data); |
HelGast95 | 79:9f3aca04de4e | 52 | } |
HelGast95 | 79:9f3aca04de4e | 53 | |
HelGast95 | 79:9f3aca04de4e | 54 | void printLog(const char * log) { |
HelGast95 | 79:9f3aca04de4e | 55 | if(VERBOSE_MODE) printf(log); |
HelGast95 | 79:9f3aca04de4e | 56 | } |
HelGast95 | 79:9f3aca04de4e | 57 | |
HelGast95 | 73:a91805f9e9f0 | 58 | /** |
HelGast95 | 77:48c622bf903f | 59 | * Thread encargado de parpadear un LED continuamente |
HelGast95 | 73:a91805f9e9f0 | 60 | */ |
HelGast95 | 73:a91805f9e9f0 | 61 | void blinkLED3() { |
HelGast95 | 73:a91805f9e9f0 | 62 | while(true) { |
HelGast95 | 73:a91805f9e9f0 | 63 | led3Test = !led3Test; |
HelGast95 | 74:12b9444a2fb4 | 64 | wait(0.8); |
HelGast95 | 73:a91805f9e9f0 | 65 | } |
HelGast95 | 73:a91805f9e9f0 | 66 | } |
HelGast95 | 73:a91805f9e9f0 | 67 | |
HelGast95 | 73:a91805f9e9f0 | 68 | /** |
HelGast95 | 73:a91805f9e9f0 | 69 | * Método encargado de enviar un string por el puerto serie char a char |
HelGast95 | 73:a91805f9e9f0 | 70 | */ |
HelGast95 | 73:a91805f9e9f0 | 71 | void sendCharArrayToSerial(char const *array, Serial *serial) { |
HelGast95 | 74:12b9444a2fb4 | 72 | uint32_t i = 0; |
HelGast95 | 73:a91805f9e9f0 | 73 | while(array[i] != '\0') { |
HelGast95 | 73:a91805f9e9f0 | 74 | serial->putc(array[i]); |
HelGast95 | 73:a91805f9e9f0 | 75 | i++; |
HelGast95 | 73:a91805f9e9f0 | 76 | } |
HelGast95 | 73:a91805f9e9f0 | 77 | serial->putc('\0'); |
HelGast95 | 73:a91805f9e9f0 | 78 | } |
mbed_official | 1:72c60abef7e7 | 79 | |
HelGast95 | 73:a91805f9e9f0 | 80 | /** |
HelGast95 | 81:dded8c042cca | 81 | * Thread encargado de calcular el tipo de evento a enviar |
HelGast95 | 81:dded8c042cca | 82 | */ |
HelGast95 | 81:dded8c042cca | 83 | void calculateEvent() { |
HelGast95 | 81:dded8c042cca | 84 | while(true) { |
HelGast95 | 81:dded8c042cca | 85 | printLog("Leo evento de BLEMail\r\n"); |
HelGast95 | 81:dded8c042cca | 86 | osEvent evt = BLEMail.get(); |
HelGast95 | 81:dded8c042cca | 87 | printLog("Evento leido de BLEMail\r\n"); |
HelGast95 | 81:dded8c042cca | 88 | if (evt.status == osEventMail) { |
HelGast95 | 81:dded8c042cca | 89 | BLEdata_t *dataIn = (BLEdata_t*) evt.value.p; |
HelGast95 | 81:dded8c042cca | 90 | printLog("ToF: %s\r\n", dataIn->ToF); |
HelGast95 | 81:dded8c042cca | 91 | printLog("Se obtiene puntero de BLEdata\r\n"); |
HelGast95 | 81:dded8c042cca | 92 | |
HelGast95 | 81:dded8c042cca | 93 | JSONdata_t event; |
HelGast95 | 81:dded8c042cca | 94 | printLog("Se declara objeto JSONdata_t\r\n"); |
HelGast95 | 81:dded8c042cca | 95 | if(dataIn->ToF > 1.0) { |
HelGast95 | 81:dded8c042cca | 96 | printLog("Evento de tipo 1\r\n"); |
HelGast95 | 81:dded8c042cca | 97 | event.hazardousDevice = dataIn->MAC1; |
HelGast95 | 81:dded8c042cca | 98 | event.affectedDevice = dataIn->MAC2; |
HelGast95 | 81:dded8c042cca | 99 | event.type = 1; |
HelGast95 | 81:dded8c042cca | 100 | } else { // Keep Alive |
HelGast95 | 81:dded8c042cca | 101 | event.type = 0; |
HelGast95 | 81:dded8c042cca | 102 | event.hazardousDevice = dataIn->MAC1; |
HelGast95 | 81:dded8c042cca | 103 | } |
HelGast95 | 81:dded8c042cca | 104 | BLEMail.free(dataIn); |
HelGast95 | 81:dded8c042cca | 105 | printLog("Se va a escribir en la cola de JSON\r\n"); |
HelGast95 | 81:dded8c042cca | 106 | JSONqueue.put(&event); |
HelGast95 | 81:dded8c042cca | 107 | printLog("Evento enviado a JSON\r\n"); |
HelGast95 | 81:dded8c042cca | 108 | } |
HelGast95 | 81:dded8c042cca | 109 | } |
HelGast95 | 81:dded8c042cca | 110 | } |
HelGast95 | 81:dded8c042cca | 111 | |
HelGast95 | 81:dded8c042cca | 112 | /** |
HelGast95 | 74:12b9444a2fb4 | 113 | * Thread encargado de enviar JSONs por el puerto serie |
HelGast95 | 73:a91805f9e9f0 | 114 | */ |
HelGast95 | 73:a91805f9e9f0 | 115 | void sendJsonOverSerial() { |
HelGast95 | 76:596c9924e51b | 116 | char tmp[512]; // Vble auxiliar para el tratamiento de cadenas de char. |
HelGast95 | 74:12b9444a2fb4 | 117 | string str; |
HelGast95 | 74:12b9444a2fb4 | 118 | while(true) { |
HelGast95 | 74:12b9444a2fb4 | 119 | // Esperamos a un mensaje en la cola |
HelGast95 | 77:48c622bf903f | 120 | picojson::object json; |
HelGast95 | 76:596c9924e51b | 121 | picojson::object event; |
HelGast95 | 76:596c9924e51b | 122 | picojson::object extraInfo; |
HelGast95 | 77:48c622bf903f | 123 | |
HelGast95 | 81:dded8c042cca | 124 | osEvent evt = JSONqueue.get(); |
HelGast95 | 79:9f3aca04de4e | 125 | if (evt.status == osEventMessage) { |
HelGast95 | 81:dded8c042cca | 126 | JSONdata_t *data = (JSONdata_t*) evt.value.p; |
HelGast95 | 79:9f3aca04de4e | 127 | |
HelGast95 | 81:dded8c042cca | 128 | int id = rand() % 1000; |
HelGast95 | 81:dded8c042cca | 129 | event["idEvent"] = picojson::value((double) id); |
HelGast95 | 81:dded8c042cca | 130 | event["type"] = picojson::value((double) data->type); |
HelGast95 | 81:dded8c042cca | 131 | //str = "E9:ED:F4:AC:BF:8E"; |
HelGast95 | 81:dded8c042cca | 132 | extraInfo["hazardousDevice"] = picojson::value(data->hazardousDevice); |
HelGast95 | 81:dded8c042cca | 133 | //str = "D5:62:12:BF:B8:45"; |
HelGast95 | 79:9f3aca04de4e | 134 | |
HelGast95 | 81:dded8c042cca | 135 | if(data->type != 0) extraInfo["affectedDevice"] = picojson::value(data->affectedDevice); |
HelGast95 | 79:9f3aca04de4e | 136 | event["extraInfo"] = picojson::value(extraInfo); |
HelGast95 | 79:9f3aca04de4e | 137 | json["Event"] = picojson::value(event); |
HelGast95 | 79:9f3aca04de4e | 138 | |
HelGast95 | 79:9f3aca04de4e | 139 | str = picojson::value(json).serialize(); |
HelGast95 | 79:9f3aca04de4e | 140 | |
HelGast95 | 79:9f3aca04de4e | 141 | // Convertimos el string a char * |
HelGast95 | 79:9f3aca04de4e | 142 | strncpy(tmp, str.c_str(), sizeof(tmp)); |
HelGast95 | 79:9f3aca04de4e | 143 | strncat(tmp, &finalCharacterJSON, sizeof(finalCharacterJSON)); // Añadimos el caracter al final |
HelGast95 | 79:9f3aca04de4e | 144 | tmp[sizeof(tmp) - 1] = 0; |
HelGast95 | 79:9f3aca04de4e | 145 | |
HelGast95 | 79:9f3aca04de4e | 146 | sendCharArrayToSerial(tmp, &pcSerial); |
HelGast95 | 79:9f3aca04de4e | 147 | } |
HelGast95 | 74:12b9444a2fb4 | 148 | } |
HelGast95 | 73:a91805f9e9f0 | 149 | } |
HelGast95 | 73:a91805f9e9f0 | 150 | |
HelGast95 | 79:9f3aca04de4e | 151 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { |
HelGast95 | 79:9f3aca04de4e | 152 | printLog("Desconectado. Se comienza la fase de Advertising de nuevo\r\n"); |
HelGast95 | 79:9f3aca04de4e | 153 | BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); |
HelGast95 | 73:a91805f9e9f0 | 154 | } |
HelGast95 | 73:a91805f9e9f0 | 155 | |
HelGast95 | 73:a91805f9e9f0 | 156 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { |
HelGast95 | 79:9f3aca04de4e | 157 | printLog("Conectado al servidor\r\n"); |
HelGast95 | 73:a91805f9e9f0 | 158 | } |
mbed_official | 1:72c60abef7e7 | 159 | |
HelGast95 | 80:5e52c5847273 | 160 | void parseRawJSONToQueue(string JSONsource) { |
HelGast95 | 80:5e52c5847273 | 161 | picojson::value v; |
HelGast95 | 81:dded8c042cca | 162 | string err, MAC1, MAC2; |
HelGast95 | 81:dded8c042cca | 163 | BLEdata_t *data = BLEMail.alloc();; |
HelGast95 | 80:5e52c5847273 | 164 | |
HelGast95 | 80:5e52c5847273 | 165 | picojson::parse(v, JSONsource.c_str(), JSONsource.c_str() + strlen(JSONsource.c_str()), &err); |
HelGast95 | 80:5e52c5847273 | 166 | printLog("res error? %s\r\n", err); |
HelGast95 | 80:5e52c5847273 | 167 | |
HelGast95 | 81:dded8c042cca | 168 | printLog("ToF %f\r\n", v.get("TOF").get<double>()); |
HelGast95 | 81:dded8c042cca | 169 | |
HelGast95 | 81:dded8c042cca | 170 | MAC1 = v.get("MAC1").get<string>(); |
HelGast95 | 81:dded8c042cca | 171 | MAC2 = v.get("MAC2").get<string>(); |
HelGast95 | 81:dded8c042cca | 172 | |
HelGast95 | 81:dded8c042cca | 173 | printLog("MAC1 en string: %s", MAC1); |
HelGast95 | 81:dded8c042cca | 174 | printLog("MAC2 en string: %s", MAC2); |
HelGast95 | 80:5e52c5847273 | 175 | data->ToF = v.get("TOF").get<double>(); |
HelGast95 | 81:dded8c042cca | 176 | |
HelGast95 | 81:dded8c042cca | 177 | printLog("Se leen los datos del JSON\r\n"); |
HelGast95 | 80:5e52c5847273 | 178 | |
HelGast95 | 80:5e52c5847273 | 179 | printLog("ToF = %f", data->ToF); |
HelGast95 | 80:5e52c5847273 | 180 | printLog(" MAC1 = %s", data->MAC1); |
HelGast95 | 80:5e52c5847273 | 181 | printLog(" MAC2 = %s\r\n", data->MAC2); |
HelGast95 | 80:5e52c5847273 | 182 | |
HelGast95 | 81:dded8c042cca | 183 | BLEMail.put(data); |
HelGast95 | 81:dded8c042cca | 184 | |
HelGast95 | 81:dded8c042cca | 185 | printLog("Se introduce dato en BLEqueue\r\n"); |
HelGast95 | 80:5e52c5847273 | 186 | } |
HelGast95 | 80:5e52c5847273 | 187 | |
HelGast95 | 79:9f3aca04de4e | 188 | void writeCharCallback(const GattWriteCallbackParams *params) { |
HelGast95 | 79:9f3aca04de4e | 189 | if(params->handle == tofService->getValueHandle()) { |
HelGast95 | 80:5e52c5847273 | 190 | char toChar [TOFService::TOF_CHAR_ARRAY_SIZE]; |
HelGast95 | 79:9f3aca04de4e | 191 | printLog("Data received: length = %d, data = 0x", params->len); |
HelGast95 | 79:9f3aca04de4e | 192 | for(int x=0; x < params->len; x++) { |
HelGast95 | 79:9f3aca04de4e | 193 | toChar[x] = (char) params->data[x]; |
HelGast95 | 79:9f3aca04de4e | 194 | printLog("%x", params->data[x]); |
HelGast95 | 73:a91805f9e9f0 | 195 | } |
HelGast95 | 80:5e52c5847273 | 196 | //toChar[params->len] = '\0'; |
HelGast95 | 80:5e52c5847273 | 197 | printLog("\n\r"); |
HelGast95 | 80:5e52c5847273 | 198 | |
HelGast95 | 80:5e52c5847273 | 199 | printLog("Cadena: %s\n\r", toChar); |
HelGast95 | 79:9f3aca04de4e | 200 | string str(toChar); |
HelGast95 | 80:5e52c5847273 | 201 | eventQueue.call(parseRawJSONToQueue, str); |
mbed_official | 1:72c60abef7e7 | 202 | } |
mbed_official | 1:72c60abef7e7 | 203 | } |
mbed_official | 1:72c60abef7e7 | 204 | |
HelGast95 | 73:a91805f9e9f0 | 205 | /** |
HelGast95 | 73:a91805f9e9f0 | 206 | * Esta función se llama si ha habido algún error en el proceso de inicialización del BLE |
HelGast95 | 73:a91805f9e9f0 | 207 | */ |
HelGast95 | 73:a91805f9e9f0 | 208 | void onBleInitError(BLE &ble, ble_error_t error) { |
HelGast95 | 79:9f3aca04de4e | 209 | printLog("Ha ocurrido un error al inicializar la configuracion del BLE\n"); |
mbed_official | 1:72c60abef7e7 | 210 | } |
mbed_official | 1:72c60abef7e7 | 211 | |
HelGast95 | 73:a91805f9e9f0 | 212 | /** |
HelGast95 | 73:a91805f9e9f0 | 213 | * Callback triggered when the ble initialization process has finished |
HelGast95 | 73:a91805f9e9f0 | 214 | */ |
HelGast95 | 79:9f3aca04de4e | 215 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { |
HelGast95 | 79:9f3aca04de4e | 216 | BLE &ble = params->ble; |
mbed_official | 1:72c60abef7e7 | 217 | ble_error_t error = params->error; |
HelGast95 | 79:9f3aca04de4e | 218 | |
mbed_official | 1:72c60abef7e7 | 219 | if (error != BLE_ERROR_NONE) { |
mbed_official | 1:72c60abef7e7 | 220 | return; |
mbed_official | 1:72c60abef7e7 | 221 | } |
mbed_official | 1:72c60abef7e7 | 222 | |
HelGast95 | 79:9f3aca04de4e | 223 | ble.gap().onDisconnection(disconnectionCallback); |
HelGast95 | 73:a91805f9e9f0 | 224 | ble.gap().onConnection(connectionCallback); |
HelGast95 | 79:9f3aca04de4e | 225 | ble.gattServer().onDataWritten(writeCharCallback); |
HelGast95 | 79:9f3aca04de4e | 226 | |
HelGast95 | 79:9f3aca04de4e | 227 | tofService = new TOFService(ble); |
HelGast95 | 79:9f3aca04de4e | 228 | |
HelGast95 | 79:9f3aca04de4e | 229 | /* Setup advertising */ |
HelGast95 | 79:9f3aca04de4e | 230 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT |
HelGast95 | 79:9f3aca04de4e | 231 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type |
HelGast95 | 79:9f3aca04de4e | 232 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name |
HelGast95 | 79:9f3aca04de4e | 233 | 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 | 234 | ble.gap().setAdvertisingInterval(100); // 100ms. |
mbed_official | 1:72c60abef7e7 | 235 | |
HelGast95 | 79:9f3aca04de4e | 236 | /* Start advertising */ |
HelGast95 | 79:9f3aca04de4e | 237 | ble.gap().startAdvertising(); |
mbed_official | 1:72c60abef7e7 | 238 | } |
mbed_official | 1:72c60abef7e7 | 239 | |
mbed_official | 1:72c60abef7e7 | 240 | void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { |
mbed_official | 1:72c60abef7e7 | 241 | BLE &ble = BLE::Instance(); |
mbed_official | 10:ac3615194d04 | 242 | eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); |
HelGast95 | 73:a91805f9e9f0 | 243 | } |
HelGast95 | 73:a91805f9e9f0 | 244 | |
HelGast95 | 73:a91805f9e9f0 | 245 | void BLEServiceManagment() { |
mbed_official | 1:72c60abef7e7 | 246 | BLE &ble = BLE::Instance(); |
HelGast95 | 73:a91805f9e9f0 | 247 | ble.onEventsToProcess(scheduleBleEventsProcessing); |
mbed_official | 1:72c60abef7e7 | 248 | ble.init(bleInitComplete); |
HelGast95 | 73:a91805f9e9f0 | 249 | |
mbed_official | 10:ac3615194d04 | 250 | eventQueue.dispatch_forever(); |
HelGast95 | 73:a91805f9e9f0 | 251 | } |
mbed_official | 1:72c60abef7e7 | 252 | |
HelGast95 | 73:a91805f9e9f0 | 253 | int main() { |
HelGast95 | 74:12b9444a2fb4 | 254 | srand(time(NULL)); |
HelGast95 | 77:48c622bf903f | 255 | threadLED.start(callback(blinkLED3)); |
HelGast95 | 79:9f3aca04de4e | 256 | threadBLE.start(callback(BLEServiceManagment)); |
HelGast95 | 81:dded8c042cca | 257 | threadSerial.start(callback(sendJsonOverSerial)); |
HelGast95 | 81:dded8c042cca | 258 | threadCalculateEvent.start(callback(calculateEvent)); |
HelGast95 | 74:12b9444a2fb4 | 259 | |
HelGast95 | 73:a91805f9e9f0 | 260 | threadLED.join(); |
HelGast95 | 73:a91805f9e9f0 | 261 | threadBLE.join(); |
HelGast95 | 81:dded8c042cca | 262 | threadSerial.join(); |
HelGast95 | 81:dded8c042cca | 263 | threadCalculateEvent.join(); |
HelGast95 | 73:a91805f9e9f0 | 264 | } |