オムロンの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:
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?

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};
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 }