オムロンのOKAO Vision HVC-C1BとBLE通信します。
Dependencies: BLE_API mbed nRF51822
Fork of BLE_ButtonSense by
オムロン 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
main.cpp@2:b94ca9b44b80, 2015-07-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |