Test

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?

UserRevisionLine numberNew 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 }