Yasushi TAUCHI / Mbed 2 deprecated BLE_HVC_EGAO

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_HVC by Yasushi TAUCHI

Committer:
yueee_yt
Date:
Sat Jul 25 07:56:30 2015 +0000
Revision:
3:29a4ed654315
Parent:
2:b94ca9b44b80
???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:2dec89c76f68 1 /* mbed Microcontroller Library
rgrover1 0:2dec89c76f68 2 * Copyright (c) 2006-2015 ARM Limited
rgrover1 0:2dec89c76f68 3 *
rgrover1 0:2dec89c76f68 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:2dec89c76f68 5 * you may not use this file except in compliance with the License.
rgrover1 0:2dec89c76f68 6 * You may obtain a copy of the License at
rgrover1 0:2dec89c76f68 7 *
rgrover1 0:2dec89c76f68 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:2dec89c76f68 9 *
rgrover1 0:2dec89c76f68 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:2dec89c76f68 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:2dec89c76f68 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:2dec89c76f68 13 * See the License for the specific language governing permissions and
rgrover1 0:2dec89c76f68 14 * limitations under the License.
rgrover1 0:2dec89c76f68 15 */
rgrover1 0:2dec89c76f68 16
rgrover1 0:2dec89c76f68 17 #include "mbed.h"
rgrover1 0:2dec89c76f68 18 #include "ble/BLE.h"
rgrover1 0:2dec89c76f68 19 #include "ble/DiscoveredCharacteristic.h"
rgrover1 0:2dec89c76f68 20 #include "ble/DiscoveredService.h"
rgrover1 0:2dec89c76f68 21
rgrover1 0:2dec89c76f68 22 #include "ble_gatt.h"
rgrover1 0:2dec89c76f68 23
yueee_yt 1:e4ee755844de 24 char HVC_ADDRESS[]= {0xd5,0x32,0x26,0x3b,0x47,0x3d};
yueee_yt 2:b94ca9b44b80 25 bool Reconnect=true;
yueee_yt 3:29a4ed654315 26 char HumanDetect=0;
yueee_yt 3:29a4ed654315 27 char HandDetect=0;
yueee_yt 2:b94ca9b44b80 28 char FaceDetect=1;
yueee_yt 3:29a4ed654315 29 char FaceDirection=0;
yueee_yt 2:b94ca9b44b80 30 char FaceOld=1;
yueee_yt 2:b94ca9b44b80 31 char FaceSex=1;
yueee_yt 3:29a4ed654315 32 char FaceLook=0;
yueee_yt 3:29a4ed654315 33 char FaceEyeClose=0;
yueee_yt 2:b94ca9b44b80 34 char FaceExpression=1;
yueee_yt 2:b94ca9b44b80 35 const uint8_t WriteCharacteristicAddr[]= {0x35,0x10,0x00,0x02,0xd1,0x3a,0x4f,0x39,0x8a,0xb3,0xbf,0x64,0xd4,0xfb,0xb4,0xb4};
yueee_yt 2:b94ca9b44b80 36 const uint8_t NotifyCharacteristicAddr[]= {0x35,0x10,0x00,0x03,0xd1,0x3a,0x4f,0x39,0x8a,0xb3,0xbf,0x64,0xd4,0xfb,0xb4,0xb4};
yueee_yt 2:b94ca9b44b80 37 const uint8_t DeviceCharacteristicAddr[]= {0x35,0x10,0x00,0x04,0xd1,0x3a,0x4f,0x39,0x8a,0xb3,0xbf,0x64,0xd4,0xfb,0xb4,0xb4};
rgrover1 0:2dec89c76f68 38 BLE ble;
yueee_yt 1:e4ee755844de 39 Serial pc(USBTX, USBRX);
rgrover1 0:2dec89c76f68 40
rgrover1 0:2dec89c76f68 41 Gap::Handle_t connectionHandle = 0xFFFF;
rgrover1 0:2dec89c76f68 42
rgrover1 0:2dec89c76f68 43 DigitalOut alivenessLED(LED1, 1);
yueee_yt 1:e4ee755844de 44 bool foundHVCWriteCharacteristic = false;
yueee_yt 1:e4ee755844de 45 bool foundHVCNotifyCharacteristic = false;
yueee_yt 1:e4ee755844de 46 bool foundHVCDeviceCharacteristic = false;
yueee_yt 2:b94ca9b44b80 47 int state=-1;
yueee_yt 1:e4ee755844de 48 bool WaitSend;
yueee_yt 1:e4ee755844de 49 DiscoveredCharacteristic HVCWriteCharacteristic;
yueee_yt 1:e4ee755844de 50 DiscoveredCharacteristic HVCNotifyCharacteristic;
yueee_yt 1:e4ee755844de 51 DiscoveredCharacteristic HVCDeviceCharacteristic;
rgrover1 0:2dec89c76f68 52
yueee_yt 3:29a4ed654315 53 int count;
yueee_yt 3:29a4ed654315 54
yueee_yt 1:e4ee755844de 55 void periodicCallback(void)
yueee_yt 1:e4ee755844de 56 {
rgrover1 0:2dec89c76f68 57 alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */
yueee_yt 3:29a4ed654315 58 count++;
yueee_yt 3:29a4ed654315 59 if(count>20){
yueee_yt 3:29a4ed654315 60 ble.gap().disconnect(connectionHandle ,Gap::CONNECTION_TIMEOUT);//connectionHandle , 0x08);
yueee_yt 3:29a4ed654315 61 count=0;
yueee_yt 3:29a4ed654315 62 }
rgrover1 0:2dec89c76f68 63 }
rgrover1 0:2dec89c76f68 64
yueee_yt 1:e4ee755844de 65 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
yueee_yt 1:e4ee755844de 66 {
yueee_yt 3:29a4ed654315 67 count=0;
yueee_yt 1:e4ee755844de 68 if ((params->peerAddr[5] != HVC_ADDRESS[0]) ||
yueee_yt 1:e4ee755844de 69 (params->peerAddr[4] != HVC_ADDRESS[1]) ||
yueee_yt 1:e4ee755844de 70 (params->peerAddr[3] != HVC_ADDRESS[2]) ||
yueee_yt 1:e4ee755844de 71 (params->peerAddr[2] != HVC_ADDRESS[3]) ||
yueee_yt 1:e4ee755844de 72 (params->peerAddr[1] != HVC_ADDRESS[4]) ||
yueee_yt 2:b94ca9b44b80 73 (params->peerAddr[0] != HVC_ADDRESS[5])) {
yueee_yt 1:e4ee755844de 74 // printf("Not adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
yueee_yt 1:e4ee755844de 75 // params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
yueee_yt 1:e4ee755844de 76 // params->rssi, params->isScanResponse, params->type);
rgrover1 0:2dec89c76f68 77 return;
rgrover1 0:2dec89c76f68 78 }
yueee_yt 2:b94ca9b44b80 79 //printf("#adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
yueee_yt 2:b94ca9b44b80 80 // params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
yueee_yt 2:b94ca9b44b80 81 // params->rssi, params->isScanResponse, params->type);
yueee_yt 2:b94ca9b44b80 82 printf("#Look at HVC-C1B peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
rgrover1 0:2dec89c76f68 83 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
yueee_yt 2:b94ca9b44b80 84 params->rssi, params->isScanResponse, params->type);
yueee_yt 2:b94ca9b44b80 85 ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); //Connection
rgrover1 0:2dec89c76f68 86 }
rgrover1 0:2dec89c76f68 87
yueee_yt 1:e4ee755844de 88 void serviceDiscoveryCallback(const DiscoveredService *service)
yueee_yt 1:e4ee755844de 89 {
yueee_yt 3:29a4ed654315 90 count=0;
rgrover1 0:2dec89c76f68 91 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
yueee_yt 2:b94ca9b44b80 92 // pc.printf("#S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
rgrover1 0:2dec89c76f68 93 } else {
yueee_yt 2:b94ca9b44b80 94 // pc.printf("#S UUID-");
yueee_yt 2:b94ca9b44b80 95 // const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
yueee_yt 2:b94ca9b44b80 96 // for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
yueee_yt 2:b94ca9b44b80 97 // pc.printf("%02x", longUUIDBytes[i]);
yueee_yt 2:b94ca9b44b80 98 // }
yueee_yt 2:b94ca9b44b80 99 // pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
rgrover1 0:2dec89c76f68 100 }
rgrover1 0:2dec89c76f68 101 }
rgrover1 0:2dec89c76f68 102
yueee_yt 1:e4ee755844de 103 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP)
yueee_yt 1:e4ee755844de 104 {
yueee_yt 3:29a4ed654315 105 count=0;
yueee_yt 2:b94ca9b44b80 106 bool flag;
yueee_yt 2:b94ca9b44b80 107 if (characteristicP->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
yueee_yt 2:b94ca9b44b80 108 printf("#short:\r\n");
yueee_yt 2:b94ca9b44b80 109 //dousasuruka wakaranai
yueee_yt 2:b94ca9b44b80 110 pc.printf("# C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID() , characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
yueee_yt 2:b94ca9b44b80 111 // if (characteristicP->getShortUUID() == 2) {
yueee_yt 2:b94ca9b44b80 112 if (characteristicP->getUUID().getShortUUID() == 2) {
yueee_yt 2:b94ca9b44b80 113 HVCWriteCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 114 foundHVCWriteCharacteristic = true;
yueee_yt 2:b94ca9b44b80 115 printf("#HVCWriteCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 116 }
yueee_yt 2:b94ca9b44b80 117 //if (characteristicP->getShortUUID() == 3) {
yueee_yt 2:b94ca9b44b80 118 if (characteristicP->getUUID().getShortUUID() == 3) {
yueee_yt 2:b94ca9b44b80 119 HVCNotifyCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 120 foundHVCNotifyCharacteristic = true;
yueee_yt 2:b94ca9b44b80 121 printf("#HVCNotifyCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 122 }
yueee_yt 2:b94ca9b44b80 123 //if (characteristicP->getShortUUID() == 4) {
yueee_yt 2:b94ca9b44b80 124 if (characteristicP->getUUID().getShortUUID() == 4) {
yueee_yt 2:b94ca9b44b80 125 HVCDeviceCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 126 foundHVCDeviceCharacteristic = true;
yueee_yt 2:b94ca9b44b80 127 printf("#HVCDeviceCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 128 }
yueee_yt 2:b94ca9b44b80 129 } else {
yueee_yt 2:b94ca9b44b80 130 printf("#long:\r\n");
yueee_yt 2:b94ca9b44b80 131 const uint8_t *longUUIDBytes = characteristicP->getUUID().getBaseUUID();
yueee_yt 2:b94ca9b44b80 132 pc.printf("# C UUID-");
yueee_yt 2:b94ca9b44b80 133 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
yueee_yt 2:b94ca9b44b80 134 printf("%02x", longUUIDBytes[i]);
yueee_yt 2:b94ca9b44b80 135 }
yueee_yt 2:b94ca9b44b80 136 printf(" valueAttr[%u] props[%x]\r\n", characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
yueee_yt 2:b94ca9b44b80 137 flag=true;
yueee_yt 2:b94ca9b44b80 138 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
yueee_yt 2:b94ca9b44b80 139 if( longUUIDBytes[i]!=WriteCharacteristicAddr[i])flag=false;
yueee_yt 2:b94ca9b44b80 140 }
yueee_yt 2:b94ca9b44b80 141 if (flag==true) {
yueee_yt 2:b94ca9b44b80 142 HVCWriteCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 143 foundHVCWriteCharacteristic = true;
yueee_yt 2:b94ca9b44b80 144 printf("#HVCWriteCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 145 } else {
yueee_yt 2:b94ca9b44b80 146 flag=true;
yueee_yt 2:b94ca9b44b80 147 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
yueee_yt 2:b94ca9b44b80 148 if( longUUIDBytes[i]!=NotifyCharacteristicAddr[i])flag=false;
yueee_yt 2:b94ca9b44b80 149 }
yueee_yt 2:b94ca9b44b80 150 if (flag==true) {
yueee_yt 2:b94ca9b44b80 151 HVCNotifyCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 152 foundHVCNotifyCharacteristic = true;
yueee_yt 2:b94ca9b44b80 153 printf("#HVCNotifyCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 154 } else {
yueee_yt 2:b94ca9b44b80 155 flag=true;
yueee_yt 2:b94ca9b44b80 156 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
yueee_yt 2:b94ca9b44b80 157 if( longUUIDBytes[i]!=DeviceCharacteristicAddr[i])flag=false;
yueee_yt 2:b94ca9b44b80 158 }
yueee_yt 2:b94ca9b44b80 159 if (flag==true) {
yueee_yt 2:b94ca9b44b80 160 HVCDeviceCharacteristic = *characteristicP;
yueee_yt 2:b94ca9b44b80 161 foundHVCDeviceCharacteristic = true;
yueee_yt 2:b94ca9b44b80 162 printf("#HVCDeviceCharacteristic Found\r\n");
yueee_yt 2:b94ca9b44b80 163 }
yueee_yt 2:b94ca9b44b80 164 }
yueee_yt 2:b94ca9b44b80 165 }
rgrover1 0:2dec89c76f68 166 }
rgrover1 0:2dec89c76f68 167 }
rgrover1 0:2dec89c76f68 168
yueee_yt 1:e4ee755844de 169 void discoveryTerminationCallback(Gap::Handle_t connectionHandle)
yueee_yt 1:e4ee755844de 170 {
yueee_yt 3:29a4ed654315 171 count=0;
yueee_yt 2:b94ca9b44b80 172 pc.printf("# discovery terminated CallBack %u\r\n", connectionHandle);
rgrover1 0:2dec89c76f68 173 }
rgrover1 0:2dec89c76f68 174
yueee_yt 1:e4ee755844de 175 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
yueee_yt 1:e4ee755844de 176 {
yueee_yt 3:29a4ed654315 177 count=0;
rgrover1 0:2dec89c76f68 178 if (params->role == Gap::CENTRAL) {
rgrover1 0:2dec89c76f68 179 connectionHandle = params->handle;
rgrover1 0:2dec89c76f68 180 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
rgrover1 0:2dec89c76f68 181 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback/*, 0xa000, 0xa001*/);
yueee_yt 1:e4ee755844de 182 ble.gap().stopScan();
yueee_yt 2:b94ca9b44b80 183 pc.printf("#HVC-C1B Connect\r\n");
yueee_yt 2:b94ca9b44b80 184 pc.printf("#SCAN Stop\r\n");
rgrover1 0:2dec89c76f68 185 }
rgrover1 0:2dec89c76f68 186 }
rgrover1 0:2dec89c76f68 187
yueee_yt 1:e4ee755844de 188 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yueee_yt 1:e4ee755844de 189 {
yueee_yt 3:29a4ed654315 190 count=0;
yueee_yt 2:b94ca9b44b80 191 pc.printf("#HVC-C1B Disconnected\r\n");
yueee_yt 2:b94ca9b44b80 192 if(Reconnect==true) {
yueee_yt 2:b94ca9b44b80 193 state=-1;
yueee_yt 2:b94ca9b44b80 194 ble.gap().startScan(advertisementCallback);
yueee_yt 2:b94ca9b44b80 195 pc.printf("#RE SCAN Start\r\n");
yueee_yt 2:b94ca9b44b80 196 }
rgrover1 0:2dec89c76f68 197 }
rgrover1 0:2dec89c76f68 198
yueee_yt 1:e4ee755844de 199 void hvxCallback(const GattHVXCallbackParams *params)
yueee_yt 1:e4ee755844de 200 {
yueee_yt 3:29a4ed654315 201 count=0;
yueee_yt 1:e4ee755844de 202 static bool flag=false; //flag=true no toki tudukiga aru
yueee_yt 1:e4ee755844de 203 static int l;
yueee_yt 1:e4ee755844de 204 static unsigned char buffer[100];
yueee_yt 2:b94ca9b44b80 205 int k,j,j1,j2,human_no,hand_no,face_no;
yueee_yt 2:b94ca9b44b80 206 pc.printf("#received HVX callback for handle %u; type %s\r\n", params->handle, (params->type == BLE_HVX_NOTIFICATION) ? "notification" : "indication");
yueee_yt 2:b94ca9b44b80 207
yueee_yt 1:e4ee755844de 208 if(flag==false)l=0;
yueee_yt 2:b94ca9b44b80 209
rgrover1 0:2dec89c76f68 210 for (unsigned index = 0; index < params->len; index++) {
yueee_yt 2:b94ca9b44b80 211 buffer[l]=params->data[index];
yueee_yt 1:e4ee755844de 212 l++;
rgrover1 0:2dec89c76f68 213 }
yueee_yt 1:e4ee755844de 214 if((buffer[0]==0xfe)||(buffer[1]==0x00)) {
yueee_yt 2:b94ca9b44b80 215 //Sucess
yueee_yt 2:b94ca9b44b80 216 if(state==3) {
yueee_yt 2:b94ca9b44b80 217 if((l+1)>(6+0x13-1)) {
yueee_yt 2:b94ca9b44b80 218 printf("# State3 %c%c%c%c%c%c%c%c%c%c%c%c %x %x %x %x\r\n",
yueee_yt 2:b94ca9b44b80 219 buffer[6],buffer[7],buffer[8],buffer[9],buffer[10],buffer[11],
yueee_yt 2:b94ca9b44b80 220 buffer[12],buffer[13],buffer[14],buffer[15],buffer[16],buffer[17],
yueee_yt 2:b94ca9b44b80 221 buffer[18],buffer[19],buffer[20],
yueee_yt 2:b94ca9b44b80 222 buffer[21]*0x1000000+buffer[22]*0x10000+buffer[23]*0x100+buffer[24]);
yueee_yt 2:b94ca9b44b80 223 WaitSend=true;
yueee_yt 2:b94ca9b44b80 224 flag=false;
yueee_yt 2:b94ca9b44b80 225 } else {
yueee_yt 2:b94ca9b44b80 226 flag=true;
yueee_yt 2:b94ca9b44b80 227 }
yueee_yt 2:b94ca9b44b80 228 } else if(state==4) {
yueee_yt 3:29a4ed654315 229 printf("DATA_START\r\n");
yueee_yt 2:b94ca9b44b80 230 k=buffer[2]+buffer[3]*0x100+buffer[4]*0x10000+buffer[5]*0x1000000;
yueee_yt 2:b94ca9b44b80 231 if((l+1)>(6+k-1)) {
yueee_yt 2:b94ca9b44b80 232 human_no=buffer[6];
yueee_yt 2:b94ca9b44b80 233 hand_no=buffer[7];
yueee_yt 2:b94ca9b44b80 234 face_no=buffer[8];
yueee_yt 2:b94ca9b44b80 235
yueee_yt 2:b94ca9b44b80 236 if(human_no>0) {
yueee_yt 2:b94ca9b44b80 237 printf("HumanDetect:%d \r\n",human_no);
yueee_yt 2:b94ca9b44b80 238 for(k=0; k<human_no; k++) {
yueee_yt 2:b94ca9b44b80 239 printf("Human(%d):x=%d,y=%d,size=%d,depend=%d\r\n",
yueee_yt 2:b94ca9b44b80 240 k,buffer[10+k*8+0]+buffer[10+k*8+1]*0x100,
yueee_yt 2:b94ca9b44b80 241 buffer[10+k*8+2]+buffer[10+k*8+3]*0x100,
yueee_yt 2:b94ca9b44b80 242 buffer[10+k*8+4]+buffer[10+k*8+5]*0x100,
yueee_yt 2:b94ca9b44b80 243 buffer[10+k*8+6]+buffer[10+k*8+7]*0x100);
yueee_yt 2:b94ca9b44b80 244 }
yueee_yt 2:b94ca9b44b80 245 } else {
yueee_yt 2:b94ca9b44b80 246 if(HumanDetect==1) {
yueee_yt 2:b94ca9b44b80 247 printf("HumanDetect:0\r\n");
yueee_yt 2:b94ca9b44b80 248 }
yueee_yt 2:b94ca9b44b80 249 }
yueee_yt 2:b94ca9b44b80 250 if(hand_no>0) {
yueee_yt 2:b94ca9b44b80 251 printf("HandDetect:%d \r\n",hand_no);
yueee_yt 2:b94ca9b44b80 252 j=10+human_no*8;
yueee_yt 2:b94ca9b44b80 253 for(k=0; k<hand_no; k++) {
yueee_yt 2:b94ca9b44b80 254 printf("Hand(%d):x=%d,y=%d,size=%d,depend=%d\r\n",
yueee_yt 2:b94ca9b44b80 255 k,buffer[j+k*8+0]+buffer[j+k*8+1]*0x100,
yueee_yt 2:b94ca9b44b80 256 buffer[j+k*8+2]+buffer[j+k*8+3]*0x100,
yueee_yt 2:b94ca9b44b80 257 buffer[j+k*8+4]+buffer[j+k*8+5]*0x100,
yueee_yt 2:b94ca9b44b80 258 buffer[j+k*8+6]+buffer[j+k*8+7]*0x100);
yueee_yt 2:b94ca9b44b80 259 }
yueee_yt 2:b94ca9b44b80 260 } else {
yueee_yt 2:b94ca9b44b80 261 if(HandDetect==1) {
yueee_yt 2:b94ca9b44b80 262 printf("HandDetect:0\r\n");
yueee_yt 2:b94ca9b44b80 263 }
yueee_yt 2:b94ca9b44b80 264 }
yueee_yt 2:b94ca9b44b80 265 if(face_no>0) {
yueee_yt 2:b94ca9b44b80 266 printf("FaceDetect:%d \r\n",face_no);
yueee_yt 2:b94ca9b44b80 267 j=10+human_no*8+hand_no*8;
yueee_yt 2:b94ca9b44b80 268 j2=FaceDetect*8+FaceDirection*8+FaceOld*3+ FaceSex*3+ FaceLook*2+FaceEyeClose*4+FaceExpression*3;
yueee_yt 2:b94ca9b44b80 269 if(FaceDetect==1) {
yueee_yt 2:b94ca9b44b80 270 j1=0;
yueee_yt 2:b94ca9b44b80 271 for(k=0; k<face_no; k++) {
yueee_yt 3:29a4ed654315 272 printf("Face:%d:%d:%d:%d:%d\r\n",
yueee_yt 2:b94ca9b44b80 273 k,buffer[j+k*j2+j1+0]+buffer[j+k*j2+j1+1]*0x100,
yueee_yt 2:b94ca9b44b80 274 buffer[j+k*j2+j1+2]+buffer[j+k*j2+j1+3]*0x100,
yueee_yt 2:b94ca9b44b80 275 buffer[j+k*j2+j1+4]+buffer[j+k*j2+j1+5]*0x100,
yueee_yt 2:b94ca9b44b80 276 buffer[j+k*j2+j1+6]+buffer[j+k*j2+j1+7]*0x100);
yueee_yt 2:b94ca9b44b80 277 }
yueee_yt 2:b94ca9b44b80 278 }
yueee_yt 2:b94ca9b44b80 279 if(FaceDirection==1) {
yueee_yt 2:b94ca9b44b80 280 j1=FaceDetect*8;
yueee_yt 2:b94ca9b44b80 281 for(k=0; k<face_no; k++) {
yueee_yt 2:b94ca9b44b80 282 printf("FaceDirection(%d):holizon=%d,vertical=%d,angle=%d,depend=%d\r\n",
yueee_yt 2:b94ca9b44b80 283 k,(signed short)(buffer[j+k*j2+j1+0]+buffer[j+k*j2+j1+1]*0x100),
yueee_yt 2:b94ca9b44b80 284 (signed short)(buffer[j+k*j2+j1+2]+buffer[j+k*j2+j1+3]*0x100),
yueee_yt 2:b94ca9b44b80 285 (signed short)(buffer[j+k*j2+j1+4]+buffer[j+k*j2+j1+5]*0x100),
yueee_yt 2:b94ca9b44b80 286 (signed short)(buffer[j+k*j2+j1+6]+buffer[j+k*j2+j1+7]*0x100));
yueee_yt 2:b94ca9b44b80 287 }
yueee_yt 2:b94ca9b44b80 288 }
yueee_yt 2:b94ca9b44b80 289 if(FaceOld==1) {
yueee_yt 2:b94ca9b44b80 290 j1=FaceDetect*8+FaceDirection*8;
yueee_yt 2:b94ca9b44b80 291 for(k=0; k<face_no; k++) {
yueee_yt 3:29a4ed654315 292 printf("FaceOld:%d:%d:%d\r\n",
yueee_yt 2:b94ca9b44b80 293 k,(signed char)(buffer[j+k*j2+j1+0]),
yueee_yt 2:b94ca9b44b80 294 (short)(buffer[j+k*j2+j1+1]+buffer[j+k*j2+j1+2]*0x100));
yueee_yt 2:b94ca9b44b80 295 }
yueee_yt 2:b94ca9b44b80 296 }
yueee_yt 2:b94ca9b44b80 297 if(FaceSex==1) {
yueee_yt 2:b94ca9b44b80 298 j1=FaceDetect*8+FaceDirection*8+FaceOld*3;
yueee_yt 2:b94ca9b44b80 299 for(k=0; k<face_no; k++) {
yueee_yt 3:29a4ed654315 300 printf("FaceSex:%d:%d:%d\r\n",
yueee_yt 2:b94ca9b44b80 301 k,(signed char)(buffer[j+k*j2+j1+0]), //0--feminine 1---male
yueee_yt 2:b94ca9b44b80 302 (short)(buffer[j+k*j2+j1+1]+buffer[j+k*j2+j1+2]*0x100));
yueee_yt 2:b94ca9b44b80 303 }
yueee_yt 2:b94ca9b44b80 304 }
yueee_yt 2:b94ca9b44b80 305 if(FaceLook==1) {
yueee_yt 2:b94ca9b44b80 306 j1=FaceDetect*8+FaceDirection*8+FaceOld*3+FaceSex*3;
yueee_yt 2:b94ca9b44b80 307 for(k=0; k<face_no; k++) {
yueee_yt 3:29a4ed654315 308 printf("FaceLook:%d:holizon=%d:vertical=%d\r\n",
yueee_yt 2:b94ca9b44b80 309 k,(signed char)(buffer[j+k*j2+j1+0]), //0--feminine 1---male
yueee_yt 2:b94ca9b44b80 310 (signed char)(buffer[j+k*j2+j1+1]));
yueee_yt 2:b94ca9b44b80 311 }
yueee_yt 2:b94ca9b44b80 312 }
yueee_yt 2:b94ca9b44b80 313 if(FaceEyeClose==1) {
yueee_yt 2:b94ca9b44b80 314 j1=FaceDetect*8+FaceDirection*8+FaceOld*3+FaceSex*3+FaceLook*2;
yueee_yt 2:b94ca9b44b80 315 for(k=0; k<face_no; k++) {
yueee_yt 2:b94ca9b44b80 316 printf("FaceEyeClose(%d):xleft=%d,right=%d\r\n",
yueee_yt 2:b94ca9b44b80 317 k,(signed short)(buffer[j+k*j2+j1+0]+buffer[j+k*j2+j1+1]*0x100),
yueee_yt 2:b94ca9b44b80 318 (signed short)(buffer[j+k*j2+j1+2]+buffer[j+k*j2+j1+3]*0x100));
yueee_yt 2:b94ca9b44b80 319 }
yueee_yt 2:b94ca9b44b80 320 }
yueee_yt 2:b94ca9b44b80 321 if(FaceExpression==1) {
yueee_yt 2:b94ca9b44b80 322 j1=FaceDetect*8+FaceDirection*8+FaceOld*3+FaceSex*3+FaceLook*2+FaceEyeClose*4;
yueee_yt 2:b94ca9b44b80 323 for(k=0; k<face_no; k++) {
yueee_yt 3:29a4ed654315 324 printf("FaceExpression:%d:%d:%d:%d\r\n",
yueee_yt 2:b94ca9b44b80 325 k,(signed char)(buffer[j+k*j2+j1+0]),
yueee_yt 2:b94ca9b44b80 326 (signed char)(buffer[j+k*j2+j1+1]),
yueee_yt 2:b94ca9b44b80 327 (signed char)(buffer[j+k*j2+j1+2]));
yueee_yt 2:b94ca9b44b80 328 }
yueee_yt 2:b94ca9b44b80 329 }
yueee_yt 2:b94ca9b44b80 330
yueee_yt 2:b94ca9b44b80 331 } else {
yueee_yt 3:29a4ed654315 332 if(FaceDetect==1) printf("#FaceDetect:0\r\n");
yueee_yt 3:29a4ed654315 333 if(FaceDirection==1) printf("#FaceDirection:0\r\n");
yueee_yt 3:29a4ed654315 334 if(FaceOld==1) printf("#FaceOld:0\r\n");
yueee_yt 3:29a4ed654315 335 if(FaceSex==1) printf("#FaceSex:0\r\n");
yueee_yt 3:29a4ed654315 336 if(FaceLook==1) printf("#FaceLook:0\r\n");
yueee_yt 3:29a4ed654315 337 if(FaceEyeClose==1) printf("#FaceEyeClose:0\r\n");
yueee_yt 3:29a4ed654315 338 if(FaceExpression==1) printf("#FaceExpression:0\r\n");
yueee_yt 2:b94ca9b44b80 339 }
yueee_yt 3:29a4ed654315 340 printf("DATA_END\r\n");
yueee_yt 2:b94ca9b44b80 341 flag=false;
yueee_yt 2:b94ca9b44b80 342 WaitSend=true;
yueee_yt 2:b94ca9b44b80 343 } else {
yueee_yt 2:b94ca9b44b80 344 flag=true;
yueee_yt 1:e4ee755844de 345 }
yueee_yt 1:e4ee755844de 346 }
yueee_yt 2:b94ca9b44b80 347 } else {
yueee_yt 2:b94ca9b44b80 348 flag=false;
yueee_yt 1:e4ee755844de 349 }
yueee_yt 1:e4ee755844de 350 }
yueee_yt 2:b94ca9b44b80 351
yueee_yt 1:e4ee755844de 352 void DataReadCallback(const GattReadCallbackParams *params)
yueee_yt 1:e4ee755844de 353 {
yueee_yt 3:29a4ed654315 354 count=0;
yueee_yt 2:b94ca9b44b80 355 // pc.printf("#Data Readed \r\n");
yueee_yt 2:b94ca9b44b80 356 //for (unsigned index = 0; index < params->len; index++) {
yueee_yt 2:b94ca9b44b80 357 // pc.printf("# %02x", params->data[index]);
yueee_yt 2:b94ca9b44b80 358 //}
yueee_yt 2:b94ca9b44b80 359 // pc.printf("\r\n");
rgrover1 0:2dec89c76f68 360 }
rgrover1 0:2dec89c76f68 361
yueee_yt 1:e4ee755844de 362 void DataWriteCallback(const GattWriteCallbackParams *params)
yueee_yt 1:e4ee755844de 363 {
yueee_yt 3:29a4ed654315 364 count=0;
yueee_yt 2:b94ca9b44b80 365 pc.printf("#send data %x\r\n",params->writeOp);
yueee_yt 2:b94ca9b44b80 366 // for (unsigned index = 0; index < params->len; index++) {
yueee_yt 2:b94ca9b44b80 367 // pc.printf(" %02x", params->data[index]);
yueee_yt 2:b94ca9b44b80 368 // }
yueee_yt 2:b94ca9b44b80 369 // pc.printf("\r\n");
yueee_yt 2:b94ca9b44b80 370 if(state==2) {
yueee_yt 2:b94ca9b44b80 371 printf("#State=2 Wited\r\n");
yueee_yt 2:b94ca9b44b80 372 WaitSend=true;
yueee_yt 2:b94ca9b44b80 373 }
yueee_yt 1:e4ee755844de 374 }
yueee_yt 1:e4ee755844de 375
yueee_yt 1:e4ee755844de 376 int main(void)
yueee_yt 1:e4ee755844de 377 {
yueee_yt 3:29a4ed654315 378 count=0;
yueee_yt 1:e4ee755844de 379 pc.baud(9600);
yueee_yt 2:b94ca9b44b80 380 pc.printf("#Progran Start\r\n");
yueee_yt 2:b94ca9b44b80 381 Ticker ticker; //LED HertBeat
rgrover1 0:2dec89c76f68 382 ticker.attach(periodicCallback, 1);
rgrover1 0:2dec89c76f68 383
rgrover1 0:2dec89c76f68 384 ble.init();
yueee_yt 1:e4ee755844de 385
rgrover1 0:2dec89c76f68 386 ble.gap().onConnection(connectionCallback);
rgrover1 0:2dec89c76f68 387 ble.gap().onDisconnection(disconnectionCallback);
rgrover1 0:2dec89c76f68 388
rgrover1 0:2dec89c76f68 389 ble.gap().setScanParams(500, 400);
rgrover1 0:2dec89c76f68 390 ble.gap().startScan(advertisementCallback);
rgrover1 0:2dec89c76f68 391
yueee_yt 1:e4ee755844de 392 ble.gattClient().onDataRead(DataReadCallback);
yueee_yt 1:e4ee755844de 393 ble.gattClient().onDataWrite(DataWriteCallback);
rgrover1 0:2dec89c76f68 394 ble.gattClient().onHVX(hvxCallback);
rgrover1 0:2dec89c76f68 395
yueee_yt 2:b94ca9b44b80 396 uint8_t SendByte0[4]= {0xfe,00,00,00,};
yueee_yt 2:b94ca9b44b80 397 uint8_t SendByte1[7]= {0xfe,03,03,0,4,0x1,0};
yueee_yt 2:b94ca9b44b80 398 SendByte1[4]=FaceEyeClose*0x80+FaceLook*0x40+FaceSex*0x20+FaceOld*0x10+FaceDirection*0x8+FaceDetect*0x4+HandDetect*0x2+HumanDetect;
yueee_yt 2:b94ca9b44b80 399 SendByte1[5]=FaceExpression;
yueee_yt 2:b94ca9b44b80 400 state=-1;
yueee_yt 2:b94ca9b44b80 401
rgrover1 0:2dec89c76f68 402 while (true) {
yueee_yt 1:e4ee755844de 403 if(state<0) {
yueee_yt 1:e4ee755844de 404 if (foundHVCWriteCharacteristic && foundHVCNotifyCharacteristic && foundHVCDeviceCharacteristic && !ble.gattClient().isServiceDiscoveryActive()) {
yueee_yt 2:b94ca9b44b80 405 printf("# State 1 Wait for Caracteristic Found \r\n");
yueee_yt 1:e4ee755844de 406 state=1;
yueee_yt 1:e4ee755844de 407 }
yueee_yt 1:e4ee755844de 408 } else if(state==1&&!ble.gattClient().isServiceDiscoveryActive()) {
yueee_yt 2:b94ca9b44b80 409 printf("# State 2 Notify Enable \r\n");
yueee_yt 1:e4ee755844de 410 state=2;
yueee_yt 1:e4ee755844de 411 uint16_t value = BLE_HVX_NOTIFICATION;
yueee_yt 2:b94ca9b44b80 412 WaitSend=false;
yueee_yt 1:e4ee755844de 413 ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ,
yueee_yt 1:e4ee755844de 414 connectionHandle,
yueee_yt 2:b94ca9b44b80 415 HVCNotifyCharacteristic.getValueHandle() + 1,
yueee_yt 2:b94ca9b44b80 416 sizeof(uint16_t),
yueee_yt 1:e4ee755844de 417 reinterpret_cast<const uint8_t *>(&value));
yueee_yt 1:e4ee755844de 418 } else if(state==2&&!ble.gattClient().isServiceDiscoveryActive()&&WaitSend) {
yueee_yt 2:b94ca9b44b80 419 //3 KIDOUKAKUNIN
yueee_yt 2:b94ca9b44b80 420 state=3;
yueee_yt 1:e4ee755844de 421 WaitSend=false;
yueee_yt 2:b94ca9b44b80 422 pc.printf("# State3 kidoukakunin\r\n");
rgrover1 0:2dec89c76f68 423 ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ,
rgrover1 0:2dec89c76f68 424 connectionHandle,
yueee_yt 2:b94ca9b44b80 425 HVCWriteCharacteristic.getValueHandle(),
yueee_yt 2:b94ca9b44b80 426 4,SendByte0);
yueee_yt 2:b94ca9b44b80 427 } else if((state==3||state==4)&&!ble.gattClient().isServiceDiscoveryActive()&&WaitSend) {
yueee_yt 2:b94ca9b44b80 428 //4 DataSend
yueee_yt 2:b94ca9b44b80 429 state=4;
yueee_yt 2:b94ca9b44b80 430 WaitSend=false;
yueee_yt 2:b94ca9b44b80 431 pc.printf("# State4 DataSending\r\n");
yueee_yt 2:b94ca9b44b80 432 ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ,
yueee_yt 2:b94ca9b44b80 433 connectionHandle,
yueee_yt 2:b94ca9b44b80 434 HVCWriteCharacteristic.getValueHandle(),
yueee_yt 2:b94ca9b44b80 435 7,SendByte1);
rgrover1 0:2dec89c76f68 436 }
rgrover1 0:2dec89c76f68 437 ble.waitForEvent();
rgrover1 0:2dec89c76f68 438 }
rgrover1 0:2dec89c76f68 439 }