Javier Vargas
/
ControllerBLE
Test
source/main.cpp@80:5e52c5847273, 2019-02-01 (annotated)
- 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?
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 | 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 | } |