f
Dependencies: BLE_API mbed nRF51822
Fork of UART_TEMPLATE by
main.cpp
- Committer:
- Mavrikant
- Date:
- 2017-02-01
- Revision:
- 1:94e2d9e7b447
- Parent:
- 0:442c7a6f1978
File content as of revision 1:94e2d9e7b447:
#include "mbed.h" #include "BLEDevice.h" #include "UARTService.h" #include "nrf_temp.h" #define MAX_REPLY_LEN (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN) #define SENSOR_READ_INTERVAL_S (0.5F) #define ADV_INTERVAL_MS (1000UL) #define UART_BAUD_RATE (9600UL) #define DEVICE_NAME ("MobilMed Tartı") // This can be read AFTER connecting to the device. #define SHORT_NAME ("Tartı2") // Keep this short: max 8 chars if a 128bit UUID is also advertised. #define DEBUG(...) { m_serial_port.printf(__VA_ARGS__); } BLEDevice m_ble; Serial m_serial_port(P0_3, P0_4); // TX pin, RX pin DigitalOut m_cmd_led(P0_21); DigitalOut m_error_led(LED2); AnalogIn m_analog_in(P0_1); uint16_t m_analog_in_value; UARTService *m_uart_service_ptr; /** * This callback is used whenever a disconnection occurs. */ void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) { switch (reason) { case Gap::REMOTE_USER_TERMINATED_CONNECTION: DEBUG("Disconnected (REMOTE_USER_TERMINATED_CONNECTION)\n\r"); break; case Gap::LOCAL_HOST_TERMINATED_CONNECTION: DEBUG("Disconnected (LOCAL_HOST_TERMINATED_CONNECTION)\n\r"); break; case Gap::CONN_INTERVAL_UNACCEPTABLE: DEBUG("Disconnected (CONN_INTERVAL_UNACCEPTABLE)\n\r"); break; } DEBUG("Restarting the advertising process\n\r"); m_ble.startAdvertising(); } /** * This callback is used whenever the host writes data to one of our GATT characteristics. */ void dataWrittenCallback(const GattCharacteristicWriteCBParams *params) { // Ensure that initialization is finished and the host has written to the TX characteristic. if ((m_uart_service_ptr != NULL) && (params->charHandle == m_uart_service_ptr->getTXCharacteristicHandle())) { uint8_t buf[MAX_REPLY_LEN]; uint32_t len = 0; if (1 == params->len) { switch (params->data[0]) { case '0': m_cmd_led = 0; len = snprintf((char*) buf, MAX_REPLY_LEN, "OK"); break; case '1': m_cmd_led = 1; len = snprintf((char*) buf, MAX_REPLY_LEN, "OK"); break; case 'a': len = snprintf((char*) buf, MAX_REPLY_LEN, "%d", m_analog_in_value); break; default: len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR: Unknown char"); break; } } else { len = snprintf((char*) buf, MAX_REPLY_LEN, "ERROR: Invalid len"); } m_ble.updateCharacteristicValue(m_uart_service_ptr->getRXCharacteristicHandle(), buf, len); DEBUG("%d bytes received from host\n\r", params->len); } } /** * This callback is used whenever a write to a GATT characteristic causes data to be sent to the host. */ void dataSentCallback(unsigned count) { // NOTE: The count always seems to be 1 regardless of data. DEBUG("%d bytes sent to host\n\r", count); } /** * This callback is scheduled to be called periodically via a low-priority interrupt. */ void periodicCallback(void) { m_analog_in_value = m_analog_in.read_u16(); } void error(ble_error_t err, uint32_t line) { m_error_led = 1; DEBUG("Error %d on line number %d\n\r", err, line); } int main(void) { ble_error_t err; Ticker ticker; m_serial_port.baud(UART_BAUD_RATE); DEBUG("Initialising\n\r"); m_cmd_led = 0; m_error_led = 0; m_analog_in_value = 0; ticker.attach(periodicCallback, SENSOR_READ_INTERVAL_S); m_ble.init(); m_ble.onDisconnection(disconnectionCallback); m_ble.onDataWritten(dataWrittenCallback); m_ble.onDataSent(dataSentCallback); // Set the TX power in dBm units. // Possible values (in decreasing order): 4, 0, -4, -8, -12, -16, -20. err = m_ble.setTxPower(4); if (BLE_ERROR_NONE != err) { error(err, __LINE__); } // Setup advertising (GAP stuff). err = m_ble.setDeviceName(DEVICE_NAME); if (BLE_ERROR_NONE != err) { error(err, __LINE__); } err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); if (BLE_ERROR_NONE != err) { error(err, __LINE__); } m_ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)SHORT_NAME, (sizeof(SHORT_NAME) - 1)); if (BLE_ERROR_NONE != err) { error(err, __LINE__); } err = m_ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); if (BLE_ERROR_NONE != err) { error(err, __LINE__); } m_ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADV_INTERVAL_MS)); m_ble.startAdvertising(); // Create a UARTService object (GATT stuff). UARTService uartService(m_ble); m_uart_service_ptr = &uartService; while (true) { m_ble.waitForEvent(); } }