Skip to content

Commit 4a2b70e

Browse files
committed
Fix crash when Arduino_RouterBridge is included but begin() not called
1 parent 2232f88 commit 4a2b70e

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

src/bridge.h

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,24 @@ class BridgeClass {
3737

3838
struct k_mutex read_mutex;
3939
struct k_mutex write_mutex;
40-
40+
4141
k_tid_t upd_tid;
4242
k_thread_stack_t *upd_stack_area;
4343
struct k_thread upd_thread_data;
4444

45+
bool started = false;
46+
4547
public:
4648

4749
BridgeClass(HardwareSerial& serial) {
4850
serial_ptr = &serial;
4951
transport = new SerialTransport(serial);
5052
}
5153

54+
operator bool() const {
55+
return started;
56+
}
57+
5258
// Initialize the bridge
5359
bool begin(unsigned long baud=DEFAULT_SERIAL_BAUD) {
5460
serial_ptr->begin(baud);
@@ -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>
@@ -212,8 +222,10 @@ class BridgeClass {
212222

213223
class BridgeClassUpdater {
214224
public:
215-
static void safeUpdate(BridgeClass& bridge) {
216-
bridge.update_safe(); // access private method
225+
static void safeUpdate(BridgeClass* bridge) {
226+
if (*bridge) {
227+
bridge->update_safe();
228+
}
217229
}
218230

219231
private:
@@ -223,14 +235,16 @@ class BridgeClassUpdater {
223235
BridgeClass Bridge(Serial1);
224236

225237
void updateEntryPoint(void *, void *, void *){
226-
while(1){
227-
Bridge.update();
238+
while (1) {
239+
if (Bridge) {
240+
Bridge.update();
241+
}
228242
k_msleep(1);
229243
}
230244
}
231245

232246
static void safeUpdate(){
233-
BridgeClassUpdater::safeUpdate(Bridge);
247+
BridgeClassUpdater::safeUpdate(&Bridge);
234248
}
235249

236250
void __loopHook(){

src/monitor.h

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,23 @@ template<size_t BufferSize=DEFAULT_MONITOR_BUF_SIZE>
2828
class BridgeMonitor: public Stream {
2929

3030
private:
31-
BridgeClass& bridge;
31+
BridgeClass* bridge;
3232
RingBufferN<BufferSize> temp_buffer;
3333
struct k_mutex monitor_mutex;
3434
bool is_connected = false;
3535

3636
public:
37-
BridgeMonitor(BridgeClass& bridge): bridge(bridge) {}
37+
BridgeMonitor(BridgeClass& bridge): bridge(&bridge) {}
3838

3939
bool begin() {
40-
return bridge.call(MON_CONNECTED_METHOD, is_connected);
4140
k_mutex_init(&monitor_mutex);
41+
if (!bridge) {
42+
bridge->begin();
43+
}
44+
return bridge->call(MON_CONNECTED_METHOD, is_connected);
4245
}
4346

44-
bool isConnected() const {
47+
operator bool() const {
4548
return is_connected;
4649
}
4750

@@ -73,6 +76,7 @@ class BridgeMonitor: public Stream {
7376
int peek() override {
7477
k_mutex_lock(&monitor_mutex, K_FOREVER);
7578
if (temp_buffer.available()) {
79+
k_mutex_unlock(&monitor_mutex);
7680
return temp_buffer.peek();
7781
}
7882
k_mutex_unlock(&monitor_mutex);
@@ -95,7 +99,7 @@ class BridgeMonitor: public Stream {
9599
}
96100

97101
size_t written;
98-
bool ret = bridge.call(MON_WRITE_METHOD, written, send_buffer);
102+
bool ret = bridge->call(MON_WRITE_METHOD, written, send_buffer);
99103
if (ret) {
100104
return written;
101105
}
@@ -105,7 +109,7 @@ 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
}
@@ -114,7 +118,7 @@ class BridgeMonitor: public Stream {
114118

115119
size_t write(String message) {
116120
size_t size;
117-
bool ok = bridge.call(MON_WRITE_METHOD, size, message);
121+
bool ok = bridge->call(MON_WRITE_METHOD, size, message);
118122

119123
if (!ok) return 0;
120124

@@ -126,7 +130,7 @@ class BridgeMonitor: public Stream {
126130
if (size == 0) return 0;
127131

128132
MsgPack::arr_t<uint8_t> message;
129-
bool ret = bridge.call(MON_READ_METHOD, message, size);
133+
bool ret = bridge->call(MON_READ_METHOD, message, size);
130134

131135
k_mutex_lock(&monitor_mutex, K_FOREVER);
132136
if (ret) {

0 commit comments

Comments
 (0)