Sog Yang / Mbed OS BLE_DOORCTL_4CH
Committer:
sog_yang
Date:
Mon Jan 16 14:16:03 2017 +0000
Revision:
0:1eec8720727a
NQ62X BLE DOORCTL 4CH project init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sog_yang 0:1eec8720727a 1 /* mbed Microcontroller Library
sog_yang 0:1eec8720727a 2 * Copyright (c) 2006-2014 ARM Limited
sog_yang 0:1eec8720727a 3 *
sog_yang 0:1eec8720727a 4 * Licensed under the Apache License, Version 2.0 (the "License");
sog_yang 0:1eec8720727a 5 * you may not use this file except in compliance with the License.
sog_yang 0:1eec8720727a 6 * You may obtain a copy of the License at
sog_yang 0:1eec8720727a 7 *
sog_yang 0:1eec8720727a 8 * http://www.apache.org/licenses/LICENSE-2.0
sog_yang 0:1eec8720727a 9 *
sog_yang 0:1eec8720727a 10 * Unless required by applicable law or agreed to in writing, software
sog_yang 0:1eec8720727a 11 * distributed under the License is distributed on an "AS IS" BASIS,
sog_yang 0:1eec8720727a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sog_yang 0:1eec8720727a 13 * See the License for the specific language governing permissions and
sog_yang 0:1eec8720727a 14 * limitations under the License.
sog_yang 0:1eec8720727a 15 */
sog_yang 0:1eec8720727a 16
sog_yang 0:1eec8720727a 17 #include <events/mbed_events.h>
sog_yang 0:1eec8720727a 18 #include <mbed.h>
sog_yang 0:1eec8720727a 19 #include "ble/BLE.h"
sog_yang 0:1eec8720727a 20 #include "ble/Gap.h"
sog_yang 0:1eec8720727a 21 #include "ble/services/BatteryService.h"
sog_yang 0:1eec8720727a 22 #include "DOORService.h"
sog_yang 0:1eec8720727a 23
sog_yang 0:1eec8720727a 24 //DigitalOut led1(LED1, 1);
sog_yang 0:1eec8720727a 25
sog_yang 0:1eec8720727a 26 const static char DEVICE_NAME[] = "DOORCTL";
sog_yang 0:1eec8720727a 27 static const uint16_t uuid16_list[] = {DOORService::DOOR_SERVICE_UUID};
sog_yang 0:1eec8720727a 28
sog_yang 0:1eec8720727a 29
sog_yang 0:1eec8720727a 30 uint8_t BLE_RX_CMD = 0xFF;
sog_yang 0:1eec8720727a 31 uint8_t doorStatusPayload[2] = {0xFF,};
sog_yang 0:1eec8720727a 32
sog_yang 0:1eec8720727a 33 DigitalOut relay1(D7); // Relay 1
sog_yang 0:1eec8720727a 34 DigitalOut relay2(D6); // Relay 2
sog_yang 0:1eec8720727a 35 DigitalOut relay3(D5); // Relay 3
sog_yang 0:1eec8720727a 36 DigitalOut relay4(D4); // Relay 4
sog_yang 0:1eec8720727a 37
sog_yang 0:1eec8720727a 38 BLEDevice ble;
sog_yang 0:1eec8720727a 39
sog_yang 0:1eec8720727a 40
sog_yang 0:1eec8720727a 41 static DOORService *doorServicePtr;
sog_yang 0:1eec8720727a 42 static EventQueue eventQueue(
sog_yang 0:1eec8720727a 43 /* event count */ 16 * /* event size */ 32
sog_yang 0:1eec8720727a 44 );
sog_yang 0:1eec8720727a 45
sog_yang 0:1eec8720727a 46 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
sog_yang 0:1eec8720727a 47 {
sog_yang 0:1eec8720727a 48 BLE::Instance().gap().startAdvertising();
sog_yang 0:1eec8720727a 49 }
sog_yang 0:1eec8720727a 50
sog_yang 0:1eec8720727a 51
sog_yang 0:1eec8720727a 52
sog_yang 0:1eec8720727a 53 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
sog_yang 0:1eec8720727a 54
sog_yang 0:1eec8720727a 55
sog_yang 0:1eec8720727a 56 if ((params->handle == doorServicePtr->getValueHandle()) && (params->len == 1)) {
sog_yang 0:1eec8720727a 57 {
sog_yang 0:1eec8720727a 58 BLE_RX_CMD = *(params->data);
sog_yang 0:1eec8720727a 59 }
sog_yang 0:1eec8720727a 60 }
sog_yang 0:1eec8720727a 61 }
sog_yang 0:1eec8720727a 62
sog_yang 0:1eec8720727a 63 void cmd_thread(void const *args) {
sog_yang 0:1eec8720727a 64 while (true) {
sog_yang 0:1eec8720727a 65 switch (BLE_RX_CMD)
sog_yang 0:1eec8720727a 66 {
sog_yang 0:1eec8720727a 67 case 0x00:
sog_yang 0:1eec8720727a 68 relay1 = 1;
sog_yang 0:1eec8720727a 69 relay2 = 0;
sog_yang 0:1eec8720727a 70 relay3 = 0;
sog_yang 0:1eec8720727a 71 relay4 = 0;
sog_yang 0:1eec8720727a 72 // Thread::wait(500);
sog_yang 0:1eec8720727a 73 doorStatusPayload[0]=0xF0;
sog_yang 0:1eec8720727a 74 break;
sog_yang 0:1eec8720727a 75
sog_yang 0:1eec8720727a 76 case 0x01:
sog_yang 0:1eec8720727a 77 relay1 = 0;
sog_yang 0:1eec8720727a 78 relay2 = 1;
sog_yang 0:1eec8720727a 79 relay3 = 0;
sog_yang 0:1eec8720727a 80 relay4 = 0;
sog_yang 0:1eec8720727a 81 //Thread::wait(500);
sog_yang 0:1eec8720727a 82 doorStatusPayload[0]=0xF1;
sog_yang 0:1eec8720727a 83 break;
sog_yang 0:1eec8720727a 84
sog_yang 0:1eec8720727a 85 case 0x02:
sog_yang 0:1eec8720727a 86 relay1 = 0;
sog_yang 0:1eec8720727a 87 relay2 = 0;
sog_yang 0:1eec8720727a 88 relay3 = 1;
sog_yang 0:1eec8720727a 89 relay4 = 0;
sog_yang 0:1eec8720727a 90 //Thread::wait(500);
sog_yang 0:1eec8720727a 91 doorStatusPayload[0]=0xF2;
sog_yang 0:1eec8720727a 92 break;
sog_yang 0:1eec8720727a 93
sog_yang 0:1eec8720727a 94 case 0x03:
sog_yang 0:1eec8720727a 95 relay1 = 0;
sog_yang 0:1eec8720727a 96 relay2 = 0;
sog_yang 0:1eec8720727a 97 relay3 = 0;
sog_yang 0:1eec8720727a 98 relay4 = 1;
sog_yang 0:1eec8720727a 99 //Thread::wait(500);
sog_yang 0:1eec8720727a 100 doorStatusPayload[0]=0xF3;
sog_yang 0:1eec8720727a 101 break;
sog_yang 0:1eec8720727a 102
sog_yang 0:1eec8720727a 103 case 0x04:
sog_yang 0:1eec8720727a 104 relay1 = 0;
sog_yang 0:1eec8720727a 105 relay2 = 0;
sog_yang 0:1eec8720727a 106 relay3 = 0;
sog_yang 0:1eec8720727a 107 relay4 = 0;
sog_yang 0:1eec8720727a 108 //Thread::wait(500);
sog_yang 0:1eec8720727a 109 doorStatusPayload[0]=0xF4;
sog_yang 0:1eec8720727a 110 break;
sog_yang 0:1eec8720727a 111
sog_yang 0:1eec8720727a 112 case 0x05: //Test Mode!!
sog_yang 0:1eec8720727a 113 relay1 = 1;
sog_yang 0:1eec8720727a 114 relay2 = 1;
sog_yang 0:1eec8720727a 115 relay3 = 1;
sog_yang 0:1eec8720727a 116 relay4 = 1;
sog_yang 0:1eec8720727a 117 //Thread::wait(500);
sog_yang 0:1eec8720727a 118 doorStatusPayload[0]=0xF5;
sog_yang 0:1eec8720727a 119 break;
sog_yang 0:1eec8720727a 120
sog_yang 0:1eec8720727a 121
sog_yang 0:1eec8720727a 122 default:
sog_yang 0:1eec8720727a 123 break;
sog_yang 0:1eec8720727a 124 }
sog_yang 0:1eec8720727a 125 if (ble.getGapState().connected) {
sog_yang 0:1eec8720727a 126 ble.updateCharacteristicValue((doorServicePtr->getValueHandle()),doorStatusPayload, 1);
sog_yang 0:1eec8720727a 127 }
sog_yang 0:1eec8720727a 128 }
sog_yang 0:1eec8720727a 129 }
sog_yang 0:1eec8720727a 130
sog_yang 0:1eec8720727a 131
sog_yang 0:1eec8720727a 132
sog_yang 0:1eec8720727a 133 /**
sog_yang 0:1eec8720727a 134 * This function is called when the ble initialization process has failled
sog_yang 0:1eec8720727a 135 */
sog_yang 0:1eec8720727a 136 void onBleInitError(BLE &ble, ble_error_t error)
sog_yang 0:1eec8720727a 137 {
sog_yang 0:1eec8720727a 138 /* Initialization error handling should go here */
sog_yang 0:1eec8720727a 139 }
sog_yang 0:1eec8720727a 140
sog_yang 0:1eec8720727a 141 /**
sog_yang 0:1eec8720727a 142 * Callback triggered when the ble initialization process has finished
sog_yang 0:1eec8720727a 143 */
sog_yang 0:1eec8720727a 144 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sog_yang 0:1eec8720727a 145 {
sog_yang 0:1eec8720727a 146 BLE& ble = params->ble;
sog_yang 0:1eec8720727a 147 ble_error_t error = params->error;
sog_yang 0:1eec8720727a 148
sog_yang 0:1eec8720727a 149 if (error != BLE_ERROR_NONE) {
sog_yang 0:1eec8720727a 150 /* In case of error, forward the error handling to onBleInitError */
sog_yang 0:1eec8720727a 151 onBleInitError(ble, error);
sog_yang 0:1eec8720727a 152 return;
sog_yang 0:1eec8720727a 153 }
sog_yang 0:1eec8720727a 154
sog_yang 0:1eec8720727a 155 /* Ensure that it is the default instance of BLE */
sog_yang 0:1eec8720727a 156 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
sog_yang 0:1eec8720727a 157 return;
sog_yang 0:1eec8720727a 158 }
sog_yang 0:1eec8720727a 159
sog_yang 0:1eec8720727a 160 ble.gap().onDisconnection(disconnectionCallback);
sog_yang 0:1eec8720727a 161 ble.gattServer().onDataWritten(onDataWrittenCallback);
sog_yang 0:1eec8720727a 162
sog_yang 0:1eec8720727a 163 /* Setup primary services */
sog_yang 0:1eec8720727a 164 uint8_t initialValueForDOORCharacteristic = 0xFF;
sog_yang 0:1eec8720727a 165 doorServicePtr = new DOORService(ble, initialValueForDOORCharacteristic);
sog_yang 0:1eec8720727a 166
sog_yang 0:1eec8720727a 167 /* Setup advertising */
sog_yang 0:1eec8720727a 168 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
sog_yang 0:1eec8720727a 169 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *) uuid16_list, sizeof(uuid16_list));
sog_yang 0:1eec8720727a 170 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *) DEVICE_NAME, sizeof(DEVICE_NAME));
sog_yang 0:1eec8720727a 171 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sog_yang 0:1eec8720727a 172 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
sog_yang 0:1eec8720727a 173 ble.gap().startAdvertising();
sog_yang 0:1eec8720727a 174 }
sog_yang 0:1eec8720727a 175
sog_yang 0:1eec8720727a 176 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
sog_yang 0:1eec8720727a 177 BLE &ble = BLE::Instance();
sog_yang 0:1eec8720727a 178 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
sog_yang 0:1eec8720727a 179 }
sog_yang 0:1eec8720727a 180
sog_yang 0:1eec8720727a 181 int main()
sog_yang 0:1eec8720727a 182 {
sog_yang 0:1eec8720727a 183 relay1 = 0;
sog_yang 0:1eec8720727a 184 relay2 = 0;
sog_yang 0:1eec8720727a 185 relay3 = 0;
sog_yang 0:1eec8720727a 186 relay4 = 0;
sog_yang 0:1eec8720727a 187
sog_yang 0:1eec8720727a 188 BLE &ble = BLE::Instance();
sog_yang 0:1eec8720727a 189 ble.onEventsToProcess(scheduleBleEventsProcessing);
sog_yang 0:1eec8720727a 190 ble.init(bleInitComplete);
sog_yang 0:1eec8720727a 191
sog_yang 0:1eec8720727a 192 Thread thread0(cmd_thread,(void *)"DOORCTL");
sog_yang 0:1eec8720727a 193
sog_yang 0:1eec8720727a 194 eventQueue.dispatch_forever();
sog_yang 0:1eec8720727a 195
sog_yang 0:1eec8720727a 196
sog_yang 0:1eec8720727a 197 return 0;
sog_yang 0:1eec8720727a 198 }