Wouter van Kleunen
/
mbed-os-example-ble-LED
MBED OS BLE example LED
Fork of mbed-os-example-ble-LED by
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include <events/mbed_events.h> 00018 #include <mbed.h> 00019 #include "ble/BLE.h" 00020 #include "LEDService.h" 00021 00022 DigitalOut alivenessLED(LED1, 0); 00023 DigitalOut actuatedLED(LED2, 0); 00024 00025 const static char DEVICE_NAME[] = "LED"; 00026 static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID}; 00027 00028 static EventQueue eventQueue(/* event count */ 10 * EVENTS_EVENT_SIZE); 00029 00030 LEDService *ledServicePtr; 00031 00032 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) 00033 { 00034 (void) params; 00035 BLE::Instance().gap().startAdvertising(); 00036 } 00037 00038 void blinkCallback(void) 00039 { 00040 alivenessLED = !alivenessLED; /* Do blinky on LED1 to indicate system aliveness. */ 00041 } 00042 00043 /** 00044 * This callback allows the LEDService to receive updates to the ledState Characteristic. 00045 * 00046 * @param[in] params 00047 * Information about the characterisitc being updated. 00048 */ 00049 void onDataWrittenCallback(const GattWriteCallbackParams *params) { 00050 if ((params->handle == ledServicePtr->getValueHandle()) && (params->len == 1)) { 00051 actuatedLED = *(params->data); 00052 } 00053 } 00054 00055 /** 00056 * This function is called when the ble initialization process has failled 00057 */ 00058 void onBleInitError(BLE &ble, ble_error_t error) 00059 { 00060 /* Initialization error handling should go here */ 00061 } 00062 00063 void printMacAddress() 00064 { 00065 /* Print out device MAC address to the console*/ 00066 Gap::AddressType_t addr_type; 00067 Gap::Address_t address; 00068 BLE::Instance().gap().getAddress(&addr_type, address); 00069 printf("DEVICE MAC ADDRESS: "); 00070 for (int i = 5; i >= 1; i--){ 00071 printf("%02x:", address[i]); 00072 } 00073 printf("%02x\r\n", address[0]); 00074 } 00075 00076 /** 00077 * Callback triggered when the ble initialization process has finished 00078 */ 00079 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) 00080 { 00081 BLE& ble = params->ble; 00082 ble_error_t error = params->error; 00083 00084 if (error != BLE_ERROR_NONE) { 00085 /* In case of error, forward the error handling to onBleInitError */ 00086 onBleInitError(ble, error); 00087 return; 00088 } 00089 00090 /* Ensure that it is the default instance of BLE */ 00091 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { 00092 return; 00093 } 00094 00095 ble.gap().onDisconnection(disconnectionCallback); 00096 ble.gattServer().onDataWritten(onDataWrittenCallback); 00097 00098 bool initialValueForLEDCharacteristic = false; 00099 ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic); 00100 00101 /* setup advertising */ 00102 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); 00103 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); 00104 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); 00105 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); 00106 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ 00107 ble.gap().startAdvertising(); 00108 00109 printMacAddress(); 00110 } 00111 00112 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { 00113 BLE &ble = BLE::Instance(); 00114 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); 00115 } 00116 00117 int main() 00118 { 00119 eventQueue.call_every(500, blinkCallback); 00120 00121 BLE &ble = BLE::Instance(); 00122 ble.onEventsToProcess(scheduleBleEventsProcessing); 00123 ble.init(bleInitComplete); 00124 00125 eventQueue.dispatch_forever(); 00126 00127 return 0; 00128 }
Generated on Sun Jul 17 2022 01:46:27 by 1.7.2