Lizzy project
Dependencies: aconno_I2C Lis2dh12 adc52832_common aconno_SEGGER_RTT
aconno_ble/aconno_ble.cpp
- Committer:
- dbartolovic
- Date:
- 2019-01-31
- Branch:
- master
- Revision:
- 28:0cc8a58195cb
- Parent:
- 26:6101bb09f70d
File content as of revision 28:0cc8a58195cb:
/* * Made by Jurica Resetar @ aconno * More info @ aconno.de * */ #include "main.h" #include "aconno_ble.h" #include "tasks.h" #include "lizzy_service.h" #include "proj_config.h" /* BLE event queue size */ #define BLE_EVENT_COUNT (4) init_lizzy_t init_lizzy = { .buzz = false, .leds = {false ,false, false}, .acc_lsb = LSB_VALUE, .acc_data = {0, 0, 0} }; LizzyService *lizzy_service; static bool clientConected = false; static EventQueue eventQueue( BLE_EVENT_COUNT * EVENTS_EVENT_SIZE ); void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { BLE &ble = context->ble; eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); } EventQueue *getBLEEventQueue(void) { return &eventQueue; } bool bleIsClientConnected(void) { return clientConected; } void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { clientConected = false; (lizzy_service->get_ble())->gap().startAdvertising(); } void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params){ clientConected = true; } void onDataWrittenCallback(const GattWriteCallbackParams *params) { if ((params->handle == lizzy_service->getBuzzHandle())) { #if VODAFONE_COMPATIBILITY == 1 #else if ((uint8_t)true < *(params->data)) lizzy_service->setBuzz(true); #endif updateBuzzLedsT.signal_set(UPDATE_BUZZ_LEDS); } #if VODAFONE_COMPATIBILITY == 1 #else else if ((params->handle == lizzy_service->getRedLedHandle()) && (params->len == 1)) { if ((uint8_t)true < *(params->data)) lizzy_service->setRedLed(true); updateBuzzLedsT.signal_set(UPDATE_BUZZ_LEDS); } #endif else if ((params->handle == lizzy_service->get_green_handle()) && (params->len == 1)) { if ((uint8_t)true < *(params->data)) lizzy_service->set_green_state(true); updateBuzzLedsT.signal_set(UPDATE_BUZZ_LEDS); } else if ((params->handle == lizzy_service->get_blue_handle()) && (params->len == 1)) { if ((uint8_t)true < *(params->data)) lizzy_service->set_blue_state(true); updateBuzzLedsT.signal_set(UPDATE_BUZZ_LEDS); } } /** * Callback triggered when the ble initialization process has finished */ void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { advertising_packet advertisementPacket; BLE& ble = params->ble; ble_error_t error = params->error; if (error != BLE_ERROR_NONE) { return; } /* Ensure that it is the default instance of BLE */ if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } lizzy_service = new LizzyService(ble, &init_lizzy); ble.gap().onDisconnection(disconnectionCallback); ble.gap().onConnection(onConnectionCallback); ble.gattServer().onDataWritten(onDataWrittenCallback); #if VODAFONE_COMPATIBILITY == 1 uint8_t myMacAddress[6]; BLEProtocol::AddressType_t temp_address_type; ble.gap().getAddress(&temp_address_type, myMacAddress); lizzy_service->setMac(myMacAddress); // Update MAC address #endif // Setup event handling. This is needed only with services. ble.onEventsToProcess(scheduleBleEventsProcessing); advertisementPacket.header = APPLICATION_ID; advertisementPacket.type = 0x00; advertisementPacket.gyroscope[0] = (int16_t)0; advertisementPacket.gyroscope[1] = (int16_t)0; advertisementPacket.gyroscope[2] = (int16_t)0; advertisementPacket.accelerometer[0] = (int16_t)0; advertisementPacket.accelerometer[1] = (int16_t)0; advertisementPacket.accelerometer[2] = (int16_t)0; advertisementPacket.magnetometer[0] = (int16_t)0; advertisementPacket.magnetometer[1] = (int16_t)0; advertisementPacket.magnetometer[2] = (int16_t)0; /* setup advertising */ #if VODAFONE_COMPATIBILITY == 1 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::INCOMPLETE_LIST_128BIT_SERVICE_IDS , (uint8_t*)UUID, sizeof(UUID)); #else ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&advertisementPacket, sizeof(advertisementPacket)); #endif ble.gap().setAdvertisingInterval(ADV_INTERVAL_MS); //ble.gap().startAdvertising(); } void updatePayload(BLE *ble, advertising_packet *advertisementPacket) { ble->gap().stopAdvertising(); GapAdvertisingData advetisementData = GapAdvertisingData(); advetisementData = ble->getAdvertisingData(); advetisementData.updateData(advetisementData.MANUFACTURER_SPECIFIC_DATA, (uint8_t *)advertisementPacket, sizeof(advertising_packet)); ble->setAdvertisingData(advetisementData); //ble->gap().startAdvertising(); }