Bluetooth Low Energy enabled device with "Analog" feature, compatible with BlueST Protocol.

Dependencies:   X_NUCLEO_LED61A1

Bluetooth Low Energy enabled device with "Analog" feature, compatible with BlueST Protocol.

Committer:
Davidroid
Date:
Thu May 10 12:52:16 2018 +0000
Revision:
0:43dcd7811b58
Child:
1:71b8b1f19322
Initial release, not completely implementing the "Analog feature"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 0:43dcd7811b58 1 /**
Davidroid 0:43dcd7811b58 2 ******************************************************************************
Davidroid 0:43dcd7811b58 3 * @file main.cpp
Davidroid 0:43dcd7811b58 4 * @author Davide Aliprandi, STMicroelectronics
Davidroid 0:43dcd7811b58 5 * @version V1.0.0
Davidroid 0:43dcd7811b58 6 * @date Ocober 31st, 2017
Davidroid 0:43dcd7811b58 7 * @brief mbed test application for the STMicroelectronics X-NUCLEO-LED61A1
Davidroid 0:43dcd7811b58 8 * LED expansion board and the X-NUCLEO-IDB05A1 Bluetooth expansion
Davidroid 0:43dcd7811b58 9 * board.
Davidroid 0:43dcd7811b58 10 ******************************************************************************
Davidroid 0:43dcd7811b58 11 * @attention
Davidroid 0:43dcd7811b58 12 *
Davidroid 0:43dcd7811b58 13 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Davidroid 0:43dcd7811b58 14 *
Davidroid 0:43dcd7811b58 15 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 0:43dcd7811b58 16 * are permitted provided that the following conditions are met:
Davidroid 0:43dcd7811b58 17 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 0:43dcd7811b58 18 * this list of conditions and the following disclaimer.
Davidroid 0:43dcd7811b58 19 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 0:43dcd7811b58 20 * this list of conditions and the following disclaimer in the documentation
Davidroid 0:43dcd7811b58 21 * and/or other materials provided with the distribution.
Davidroid 0:43dcd7811b58 22 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 0:43dcd7811b58 23 * may be used to endorse or promote products derived from this software
Davidroid 0:43dcd7811b58 24 * without specific prior written permission.
Davidroid 0:43dcd7811b58 25 *
Davidroid 0:43dcd7811b58 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 0:43dcd7811b58 27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 0:43dcd7811b58 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 0:43dcd7811b58 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 0:43dcd7811b58 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 0:43dcd7811b58 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 0:43dcd7811b58 32 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 0:43dcd7811b58 33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 0:43dcd7811b58 34 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 0:43dcd7811b58 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 0:43dcd7811b58 36 *
Davidroid 0:43dcd7811b58 37 ******************************************************************************
Davidroid 0:43dcd7811b58 38 */
Davidroid 0:43dcd7811b58 39
Davidroid 0:43dcd7811b58 40
Davidroid 0:43dcd7811b58 41 /* Includes ------------------------------------------------------------------*/
Davidroid 0:43dcd7811b58 42
Davidroid 0:43dcd7811b58 43 /* mbed specific header files. */
Davidroid 0:43dcd7811b58 44 #include <events/mbed_events.h>
Davidroid 0:43dcd7811b58 45 #include <mbed.h>
Davidroid 0:43dcd7811b58 46 #include "ble/BLE.h"
Davidroid 0:43dcd7811b58 47 #include "CustomService.h"
Davidroid 0:43dcd7811b58 48
Davidroid 0:43dcd7811b58 49 /* Component specific header files. */
Davidroid 0:43dcd7811b58 50 #include "Led6001.h"
Davidroid 0:43dcd7811b58 51
Davidroid 0:43dcd7811b58 52
Davidroid 0:43dcd7811b58 53 /* Definitions ---------------------------------------------------------------*/
Davidroid 0:43dcd7811b58 54
Davidroid 0:43dcd7811b58 55 #define BLE_ADVERTISING_INTERVAL_ms 1000
Davidroid 0:43dcd7811b58 56
Davidroid 0:43dcd7811b58 57
Davidroid 0:43dcd7811b58 58 /* Variables -----------------------------------------------------------------*/
Davidroid 0:43dcd7811b58 59
Davidroid 0:43dcd7811b58 60 /* Blinky LED to indicate system aliveness. */
Davidroid 0:43dcd7811b58 61 DigitalOut alivenessLED(LED1, 0);
Davidroid 0:43dcd7811b58 62
Davidroid 0:43dcd7811b58 63 /* Bluetooth. */
Davidroid 0:43dcd7811b58 64 const static char DEVICE_NAME[] = "LED_DEVICE";
Davidroid 0:43dcd7811b58 65 const static uint8_t MANUFACTURER_SPECIFIC_DATA[]= {0x01,0x80,0x00,0x00,0x20,0x00};
Davidroid 0:43dcd7811b58 66 static EventQueue event_queue(/* event count */ 10 * EVENTS_EVENT_SIZE);
Davidroid 0:43dcd7811b58 67 CustomService *custom_service;
Davidroid 0:43dcd7811b58 68
Davidroid 0:43dcd7811b58 69 /* LED Control Component. */
Davidroid 0:43dcd7811b58 70 Led6001 *led;
Davidroid 0:43dcd7811b58 71
Davidroid 0:43dcd7811b58 72
Davidroid 0:43dcd7811b58 73 /* Bluetooth related functions -----------------------------------------------*/
Davidroid 0:43dcd7811b58 74
Davidroid 0:43dcd7811b58 75 void on_disconnection_callback(const Gap::DisconnectionCallbackParams_t *params)
Davidroid 0:43dcd7811b58 76 {
Davidroid 0:43dcd7811b58 77 (void) params;
Davidroid 0:43dcd7811b58 78 BLE::Instance().gap().startAdvertising();
Davidroid 0:43dcd7811b58 79 }
Davidroid 0:43dcd7811b58 80
Davidroid 0:43dcd7811b58 81 void aliveness_callback(void)
Davidroid 0:43dcd7811b58 82 {
Davidroid 0:43dcd7811b58 83 alivenessLED = !alivenessLED; /* Do blinky to indicate system aliveness. */
Davidroid 0:43dcd7811b58 84 }
Davidroid 0:43dcd7811b58 85
Davidroid 0:43dcd7811b58 86 /**
Davidroid 0:43dcd7811b58 87 * This callback allows the custom service to receive updates for the
Davidroid 0:43dcd7811b58 88 * characteristic.
Davidroid 0:43dcd7811b58 89 *
Davidroid 0:43dcd7811b58 90 * @param[in] params
Davidroid 0:43dcd7811b58 91 * Information about the characterisitc being updated.
Davidroid 0:43dcd7811b58 92 */
Davidroid 0:43dcd7811b58 93 void on_data_written_callback(const GattWriteCallbackParams *params) {
Davidroid 0:43dcd7811b58 94 if ((params->handle == custom_service->getValueHandle())) {
Davidroid 0:43dcd7811b58 95 switch ((CustomService::led_commands_t) ((uint8_t *) (params->data))[0])
Davidroid 0:43dcd7811b58 96 {
Davidroid 0:43dcd7811b58 97 //Power Off
Davidroid 0:43dcd7811b58 98 case CustomService::LED_POWER_OFF:
Davidroid 0:43dcd7811b58 99 led->power_off();
Davidroid 0:43dcd7811b58 100 break;
Davidroid 0:43dcd7811b58 101 //Power On
Davidroid 0:43dcd7811b58 102 case CustomService::LED_POWER_ON:
Davidroid 0:43dcd7811b58 103 led->power_on();
Davidroid 0:43dcd7811b58 104 break;
Davidroid 0:43dcd7811b58 105 //Other
Davidroid 0:43dcd7811b58 106 default:
Davidroid 0:43dcd7811b58 107 break;
Davidroid 0:43dcd7811b58 108 }
Davidroid 0:43dcd7811b58 109 }
Davidroid 0:43dcd7811b58 110 }
Davidroid 0:43dcd7811b58 111
Davidroid 0:43dcd7811b58 112 /**
Davidroid 0:43dcd7811b58 113 * This function is called when the ble initialization process has failled
Davidroid 0:43dcd7811b58 114 */
Davidroid 0:43dcd7811b58 115 void on_ble_init_error_callback(BLE &ble, ble_error_t error)
Davidroid 0:43dcd7811b58 116 {
Davidroid 0:43dcd7811b58 117 /* Initialization error handling should go here */
Davidroid 0:43dcd7811b58 118 }
Davidroid 0:43dcd7811b58 119
Davidroid 0:43dcd7811b58 120 /**
Davidroid 0:43dcd7811b58 121 * Callback triggered when the ble initialization process has finished
Davidroid 0:43dcd7811b58 122 */
Davidroid 0:43dcd7811b58 123 void ble_init_complete(BLE::InitializationCompleteCallbackContext *params)
Davidroid 0:43dcd7811b58 124 {
Davidroid 0:43dcd7811b58 125 BLE& ble = params->ble;
Davidroid 0:43dcd7811b58 126 ble_error_t error = params->error;
Davidroid 0:43dcd7811b58 127
Davidroid 0:43dcd7811b58 128 if (error != BLE_ERROR_NONE) {
Davidroid 0:43dcd7811b58 129 /* In case of error, forward the error handling to on_ble_init_error_callback */
Davidroid 0:43dcd7811b58 130 on_ble_init_error_callback(ble, error);
Davidroid 0:43dcd7811b58 131 return;
Davidroid 0:43dcd7811b58 132 }
Davidroid 0:43dcd7811b58 133
Davidroid 0:43dcd7811b58 134 /* Ensure that it is the default instance of BLE */
Davidroid 0:43dcd7811b58 135 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
Davidroid 0:43dcd7811b58 136 return;
Davidroid 0:43dcd7811b58 137 }
Davidroid 0:43dcd7811b58 138
Davidroid 0:43dcd7811b58 139 ble.gap().onDisconnection(on_disconnection_callback);
Davidroid 0:43dcd7811b58 140 ble.gattServer().onDataWritten(on_data_written_callback);
Davidroid 0:43dcd7811b58 141
Davidroid 0:43dcd7811b58 142 custom_service = new CustomService(ble);
Davidroid 0:43dcd7811b58 143
Davidroid 0:43dcd7811b58 144 /* Setup advertising data. */
Davidroid 0:43dcd7811b58 145 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Davidroid 0:43dcd7811b58 146 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (uint8_t *) CUSTOM_LED_SERVICE_UUID, sizeof(CUSTOM_LED_SERVICE_UUID));
Davidroid 0:43dcd7811b58 147 ble.gap().accumulateScanResponse(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, MANUFACTURER_SPECIFIC_DATA, sizeof(MANUFACTURER_SPECIFIC_DATA));
Davidroid 0:43dcd7811b58 148 ble.gap().accumulateScanResponse(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
Davidroid 0:43dcd7811b58 149 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Davidroid 0:43dcd7811b58 150 ble.gap().setAdvertisingInterval(BLE_ADVERTISING_INTERVAL_ms);
Davidroid 0:43dcd7811b58 151 ble.gap().startAdvertising();
Davidroid 0:43dcd7811b58 152 }
Davidroid 0:43dcd7811b58 153
Davidroid 0:43dcd7811b58 154 void schedule_ble_events_processing(BLE::OnEventsToProcessCallbackContext* context) {
Davidroid 0:43dcd7811b58 155 BLE &ble = BLE::Instance();
Davidroid 0:43dcd7811b58 156 event_queue.call(Callback<void()>(&ble, &BLE::processEvents));
Davidroid 0:43dcd7811b58 157 }
Davidroid 0:43dcd7811b58 158
Davidroid 0:43dcd7811b58 159
Davidroid 0:43dcd7811b58 160 /* Custom service related functions ------------------------------------------*/
Davidroid 0:43dcd7811b58 161
Davidroid 0:43dcd7811b58 162 /**
Davidroid 0:43dcd7811b58 163 * @brief Interrupt Handler for the component's XFAULT interrupt.
Davidroid 0:43dcd7811b58 164 * @param None.
Davidroid 0:43dcd7811b58 165 * @retval None.
Davidroid 0:43dcd7811b58 166 */
Davidroid 0:43dcd7811b58 167 void xfault_irq_handler(void)
Davidroid 0:43dcd7811b58 168 {
Davidroid 0:43dcd7811b58 169 /* Printing to the console. */
Davidroid 0:43dcd7811b58 170 printf("XFAULT Interrupt detected! Re-initializing LED driver...");
Davidroid 0:43dcd7811b58 171
Davidroid 0:43dcd7811b58 172 /* Re-starting-up LED Control Component. */
Davidroid 0:43dcd7811b58 173 led->start_up();
Davidroid 0:43dcd7811b58 174
Davidroid 0:43dcd7811b58 175 /* Printing to the console. */
Davidroid 0:43dcd7811b58 176 printf("Done.\r\n\n");
Davidroid 0:43dcd7811b58 177 }
Davidroid 0:43dcd7811b58 178
Davidroid 0:43dcd7811b58 179
Davidroid 0:43dcd7811b58 180 /* Main function -------------------------------------------------------------*/
Davidroid 0:43dcd7811b58 181
Davidroid 0:43dcd7811b58 182 int main()
Davidroid 0:43dcd7811b58 183 {
Davidroid 0:43dcd7811b58 184 /*----- Initialization. -----*/
Davidroid 0:43dcd7811b58 185
Davidroid 0:43dcd7811b58 186 /* Printing to the console. */
Davidroid 0:43dcd7811b58 187 printf("LED Node Application Example\r\n\n");
Davidroid 0:43dcd7811b58 188
Davidroid 0:43dcd7811b58 189 /* Aliveness callback. */
Davidroid 0:43dcd7811b58 190 event_queue.call_every(500, aliveness_callback);
Davidroid 0:43dcd7811b58 191
Davidroid 0:43dcd7811b58 192 /* Bluetooth. */
Davidroid 0:43dcd7811b58 193 BLE &ble = BLE::Instance();
Davidroid 0:43dcd7811b58 194 ble.onEventsToProcess(schedule_ble_events_processing);
Davidroid 0:43dcd7811b58 195 ble.init(ble_init_complete);
Davidroid 0:43dcd7811b58 196
Davidroid 0:43dcd7811b58 197 /* Initializing LED Control Component. */
Davidroid 0:43dcd7811b58 198 led = new Led6001(D4, A3, D6, D5);
Davidroid 0:43dcd7811b58 199 if (led->init() != COMPONENT_OK) {
Davidroid 0:43dcd7811b58 200 exit(EXIT_FAILURE);
Davidroid 0:43dcd7811b58 201 }
Davidroid 0:43dcd7811b58 202
Davidroid 0:43dcd7811b58 203 /* Attaching and enabling interrupt handlers. */
Davidroid 0:43dcd7811b58 204 led->attach_xfault_irq(&xfault_irq_handler);
Davidroid 0:43dcd7811b58 205 led->enable_xfault_irq();
Davidroid 0:43dcd7811b58 206
Davidroid 0:43dcd7811b58 207 /* Powering OFF. */
Davidroid 0:43dcd7811b58 208 led->power_off();
Davidroid 0:43dcd7811b58 209
Davidroid 0:43dcd7811b58 210 /* Start. */
Davidroid 0:43dcd7811b58 211 event_queue.dispatch_forever();
Davidroid 0:43dcd7811b58 212
Davidroid 0:43dcd7811b58 213 return 0;
Davidroid 0:43dcd7811b58 214 }