オムロンの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@1:e4ee755844de, 2015-07-19 (annotated)
- Committer:
- yueee_yt
- Date:
- Sun Jul 19 13:20:06 2015 +0000
- Revision:
- 1:e4ee755844de
- Parent:
- 0:2dec89c76f68
- Child:
- 2:b94ca9b44b80
mbed(BLE central)<--->omron HVC-C1B(OKAO Vsion)
; alph edtion
;
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}; |
rgrover1 | 0:2dec89c76f68 | 25 | BLE ble; |
yueee_yt | 1:e4ee755844de | 26 | Serial pc(USBTX, USBRX); |
rgrover1 | 0:2dec89c76f68 | 27 | |
rgrover1 | 0:2dec89c76f68 | 28 | Gap::Handle_t connectionHandle = 0xFFFF; |
rgrover1 | 0:2dec89c76f68 | 29 | |
rgrover1 | 0:2dec89c76f68 | 30 | DigitalOut alivenessLED(LED1, 1); |
yueee_yt | 1:e4ee755844de | 31 | bool foundHVCWriteCharacteristic = false; |
yueee_yt | 1:e4ee755844de | 32 | bool foundHVCNotifyCharacteristic = false; |
yueee_yt | 1:e4ee755844de | 33 | bool foundHVCDeviceCharacteristic = false; |
yueee_yt | 1:e4ee755844de | 34 | bool WaitSend; |
yueee_yt | 1:e4ee755844de | 35 | DiscoveredCharacteristic HVCWriteCharacteristic; |
yueee_yt | 1:e4ee755844de | 36 | DiscoveredCharacteristic HVCNotifyCharacteristic; |
yueee_yt | 1:e4ee755844de | 37 | DiscoveredCharacteristic HVCDeviceCharacteristic; |
rgrover1 | 0:2dec89c76f68 | 38 | |
yueee_yt | 1:e4ee755844de | 39 | void periodicCallback(void) |
yueee_yt | 1:e4ee755844de | 40 | { |
rgrover1 | 0:2dec89c76f68 | 41 | alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */ |
rgrover1 | 0:2dec89c76f68 | 42 | } |
rgrover1 | 0:2dec89c76f68 | 43 | |
yueee_yt | 1:e4ee755844de | 44 | void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) |
yueee_yt | 1:e4ee755844de | 45 | { |
yueee_yt | 1:e4ee755844de | 46 | if ((params->peerAddr[5] != HVC_ADDRESS[0]) || |
yueee_yt | 1:e4ee755844de | 47 | (params->peerAddr[4] != HVC_ADDRESS[1]) || |
yueee_yt | 1:e4ee755844de | 48 | (params->peerAddr[3] != HVC_ADDRESS[2]) || |
yueee_yt | 1:e4ee755844de | 49 | (params->peerAddr[2] != HVC_ADDRESS[3]) || |
yueee_yt | 1:e4ee755844de | 50 | (params->peerAddr[1] != HVC_ADDRESS[4]) || |
yueee_yt | 1:e4ee755844de | 51 | (params->peerAddr[0] != HVC_ADDRESS[5])) { /* !ALERT! Update this filter to suit your device. */ |
yueee_yt | 1:e4ee755844de | 52 | // printf("Not adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", |
yueee_yt | 1:e4ee755844de | 53 | // params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], |
yueee_yt | 1:e4ee755844de | 54 | // params->rssi, params->isScanResponse, params->type); |
rgrover1 | 0:2dec89c76f68 | 55 | return; |
rgrover1 | 0:2dec89c76f68 | 56 | } |
yueee_yt | 1:e4ee755844de | 57 | /* |
yueee_yt | 1:e4ee755844de | 58 | printf("#adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", |
rgrover1 | 0:2dec89c76f68 | 59 | params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0], |
yueee_yt | 1:e4ee755844de | 60 | params->rssi, params->isScanResponse, params->type);*/ |
rgrover1 | 0:2dec89c76f68 | 61 | ble.gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); |
rgrover1 | 0:2dec89c76f68 | 62 | } |
rgrover1 | 0:2dec89c76f68 | 63 | |
yueee_yt | 1:e4ee755844de | 64 | void serviceDiscoveryCallback(const DiscoveredService *service) |
yueee_yt | 1:e4ee755844de | 65 | { |
rgrover1 | 0:2dec89c76f68 | 66 | if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) { |
yueee_yt | 1:e4ee755844de | 67 | /* pc.printf("#S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());*/ |
rgrover1 | 0:2dec89c76f68 | 68 | } else { |
yueee_yt | 1:e4ee755844de | 69 | /* pc.printf("#S UUID-");*/ |
rgrover1 | 0:2dec89c76f68 | 70 | const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID(); |
rgrover1 | 0:2dec89c76f68 | 71 | for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) { |
yueee_yt | 1:e4ee755844de | 72 | /* pc.printf("%02x", longUUIDBytes[i]);*/ |
rgrover1 | 0:2dec89c76f68 | 73 | } |
yueee_yt | 1:e4ee755844de | 74 | /* pc.printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());*/ |
rgrover1 | 0:2dec89c76f68 | 75 | } |
rgrover1 | 0:2dec89c76f68 | 76 | } |
rgrover1 | 0:2dec89c76f68 | 77 | |
yueee_yt | 1:e4ee755844de | 78 | void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) |
yueee_yt | 1:e4ee755844de | 79 | { |
yueee_yt | 1:e4ee755844de | 80 | /* pc.printf("# C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());*/ |
yueee_yt | 1:e4ee755844de | 81 | if (characteristicP->getShortUUID() == 2) { /* !ALERT! Update this filter to suit your device. */ |
yueee_yt | 1:e4ee755844de | 82 | HVCWriteCharacteristic = *characteristicP; |
yueee_yt | 1:e4ee755844de | 83 | foundHVCWriteCharacteristic = true; |
yueee_yt | 1:e4ee755844de | 84 | /* printf("#HVCWriteCharacteristic Found\r\n");*/ |
yueee_yt | 1:e4ee755844de | 85 | } |
yueee_yt | 1:e4ee755844de | 86 | if (characteristicP->getShortUUID() == 3) { /* !ALERT! Update this filter to suit your device. */ |
yueee_yt | 1:e4ee755844de | 87 | HVCNotifyCharacteristic = *characteristicP; |
yueee_yt | 1:e4ee755844de | 88 | foundHVCNotifyCharacteristic = true; |
yueee_yt | 1:e4ee755844de | 89 | /* printf("#HVCNotifyCharacteristic Found\r\n");*/ |
yueee_yt | 1:e4ee755844de | 90 | } |
yueee_yt | 1:e4ee755844de | 91 | if (characteristicP->getShortUUID() == 4) { /* !ALERT! Update this filter to suit your device. */ |
yueee_yt | 1:e4ee755844de | 92 | HVCDeviceCharacteristic = *characteristicP; |
yueee_yt | 1:e4ee755844de | 93 | foundHVCDeviceCharacteristic = true; |
yueee_yt | 1:e4ee755844de | 94 | /* printf("#HVCDeviceCharacteristic Found\r\n");*/ |
rgrover1 | 0:2dec89c76f68 | 95 | } |
rgrover1 | 0:2dec89c76f68 | 96 | } |
rgrover1 | 0:2dec89c76f68 | 97 | |
yueee_yt | 1:e4ee755844de | 98 | void discoveryTerminationCallback(Gap::Handle_t connectionHandle) |
yueee_yt | 1:e4ee755844de | 99 | { |
yueee_yt | 1:e4ee755844de | 100 | /* pc.printf("# discovery terminated CallBack %u\r\n", connectionHandle);*/ |
rgrover1 | 0:2dec89c76f68 | 101 | } |
rgrover1 | 0:2dec89c76f68 | 102 | |
yueee_yt | 1:e4ee755844de | 103 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) |
yueee_yt | 1:e4ee755844de | 104 | { |
rgrover1 | 0:2dec89c76f68 | 105 | if (params->role == Gap::CENTRAL) { |
rgrover1 | 0:2dec89c76f68 | 106 | connectionHandle = params->handle; |
rgrover1 | 0:2dec89c76f68 | 107 | ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); |
rgrover1 | 0:2dec89c76f68 | 108 | ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback/*, 0xa000, 0xa001*/); |
yueee_yt | 1:e4ee755844de | 109 | ble.gap().stopScan(); |
yueee_yt | 1:e4ee755844de | 110 | /* pc.printf("#SCAN Stop\r\n");*/ |
rgrover1 | 0:2dec89c76f68 | 111 | } |
rgrover1 | 0:2dec89c76f68 | 112 | } |
rgrover1 | 0:2dec89c76f68 | 113 | |
yueee_yt | 1:e4ee755844de | 114 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
yueee_yt | 1:e4ee755844de | 115 | { |
yueee_yt | 1:e4ee755844de | 116 | /* pc.printf("#Disconnected\r\n");*/ |
yueee_yt | 1:e4ee755844de | 117 | // ble.gap().startScan(advertisementCallback); |
yueee_yt | 1:e4ee755844de | 118 | // pc.printf("#RE SCAN Start\r\n"); |
rgrover1 | 0:2dec89c76f68 | 119 | } |
rgrover1 | 0:2dec89c76f68 | 120 | |
yueee_yt | 1:e4ee755844de | 121 | void hvxCallback(const GattHVXCallbackParams *params) |
yueee_yt | 1:e4ee755844de | 122 | { |
yueee_yt | 1:e4ee755844de | 123 | static bool flag=false; //flag=true no toki tudukiga aru |
yueee_yt | 1:e4ee755844de | 124 | static int l; |
yueee_yt | 1:e4ee755844de | 125 | static unsigned char buffer[100]; |
yueee_yt | 1:e4ee755844de | 126 | int k,human_no,hand_no,face_no; |
yueee_yt | 1:e4ee755844de | 127 | int a; |
yueee_yt | 1:e4ee755844de | 128 | /* pc.printf("#received HVX callback for handle %u; type %s\r\n", params->handle, (params->type == BLE_HVX_NOTIFICATION) ? "notification" : "indication");*/ |
yueee_yt | 1:e4ee755844de | 129 | if(flag==false)l=0; |
rgrover1 | 0:2dec89c76f68 | 130 | for (unsigned index = 0; index < params->len; index++) { |
yueee_yt | 1:e4ee755844de | 131 | /* pc.printf("# %02x", params->data[index]);*/ |
yueee_yt | 1:e4ee755844de | 132 | buffer[l]=params->data[l]; |
yueee_yt | 1:e4ee755844de | 133 | l++; |
rgrover1 | 0:2dec89c76f68 | 134 | } |
yueee_yt | 1:e4ee755844de | 135 | /* pc.printf("\r\n");*/ |
yueee_yt | 1:e4ee755844de | 136 | if((buffer[0]==0xfe)||(buffer[1]==0x00)) { |
yueee_yt | 1:e4ee755844de | 137 | k=buffer[2]+buffer[3]*0x100+buffer[4]*0x10000+buffer[5]*0x1000000; |
yueee_yt | 1:e4ee755844de | 138 | human_no=buffer[6]; |
yueee_yt | 1:e4ee755844de | 139 | hand_no=buffer[7]; |
yueee_yt | 1:e4ee755844de | 140 | face_no=buffer[8]; |
yueee_yt | 1:e4ee755844de | 141 | if(l>2+4+4+8*human_no+8*hand_no+(8+3)*face_no-2)flag=false; |
yueee_yt | 1:e4ee755844de | 142 | else flag=true; |
yueee_yt | 1:e4ee755844de | 143 | if(flag==false) { |
yueee_yt | 1:e4ee755844de | 144 | /* printf("# humanNo=%d HandNo=%d FaceNo=%d\r\n",human_no,hand_no,face_no);*/ |
yueee_yt | 1:e4ee755844de | 145 | if(face_no>0) { |
yueee_yt | 1:e4ee755844de | 146 | a=buffer[9+human_no*8+hand_no*8+9]; |
yueee_yt | 1:e4ee755844de | 147 | printf("%d\r\n",a); |
yueee_yt | 1:e4ee755844de | 148 | } |
yueee_yt | 1:e4ee755844de | 149 | } |
yueee_yt | 1:e4ee755844de | 150 | } |
yueee_yt | 1:e4ee755844de | 151 | WaitSend=true; |
yueee_yt | 1:e4ee755844de | 152 | } |
yueee_yt | 1:e4ee755844de | 153 | void DataReadCallback(const GattReadCallbackParams *params) |
yueee_yt | 1:e4ee755844de | 154 | { |
yueee_yt | 1:e4ee755844de | 155 | /* pc.printf("#recive dataread \r\n");*/ |
yueee_yt | 1:e4ee755844de | 156 | for (unsigned index = 0; index < params->len; index++) { |
yueee_yt | 1:e4ee755844de | 157 | /* pc.printf("# %02x", params->data[index]);*/ |
yueee_yt | 1:e4ee755844de | 158 | } |
yueee_yt | 1:e4ee755844de | 159 | /* pc.printf("\r\n");*/ |
rgrover1 | 0:2dec89c76f68 | 160 | } |
rgrover1 | 0:2dec89c76f68 | 161 | |
yueee_yt | 1:e4ee755844de | 162 | |
yueee_yt | 1:e4ee755844de | 163 | void DataWriteCallback(const GattWriteCallbackParams *params) |
yueee_yt | 1:e4ee755844de | 164 | { |
yueee_yt | 1:e4ee755844de | 165 | // pc.printf("#send data %x\r\n",params->writeOp); |
yueee_yt | 1:e4ee755844de | 166 | // for (unsigned index = 0; index < params->len; index++) { |
yueee_yt | 1:e4ee755844de | 167 | // pc.printf(" %02x", params->data[index]); |
yueee_yt | 1:e4ee755844de | 168 | // } |
yueee_yt | 1:e4ee755844de | 169 | // pc.printf("\r\n"); |
yueee_yt | 1:e4ee755844de | 170 | // ble.gattClient().read(connectionHandle, HVCDeviceCharacteristic.getValueHandle(), 0); |
yueee_yt | 1:e4ee755844de | 171 | //WaitSend=true; |
yueee_yt | 1:e4ee755844de | 172 | //HVCNotifyCharacteristic.read(0); |
yueee_yt | 1:e4ee755844de | 173 | } |
yueee_yt | 1:e4ee755844de | 174 | |
yueee_yt | 1:e4ee755844de | 175 | int main(void) |
yueee_yt | 1:e4ee755844de | 176 | { |
yueee_yt | 1:e4ee755844de | 177 | pc.baud(9600); |
yueee_yt | 1:e4ee755844de | 178 | /* pc.printf("#Start\r\n");*/ |
rgrover1 | 0:2dec89c76f68 | 179 | Ticker ticker; |
rgrover1 | 0:2dec89c76f68 | 180 | ticker.attach(periodicCallback, 1); |
rgrover1 | 0:2dec89c76f68 | 181 | |
rgrover1 | 0:2dec89c76f68 | 182 | ble.init(); |
yueee_yt | 1:e4ee755844de | 183 | |
rgrover1 | 0:2dec89c76f68 | 184 | ble.gap().onConnection(connectionCallback); |
rgrover1 | 0:2dec89c76f68 | 185 | ble.gap().onDisconnection(disconnectionCallback); |
rgrover1 | 0:2dec89c76f68 | 186 | |
rgrover1 | 0:2dec89c76f68 | 187 | ble.gap().setScanParams(500, 400); |
rgrover1 | 0:2dec89c76f68 | 188 | ble.gap().startScan(advertisementCallback); |
rgrover1 | 0:2dec89c76f68 | 189 | |
yueee_yt | 1:e4ee755844de | 190 | ble.gattClient().onDataRead(DataReadCallback); |
yueee_yt | 1:e4ee755844de | 191 | ble.gattClient().onDataWrite(DataWriteCallback); |
rgrover1 | 0:2dec89c76f68 | 192 | ble.gattClient().onHVX(hvxCallback); |
rgrover1 | 0:2dec89c76f68 | 193 | |
yueee_yt | 1:e4ee755844de | 194 | uint8_t send[100]= {0xfe,03,03,0,4,0x1,0}; |
yueee_yt | 1:e4ee755844de | 195 | int state=-1; |
rgrover1 | 0:2dec89c76f68 | 196 | while (true) { |
yueee_yt | 1:e4ee755844de | 197 | if(state<0) { |
yueee_yt | 1:e4ee755844de | 198 | if (foundHVCWriteCharacteristic && foundHVCNotifyCharacteristic && foundHVCDeviceCharacteristic && !ble.gattClient().isServiceDiscoveryActive()) { |
yueee_yt | 1:e4ee755844de | 199 | // printf("# State 1 \r\n"); |
yueee_yt | 1:e4ee755844de | 200 | state=1; |
yueee_yt | 1:e4ee755844de | 201 | } |
yueee_yt | 1:e4ee755844de | 202 | } else if(state==1&&!ble.gattClient().isServiceDiscoveryActive()) { |
yueee_yt | 1:e4ee755844de | 203 | // printf("# State 2 \r\n"); |
yueee_yt | 1:e4ee755844de | 204 | state=2; |
yueee_yt | 1:e4ee755844de | 205 | ble.gattClient().onHVX(hvxCallback); |
yueee_yt | 1:e4ee755844de | 206 | |
yueee_yt | 1:e4ee755844de | 207 | uint16_t value = BLE_HVX_NOTIFICATION; |
yueee_yt | 1:e4ee755844de | 208 | WaitSend=true; |
yueee_yt | 1:e4ee755844de | 209 | ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ, |
yueee_yt | 1:e4ee755844de | 210 | connectionHandle, |
yueee_yt | 1:e4ee755844de | 211 | HVCNotifyCharacteristic.getValueHandle() + 1, /* HACK Alert. We're assuming that CCCD descriptor immediately follows the value attribute. */ |
yueee_yt | 1:e4ee755844de | 212 | sizeof(uint16_t), /* HACK Alert! size should be made into a BLE_API constant. */ |
yueee_yt | 1:e4ee755844de | 213 | reinterpret_cast<const uint8_t *>(&value)); |
yueee_yt | 1:e4ee755844de | 214 | // HVCNotifyCharacteristic.write( sizeof(uint16_t), reinterpret_cast<const uint8_t *>(&value)); /* HACK Alert! size should be made into a BLE_API constant. */ |
yueee_yt | 1:e4ee755844de | 215 | // |
yueee_yt | 1:e4ee755844de | 216 | //HVCNotifyCharacteristic.enableNoticiation() ; |
yueee_yt | 1:e4ee755844de | 217 | } else if(state==2&&!ble.gattClient().isServiceDiscoveryActive()&&WaitSend) { |
yueee_yt | 1:e4ee755844de | 218 | |
yueee_yt | 1:e4ee755844de | 219 | WaitSend=false; |
yueee_yt | 1:e4ee755844de | 220 | // pc.printf("#loop\r\n"); |
yueee_yt | 1:e4ee755844de | 221 | foundHVCWriteCharacteristic = false; /* need to do the following only once */ |
rgrover1 | 0:2dec89c76f68 | 222 | |
rgrover1 | 0:2dec89c76f68 | 223 | /* Note: Yuckiness alert! The following needs to be encapsulated in a neat API. |
rgrover1 | 0:2dec89c76f68 | 224 | * It isn't clear whether we should provide a DiscoveredCharacteristic::enableNoticiation() or |
rgrover1 | 0:2dec89c76f68 | 225 | * DiscoveredCharacteristic::discoverDescriptors() followed by DiscoveredDescriptor::write(...). */ |
yueee_yt | 1:e4ee755844de | 226 | // uint16_t value = BLE_HVX_NOTIFICATION; |
yueee_yt | 1:e4ee755844de | 227 | // ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ, |
yueee_yt | 1:e4ee755844de | 228 | // connectionHandle, |
yueee_yt | 1:e4ee755844de | 229 | // HVCNotifyCharacteristic.getValueHandle() + 1, /* HACK Alert. We're assuming that CCCD descriptor immediately follows the value attribute. */ |
yueee_yt | 1:e4ee755844de | 230 | // sizeof(uint16_t), /* HACK Alert! size should be made into a BLE_API constant. */ |
yueee_yt | 1:e4ee755844de | 231 | // reinterpret_cast<const uint8_t *>(&value)); |
rgrover1 | 0:2dec89c76f68 | 232 | ble.gattClient().write(GattClient::GATT_OP_WRITE_REQ, |
rgrover1 | 0:2dec89c76f68 | 233 | connectionHandle, |
yueee_yt | 1:e4ee755844de | 234 | HVCWriteCharacteristic.getValueHandle(), /* HACK Alert. We're assuming that CCCD descriptor immediately follows the value attribute. */ |
yueee_yt | 1:e4ee755844de | 235 | 7, /* HACK Alert! size should be made into a BLE_API constant. */ |
yueee_yt | 1:e4ee755844de | 236 | send); |
yueee_yt | 1:e4ee755844de | 237 | //printf ( "snd_error %d \r\n" ,HVCWriteCharacteristic.write(4,send)); |
yueee_yt | 1:e4ee755844de | 238 | |
rgrover1 | 0:2dec89c76f68 | 239 | } |
rgrover1 | 0:2dec89c76f68 | 240 | ble.waitForEvent(); |
rgrover1 | 0:2dec89c76f68 | 241 | } |
rgrover1 | 0:2dec89c76f68 | 242 | } |