オムロンのOKAO Vision HVC-C1BとBLE通信します。

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_ButtonSense by Bluetooth Low Energy

オムロン OKAO Vision(ヒューマンビジョンコンポ)HVC-C1BとRedBearLab nRF51822 mbedでBLE通信を行うサンプルです。

HVC-C1Bは、人、手、顔、性別、年齢、表情、顔の向き、視線、目の閉じを推定し、値を返してくれます。 http://plus-sensing.omron.co.jp/egg-project/

main.cppの最初の定義の部分(IDや欲しい項目)を変更すると使えます。 欲しい項目を1に要らない項目は0にしてください。

タイムアウトの処理が入っていませんが、もし入れたい場合は、LEDのHartBeatの処理に追加すれば簡単に出来ると思います。

下記のような感じでメッセージが帰ってきます。

#Look at HVC-C1B peerAddr[d5 32 26 3b 47 3d] rssi -76, isScanResponse 0, AdvertisementType 0
# St#HVC-C1B Connect
#SCAN Stop
ate 1 Wait for Caracteristic Found
#short:
#  C UUID-2a00 valueAttr[3] props[0]
#short:
#  C UUID-2a01 valueAttr[5] props[0]
#short:
#  C UUID-2a04 valueAttr[7] props[0]
#short:
#  C UUID-2a05 valueAttr[10] props[0]
#long:
#  C UUID-35100003d13a4f398ab3bf64d4fbb4b4 valueAttr[14] props[0]
#HVCNotifyCharacteristic Found
#long:
#  C UUID-35100002d13a4f398ab3bf64d4fbb4b4 valueAttr[17] props[0]
#HVCWriteCharacteristic Found
#long:
#  C UUID-35100004d13a4f398ab3bf64d4fbb4b4 valueAttr[19] props[0]
#HVCDeviceCharacteristic Found
# discovery terminated CallBack 0
# State 2 Notify Enable
#send data 1
#State=2 Wited
# State3 kidoukakunin
#send data 1
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
# State3 HVC-C1B      1 1 0 96090000
# State4 DataSending
#send data 1
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
#received HVX callback for handle 14; type notification
HumanDetect:1
Human(0):x=199,y=251,size=330,depend=774
HandDetect:0
FaceDetect:1
Face(0):x=227,y=230,size=158,depend=670
FaceDirection(0):holizon=20,vertical=0,angle=15,depend=120
FaceOld(0):old=64,depend=333
FaceSex(0):Sex=0,depend=111
FaceLook(0):holizon=-2,vertical=-2
FaceEyeClose(0):xleft=229,right=326
FaceExpression(0):TopExpression=5,TopScore=46,look=-74
# State4 DataSending
#send data 1

Committer:
yueee_yt
Date:
Wed Jul 22 09:45:56 2015 +0000
Revision:
2:b94ca9b44b80
Parent:
1:e4ee755844de
Release

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