работает в паре с micro:bit мигалкой

Dependencies:   mbed BLE_API nRF51822

Программа для управляющего устройства на nRF51822. Используется одна Button1 для включения\выключения светодиода на устройстве приемнике.

Committer:
mamont090671
Date:
Sat Dec 14 12:50:37 2019 +0000
Revision:
14:e31da6a3279f
Parent:
13:7b6d69a11fb5
use button1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:415d7f24cb91 1 /* mbed Microcontroller Library
rgrover1 0:415d7f24cb91 2 * Copyright (c) 2006-2015 ARM Limited
rgrover1 0:415d7f24cb91 3 *
rgrover1 0:415d7f24cb91 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:415d7f24cb91 5 * you may not use this file except in compliance with the License.
rgrover1 0:415d7f24cb91 6 * You may obtain a copy of the License at
rgrover1 0:415d7f24cb91 7 *
rgrover1 0:415d7f24cb91 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:415d7f24cb91 9 *
rgrover1 0:415d7f24cb91 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:415d7f24cb91 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:415d7f24cb91 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:415d7f24cb91 13 * See the License for the specific language governing permissions and
rgrover1 0:415d7f24cb91 14 * limitations under the License.
rgrover1 0:415d7f24cb91 15 */
rgrover1 0:415d7f24cb91 16
rgrover1 0:415d7f24cb91 17 #include "mbed.h"
rgrover1 6:1730f66fb14d 18 #include "ble/BLE.h"
rgrover1 6:1730f66fb14d 19 #include "ble/DiscoveredCharacteristic.h"
rgrover1 6:1730f66fb14d 20 #include "ble/DiscoveredService.h"
rgrover1 0:415d7f24cb91 21
andresag 11:023d96b0e427 22 DigitalOut alivenessLED(LED1, 1);
mamont090671 13:7b6d69a11fb5 23 DigitalOut connectLED(P0_22, 0);
mamont090671 13:7b6d69a11fb5 24
mamont090671 12:1cd9fd69a4f4 25 Serial pc(USBTX, USBRX);
rgrover1 6:1730f66fb14d 26
andresag 11:023d96b0e427 27 bool triggerLedCharacteristic = false;
rgrover1 0:415d7f24cb91 28 DiscoveredCharacteristic ledCharacteristic;
mamont090671 14:e31da6a3279f 29 uint8_t bVal = 0;
mamont090671 14:e31da6a3279f 30
mamont090671 14:e31da6a3279f 31 //Функции обработки событий кнопок
mamont090671 14:e31da6a3279f 32 void triggerfall_1(); //Button1 falling interrupt function
mamont090671 14:e31da6a3279f 33 void triggerrise_1(); //Button1 rising interrupt function
mamont090671 14:e31da6a3279f 34 void triggerfall_2(); //Button2 falling interrupt function
mamont090671 14:e31da6a3279f 35 void triggerrise_2(); //Button2 rising interrupt function
mamont090671 14:e31da6a3279f 36
mamont090671 14:e31da6a3279f 37 DigitalIn sw1(BUTTON1);
mamont090671 14:e31da6a3279f 38 DigitalIn sw2(BUTTON2);
mamont090671 14:e31da6a3279f 39
mamont090671 14:e31da6a3279f 40 //Initiate input interrupts
mamont090671 14:e31da6a3279f 41 InterruptIn sw1Press(BUTTON1);
mamont090671 14:e31da6a3279f 42 InterruptIn sw2Press(BUTTON2);
rgrover1 0:415d7f24cb91 43
mamont090671 12:1cd9fd69a4f4 44 BLE ble;
andresag 11:023d96b0e427 45 Ticker ticker;
andresag 11:023d96b0e427 46
mamont090671 13:7b6d69a11fb5 47 //событие по таймеру
rgrover1 0:415d7f24cb91 48 void periodicCallback(void) {
mamont090671 13:7b6d69a11fb5 49 //Мигаем светодиодом
rgrover1 3:146eba831693 50 alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */
rgrover1 0:415d7f24cb91 51 }
mamont090671 13:7b6d69a11fb5 52 //результат сканирования
rgrover1 0:415d7f24cb91 53 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
mamont090671 12:1cd9fd69a4f4 54 /* if (params->peerAddr[0] != 0x37) { // !ALERT! Alter this filter to suit your device.
rgrover1 0:415d7f24cb91 55 return;
mamont090671 12:1cd9fd69a4f4 56 }*/
rgrover1 0:415d7f24cb91 57 printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
rgrover1 0:415d7f24cb91 58 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
rgrover1 0:415d7f24cb91 59 params->rssi, params->isScanResponse, params->type);
rgrover1 0:415d7f24cb91 60
andresag 11:023d96b0e427 61 BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
rgrover1 0:415d7f24cb91 62 }
mamont090671 13:7b6d69a11fb5 63 //поиск сервисов
rgrover1 0:415d7f24cb91 64 void serviceDiscoveryCallback(const DiscoveredService *service) {
mamont090671 14:e31da6a3279f 65 printf("TEST!!!!!!!!\r\n");
mamont090671 14:e31da6a3279f 66 printf("S UUID-%x\r\n", service->getUUID().getShortUUID());
rgrover1 0:415d7f24cb91 67 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
rgrover1 0:415d7f24cb91 68 printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
rgrover1 0:415d7f24cb91 69 } else {
rgrover1 0:415d7f24cb91 70 printf("S UUID-");
rgrover1 0:415d7f24cb91 71 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
rgrover1 0:415d7f24cb91 72 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
rgrover1 0:415d7f24cb91 73 printf("%02x", longUUIDBytes[i]);
rgrover1 0:415d7f24cb91 74 }
rgrover1 0:415d7f24cb91 75 printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
rgrover1 0:415d7f24cb91 76 }
rgrover1 0:415d7f24cb91 77 }
mamont090671 13:7b6d69a11fb5 78 //поиск характеристик и вывод инфы
rgrover1 0:415d7f24cb91 79 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
mamont090671 14:e31da6a3279f 80 printf("C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
rgrover1 10:507318f2afda 81 if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */
rgrover1 1:1db45b17552e 82 ledCharacteristic = *characteristicP;
rgrover1 1:1db45b17552e 83 triggerLedCharacteristic = true;
rgrover1 0:415d7f24cb91 84 }
rgrover1 0:415d7f24cb91 85 }
rgrover1 0:415d7f24cb91 86
rgrover1 0:415d7f24cb91 87 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
rgrover1 0:415d7f24cb91 88 printf("terminated SD for handle %u\r\n", connectionHandle);
rgrover1 0:415d7f24cb91 89 }
mamont090671 13:7b6d69a11fb5 90 //Действие при событии "onConnection"
rgrover1 0:415d7f24cb91 91 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
rgrover1 0:415d7f24cb91 92 if (params->role == Gap::CENTRAL) {
andresag 11:023d96b0e427 93 BLE::Instance().gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
andresag 11:023d96b0e427 94 BLE::Instance().gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001);
rgrover1 0:415d7f24cb91 95 }
mamont090671 14:e31da6a3279f 96 printf("connected\r\n");
mamont090671 14:e31da6a3279f 97 connectLED = 1;
rgrover1 0:415d7f24cb91 98 }
rgrover1 0:415d7f24cb91 99
mamont090671 12:1cd9fd69a4f4 100 //Вызывается событием "onDataRead"
rgrover1 0:415d7f24cb91 101 void triggerToggledWrite(const GattReadCallbackParams *response) {
rgrover1 0:415d7f24cb91 102 if (response->handle == ledCharacteristic.getValueHandle()) {
mamont090671 12:1cd9fd69a4f4 103 //#if DUMP_READ_DATA
rgrover1 0:415d7f24cb91 104 printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
rgrover1 0:415d7f24cb91 105 for (unsigned index = 0; index < response->len; index++) {
rgrover1 0:415d7f24cb91 106 printf("%c[%02x]", response->data[index], response->data[index]);
rgrover1 0:415d7f24cb91 107 }
rgrover1 0:415d7f24cb91 108 printf("\r\n");
mamont090671 12:1cd9fd69a4f4 109 //#endif
mamont090671 12:1cd9fd69a4f4 110 //пишем в характеристику 0х00 или 0х01, т.е. моргаем диодом дистанционно
mamont090671 14:e31da6a3279f 111 // uint8_t toggledValue = response->data[0] ^ 0x1;
mamont090671 14:e31da6a3279f 112 uint8_t toggledValue = bVal;
rgrover1 0:415d7f24cb91 113 ledCharacteristic.write(1, &toggledValue);
mamont090671 12:1cd9fd69a4f4 114 printf("onDataRead\r\ntoggledValue: %02x\r\n", toggledValue);
rgrover1 0:415d7f24cb91 115 }
rgrover1 0:415d7f24cb91 116 }
rgrover1 0:415d7f24cb91 117
mamont090671 12:1cd9fd69a4f4 118 //Вызывается событием "onDataWrite"
rgrover1 0:415d7f24cb91 119 void triggerRead(const GattWriteCallbackParams *response) {
rgrover1 0:415d7f24cb91 120 if (response->handle == ledCharacteristic.getValueHandle()) {
rgrover1 0:415d7f24cb91 121 ledCharacteristic.read();
mamont090671 12:1cd9fd69a4f4 122 printf("onDataWrite\r\n");
rgrover1 0:415d7f24cb91 123 }
rgrover1 0:415d7f24cb91 124 }
rgrover1 0:415d7f24cb91 125
mamont090671 13:7b6d69a11fb5 126 //Действие при событии "Disconnect"
rgrover1 10:507318f2afda 127 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
rgrover1 0:415d7f24cb91 128 printf("disconnected\r\n");
mamont090671 12:1cd9fd69a4f4 129 pc.printf("Rescan\r\n");
mamont090671 12:1cd9fd69a4f4 130 ble.gap().startScan(advertisementCallback);
mamont090671 14:e31da6a3279f 131 connectLED = 0;
rgrover1 0:415d7f24cb91 132 }
rgrover1 0:415d7f24cb91 133
andresag 11:023d96b0e427 134 /**
andresag 11:023d96b0e427 135 * This function is called when the ble initialization process has failed
andresag 11:023d96b0e427 136 */
andresag 11:023d96b0e427 137 void onBleInitError(BLE &ble, ble_error_t error)
andresag 11:023d96b0e427 138 {
andresag 11:023d96b0e427 139 /* Initialization error handling should go here */
andresag 11:023d96b0e427 140 }
rgrover1 0:415d7f24cb91 141
andresag 11:023d96b0e427 142 /**
andresag 11:023d96b0e427 143 * Callback triggered when the ble initialization process has finished
andresag 11:023d96b0e427 144 */
andresag 11:023d96b0e427 145 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
andresag 11:023d96b0e427 146 {
andresag 11:023d96b0e427 147 BLE& ble = params->ble;
andresag 11:023d96b0e427 148 ble_error_t error = params->error;
andresag 11:023d96b0e427 149
andresag 11:023d96b0e427 150 if (error != BLE_ERROR_NONE) {
andresag 11:023d96b0e427 151 /* In case of error, forward the error handling to onBleInitError */
andresag 11:023d96b0e427 152 onBleInitError(ble, error);
andresag 11:023d96b0e427 153 return;
andresag 11:023d96b0e427 154 }
andresag 11:023d96b0e427 155
andresag 11:023d96b0e427 156 /* Ensure that it is the default instance of BLE */
andresag 11:023d96b0e427 157 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 11:023d96b0e427 158 return;
andresag 11:023d96b0e427 159 }
andresag 11:023d96b0e427 160
rgrover1 5:3bbad34d1a85 161 ble.gap().onConnection(connectionCallback);
rgrover1 5:3bbad34d1a85 162 ble.gap().onDisconnection(disconnectionCallback);
rgrover1 0:415d7f24cb91 163
rgrover1 7:61e2224ec9a0 164 ble.gattClient().onDataRead(triggerToggledWrite);
rgrover1 7:61e2224ec9a0 165 ble.gattClient().onDataWrite(triggerRead);
rgrover1 0:415d7f24cb91 166
rgrover1 5:3bbad34d1a85 167 ble.gap().setScanParams(500, 400);
rgrover1 5:3bbad34d1a85 168 ble.gap().startScan(advertisementCallback);
andresag 11:023d96b0e427 169 }
andresag 11:023d96b0e427 170
andresag 11:023d96b0e427 171 int main(void) {
mamont090671 12:1cd9fd69a4f4 172 pc.baud(9600);
mamont090671 12:1cd9fd69a4f4 173 printf("--- Start!!! ---\r\n");
mamont090671 14:e31da6a3279f 174
mamont090671 14:e31da6a3279f 175 //Set falling and rising edge to apppropriate interrup function
mamont090671 14:e31da6a3279f 176 sw1Press.fall(&triggerfall_1);
mamont090671 14:e31da6a3279f 177 sw1Press.rise(&triggerrise_1);
mamont090671 14:e31da6a3279f 178 sw2Press.fall(&triggerfall_2);
mamont090671 14:e31da6a3279f 179 sw2Press.rise(&triggerrise_2);
mamont090671 12:1cd9fd69a4f4 180
andresag 11:023d96b0e427 181 ticker.attach(periodicCallback, 1);
andresag 11:023d96b0e427 182
andresag 11:023d96b0e427 183 BLE &ble = BLE::Instance();
andresag 11:023d96b0e427 184 ble.init(bleInitComplete);
andresag 11:023d96b0e427 185
andresag 11:023d96b0e427 186 /* SpinWait for initialization to complete. This is necessary because the
andresag 11:023d96b0e427 187 * BLE object is used in the main loop below. */
andresag 11:023d96b0e427 188 while (ble.hasInitialized() == false) { /* spin loop */ }
rgrover1 0:415d7f24cb91 189
rgrover1 0:415d7f24cb91 190 while (true) {
rgrover1 4:460ce53dc854 191 if (triggerLedCharacteristic && !ble.gattClient().isServiceDiscoveryActive()) {
rgrover1 1:1db45b17552e 192 triggerLedCharacteristic = false;
rgrover1 0:415d7f24cb91 193 ledCharacteristic.read(); /* We could have issued this read just as easily from
rgrover1 0:415d7f24cb91 194 * characteristicDiscoveryCallback(); but
rgrover1 2:3e1e967035cb 195 * invoking it here demonstrates the use
rgrover1 2:3e1e967035cb 196 * of isServiceDiscoveryActive() and also
rgrover1 2:3e1e967035cb 197 * the fact that it is permitted to
rgrover1 2:3e1e967035cb 198 * operate on application-local copies of
rgrover1 2:3e1e967035cb 199 * DiscoveredCharacteristic. */
rgrover1 0:415d7f24cb91 200 }
rgrover1 0:415d7f24cb91 201 ble.waitForEvent();
rgrover1 0:415d7f24cb91 202 }
rgrover1 0:415d7f24cb91 203 }
mamont090671 14:e31da6a3279f 204
mamont090671 14:e31da6a3279f 205 //Button1 falling interrupt function
mamont090671 14:e31da6a3279f 206 void triggerfall_1()
mamont090671 14:e31da6a3279f 207 {
mamont090671 14:e31da6a3279f 208 bVal =! bVal;
mamont090671 14:e31da6a3279f 209 }
mamont090671 14:e31da6a3279f 210 //Button1 rising interrupt function
mamont090671 14:e31da6a3279f 211 void triggerrise_1()
mamont090671 14:e31da6a3279f 212 {
mamont090671 14:e31da6a3279f 213 }
mamont090671 14:e31da6a3279f 214
mamont090671 14:e31da6a3279f 215 //Button1 falling interrupt function
mamont090671 14:e31da6a3279f 216 void triggerfall_2()
mamont090671 14:e31da6a3279f 217 {
mamont090671 14:e31da6a3279f 218 }
mamont090671 14:e31da6a3279f 219 //Button1 rising interrupt function
mamont090671 14:e31da6a3279f 220 void triggerrise_2()
mamont090671 14:e31da6a3279f 221 {
mamont090671 14:e31da6a3279f 222 }