source for demo Book And Plug
Dependencies: APA102
Diff: BltLink.cpp
- Revision:
- 0:5648c217e527
diff -r 000000000000 -r 5648c217e527 BltLink.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BltLink.cpp Mon May 14 12:33:43 2018 +0000 @@ -0,0 +1,143 @@ +/* + * + */ +#include "mbed.h" +#include "string.h" +#include "mbed_events.h" +#include "ble/BLE.h" +#include "ble/services/UARTService.h" +#if 0 +#include "X_NUCLEO_IDB0XA1/x-nucleo-idb0xa1/bluenrg-hci/ble_hci.h" +#endif + +#include "BNP_Ctrl.h" +#include "BltLink.h" + +#define NEED_CONSOLE_OUTPUT 1 + +#if NEED_CONSOLE_OUTPUT +#define PRINTF(...) { printf(__VA_ARGS__); } +#else +#define PRINTF(...) +#endif + +// static +BltLink *BltLink::singleInstP = 0 ; + +const SecurityManager::Passkey_t pinCode = {'6' , '5' , '4' , '3', '2', '1' } ; + +void BltLink::connectionCallback(const Gap::ConnectionCallbackParams_t *params) +{ + BltLink &bltLink = BltLink::getInst() ; + bltLink.connectionHandle = params->handle ; + bltLink.connectedB = true ; + printf ("Connected!\n\r") ; +} + +//static +void BltLink::disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) +{ + BltLink &bltLink = BltLink::getInst() ; + bltLink.connectedB = false ; + printf ("Disconnected!\n\r"); + BLE::Instance().startAdvertising(); +} + + +// replace these supplied by mbed. +void UARTService::onDataWritten(const GattWriteCallbackParams *params) +{ + if (params->handle == getTXCharacteristicHandle()) { + uint16_t bytesRead = params->len; + PRINTF ("UARTService::received %u bytes\n\r", bytesRead); + if (bytesRead <= BLE_UART_SERVICE_MAX_DATA_LEN) { + numBytesReceived = bytesRead; + receiveBufferIndex = 0; + memcpy(receiveBuffer, params->data, numBytesReceived); + if (!strncmp((char*)receiveBuffer, "$RESERVE", numBytesReceived)) { + printf("\r\nBltLink : msg RESERVE\n") ; + BNP_Ctrl::getInst().signalEvent(BNP_Ctrl::oprTerminalReserve) ; + } + if (!strncmp((char*)receiveBuffer, "$RELEASED", numBytesReceived)) { + printf("\r\nBltLink : msg RELEAS\n") ; + BNP_Ctrl::getInst().signalEvent(BNP_Ctrl::oprTerminalRelease) ; + } + if (!strncmp((char*)receiveBuffer, "$PLUG_E", numBytesReceived)) { + printf("\r\nBltLink : msg PLUG_E\n") ; + BltLink::getInst().selectedIrisPosition = BNP_Ctrl::irisAtPlugEPosition ; + BNP_Ctrl::getInst().signalEvent(BNP_Ctrl::oprPlugSelection) ; + } + if (!strncmp((char*)receiveBuffer, "$PLUG_C", numBytesReceived)) { + printf("\r\nBltLink : msg PLUG_C\n") ; + BltLink::getInst().selectedIrisPosition = BNP_Ctrl::irisAtPlugCPosition ; ; + BNP_Ctrl::getInst().signalEvent(BNP_Ctrl::oprPlugSelection) ; + } + if (!strncmp((char*)receiveBuffer, "$RESUME", numBytesReceived)) { + printf("\r\nBltLink : msg RESUME\n") ; + BNP_Ctrl::getInst().signalEvent(BNP_Ctrl::oprResumptionRequest) ; + } + } + } +} + + +void BltLink::printMacAddress() +{ + /* Print out device MAC address to the console*/ + Gap::AddressType_t addr_type; + Gap::Address_t address; + BLE::Instance().gap().getAddress(&addr_type, address); + printf("DEVICE MAC ADDRESS: "); + for (int i = 5; i >= 1; i--){ + printf("%02x:", address[i]); + } + printf("%02x\r\n", address[0]); +} + +#if 0 +//static +void BltLink::updateRssi(void) +{ + BltLink &bltLink = getInst() ; + if (bltLink.connectedB) { + *bltLink.led1P = !*bltLink.led1P ; + hci_read_rssi(&bltLink.connectionHandle, &bltLink.rssi); + } +} + +#endif +//static +void BltLink::scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { + BLE &ble = BLE::Instance(); + mainQueueP->call(Callback<void()>(&ble, &BLE::processEvents)); +} + + +void BltLink::init(void) +{ + *led1P = 0; + + BLE &ble = BLE::Instance(); + ble.onEventsToProcess(scheduleBleEventsProcessing); + ble.init(); + for(; !ble.hasInitialized() ; ) ; + printf ("!!!! ble init done\r\n") ; + printMacAddress() ; + ble.gap().onConnection (connectionCallback); + ble.gap().onDisconnection (disconnectionCallback); + + uartServicePtr = new UARTService(ble) ; + + /* setup advertising */ + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, //GapAdvertisingData::SHORTENED_LOCAL_NAME, + (const uint8_t *)"Bk&PlgA", sizeof("Bk&PlgA") - 1); + ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); + ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.setAdvertisingInterval(1000); /* in multiples of 0.625ms. */ + ble.gap().startAdvertising(); + +// queue.call_every(250, updateRssi); + printf ("BltLink::init() done\n\r"); +}