forked from arduino/ArduinoCore-arc32
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIMUBleCentral.ino
140 lines (115 loc) · 3.87 KB
/
IMUBleCentral.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
* Copyright (c) 2016 Intel Corporation. All rights reserved.
* See the bottom of this file for the license terms.
*/
/*
* Sketch: IMUBleCentral.ino
*
* Description:
* This sketch will receive the notifications and output the
* received data in the serial monitor. It also illustrates
* using a non-typed characteristic.
*
* Notes:
*
* - Expected Peripheral name: Imu
* - Expected Peripheral Characteristic: F7580003-153E-D4F6-F26D-43D8D98EEB13
* - Expected Peripheral sketch: IMUBleNotification.ino
*/
#include <CurieBLE.h>
#define LED_PIN 13
#define MAX_IMU_RECORD 1
// define a structure that will serve as buffer for holding IMU data
typedef struct {
int index;
unsigned int slot[3];
} imuFrameType;
imuFrameType imuBuf[MAX_IMU_RECORD];
void setup()
{
// This is set to higher baud rate because accelerometer data changes very quickly
Serial.begin(9600); // initialize serial communication
while (!Serial);
pinMode(LED_PIN, OUTPUT); // initialize the LED on pin 13 to indicate when a central is connected
/* Now activate the BLE device. It will start continuously transmitting BLE
advertising packets and will be visible to remote BLE central devices
until it receives a new connection */
BLE.begin();
Serial.println(BLE.address());
BLE.scanForName("Imu");
}
void loop()
{
BLEDevice peripheral = BLE.available();
//pr_debug(LOG_MODULE_BLE, "%s-%d",__FUNCTION__, __LINE__);
if (peripheral)
{
Serial.println(peripheral.address());
BLE.stopScan();
delay (1000);
// central connected to peripheral
controlImu(peripheral);
delay (4000);
BLE.scanForName("Imu");
}
}
void controlImu(BLEDevice peripheral)
{
static bool discovered = false;
// connect to the peripheral
Serial.print("Connecting ... ");
Serial.println(peripheral.address());
if (peripheral.connect())
{
Serial.print("Connected: ");
Serial.println(peripheral.address());
}
else
{
Serial.println("Failed to connect!");
return;
}
peripheral.discoverAttributes();
BLECharacteristic bleImuChar = peripheral.characteristic("F7580003-153E-D4F6-F26D-43D8D98EEB13");
if (!bleImuChar)
{
peripheral.disconnect();
Serial.println("Peripheral does not have IMU characteristic!");
delay(5000);
return;
}
bleImuChar.subscribe();
discovered = false;
while (peripheral.connected())
{
if (bleImuChar.valueUpdated())
{
const unsigned char *cvalue = bleImuChar.value();
const imuFrameType *value = (const imuFrameType *)cvalue;
Serial.print("\r\nCharacteristic event, written: ");
Serial.print(value->index);
Serial.print("\t");
Serial.print(value->slot[0]);
Serial.print("\t");
Serial.print(value->slot[1]);
Serial.print("\t");
Serial.println(value->slot[2]);
}
}
Serial.print("Disconnected");
Serial.println(peripheral.address());
}
/*
Copyright (c) 2016 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/