Test

Committer:
HelGast95
Date:
Fri Feb 01 14:08:20 2019 +0000
Revision:
80:5e52c5847273
Parent:
79:9f3aca04de4e
Child:
81:dded8c042cca
Se soluciona lo de enviar mas de 20 bytes

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 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 80:5e52c5847273 34 //Queue<EventData_t, 32> Eventqueue; WIP
HelGast95 74:12b9444a2fb4 35 Queue<BLEdata_t, 32> BLEqueue;
HelGast95 74:12b9444a2fb4 36 MemoryPool<BLEdata_t, 32> BLEmpool;
mbed_official 1:72c60abef7e7 37
HelGast95 80:5e52c5847273 38 Thread threadLED(osPriorityAboveNormal1, 400);
HelGast95 74:12b9444a2fb4 39 Thread threadSerial(osPriorityAboveNormal2, 2500);
HelGast95 80:5e52c5847273 40 Thread threadBLE(osPriorityRealtime3, 2500);
HelGast95 73:a91805f9e9f0 41
HelGast95 79:9f3aca04de4e 42 template<typename arg>
HelGast95 79:9f3aca04de4e 43 void printLog(const char * log, arg data) {
HelGast95 79:9f3aca04de4e 44 if(VERBOSE_MODE) printf(log, data);
HelGast95 79:9f3aca04de4e 45 }
HelGast95 79:9f3aca04de4e 46
HelGast95 79:9f3aca04de4e 47 void printLog(const char * log) {
HelGast95 79:9f3aca04de4e 48 if(VERBOSE_MODE) printf(log);
HelGast95 79:9f3aca04de4e 49 }
HelGast95 79:9f3aca04de4e 50
HelGast95 73:a91805f9e9f0 51 /**
HelGast95 77:48c622bf903f 52 * Thread encargado de parpadear un LED continuamente
HelGast95 73:a91805f9e9f0 53 */
HelGast95 73:a91805f9e9f0 54 void blinkLED3() {
HelGast95 73:a91805f9e9f0 55 while(true) {
HelGast95 73:a91805f9e9f0 56 led3Test = !led3Test;
HelGast95 74:12b9444a2fb4 57 wait(0.8);
HelGast95 73:a91805f9e9f0 58 }
HelGast95 73:a91805f9e9f0 59 }
HelGast95 73:a91805f9e9f0 60
HelGast95 73:a91805f9e9f0 61 /**
HelGast95 73:a91805f9e9f0 62 * Método encargado de enviar un string por el puerto serie char a char
HelGast95 73:a91805f9e9f0 63 */
HelGast95 73:a91805f9e9f0 64 void sendCharArrayToSerial(char const *array, Serial *serial) {
HelGast95 74:12b9444a2fb4 65 uint32_t i = 0;
HelGast95 73:a91805f9e9f0 66 while(array[i] != '\0') {
HelGast95 73:a91805f9e9f0 67 serial->putc(array[i]);
HelGast95 73:a91805f9e9f0 68 i++;
HelGast95 73:a91805f9e9f0 69 }
HelGast95 73:a91805f9e9f0 70 serial->putc('\0');
HelGast95 73:a91805f9e9f0 71 }
mbed_official 1:72c60abef7e7 72
HelGast95 73:a91805f9e9f0 73 /**
HelGast95 74:12b9444a2fb4 74 * Thread encargado de enviar JSONs por el puerto serie
HelGast95 73:a91805f9e9f0 75 */
HelGast95 73:a91805f9e9f0 76 void sendJsonOverSerial() {
HelGast95 76:596c9924e51b 77 char tmp[512]; // Vble auxiliar para el tratamiento de cadenas de char.
HelGast95 74:12b9444a2fb4 78 string str;
HelGast95 74:12b9444a2fb4 79 while(true) {
HelGast95 74:12b9444a2fb4 80 // Esperamos a un mensaje en la cola
HelGast95 77:48c622bf903f 81 picojson::object json;
HelGast95 76:596c9924e51b 82 picojson::object event;
HelGast95 76:596c9924e51b 83 picojson::object extraInfo;
HelGast95 77:48c622bf903f 84
HelGast95 79:9f3aca04de4e 85 osEvent evt = BLEqueue.get();
HelGast95 79:9f3aca04de4e 86 if (evt.status == osEventMessage) {
HelGast95 79:9f3aca04de4e 87 BLEdata_t *BLEdata = (BLEdata_t*)evt.value.p;
HelGast95 79:9f3aca04de4e 88
HelGast95 79:9f3aca04de4e 89 BLEmpool.free(BLEdata);
HelGast95 79:9f3aca04de4e 90
HelGast95 79:9f3aca04de4e 91 int type = rand() % 4;
HelGast95 80:5e52c5847273 92 event["idEvent"] = picojson::value(BLEdata->MAC1);
HelGast95 79:9f3aca04de4e 93 event["type"] = picojson::value((double) type);
HelGast95 79:9f3aca04de4e 94 str = "E9:ED:F4:AC:BF:8E";
HelGast95 79:9f3aca04de4e 95 extraInfo["hazardousDevice"] = picojson::value(str);
HelGast95 79:9f3aca04de4e 96 str = "D5:62:12:BF:B8:45";
HelGast95 79:9f3aca04de4e 97
HelGast95 79:9f3aca04de4e 98 if(type != 0) extraInfo["affectedDevice"] = picojson::value(str);
HelGast95 79:9f3aca04de4e 99 event["extraInfo"] = picojson::value(extraInfo);
HelGast95 79:9f3aca04de4e 100 json["Event"] = picojson::value(event);
HelGast95 79:9f3aca04de4e 101
HelGast95 79:9f3aca04de4e 102 str = picojson::value(json).serialize();
HelGast95 79:9f3aca04de4e 103
HelGast95 79:9f3aca04de4e 104 // Convertimos el string a char *
HelGast95 79:9f3aca04de4e 105 strncpy(tmp, str.c_str(), sizeof(tmp));
HelGast95 79:9f3aca04de4e 106 strncat(tmp, &finalCharacterJSON, sizeof(finalCharacterJSON)); // Añadimos el caracter al final
HelGast95 79:9f3aca04de4e 107 tmp[sizeof(tmp) - 1] = 0;
HelGast95 79:9f3aca04de4e 108
HelGast95 79:9f3aca04de4e 109 sendCharArrayToSerial(tmp, &pcSerial);
HelGast95 79:9f3aca04de4e 110 }
HelGast95 74:12b9444a2fb4 111 }
HelGast95 73:a91805f9e9f0 112 }
HelGast95 73:a91805f9e9f0 113
HelGast95 79:9f3aca04de4e 114 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
HelGast95 79:9f3aca04de4e 115 printLog("Desconectado. Se comienza la fase de Advertising de nuevo\r\n");
HelGast95 79:9f3aca04de4e 116 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
HelGast95 73:a91805f9e9f0 117 }
HelGast95 73:a91805f9e9f0 118
HelGast95 73:a91805f9e9f0 119 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
HelGast95 79:9f3aca04de4e 120 printLog("Conectado al servidor\r\n");
HelGast95 73:a91805f9e9f0 121 }
mbed_official 1:72c60abef7e7 122
HelGast95 80:5e52c5847273 123 void parseRawJSONToQueue(string JSONsource) {
HelGast95 80:5e52c5847273 124 picojson::value v;
HelGast95 80:5e52c5847273 125 string err;
HelGast95 80:5e52c5847273 126 BLEdata_t* data = BLEmpool.alloc();
HelGast95 80:5e52c5847273 127
HelGast95 80:5e52c5847273 128 picojson::parse(v, JSONsource.c_str(), JSONsource.c_str() + strlen(JSONsource.c_str()), &err);
HelGast95 80:5e52c5847273 129 printLog("res error? %s\r\n", err);
HelGast95 80:5e52c5847273 130
HelGast95 80:5e52c5847273 131 data->ToF = v.get("TOF").get<double>();
HelGast95 80:5e52c5847273 132 data->MAC1 = v.get("MAC1").get<string>();
HelGast95 80:5e52c5847273 133 data->MAC2 = v.get("MAC2").get<string>();
HelGast95 80:5e52c5847273 134
HelGast95 80:5e52c5847273 135 printLog("ToF = %f", data->ToF);
HelGast95 80:5e52c5847273 136 printLog(" MAC1 = %s", data->MAC1);
HelGast95 80:5e52c5847273 137 printLog(" MAC2 = %s\r\n", data->MAC2);
HelGast95 80:5e52c5847273 138
HelGast95 80:5e52c5847273 139 //EventQueue.put(data); WIP
HelGast95 80:5e52c5847273 140 }
HelGast95 80:5e52c5847273 141
HelGast95 79:9f3aca04de4e 142 void writeCharCallback(const GattWriteCallbackParams *params) {
HelGast95 79:9f3aca04de4e 143 if(params->handle == tofService->getValueHandle()) {
HelGast95 80:5e52c5847273 144 //BLEdata_t* data = BLEmpool.alloc();
HelGast95 80:5e52c5847273 145 //BLEdata_t data;
HelGast95 80:5e52c5847273 146 char toChar [TOFService::TOF_CHAR_ARRAY_SIZE];
HelGast95 79:9f3aca04de4e 147 printLog("Data received: length = %d, data = 0x", params->len);
HelGast95 79:9f3aca04de4e 148 for(int x=0; x < params->len; x++) {
HelGast95 79:9f3aca04de4e 149 toChar[x] = (char) params->data[x];
HelGast95 79:9f3aca04de4e 150 printLog("%x", params->data[x]);
HelGast95 73:a91805f9e9f0 151 }
HelGast95 80:5e52c5847273 152 //toChar[params->len] = '\0';
HelGast95 80:5e52c5847273 153 printLog("\n\r");
HelGast95 80:5e52c5847273 154
HelGast95 80:5e52c5847273 155 printLog("Cadena: %s\n\r", toChar);
HelGast95 79:9f3aca04de4e 156 string str(toChar);
HelGast95 80:5e52c5847273 157 eventQueue.call(parseRawJSONToQueue, str);
HelGast95 80:5e52c5847273 158 //BLEqueue.put(data);
mbed_official 1:72c60abef7e7 159 }
mbed_official 1:72c60abef7e7 160 }
mbed_official 1:72c60abef7e7 161
HelGast95 73:a91805f9e9f0 162 /**
HelGast95 73:a91805f9e9f0 163 * Esta función se llama si ha habido algún error en el proceso de inicialización del BLE
HelGast95 73:a91805f9e9f0 164 */
HelGast95 73:a91805f9e9f0 165 void onBleInitError(BLE &ble, ble_error_t error) {
HelGast95 79:9f3aca04de4e 166 printLog("Ha ocurrido un error al inicializar la configuracion del BLE\n");
mbed_official 1:72c60abef7e7 167 }
mbed_official 1:72c60abef7e7 168
HelGast95 73:a91805f9e9f0 169 /**
HelGast95 73:a91805f9e9f0 170 * Callback triggered when the ble initialization process has finished
HelGast95 73:a91805f9e9f0 171 */
HelGast95 79:9f3aca04de4e 172 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) {
HelGast95 79:9f3aca04de4e 173 BLE &ble = params->ble;
mbed_official 1:72c60abef7e7 174 ble_error_t error = params->error;
HelGast95 79:9f3aca04de4e 175
mbed_official 1:72c60abef7e7 176 if (error != BLE_ERROR_NONE) {
mbed_official 1:72c60abef7e7 177 return;
mbed_official 1:72c60abef7e7 178 }
mbed_official 1:72c60abef7e7 179
HelGast95 79:9f3aca04de4e 180 ble.gap().onDisconnection(disconnectionCallback);
HelGast95 73:a91805f9e9f0 181 ble.gap().onConnection(connectionCallback);
HelGast95 79:9f3aca04de4e 182 ble.gattServer().onDataWritten(writeCharCallback);
HelGast95 79:9f3aca04de4e 183
HelGast95 79:9f3aca04de4e 184 tofService = new TOFService(ble);
HelGast95 79:9f3aca04de4e 185
HelGast95 79:9f3aca04de4e 186 /* Setup advertising */
HelGast95 79:9f3aca04de4e 187 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
HelGast95 79:9f3aca04de4e 188 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
HelGast95 79:9f3aca04de4e 189 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
HelGast95 79:9f3aca04de4e 190 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 191 ble.gap().setAdvertisingInterval(100); // 100ms.
mbed_official 1:72c60abef7e7 192
HelGast95 79:9f3aca04de4e 193 /* Start advertising */
HelGast95 79:9f3aca04de4e 194 ble.gap().startAdvertising();
mbed_official 1:72c60abef7e7 195 }
mbed_official 1:72c60abef7e7 196
mbed_official 1:72c60abef7e7 197 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mbed_official 1:72c60abef7e7 198 BLE &ble = BLE::Instance();
mbed_official 10:ac3615194d04 199 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
HelGast95 73:a91805f9e9f0 200 }
HelGast95 73:a91805f9e9f0 201
HelGast95 73:a91805f9e9f0 202 void BLEServiceManagment() {
mbed_official 1:72c60abef7e7 203 BLE &ble = BLE::Instance();
HelGast95 73:a91805f9e9f0 204 ble.onEventsToProcess(scheduleBleEventsProcessing);
mbed_official 1:72c60abef7e7 205 ble.init(bleInitComplete);
HelGast95 73:a91805f9e9f0 206
mbed_official 10:ac3615194d04 207 eventQueue.dispatch_forever();
HelGast95 73:a91805f9e9f0 208 }
mbed_official 1:72c60abef7e7 209
HelGast95 73:a91805f9e9f0 210 int main() {
HelGast95 74:12b9444a2fb4 211 srand(time(NULL));
HelGast95 77:48c622bf903f 212 threadLED.start(callback(blinkLED3));
HelGast95 79:9f3aca04de4e 213 threadBLE.start(callback(BLEServiceManagment));
HelGast95 80:5e52c5847273 214 //threadSerial.start(callback(sendJsonOverSerial)); WIP
HelGast95 74:12b9444a2fb4 215
HelGast95 73:a91805f9e9f0 216 threadLED.join();
HelGast95 73:a91805f9e9f0 217 threadBLE.join();
HelGast95 79:9f3aca04de4e 218 //threadSerial.join();
HelGast95 73:a91805f9e9f0 219 }