TYBLE16 on os5 sample programs
Dependencies: BME280 TextLCD nRF51_Vdd
Fork of TYBLE16_mbedlized_os5_BASE by
Please refer following notebook.
/users/kenjiArai/notebook/tyble16-module-as-mbed-os-5-board-mbedlization/
Diff: 7_Uart_Client/original.cpp
- Revision:
- 3:c0010c8ad17f
- Parent:
- 2:47ad8c48224e
--- a/7_Uart_Client/original.cpp Sat Apr 14 12:57:53 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,614 +0,0 @@ -#if 0 -//------------------------------------------------------------------------------------------------- -// ORIGINAL PROGRAM -// S130 potential unstability case [closed] by Fabien Comte -// https://devzone.nordicsemi.com/question/49705/s130-potential-unstability-case/ -// -#include "mbed.h" -#include "BLE.h" -#include "UARTService.h" -#include "ble/DiscoveredCharacteristic.h" -#include "ble/DiscoveredService.h" -#include "ble/service/UARTService.h" - -#define SOFT_DEVICE_FATHER_HANDLE 3 - -#define BOARDS_COUNT 3 - -const Gap::Address_t mac_board_0 = {0xb8, 0xac, 0x4e, 0x8d, 0x8b, 0xeb}; -const Gap::Address_t mac_board_1 = {0x9c, 0x43, 0x62, 0x30, 0xaf, 0xd2}; -const Gap::Address_t mac_board_2 = {0x5f, 0x1a, 0x9e, 0x6a, 0x63, 0xdd}; - - -// tiny ble board -#define LED_GREEN p21 -#define LED_RED p22 -#define LED_BLUE p23 -#define BUTTON_PIN p17 -#define BATTERY_PIN p1 - -#define MPU6050_SDA p12 -#define MPU6050_SCL p13 - -#define UART_TX p9 -#define UART_RX p11 -#define UART_CTS p8 -#define UART_RTS p10 - -DigitalOut led(LED_RED); -DigitalOut alivenessLED(LED_GREEN); -InterruptIn button(BUTTON_PIN); -AnalogIn battery(BATTERY_PIN); -Serial pc(UART_TX, UART_RX); - -bool mac_equals(const Gap::Address_t mac_1, const Gap::Address_t mac_2) -{ - #if 0 - if (mac_1[0] != mac_2[0]) - { - return false; - } - if (mac_1[1] != mac_2[1]) - { - return false; - } - if (mac_1[2] != mac_2[2]) - { - return false; - } - if (mac_1[3] != mac_2[3]) - { - return false; - } - if (mac_1[4] != mac_2[4]) - { - return false; - } - if (mac_1[5] != mac_2[5]) - { - return false; - } - #else - for (int i = 0; i < 6; i++) - { - if (mac_1[i] != mac_2[i]) - { - //pc.printf("0x%02x != 0x%02x at %d\r\n", mac_1[i], mac_2[i], i); - return false; - } - else - { - //pc.printf("0x%02x == 0x%02x at %d\r\n", mac_1[i], mac_2[i], i); - } - } - #endif - return true; -} - -int get_board_index(const Gap::Address_t mac) -{ - if (mac_equals(mac, mac_board_0)) - { - return 0; - } - if (mac_equals(mac, mac_board_1)) - { - return 1; - } - if (mac_equals(mac, mac_board_2)) - { - return 2; - } - - return -1; -} - -void periodicCallback(void) -{ - alivenessLED = !alivenessLED; /* do blinky on alivenessLED while we're waiting for BLE events */ -} - - -// Mixed role **************************************************** -BLE ble; -Gap::Address_t my_mac; -int my_board_index = -1; - -// Device role **************************************************** -UARTService * uartServicePtr = NULL; -const static char DEVICE_NAME[] = "ChangeMe!!"; // change this -static const uint16_t uuid16_list[] = {UARTServiceShortUUID}; -volatile int central_handle = -1; - - -// Central role **************************************************** -Gap::Handle_t connectionHandle = 0xFFFF; -DiscoveredCharacteristic uartTXCharacteristic; -DiscoveredCharacteristic uartRXCharacteristic; -bool foundUartRXCharacteristic = false; -volatile int device_handle = -1; - - -// Device role **************************************************** -void onReceivedDataFromCentralCallback(const GattWriteCallbackParams *params) -{ - if (uartServicePtr != NULL) - { - if ((params->handle == uartServicePtr->getTXCharacteristicHandle()) && (params->len >= 1)) - { - if (params->data[0] != '0') - { - led = 1; - } - else - { - led = 0; - } - - for(int i = 0; i < params->len; i++) - { - pc.printf("%c", params->data[i]); - } - - pc.printf(" (%d, %d)\r\n", params->handle, params->connHandle); - } - } -} - -// Central role **************************************************** -void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) -{ - // do connections like a triangle - int peer_board_index = get_board_index(params->peerAddr); - - int next_board_index = my_board_index + 1; - if (next_board_index >= BOARDS_COUNT) - { - next_board_index = 0; - } - - //pc.printf("adv %d, %d, %d\r\n", peer_board_index, my_board_index, next_board_index); - - // force order - if ((central_handle != -1) || (peer_board_index == 0)) - { - if (peer_board_index == next_board_index) - { - //pc.printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", - // params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], - // params->rssi, params->isScanResponse, params->type); - - ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); - } - } -} - -void serviceDiscoveryCallback(const DiscoveredService *service) -{ - if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) - { - pc.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle()); - } - else - { - //pc.printf("S UUID-"); - const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID(); - for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) - { - pc.printf("%02x", longUUIDBytes[i]); - } - pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle()); - } -} - -void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) -{ - //pc.printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); - if (characteristicP->getUUID().getShortUUID() == UARTServiceTXCharacteristicShortUUID) - { - pc.printf("fit TX 0x%04x\r\n", UARTServiceTXCharacteristicShortUUID); - /* !ALERT! Alter this filter to suit your device. */ - uartTXCharacteristic = *characteristicP; - } - else if (characteristicP->getUUID().getShortUUID() == UARTServiceRXCharacteristicShortUUID) - { - pc.printf("fit RX 0x%04x\r\n", UARTServiceRXCharacteristicShortUUID); - /* !ALERT! Alter this filter to suit your device. */ - uartRXCharacteristic = *characteristicP; - foundUartRXCharacteristic = true; - } -} - -void discoveryTerminationCallback(Gap::Handle_t connectionHandle) -{ - pc.printf("terminated SD for handle %u\r\n", connectionHandle); -} - -void onReceivedDataFromDeviceCallback(const GattHVXCallbackParams *params) -{ - //pc.printf("received HVX callback for handle %u; type %s\r\r\n", params->handle, (params->type == BLE_HVX_NOTIFICATION) ? "notification" : "indication"); - if (params->type == BLE_HVX_NOTIFICATION) - { - if ((params->handle == uartRXCharacteristic.getValueHandle()) && (params->len > 0)) - { - for (int i = 0; i < params->len; i++) - { - pc.printf("%c", params->data[i]); - } - - pc.printf(" (%d, %d)\r\n", params->handle, params->connHandle); - } - } - else - { - pc.printf("%d\r\n", params->type); - } -} - -// Mixed role **************************************************** -void connectionCallback(const Gap::ConnectionCallbackParams_t *params) -{ - if (params->role == Gap::CENTRAL) - { - if (central_handle == -1) - { - ble.stopAdvertising(); // stop advertising during discovery, incoming connection breaks discovery - } - - device_handle = params->handle; - pc.printf("connected as central (handle = %d)\r\n\r", params->handle); - connectionHandle = params->handle; - ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); - int ret = ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, UARTServiceShortUUID/*, 0xa001*/); - - if (ret != BLE_ERROR_NONE) - { - pc.printf("launchServiceDiscovery failed error = %d\r\n\r", ret); - } - } - else - { - central_handle = params->handle; - pc.printf("connected as device (handle = %d)\r\n\r", params->handle); - - //pc.printf("Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n", params->connectionParams->minConnectionInterval, params->connectionParams->maxConnectionInterval, params->connectionParams->slaveLatency, params->connectionParams->connectionSupervisionTimeout); - /* - Gap::ConnectionParams_t connectionParams; - connectionParams.minConnectionInterval = 6; - connectionParams.maxConnectionInterval = 12; - connectionParams.slaveLatency = 40; - connectionParams.connectionSupervisionTimeout = 500; - - int ret = ble.updateConnectionParams(params->handle, &connectionParams); - if (ret != BLE_ERROR_NONE) - { - pc.printf("failed to update connection parameter\r\n"); - } - */ - } - pc.printf("own %02x:%02x:%02x:%02x:%02x:%02x (%s), peer %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n", params->ownAddr[5], params->ownAddr[4], params->ownAddr[3], params->ownAddr[2], params->ownAddr[1], params->ownAddr[0], (params->ownAddrType == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random", params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], (params->peerAddrType == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"); -} - -void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) -{ - char * ascii_reason = "?"; - switch (reason) - { - case Gap::CONNECTION_TIMEOUT: - ascii_reason = "connection timeout"; - break; - case Gap::REMOTE_USER_TERMINATED_CONNECTION: - ascii_reason = "user terminated connection"; - break; - case Gap::REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES: - ascii_reason = "low resources"; - break; - case Gap::REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF: - ascii_reason = "power off"; - break; - case Gap::LOCAL_HOST_TERMINATED_CONNECTION: - ascii_reason = "host terminated connection"; - break; - case Gap::CONN_INTERVAL_UNACCEPTABLE: - ascii_reason = "interval unacceptable"; - break; - default: - ascii_reason = "unknown"; - break; - } - - pc.printf("disconnected (reason = %s, handle = %d)\r\n", ascii_reason, handle); - - - if (handle == SOFT_DEVICE_FATHER_HANDLE) - { - central_handle = -1; - // restart advertising - ble.startAdvertising(); - } - else - { - device_handle = -1; - // restart scan - ble.gap().startScan(advertisementCallback); - } -} - - - -void serialTxCallback() -{ - -} - -int rx_char = -1; -void serialRxCallback() -{ - if (rx_char != -1) - { - pc.printf("overflow\r\n"); - } - - //computer.putc(computer.getc()); - rx_char = pc.getc(); -} - -/* -void gattServerOnDataSent(unsigned count) -{ - -} -*/ - - -int main(void) -{ - alivenessLED = 0; - - pc.baud(115200); - //pc.attach(&serialTxCallback, Serial::TxIrq); - pc.attach(&serialRxCallback, Serial::RxIrq); - - // clear terminal output - for (int k = 0; k < 32; k++) - { - pc.printf("\r\n"); - } - - pc.printf("Central and device\r\n"); - - Ticker ticker; - ticker.attach(periodicCallback, 1); - - - // Mixed role **************************************************** - ble.init(); - - Gap::AddressType_t my_mac_type; - ble.gap().getAddress(&my_mac_type, my_mac); - my_board_index = get_board_index(my_mac); - pc.printf("me %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n", my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0], (my_mac_type == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"); - - - // try to speed up but looks like if it was ignored - Gap::ConnectionParams_t fast; - if (ble.getPreferredConnectionParams(&fast) != BLE_ERROR_NONE) - { - pc.printf("getPreferredConnectionParams failed\r\n"); - } - else - { - fast.minConnectionInterval = 16; // 20 ms - fast.maxConnectionInterval = 32; // 40 ms - fast.slaveLatency = 0; - if (ble.gap().setPreferredConnectionParams(&fast) != BLE_ERROR_NONE) - { - pc.printf("setPreferredConnectionParams failed\r\n"); - } - } - ble.gap().onConnection(connectionCallback); - ble.gap().onDisconnection(disconnectionCallback); - - // Device role **************************************************** - ble.gattServer().onDataWritten(onReceivedDataFromCentralCallback); - //ble.gattServer().onDataSent(gattServerOnDataSent); - - UARTService uartService(ble); - uartServicePtr = &uartService; - - // setup advertising - ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT - ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name - ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet - ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type - ble.setAdvertisingInterval(100); - - // Central role **************************************************** - ble.gattClient().onHVX(onReceivedDataFromDeviceCallback); - ble.gap().setScanParams(500, 450); - - - // start advertising and scan - ble.startAdvertising(); - ble.gap().startScan(advertisementCallback); - - while (true) - { - // allow notifications from device - if (foundUartRXCharacteristic && !ble.gattClient().isServiceDiscoveryActive()) - { - foundUartRXCharacteristic = false; /* need to do the following only once */ - - uint16_t value = BLE_HVX_NOTIFICATION; - int ret = ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ, - connectionHandle, - uartRXCharacteristic.getValueHandle() + 1, /* HACK Alert. We're assuming that CCCD descriptor immediately follows the value attribute. */ - sizeof(uint16_t), /* HACK Alert! size should be made into a BLE_API constant. */ - reinterpret_cast<const uint8_t *>(&value)); - - if (ret == BLE_ERROR_NONE) - { - pc.printf("\r\ndevice notifications enabled\r\n"); - } - else - { - switch (ret) - { - case BLE_STACK_BUSY: - foundUartRXCharacteristic = true; // retry later - break; - case BLE_ERROR_NO_MEM: - foundUartRXCharacteristic = true; // retry later - break; - case BLE_ERROR_INVALID_STATE: - pc.printf("\r\ndevice notifications enable failed\r\n"); - break; - default: - break; - } - } - - if (!foundUartRXCharacteristic) - { - if (central_handle == -1) - { - ble.startAdvertising(); - } - } - } - - // while a new char from computer is available - while (rx_char != -1) - { - uint8_t temp[20]; - int length = 1; - - uint8_t command = rx_char; - rx_char = -1; - - // if special char to test a 20 bytes frame - /* - if (command == '*') - { - pc.printf("20 chars\r\n"); - - int c = 0; - for (c = 0; c < 20; c++) - { - temp[c] = 'a' + c; - } - length = 20; - } - else - { - temp[0] = command; - } - */ - temp[0] = command; - - // to central - //if (command == '1') - { - if (central_handle != -1) - { - // device to central - while (1) - { - if (central_handle == -1) - { - pc.printf("\r\ndisconnected 1 (to central)\r\n"); - break; - } - if (!ble.gap().getState().connected) - { - pc.printf("\r\ndisconnected 2 (to central)\r\n"); - break; - } - int ret = ble.gattServer().write(uartServicePtr->getRXCharacteristicHandle(), temp, length); - - if (ret == BLE_ERROR_NONE) - { - //pc.printf("\r\nok (to central)\r\n"); - break; - } - else if (ret == BLE_STACK_BUSY) - { - //pc.printf("\r\nbusy (to central)\r\n"); - //break; - } - else if (ret == BLE_ERROR_OPERATION_NOT_PERMITTED) - { - pc.printf("\r\nnot permitted (to central)\r\n"); - break; - } - else if (ret == BLE_ERROR_INVALID_STATE) - { - pc.printf("\r\ninvalid state (to central)\r\n"); - break; - } - else - { - pc.printf("\r\ncode %d (to central)\r\n", ret); - break; - } - } - } - else - { - pc.printf("\r\nnot connected with central\r\n"); - } - } - - // to device - //if (command == '2') - { - if (device_handle != -1) - { - // central to device - while (1) - { - if (device_handle == -1) - { - pc.printf("\r\ndisconnected (to device)\r\n"); - break; - } - int ret = uartTXCharacteristic.write(length, temp); - if (ret == BLE_ERROR_NONE) - { - //pc.printf("\r\nok (to device)\r\n"); - break; - } - else if (ret == BLE_STACK_BUSY) - { - //pc.printf("\r\nbusy (to device)\r\n"); - //break; - } - else if (ret == BLE_ERROR_OPERATION_NOT_PERMITTED) - { - pc.printf("\r\nnot permitted (to device)\r\n"); - break; - } - else if (ret == BLE_ERROR_INVALID_STATE) - { - pc.printf("\r\ninvalid state (to device)\r\n"); - break; - } - else - { - pc.printf("\r\ncode %d (to device)\r\n", ret); - break; - } - } - } - else - { - pc.printf("\r\nnot connected with device\r\n"); - } - } - } - - ble.waitForEvent(); // save power - } -} - -#endif