Skip to content

Commit 5312b11

Browse files
committed
SerialWrapper: fix some corner cases
1 parent 00f2cdc commit 5312b11

File tree

1 file changed

+3
-14
lines changed

1 file changed

+3
-14
lines changed

SerialDispatcher.h

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ struct _sinkBuffers {
1212
rtos::Semaphore* sem;
1313
RingBuffer rxBuffer;
1414
RingBuffer txBuffer;
15-
uint32_t lastTimestamp;
1615
};
1716

1817
#define READ_READY_UNBLOCK (1 << 1)
@@ -65,15 +64,13 @@ class SerialClassDispatcher : public HardwareSerial {
6564

6665
size_t write(uint8_t data) {
6766
findSemaphore(rtos::ThisThread::get_id())->acquire();
68-
*findLastTimestamp(rtos::ThisThread::get_id()) = millis();
6967
findThreadTxBuffer(rtos::ThisThread::get_id()).store_char(data);
7068
findSemaphore(rtos::ThisThread::get_id())->release();
7169
unlock_print.set(READ_READY_UNBLOCK);
7270
}
7371

7472
size_t write(const uint8_t* data, size_t len) {
7573
findSemaphore(rtos::ThisThread::get_id())->acquire();
76-
*findLastTimestamp(rtos::ThisThread::get_id()) = millis();
7774
for (int i=0; i<len; i++) {
7875
findThreadTxBuffer(rtos::ThisThread::get_id()).store_char(data[i]);
7976
}
@@ -124,13 +121,13 @@ class SerialClassDispatcher : public HardwareSerial {
124121
while (1) {
125122
unlock_print.wait_any(READ_READY_UNBLOCK, osWaitForever, true);
126123
for (int i = 0; i < users; i++) {
124+
sinkBuffers[i].sem->acquire();
127125
// Implementation "leak", should be changed at RingBuffer API level
128126
int c = sinkBuffers[i].txBuffer._iHead == 0 ?
129127
sinkBuffers[i].txBuffer._aucBuffer[sizeof(sinkBuffers[i].txBuffer._aucBuffer) -1] :
130128
sinkBuffers[i].txBuffer._aucBuffer[sinkBuffers[i].txBuffer._iHead - 1];
131129
if ((!sinkBuffers[i].raw && (c == '\n' /*|| c == '\r' */|| c == '\0')) ||
132-
(sinkBuffers[i].raw && (millis() - sinkBuffers[i].lastTimestamp > 10))) {
133-
sinkBuffers[i].sem->acquire();
130+
sinkBuffers[i].raw || !sinkBuffers[i].txBuffer.availableForStore()) {
134131
if (sinkBuffers[i].txBuffer.available() && print_tags) {
135132
serial.print("[");
136133
serial.print(i);
@@ -139,8 +136,8 @@ class SerialClassDispatcher : public HardwareSerial {
139136
while (sinkBuffers[i].txBuffer.available()) {
140137
serial.write(sinkBuffers[i].txBuffer.read_char());
141138
}
142-
sinkBuffers[i].sem->release();
143139
}
140+
sinkBuffers[i].sem->release();
144141
}
145142
}
146143
}
@@ -161,14 +158,6 @@ class SerialClassDispatcher : public HardwareSerial {
161158
}
162159
}
163160

164-
uint32_t* findLastTimestamp(osThreadId_t id) {
165-
for (int i = 0; i < 10; i++) {
166-
if (id == sinkBuffers[i].id) {
167-
return &sinkBuffers[i].lastTimestamp;
168-
}
169-
}
170-
}
171-
172161
rtos::Semaphore* findSemaphore(osThreadId_t id) {
173162
for (int i = 0; i < 10; i++) {
174163
if (id == sinkBuffers[i].id) {

0 commit comments

Comments
 (0)