Skip to content

Commit 9544f6d

Browse files
authored
Merge pull request #8 from bcmi-labs/bugfixes_bridge_included_and_not_started
Fix crash when Arduino_RouterBridge is included but begin() not called
2 parents 2232f88 + e1055d2 commit 9544f6d

File tree

5 files changed

+242
-51
lines changed

5 files changed

+242
-51
lines changed

library.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"url": "https://github.com/bcmi-labs/Arduino_RouterBridge",
1212
"maintainer": true
1313
},
14-
"version": "0.1.2",
14+
"version": "0.1.3",
1515
"license": "MPL2.0",
1616
"frameworks": "arduino",
1717
"platforms": "*",

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=Arduino_RouterBridge
2-
version=0.1.2
2+
version=0.1.3
33
author=BCMI-labs
44
maintainer=BCMI-labs
55
sentence=A RPC bridge for Arduino UNO Q boards

src/bridge.h

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,31 @@ class BridgeClass {
3333
RPCClient* client = nullptr;
3434
RPCServer* server = nullptr;
3535
HardwareSerial* serial_ptr = nullptr;
36-
ITransport* transport;
36+
ITransport* transport = nullptr;
3737

38-
struct k_mutex read_mutex;
39-
struct k_mutex write_mutex;
40-
41-
k_tid_t upd_tid;
42-
k_thread_stack_t *upd_stack_area;
43-
struct k_thread upd_thread_data;
38+
struct k_mutex read_mutex{};
39+
struct k_mutex write_mutex{};
40+
41+
k_tid_t upd_tid{};
42+
k_thread_stack_t *upd_stack_area{};
43+
struct k_thread upd_thread_data{};
44+
45+
bool started = false;
4446

4547
public:
4648

47-
BridgeClass(HardwareSerial& serial) {
49+
explicit BridgeClass(HardwareSerial& serial) {
4850
serial_ptr = &serial;
49-
transport = new SerialTransport(serial);
51+
}
52+
53+
operator bool() const {
54+
return started;
5055
}
5156

5257
// Initialize the bridge
5358
bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD) {
5459
serial_ptr->begin(baud);
60+
transport = new SerialTransport(*serial_ptr);
5561

5662
k_mutex_init(&read_mutex);
5763
k_mutex_init(&write_mutex);
@@ -67,7 +73,11 @@ class BridgeClass {
6773
UPDATE_THREAD_PRIORITY, 0, K_NO_WAIT);
6874

6975
bool res;
70-
return call(RESET_METHOD, res);
76+
call(RESET_METHOD, res);
77+
if (res) {
78+
started = true;
79+
}
80+
return res;
7181
}
7282

7383
template<typename F>
@@ -123,7 +133,7 @@ class BridgeClass {
123133
}
124134

125135
template<typename RType, typename... Args>
126-
bool call(const MsgPack::str_t method, RType& result, Args&&... args) {
136+
bool call(const MsgPack::str_t& method, RType& result, Args&&... args) {
127137

128138
uint32_t msg_id_wait;
129139

@@ -165,11 +175,15 @@ class BridgeClass {
165175
}
166176

167177
String get_error_message() const {
168-
return (String) client->lastError.traceback;
178+
return static_cast<String>(client->lastError.traceback);
169179
}
170180

171181
uint8_t get_error_code() const {
172-
return (uint8_t) client->lastError.code;
182+
return static_cast<uint8_t>(client->lastError.code);
183+
}
184+
185+
RpcError& get_last_client_error() const {
186+
return client->lastError;
173187
}
174188

175189
private:
@@ -212,8 +226,10 @@ class BridgeClass {
212226

213227
class BridgeClassUpdater {
214228
public:
215-
static void safeUpdate(BridgeClass& bridge) {
216-
bridge.update_safe(); // access private method
229+
static void safeUpdate(BridgeClass* bridge) {
230+
if (*bridge) {
231+
bridge->update_safe();
232+
}
217233
}
218234

219235
private:
@@ -222,18 +238,20 @@ class BridgeClassUpdater {
222238

223239
BridgeClass Bridge(Serial1);
224240

225-
void updateEntryPoint(void *, void *, void *){
226-
while(1){
227-
Bridge.update();
241+
inline void updateEntryPoint(void *, void *, void *){
242+
while (true) {
243+
if (Bridge) {
244+
Bridge.update();
245+
}
228246
k_msleep(1);
229247
}
230248
}
231249

232250
static void safeUpdate(){
233-
BridgeClassUpdater::safeUpdate(Bridge);
251+
BridgeClassUpdater::safeUpdate(&Bridge);
234252
}
235253

236-
void __loopHook(){
254+
inline void __loopHook(){
237255
k_msleep(1);
238256
safeUpdate();
239257
}

src/monitor.h

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,27 @@
2727
template<size_t BufferSize=DEFAULT_MONITOR_BUF_SIZE>
2828
class BridgeMonitor: public Stream {
2929

30-
private:
31-
BridgeClass& bridge;
30+
BridgeClass* bridge;
3231
RingBufferN<BufferSize> temp_buffer;
33-
struct k_mutex monitor_mutex;
32+
struct k_mutex monitor_mutex{};
3433
bool is_connected = false;
3534

3635
public:
37-
BridgeMonitor(BridgeClass& bridge): bridge(bridge) {}
36+
explicit BridgeMonitor(BridgeClass& bridge): bridge(&bridge) {}
37+
38+
using Print::write;
3839

3940
bool begin() {
40-
return bridge.call(MON_CONNECTED_METHOD, is_connected);
4141
k_mutex_init(&monitor_mutex);
42+
43+
bool bridge_started = (*bridge);
44+
if (!bridge_started) {
45+
bridge_started = bridge->begin();
46+
}
47+
return bridge_started && bridge->call(MON_CONNECTED_METHOD, is_connected);
4248
}
4349

44-
bool isConnected() const {
50+
explicit operator bool() const {
4551
return is_connected;
4652
}
4753

@@ -73,9 +79,11 @@ class BridgeMonitor: public Stream {
7379
int peek() override {
7480
k_mutex_lock(&monitor_mutex, K_FOREVER);
7581
if (temp_buffer.available()) {
82+
k_mutex_unlock(&monitor_mutex);
7683
return temp_buffer.peek();
7784
}
7885
k_mutex_unlock(&monitor_mutex);
86+
return -1;
7987
}
8088

8189
size_t write(uint8_t c) override {
@@ -84,18 +92,14 @@ class BridgeMonitor: public Stream {
8492

8593
size_t write(const uint8_t* buffer, size_t size) override {
8694

87-
MsgPack::str_t send_buffer;
95+
String send_buffer;
8896

8997
for (size_t i = 0; i < size; ++i) {
90-
#ifdef ARDUINO
91-
send_buffer += (char)buffer[i];
92-
#else
93-
send_buffer.push_back(static_cast<char>(buffer[i]));
94-
#endif
98+
send_buffer += static_cast<char>(buffer[i]);
9599
}
96100

97101
size_t written;
98-
bool ret = bridge.call(MON_WRITE_METHOD, written, send_buffer);
102+
const bool ret = bridge->call(MON_WRITE_METHOD, written, send_buffer);
99103
if (ret) {
100104
return written;
101105
}
@@ -105,43 +109,34 @@ class BridgeMonitor: public Stream {
105109

106110
bool reset() {
107111
bool res;
108-
bool ok = bridge.call(MON_RESET_METHOD, res);
112+
bool ok = bridge->call(MON_RESET_METHOD, res);
109113
if (ok && res) {
110114
is_connected = false;
111115
}
112116
return (ok && res);
113117
}
114118

115-
size_t write(String message) {
116-
size_t size;
117-
bool ok = bridge.call(MON_WRITE_METHOD, size, message);
118-
119-
if (!ok) return 0;
120-
121-
return size;
122-
}
119+
private:
120+
void _read(size_t size) {
123121

124-
int _read(size_t size) {
122+
if (size == 0) return;
125123

126-
if (size == 0) return 0;
124+
k_mutex_lock(&monitor_mutex, K_FOREVER);
127125

128126
MsgPack::arr_t<uint8_t> message;
129-
bool ret = bridge.call(MON_READ_METHOD, message, size);
127+
bool ret = bridge->call(MON_READ_METHOD, message, size);
130128

131-
k_mutex_lock(&monitor_mutex, K_FOREVER);
132129
if (ret) {
133130
for (size_t i = 0; i < message.size(); ++i) {
134131
temp_buffer.store_char(static_cast<char>(message[i]));
135132
}
136-
return message.size();
137133
}
138134

139135
// if (bridge.lastError.code > NO_ERR) {
140136
// is_connected = false;
141137
// }
142-
k_mutex_unlock(&monitor_mutex);
143-
return 0;
144138

139+
k_mutex_unlock(&monitor_mutex);
145140
}
146141

147142

0 commit comments

Comments
 (0)