BLE Central for Magic Light

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_Central_Light by HM_IOT_Demo

Committer:
hmiot
Date:
Fri Feb 10 07:36:43 2017 +0000
Revision:
14:f84a9745c10a
Parent:
13:9b2a587ee7ac
BLE Demo code for Blitz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hmiot 7:66586d2d7cb5 1 /************************************************************************
hmiot 7:66586d2d7cb5 2 * *
hmiot 7:66586d2d7cb5 3 * *
hmiot 7:66586d2d7cb5 4 ************************************************************************/
hmiot 6:71e7a446ae6a 5
hmiot 7:66586d2d7cb5 6 #include "hm_config.h"
hmiot 7:66586d2d7cb5 7
hmiot 13:9b2a587ee7ac 8 DiscoveredCharacteristic lightCharacteristic;
hmiot 12:cd54180657ee 9 static s_serviceInfo lightChar = {NULL,NULL,NULL,NULL};
hmiot 6:71e7a446ae6a 10 Serial pc(USBTX, USBRX);
hmiot 9:b967a01810e1 11 void bleint();
hmiot 10:5e5fa5bf77b5 12 void waitBleEvent();
hmiot 10:5e5fa5bf77b5 13 void ble_actions(int spi_data);
hmiot 13:9b2a587ee7ac 14 uint8_t statusWR;
hmiot 8:285ebd0e83fb 15 SPISlave spiSlave(P0_9, P0_11, P0_8, P0_10);
hmiot 8:285ebd0e83fb 16
mbed_tw_hoehoe 3:d6f80e11a7f4 17
hmiot 6:71e7a446ae6a 18 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
hmiot 6:71e7a446ae6a 19 uint8_t con_status =0;
hmiot 6:71e7a446ae6a 20 //0x51 for Magic light
hmiot 6:71e7a446ae6a 21 //0x5A
hmiot 13:9b2a587ee7ac 22 if (params->peerAddr[0] == 0x51){ // 0x2F for red bear1.5 /* !ALERT! Alter this filter to suit your device. */
hmiot 8:285ebd0e83fb 23
hmiot 8:285ebd0e83fb 24 pc.printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
mbed_tw_hoehoe 0:83b5c6efd8d7 25 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
mbed_tw_hoehoe 0:83b5c6efd8d7 26 params->rssi, params->isScanResponse, params->type);
hmiot 6:71e7a446ae6a 27 pc.printf("Data Length : %d\r\n",params->advertisingDataLen);
hmiot 8:285ebd0e83fb 28 con_status = BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_PUBLIC, NULL, NULL);
hmiot 8:285ebd0e83fb 29 pc.printf("Connection Status : %d\r\n",con_status);
hmiot 8:285ebd0e83fb 30 connect_status = 1;
hmiot 13:9b2a587ee7ac 31 BLE::Instance().gap().stopScan();
hmiot 9:b967a01810e1 32
hmiot 11:58d8a3129877 33 }else{
hmiot 11:58d8a3129877 34 printf("Not Matched your device\r\n");
hmiot 11:58d8a3129877 35 return;
hmiot 11:58d8a3129877 36 }
hmiot 8:285ebd0e83fb 37 }
mbed_tw_hoehoe 0:83b5c6efd8d7 38
mbed_tw_hoehoe 0:83b5c6efd8d7 39 void serviceDiscoveryCallback(const DiscoveredService *service) {
hmiot 6:71e7a446ae6a 40 pc.printf("Service Discovery Callback\r\n");
hmiot 6:71e7a446ae6a 41 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
hmiot 6:71e7a446ae6a 42 pc.printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
hmiot 6:71e7a446ae6a 43 } else {
hmiot 6:71e7a446ae6a 44 pc.printf("S UUID-");
hmiot 6:71e7a446ae6a 45 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
hmiot 6:71e7a446ae6a 46 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
hmiot 6:71e7a446ae6a 47 printf("%02x", longUUIDBytes[i]);
hmiot 6:71e7a446ae6a 48 }
hmiot 6:71e7a446ae6a 49 pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
hmiot 6:71e7a446ae6a 50 }
mbed_tw_hoehoe 0:83b5c6efd8d7 51 }
mbed_tw_hoehoe 0:83b5c6efd8d7 52
mbed_tw_hoehoe 0:83b5c6efd8d7 53 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
hmiot 6:71e7a446ae6a 54 pc.printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
hmiot 13:9b2a587ee7ac 55
hmiot 9:b967a01810e1 56 if (characteristicP->getUUID().getShortUUID() == 0xffe9) { /* !ALERT! Alter this filter to suit your device. */
hmiot 8:285ebd0e83fb 57 lightCharacteristic = *characteristicP;
hmiot 6:71e7a446ae6a 58 pc.printf("Matched char UUID\r\n");
hmiot 8:285ebd0e83fb 59 printf("Conn Handle = %dand %d \r\n",characteristicP->getConnectionHandle(), lightCharacteristic.getConnectionHandle());
hmiot 8:285ebd0e83fb 60 printf("Value Handle = %d and %d\r\n",characteristicP->getValueHandle(),lightCharacteristic.getValueHandle());
hmiot 10:5e5fa5bf77b5 61 AddCharNodes(lightCharacteristic);
hmiot 9:b967a01810e1 62 charDiscover = 1;
hmiot 9:b967a01810e1 63 serviceDiscover = true;
hmiot 9:b967a01810e1 64 }else {
hmiot 8:285ebd0e83fb 65 printf("Not Matched char UUID\r\n");
mbed_tw_hoehoe 2:4b53d13d9851 66 }
mbed_tw_hoehoe 0:83b5c6efd8d7 67 }
mbed_tw_hoehoe 0:83b5c6efd8d7 68
hmiot 8:285ebd0e83fb 69 void AddCharNodes(DiscoveredCharacteristic light_Characteristic)
hmiot 8:285ebd0e83fb 70 {
hmiot 8:285ebd0e83fb 71 printf("Add Char Nodes\r\n");
hmiot 13:9b2a587ee7ac 72 lightCharacteristic_t *ptr_temp_char;
hmiot 8:285ebd0e83fb 73 ptr_temp_char = lightChar.services_Char[0];
hmiot 8:285ebd0e83fb 74
hmiot 13:9b2a587ee7ac 75
hmiot 8:285ebd0e83fb 76 if(NULL == ptr_temp_char)
hmiot 8:285ebd0e83fb 77 {
hmiot 12:cd54180657ee 78 ptr_temp_char = new lightCharacteristic_t;
hmiot 8:285ebd0e83fb 79 lightChar.services_Char[0] = ptr_temp_char;
hmiot 8:285ebd0e83fb 80 }
hmiot 8:285ebd0e83fb 81 else
hmiot 8:285ebd0e83fb 82 {
hmiot 8:285ebd0e83fb 83 while(NULL != ptr_temp_char->nextChar)
hmiot 8:285ebd0e83fb 84 {
hmiot 8:285ebd0e83fb 85 ptr_temp_char = ptr_temp_char->nextChar;
hmiot 8:285ebd0e83fb 86 }
hmiot 8:285ebd0e83fb 87
hmiot 8:285ebd0e83fb 88 /* add a new node */
hmiot 12:cd54180657ee 89 ptr_temp_char->nextChar = new lightCharacteristic_t;
hmiot 8:285ebd0e83fb 90 ptr_temp_char = ptr_temp_char->nextChar;
hmiot 8:285ebd0e83fb 91 }
hmiot 8:285ebd0e83fb 92
hmiot 8:285ebd0e83fb 93 /* assign data to the node */
hmiot 8:285ebd0e83fb 94 ptr_temp_char->u_characteristicID = 1;
hmiot 8:285ebd0e83fb 95 printf("Conn Handle = %d\r\n",light_Characteristic.getConnectionHandle());
hmiot 8:285ebd0e83fb 96 printf("Value Handle = %d\r\n",light_Characteristic.getValueHandle());
hmiot 8:285ebd0e83fb 97 ptr_temp_char->connHandle = light_Characteristic.getConnectionHandle();
hmiot 8:285ebd0e83fb 98 ptr_temp_char->valueHandle = light_Characteristic.getValueHandle();
hmiot 8:285ebd0e83fb 99 ptr_temp_char->nextChar = NULL;
hmiot 8:285ebd0e83fb 100 }
hmiot 8:285ebd0e83fb 101
mbed_tw_hoehoe 0:83b5c6efd8d7 102 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
mbed_tw_hoehoe 1:2f1203d70643 103 pc.printf("terminated SD for handle %u\r\n", connectionHandle);
hmiot 8:285ebd0e83fb 104 serviceDiscover = false;
mbed_tw_hoehoe 0:83b5c6efd8d7 105 }
mbed_tw_hoehoe 0:83b5c6efd8d7 106
hmiot 6:71e7a446ae6a 107 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
hmiot 6:71e7a446ae6a 108 pc.printf("Connection Callback\n\r");
hmiot 6:71e7a446ae6a 109 if (params->role == Gap::CENTRAL) {
hmiot 6:71e7a446ae6a 110 pc.printf("Service and characterstics discovery callback\r\n");
hmiot 6:71e7a446ae6a 111 BLE::Instance().gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
hmiot 6:71e7a446ae6a 112 BLE::Instance().gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xffe5, 0xffe9);
hmiot 10:5e5fa5bf77b5 113 // 0xffe5 --> Services UUID
hmiot 10:5e5fa5bf77b5 114 // 0xffe9 --> Characteristics UUID
mbed_tw_hoehoe 0:83b5c6efd8d7 115 }
hmiot 6:71e7a446ae6a 116 }
hmiot 6:71e7a446ae6a 117
hmiot 6:71e7a446ae6a 118 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) {
hmiot 6:71e7a446ae6a 119 pc.printf("disconnected\r\n");
hmiot 8:285ebd0e83fb 120 BLE::Instance().gap().startScan(advertisementCallback);
mbed_tw_hoehoe 0:83b5c6efd8d7 121 }
mbed_tw_hoehoe 0:83b5c6efd8d7 122
hmiot 6:71e7a446ae6a 123
hmiot 6:71e7a446ae6a 124 /**
hmiot 6:71e7a446ae6a 125 * Callback triggered when the ble initialization process has finished
hmiot 6:71e7a446ae6a 126 */
hmiot 6:71e7a446ae6a 127 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
hmiot 6:71e7a446ae6a 128 {
hmiot 6:71e7a446ae6a 129 BLE& ble = params->ble;
hmiot 8:285ebd0e83fb 130
hmiot 6:71e7a446ae6a 131 pc.printf("Ble Init\n\r");
hmiot 9:b967a01810e1 132 /* Ensure that it is the default instance of BLE */
hmiot 6:71e7a446ae6a 133 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
hmiot 6:71e7a446ae6a 134 return;
hmiot 9:b967a01810e1 135 }
hmiot 6:71e7a446ae6a 136
hmiot 9:b967a01810e1 137 ble.gap().onConnection(connectionCallback);
hmiot 9:b967a01810e1 138 ble.gap().onDisconnection(disconnectionCallback);
hmiot 9:b967a01810e1 139 ble.gap().setScanParams(1000, 800);
hmiot 9:b967a01810e1 140 ble.gap().startScan(advertisementCallback);
hmiot 10:5e5fa5bf77b5 141
hmiot 8:285ebd0e83fb 142 }
hmiot 8:285ebd0e83fb 143
hmiot 8:285ebd0e83fb 144 void light_actions(int service_char[]){
hmiot 8:285ebd0e83fb 145 lightCharacteristic_t *ptr_tmp = NULL;
hmiot 13:9b2a587ee7ac 146 ptr_tmp = lightChar.services_Char[0];
hmiot 13:9b2a587ee7ac 147 uint8_t numCount;
hmiot 10:5e5fa5bf77b5 148 if(connect_status)
hmiot 10:5e5fa5bf77b5 149 {
hmiot 9:b967a01810e1 150
hmiot 10:5e5fa5bf77b5 151 switch(service_char[2])
hmiot 10:5e5fa5bf77b5 152 {
hmiot 10:5e5fa5bf77b5 153 case TURN_OFF: // off
hmiot 10:5e5fa5bf77b5 154 write_data[0]=0x56;
hmiot 10:5e5fa5bf77b5 155 write_data[1]=0x00;
hmiot 10:5e5fa5bf77b5 156 write_data[2]=0x00;
hmiot 10:5e5fa5bf77b5 157 write_data[3]=0x00;
hmiot 10:5e5fa5bf77b5 158 write_data[4]=0x00;
hmiot 10:5e5fa5bf77b5 159 write_data[5]=0xf0;
hmiot 10:5e5fa5bf77b5 160 write_data[6]=0xaa;
hmiot 10:5e5fa5bf77b5 161 error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,8,write_data);
hmiot 10:5e5fa5bf77b5 162 break;
hmiot 8:285ebd0e83fb 163
hmiot 10:5e5fa5bf77b5 164 case TURN_ON: //on
hmiot 10:5e5fa5bf77b5 165 if(first_on){
hmiot 10:5e5fa5bf77b5 166 pre_write_data[0]=0x56;
hmiot 10:5e5fa5bf77b5 167 pre_write_data[1]=0xDE;
hmiot 10:5e5fa5bf77b5 168 pre_write_data[2]=0x8E;
hmiot 10:5e5fa5bf77b5 169 pre_write_data[3]=0xEE;
hmiot 10:5e5fa5bf77b5 170 pre_write_data[4]=0x00;
hmiot 10:5e5fa5bf77b5 171 pre_write_data[5]=0xf0;
hmiot 10:5e5fa5bf77b5 172 pre_write_data[6]=0xaa;
hmiot 10:5e5fa5bf77b5 173 }
hmiot 10:5e5fa5bf77b5 174 error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,8,pre_write_data);
hmiot 10:5e5fa5bf77b5 175 break;
hmiot 8:285ebd0e83fb 176
hmiot 10:5e5fa5bf77b5 177 case COLOR: // Color
hmiot 13:9b2a587ee7ac 178 write_data[0]=0x56;
hmiot 13:9b2a587ee7ac 179 write_data[1]=lightColor[service_char[3]][0];//0xff
hmiot 13:9b2a587ee7ac 180 write_data[2]=lightColor[service_char[3]][1];//0x00;
hmiot 13:9b2a587ee7ac 181 write_data[3]=lightColor[service_char[3]][2];//0x00;
hmiot 13:9b2a587ee7ac 182 write_data[4]=0x00;
hmiot 13:9b2a587ee7ac 183 write_data[5]=0xf0;
hmiot 13:9b2a587ee7ac 184 write_data[6]=0xaa;
hmiot 13:9b2a587ee7ac 185 for(numCount=0; numCount < 7; numCount++){
hmiot 13:9b2a587ee7ac 186 pre_write_data[numCount] = write_data[numCount];
hmiot 12:cd54180657ee 187 }
hmiot 13:9b2a587ee7ac 188 first_on=false;
hmiot 13:9b2a587ee7ac 189 error_status = BLE::Instance().gattClient().write(GattClient::GATT_OP_WRITE_CMD,ptr_tmp->connHandle,ptr_tmp->valueHandle,8,write_data);
hmiot 10:5e5fa5bf77b5 190 break;
hmiot 8:285ebd0e83fb 191
hmiot 10:5e5fa5bf77b5 192 default:
hmiot 10:5e5fa5bf77b5 193 printf("Invalid Options\r\n");
hmiot 10:5e5fa5bf77b5 194 }
hmiot 10:5e5fa5bf77b5 195 printf("Error Status =%d\n\r",error_status);
hmiot 13:9b2a587ee7ac 196 }
hmiot 13:9b2a587ee7ac 197
hmiot 8:285ebd0e83fb 198 }
hmiot 8:285ebd0e83fb 199
hmiot 12:cd54180657ee 200 void datancpy(char pre_write[], char writeData[], int data_size){
hmiot 8:285ebd0e83fb 201 int numCount;
hmiot 8:285ebd0e83fb 202 for(numCount=0; numCount <= data_size; numCount++){
hmiot 8:285ebd0e83fb 203 pre_write[numCount] = writeData[numCount];
hmiot 8:285ebd0e83fb 204 }
hmiot 8:285ebd0e83fb 205
mbed_tw_hoehoe 2:4b53d13d9851 206 }
mbed_tw_hoehoe 2:4b53d13d9851 207
hmiot 8:285ebd0e83fb 208 void bleint()
hmiot 8:285ebd0e83fb 209 {
hmiot 8:285ebd0e83fb 210 printf("Init\r\n");
hmiot 9:b967a01810e1 211 BLE &ble = BLE::Instance();
hmiot 8:285ebd0e83fb 212 BLE::Instance().init(bleInitComplete);
hmiot 8:285ebd0e83fb 213 }
hmiot 8:285ebd0e83fb 214
hmiot 8:285ebd0e83fb 215 int main()
hmiot 8:285ebd0e83fb 216 {
hmiot 8:285ebd0e83fb 217 // Serial port configuration
mbed_tw_hoehoe 1:2f1203d70643 218 pc.baud(9600);
mbed_tw_hoehoe 0:83b5c6efd8d7 219 wait(8.0);
hmiot 9:b967a01810e1 220 pc.printf("Start\n\r");
hmiot 13:9b2a587ee7ac 221
hmiot 12:cd54180657ee 222 spiSlave.reply(191);
hmiot 13:9b2a587ee7ac 223 statusWR=1;
hmiot 9:b967a01810e1 224 bleint();
hmiot 10:5e5fa5bf77b5 225 bufferSize = 0;
hmiot 10:5e5fa5bf77b5 226 while(1){
hmiot 9:b967a01810e1 227 //printf("loop\r\n");
hmiot 14:f84a9745c10a 228 if(!(connect_status && charDiscover))
hmiot 10:5e5fa5bf77b5 229 waitBleEvent();
hmiot 10:5e5fa5bf77b5 230
hmiot 12:cd54180657ee 231 if(spiSlave.receive()){
hmiot 10:5e5fa5bf77b5 232 // printf("Slave Read loop1\r\n");
hmiot 10:5e5fa5bf77b5 233 spiRX[bufferSize] = spiSlave.read();
hmiot 10:5e5fa5bf77b5 234 spiSlave.reply(spiRX[bufferSize]);
hmiot 10:5e5fa5bf77b5 235 bufferSize++;
hmiot 10:5e5fa5bf77b5 236
hmiot 10:5e5fa5bf77b5 237 if(bufferSize >= 5){
hmiot 10:5e5fa5bf77b5 238 bufferSize=0;
hmiot 10:5e5fa5bf77b5 239 light_actions(spiRX);
hmiot 10:5e5fa5bf77b5 240 spiSlave.reply(0xAA);
hmiot 13:9b2a587ee7ac 241
hmiot 13:9b2a587ee7ac 242 if(statusWR >=4)
hmiot 13:9b2a587ee7ac 243 { wait_ms(500);
hmiot 13:9b2a587ee7ac 244 BLE::Instance().shutdown();
hmiot 13:9b2a587ee7ac 245 statusWR =1;
hmiot 13:9b2a587ee7ac 246 connect_status =0;
hmiot 13:9b2a587ee7ac 247 charDiscover =0;
hmiot 13:9b2a587ee7ac 248 serviceDiscover = true;
hmiot 13:9b2a587ee7ac 249 bleint();
hmiot 13:9b2a587ee7ac 250 }
hmiot 13:9b2a587ee7ac 251 statusWR++;
hmiot 10:5e5fa5bf77b5 252 }
hmiot 10:5e5fa5bf77b5 253
hmiot 12:cd54180657ee 254 }
hmiot 10:5e5fa5bf77b5 255
hmiot 13:9b2a587ee7ac 256
hmiot 13:9b2a587ee7ac 257
hmiot 9:b967a01810e1 258 }
hmiot 9:b967a01810e1 259
hmiot 9:b967a01810e1 260 }
hmiot 9:b967a01810e1 261
hmiot 10:5e5fa5bf77b5 262 void waitBleEvent()
hmiot 10:5e5fa5bf77b5 263 {
hmiot 10:5e5fa5bf77b5 264 while(serviceDiscover || BLE::Instance().gattClient().isServiceDiscoveryActive()){
hmiot 10:5e5fa5bf77b5 265 BLE::Instance().waitForEvent();
hmiot 10:5e5fa5bf77b5 266 }
hmiot 9:b967a01810e1 267 }
hmiot 10:5e5fa5bf77b5 268