9
9
10
10
#include " app_interface.h"
11
11
12
+ #define UART_BUFFER_SIZE BLE_BUFSIZE
13
+
12
14
extern AppInterface app;
13
15
14
16
AppInterface::AppInterface (Adafruit_BluefruitLE_SPI& ble, PanoSettings& settings, PanoState& state)
@@ -32,13 +34,13 @@ void callbackGattRX(int32_t char_id, uint8_t* data, uint16_t len){
32
34
}
33
35
void callbackUartRX (char data[], uint16_t len){
34
36
// { debug
35
- Serial.print (" BLE UART RX len=" );
36
- Serial.print (len);
37
- Serial.print (" data=" );
38
- for (int i = 0 ; i < len; i++) { Serial.print (data[i], HEX); Serial.print (" -" ); };
39
- Serial.println (" " );
40
- // } debug
41
- app.uartRX ((uint8_t *)data, len);
37
+ Serial.print (" BLE UART RX len=" );
38
+ Serial.print (len);
39
+ Serial.print (" data=" );
40
+ for (int i = 0 ; i < len; i++) { Serial.print (data[i], HEX); Serial.print (" -" ); };
41
+ Serial.println (" " );
42
+ // } debug
43
+ app.uartRX ((uint8_t *)data, len);
42
44
}
43
45
void callbackDidConnect (void ){
44
46
app.didConnect ();
@@ -49,14 +51,14 @@ void callbackDidDisconnect(void){
49
51
50
52
void AppInterface::begin (){
51
53
ble.sendCommandCheckOK (" AT+BAUDRATE=921600" );
52
- // LED Activity command is only supported from 0.6.6
54
+ // LED Activity command is only supported from 0.6.6: MODE, BLEUART
53
55
ble.sendCommandCheckOK (" AT+HWMODELED=BLEUART" );
54
56
ble.sendCommandCheckOK (" AT+GAPDEVNAME=Pano Controller" );
55
57
56
58
gatt = new Adafruit_BLEGatt (ble);
57
59
service_id = gatt->addService (SERVICE_UUID);
58
60
config_char_id = gatt->addCharacteristic (CONFIG_CHAR_UUID, GATT_CHARS_PROPERTIES_READ | GATT_CHARS_PROPERTIES_WRITE | GATT_CHARS_PROPERTIES_WRITE_WO_RESP,
59
- 5 , 20 , BLE_DATATYPE_BYTEARRAY, " Configuration" );
61
+ 3 , 20 , BLE_DATATYPE_BYTEARRAY, " Configuration" );
60
62
status_char_id = gatt->addCharacteristic (STATUS_CHAR_UUID, GATT_CHARS_PROPERTIES_READ | GATT_CHARS_PROPERTIES_NOTIFY,
61
63
sizeof (PanoState), sizeof (PanoState), BLE_DATATYPE_BYTEARRAY, " Status" );
62
64
cmd_char_id = gatt->addCharacteristic (CMD_CHAR_UUID, GATT_CHARS_PROPERTIES_WRITE,
@@ -69,7 +71,8 @@ void AppInterface::begin(){
69
71
ble.setDisconnectCallback (callbackDidDisconnect);
70
72
ble.setBleGattRxCallback (config_char_id, callbackGattRX);
71
73
ble.setBleGattRxCallback (cmd_char_id, callbackGattRX);
72
- ble.setBleUartRxCallback (callbackUartRX);
74
+ // ble.setBleUartRxCallback(callbackUartRX); // direct polling is faster than ble.update()
75
+ ble.setMode (BLUEFRUIT_MODE_DATA);
73
76
}
74
77
75
78
void AppInterface::sendStatus (){
@@ -78,20 +81,15 @@ void AppInterface::sendStatus(){
78
81
}
79
82
80
83
void AppInterface::gattRX (int32_t char_id, uint8_t * data, uint16_t len){
81
- if (char_id == config_char_id || char_id == cmd_char_id){
82
- uartRX (data, len);
83
- }
84
+ uartRX (data, len);
84
85
}
85
86
static bool unpack (settings_t & variable, uint8_t * &data, uint16_t & len){
86
- if (len >= 2 *sizeof (variable)){
87
- len -= 2 *sizeof (variable);
88
- variable = 0 ;
89
- for (int i=2 *sizeof (variable); i; i--){
90
- variable = (variable <<= 4 ) + (*data++ - 0x30 );
91
- }
87
+ if (len >= sizeof (variable)){
88
+ len -= sizeof (variable);
89
+ memcpy ((void *)&variable, data, sizeof (variable));
90
+ data += sizeof (variable);
92
91
return true ;
93
92
}
94
- return false ;
95
93
}
96
94
void AppInterface::uartRX (uint8_t * data, uint16_t len){
97
95
static uint8_t keyCode;
@@ -123,7 +121,7 @@ void AppInterface::uartRX(uint8_t* data, uint16_t len){
123
121
case 0x66 : callbacks.goHome (); break ;
124
122
case 0x67 : sendStatus (); break ;
125
123
case 0x68 : // free move
126
- if (len >= 2 * 2 * sizeof (settings_t )){
124
+ if (len >= 2 * sizeof (settings_t )){
127
125
settings_t horiz_move, vert_move;
128
126
unpack (horiz_move, data, len);
129
127
unpack (vert_move, data, len);
@@ -161,5 +159,24 @@ bool AppInterface::isConnected(void){
161
159
}
162
160
163
161
void AppInterface::poll (uint32_t timeout){
164
- ble.update (timeout);
162
+ static char buffer[UART_BUFFER_SIZE];
163
+ static char * eob = buffer + UART_BUFFER_SIZE;
164
+ if (!connected || timeout > 0 ){
165
+ ble.update (timeout);
166
+ } else {
167
+ char * p = buffer;
168
+ int c;
169
+ do {
170
+ do {
171
+ // ble.read() can substitute for ble.available() because it can return EOF
172
+ c = ble.read ();
173
+ if (c == EOF) break ;
174
+ *p++ = (char )c;
175
+ } while (p < eob);
176
+
177
+ if (p != buffer){
178
+ callbackUartRX (buffer, p-buffer);
179
+ }
180
+ } while (p == eob); // we filled the buffer so there may be more to read
181
+ }
165
182
}
0 commit comments