Neosensory SDK for Bluefruit
neosensory_bluefruit.h
1 /*
2  * Copyright 2020 Neosensory, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * Please note that while this Neosensory SDK has an Apache 2.0 license,
17  * usage of the Neosensory API to interface with Neosensory products is
18  * still subject to the Neosensory developer terms of service located at:
19  * https://neosensory.com/legal/dev-terms-service/
20  */
21 
22 /*
23  NeosensoryBluefruit.h - Library for connecting to
24  Neosensory hardware via Adafruit's Bluefruit library.
25  Created by Mike V. Perrotta, January 23, 2020.
26 */
27 
28 #ifndef NeosensoryBluefruit_h
29 #define NeosensoryBluefruit_h
30 
31 #include "Arduino.h"
32 #include <bluefruit.h>
33 
39 {
40  typedef void (*ConnectedCallback)(bool);
41  typedef void (*DisconnectedCallback)(uint16_t, uint8_t);
42  typedef void (*ReadNotifyCallback)(BLEClientCharacteristic*, uint8_t*, uint16_t);
43 
44  public:
51  NeosensoryBluefruit(char device_id[]="", uint8_t num_motors=4,
52  uint8_t initial_min_vibration=30, uint8_t initial_max_vibration=255);
53 
59  bool isConnected(void);
60 
65  bool startScan(void);
66 
70  uint8_t* getDeviceAddress(void);
71 
74  void begin(void);
75 
82  void setDeviceId(char new_device_id[]);
83 
84 
85  /* Developer Commands */
86 
90  bool isAuthorized(void);
91 
94  void acceptTermsAndConditions(void);
95 
99  void audioStart(void);
100 
104  void audioStop(void);
105 
110  void authorizeDeveloper(void);
111 
114  void deviceBattery(void);
115 
119  void deviceInfo(void);
120 
123  void motorsClearQueue(void);
124 
128  void motorsStart(void);
129 
133  void motorsStop(void);
134 
138  void sendCommand(char cmd[]);
139 
143  void stopAlgorithm(void);
144 
145 
146  /* BLE Callbacks */
147 
155  void connectCallback(uint16_t conn_handle);
156 
161  void disconnectCallback(uint16_t conn_handle, uint8_t reason);
162 
168  void readNotifyCallback(BLEClientCharacteristic* chr, uint8_t* data, uint16_t len);
169 
176  void scanCallback(ble_gap_evt_adv_report_t* report);
177 
183  void setConnectedCallback(ConnectedCallback);
184 
188  void setDisconnectedCallback(DisconnectedCallback);
189 
193  void setReadNotifyCallback(ReadNotifyCallback);
194 
195 
196  /* Vibration */
197 
204  uint8_t firmware_frame_duration(void);
205 
209  uint8_t max_frames_per_bt_package(void);
210 
211  uint8_t max_vibration;
213  uint8_t min_vibration;
219  uint8_t num_motors(void);
220 
223  void turnOffAllMotors(void);
224 
229  void vibrateMotor(uint8_t motor, float intensity);
230 
242  void vibrateMotors(float *intensities[], int num_frames);
243 
254  void vibrateMotors(float intensities[]);
255 
256  private:
257  bool checkAddressMatches(uint8_t foundAddress[]);
258  bool checkDevice(ble_gap_evt_adv_report_t* report);
259  bool checkIsNeosensory(ble_gap_evt_adv_report_t* report);
260  bool connect_to_any_neo_device_;
261  bool is_authorized_;
262  uint8_t device_address_[BLE_GAP_ADDR_LEN];
263  void setDeviceAddress(char device_id[]);
264 
265  /* Vibrations */
266  uint8_t *previous_motor_array_;
267  uint8_t firmware_frame_duration_;
268  uint8_t max_frames_per_bt_package_;
269  uint8_t num_motors_;
270  void getMotorIntensitiesFromLinArray(
271  float lin_array[], uint8_t motor_space_array[], size_t array_size);
272  void sendMotorCommand(uint8_t motor_intensities[], size_t num_frames=1);
273 
274  /* CLI Parsing */
275  bool jsonStarted_;
276  String jsonMessage_;
277  void handleCliJson(String jsonMessage);
278  void parseCliData(uint8_t* data, uint16_t len);
279 
280  /* External Callbacks */
281  ConnectedCallback externalConnectedCallback;
282  DisconnectedCallback externalDisconnectedCallback;
283  ReadNotifyCallback externalReadNotifyCallback;
284 
285  /* Services & Characteristic UUIDs */
286  uint8_t wb_service_uuid_[16];
287  uint8_t wb_write_char_uuid_[16];
288  uint8_t wb_read_char_uuid_[16];
289 
290  /* Services & Characteristic */
291  BLEClientService wb_service_;
292  BLEClientCharacteristic wb_write_characteristic_;
293  BLEClientCharacteristic wb_read_characteristic_;
294 };
295 
296 void connectCallbackWrapper(uint16_t conn_handle);
297 void disconnectCallbackWrapper(uint16_t conn_handle, uint8_t reason);
298 void readNotifyCallbackWrapper(BLEClientCharacteristic* chr, uint8_t* data, uint16_t len);
299 void scanCallbackWrapper(ble_gap_evt_adv_report_t* report);
300 
301 #endif
void vibrateMotor(uint8_t motor, float intensity)
Turn on a single motor at an intensity.
Definition: neosensory_bluefruit.cpp:386
void setDeviceId(char new_device_id[])
Sets new device ID for central to search for.
Definition: neosensory_bluefruit.cpp:107
uint8_t min_vibration
Definition: neosensory_bluefruit.h:213
void motorsStart(void)
Initialize and start the motors interface.
Definition: neosensory_bluefruit.cpp:197
void deviceInfo(void)
Get information about the connected Neosensory device.
Definition: neosensory_bluefruit.cpp:193
uint8_t firmware_frame_duration(void)
Get firmware frame duration in milliseconds.
Definition: neosensory_bluefruit.cpp:257
void audioStart(void)
Starts the audio task processing.
Definition: neosensory_bluefruit.cpp:213
void setDisconnectedCallback(DisconnectedCallback)
Sets a callback that gets called when NeoBluefruit disconnects from a device.
Definition: neosensory_bluefruit.cpp:441
void turnOffAllMotors(void)
Turn off all the motors.
Definition: neosensory_bluefruit.cpp:380
uint8_t max_frames_per_bt_package(void)
Get maximum number of frames allowed in a Bluetooth packet.
Definition: neosensory_bluefruit.cpp:261
void stopAlgorithm(void)
Stops the sound-to-touch algorithm that runs on the wristband.
Definition: neosensory_bluefruit.cpp:188
void begin(void)
Begins Bluetooth components of NeosensoryBluefruit.
Definition: neosensory_bluefruit.cpp:70
void scanCallback(ble_gap_evt_adv_report_t *report)
Callback when a device is found during scan.
Definition: neosensory_bluefruit.cpp:396
void readNotifyCallback(BLEClientCharacteristic *chr, uint8_t *data, uint16_t len)
Callback when read characteristic has data to be read.
Definition: neosensory_bluefruit.cpp:430
void authorizeDeveloper(void)
Send a command to the wristband to authorize developer options.
Definition: neosensory_bluefruit.cpp:180
static NeosensoryBluefruit * NeoBluefruit
Definition: neosensory_bluefruit.h:54
void disconnectCallback(uint16_t conn_handle, uint8_t reason)
Callback when central disconnects.
Definition: neosensory_bluefruit.cpp:424
bool isAuthorized(void)
Returns true if connected device has authorized developer options.
Definition: neosensory_bluefruit.cpp:172
void connectCallback(uint16_t conn_handle)
Callback when central connects.
Definition: neosensory_bluefruit.cpp:405
void setConnectedCallback(ConnectedCallback)
Sets a callback that gets called when NeoBluefruit connects to a device.
Definition: neosensory_bluefruit.cpp:436
void acceptTermsAndConditions(void)
Send a command to the wristband to accept developer terms and conditions.
Definition: neosensory_bluefruit.cpp:184
uint8_t * getDeviceAddress(void)
Get address of device to connect to.
Definition: neosensory_bluefruit.cpp:114
void deviceBattery(void)
Get the amount of charge left on the device battery in percentage.
Definition: neosensory_bluefruit.cpp:209
bool startScan(void)
Start scanning for desired device.
Definition: neosensory_bluefruit.cpp:120
void sendCommand(char cmd[])
Send a command to the wristband.
Definition: neosensory_bluefruit.cpp:176
NeosensoryBluefruit(char device_id[]="", uint8_t num_motors=4, uint8_t initial_min_vibration=30, uint8_t initial_max_vibration=255)
Constructor for new NeosensoryBluefruit object.
Definition: neosensory_bluefruit.cpp:33
void motorsClearQueue(void)
Clears the motor command queue.
Definition: neosensory_bluefruit.cpp:205
Class that handles connecting to and communicating with a Neosensory device over BLE. Relies heavily on Adafruit&#39;s Bluefruit library for BLE. Opens all developer accessible CLI commands with Neosensory hardware. Also offers some higher level motor vibration functions.
Definition: neosensory_bluefruit.h:38
void setReadNotifyCallback(ReadNotifyCallback)
Sets a callback that gets called when read characteristic has data.
Definition: neosensory_bluefruit.cpp:446
void vibrateMotors(float *intensities[], int num_frames)
Cause the wristband to vibrate at the given intensities, for multiple frames.
Definition: neosensory_bluefruit.cpp:364
void audioStop(void)
Stops the current audio task processing and hence any motor outputs from the algorithm.
Definition: neosensory_bluefruit.cpp:217
void motorsStop(void)
Clears the motor queue and stops the motors interface.
Definition: neosensory_bluefruit.cpp:201
uint8_t num_motors(void)
Get number of motors.
Definition: neosensory_bluefruit.cpp:253
uint8_t max_vibration
Definition: neosensory_bluefruit.h:211
bool isConnected(void)
Returns true if NeosensoryBluefruit has connected to a device.
Definition: neosensory_bluefruit.cpp:125