1919#define FIRST_HANDLE 0x0001
2020#define LAST_HANDLE 0xffff
2121
22+
2223namespace GanglionLib
2324{
2425 extern volatile int exit_code;
@@ -27,8 +28,8 @@ namespace GanglionLib
2728 extern volatile uint16 client_char_handle;
2829 extern char uart_port[1024 ];
2930 extern volatile State state;
30- extern std::mutex m;
3131 extern std::condition_variable cv;
32+ std::mutex mutex;
3233
3334 void output (uint8 len1, uint8 *data1, uint16 len2, uint8 *data2)
3435 {
@@ -41,7 +42,9 @@ namespace GanglionLib
4142 // reads messages and calls required callbacks (copypaste from sample)
4243 int read_message (int timeout_ms)
4344 {
44- unsigned char data[256 ]; // enough for BLE
45+ std::lock_guard<std::mutex> lock (mutex);
46+
47+ unsigned char *data = NULL ;
4548 struct ble_header hdr;
4649 int r;
4750
@@ -57,10 +60,12 @@ namespace GanglionLib
5760 }
5861 if (hdr.lolen )
5962 {
63+ data = new unsigned char [hdr.lolen ];
6064 r = uart_rx (hdr.lolen , data, UART_TIMEOUT);
6165 if (r <= 0 )
6266 {
6367 exit_code = (int )GanglionLib::PORT_OPEN_ERROR;
68+ delete[] data;
6469 return 1 ; // fails to read
6570 }
6671 }
@@ -70,11 +75,12 @@ namespace GanglionLib
7075 if (!msg)
7176 {
7277 exit_code = (int )GanglionLib::GENERAL_ERROR;
78+ delete[] data;
7379 return 1 ;
7480 }
7581
7682 msg->handler (data);
77-
83+ delete[] data;
7884 return 0 ;
7985 }
8086
0 commit comments