Skip to content

Commit 4026d98

Browse files
committed
flow debugger to message non blocking
1 parent e458438 commit 4026d98

File tree

6 files changed

+129
-25
lines changed

6 files changed

+129
-25
lines changed
-39 Bytes
Binary file not shown.

src/eez/flow/debugger.cpp

+118-23
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include <inttypes.h>
2323

2424
#include <eez/debug.h>
25+
#include <eez/system.h>
26+
#include <eez/tasks.h>
2527

2628
#include <eez/flow/flow.h>
2729
#include <eez/flow/private.h>
@@ -89,16 +91,61 @@ static unsigned g_inputFromDebuggerPosition;
8991

9092
static void processDebuggerInput(char *buffer, uint32_t length);
9193

94+
////////////////////////////////////////////////////////////////////////////////
95+
96+
char *g_toDebuggerMessage = (char *)FLOW_TO_DEBUGGER_MESSAGE_BUFFER;
97+
uint32_t g_toDebuggerMessagePosition = 0;
98+
99+
void startToDebuggerMessage() {
100+
}
101+
102+
void flushToDebuggerMessageBuffer() {
103+
if (g_toDebuggerMessagePosition != 0) {
104+
sendMessageToLowPriorityThread(FLOW_FLUSH_TO_DEBUGGER_MESSAGE);
105+
106+
while (g_toDebuggerMessagePosition != 0 && g_debuggerIsConnected) {
107+
osDelay(1);
108+
WATCHDOG_RESET(WATCHDOG_GUI_THREAD);
109+
}
110+
}
111+
}
112+
113+
void flushToDebuggerMessage() {
114+
eez::mcu::ethernet::writeDebuggerBuffer(g_toDebuggerMessage, g_toDebuggerMessagePosition);
115+
g_toDebuggerMessagePosition = 0;
116+
}
117+
118+
void writeDebuggerBuffer(const char *buffer, uint32_t length) {
119+
if (g_toDebuggerMessagePosition + length > FLOW_TO_DEBUGGER_MESSAGE_BUFFER_SIZE) {
120+
flushToDebuggerMessageBuffer();
121+
}
122+
123+
memcpy(g_toDebuggerMessage + g_toDebuggerMessagePosition, buffer, length);
124+
g_toDebuggerMessagePosition += length;
125+
}
126+
127+
void finishToDebuggerMessage() {
128+
flushToDebuggerMessageBuffer();
129+
}
130+
131+
////////////////////////////////////////////////////////////////////////////////
132+
92133
static void setDebuggerState(DebuggerState newState) {
93134
if (newState != g_debuggerState) {
94135
g_debuggerState = newState;
95136

96-
char buffer[100];
97-
snprintf(buffer, sizeof(buffer), "%d\t%d\n",
98-
MESSAGE_TO_DEBUGGER_STATE_CHANGED,
99-
g_debuggerState
100-
);
101-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
137+
if (g_debuggerIsConnected) {
138+
startToDebuggerMessage();
139+
140+
char buffer[100];
141+
snprintf(buffer, sizeof(buffer), "%d\t%d\n",
142+
MESSAGE_TO_DEBUGGER_STATE_CHANGED,
143+
g_debuggerState
144+
);
145+
writeDebuggerBuffer(buffer, strlen(buffer));
146+
147+
finishToDebuggerMessage();
148+
}
102149
}
103150
}
104151

@@ -220,13 +267,13 @@ int outputBufferPosition = 0;
220267
#define WRITE_TO_OUTPUT_BUFFER(ch) \
221268
outputBuffer[outputBufferPosition++] = ch; \
222269
if (outputBufferPosition == sizeof(outputBuffer)) { \
223-
eez::mcu::ethernet::writeDebuggerBuffer(outputBuffer, outputBufferPosition); \
270+
writeDebuggerBuffer(outputBuffer, outputBufferPosition); \
224271
outputBufferPosition = 0; \
225272
}
226273

227274
#define FLUSH_OUTPUT_BUFFER() \
228275
if (outputBufferPosition > 0) { \
229-
eez::mcu::ethernet::writeDebuggerBuffer(outputBuffer, outputBufferPosition); \
276+
writeDebuggerBuffer(outputBuffer, outputBufferPosition); \
230277
outputBufferPosition = 0; \
231278
}
232279

@@ -362,13 +409,15 @@ void writeValue(const Value &value) {
362409

363410
stringAppendString(tempStr, sizeof(tempStr), "\n");
364411

365-
eez::mcu::ethernet::writeDebuggerBuffer(tempStr, strlen(tempStr));
412+
writeDebuggerBuffer(tempStr, strlen(tempStr));
366413
}
367414

368415
////////////////////////////////////////////////////////////////////////////////
369416

370417
void onStarted(Assets *assets) {
371418
if (g_debuggerIsConnected) {
419+
startToDebuggerMessage();
420+
372421
auto flowDefinition = assets->flowDefinition.ptr(assets);
373422

374423
for (uint32_t i = 0; i < flowDefinition->globalVariables.count; i++) {
@@ -380,15 +429,19 @@ void onStarted(Assets *assets) {
380429
(int)i,
381430
(int)pValue
382431
);
383-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
432+
writeDebuggerBuffer(buffer, strlen(buffer));
384433

385434
writeValue(*pValue);
386435
}
436+
437+
finishToDebuggerMessage();
387438
}
388439
}
389440

390441
void onAddToQueue(FlowState *flowState, int sourceComponentIndex, int sourceOutputIndex, unsigned targetComponentIndex, int targetInputIndex) {
391442
if (g_debuggerIsConnected) {
443+
startToDebuggerMessage();
444+
392445
char buffer[100];
393446
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t%d\t%d\t%d\n",
394447
MESSAGE_TO_DEBUGGER_ADD_TO_QUEUE,
@@ -398,35 +451,47 @@ void onAddToQueue(FlowState *flowState, int sourceComponentIndex, int sourceOutp
398451
targetComponentIndex,
399452
targetInputIndex
400453
);
401-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
454+
writeDebuggerBuffer(buffer, strlen(buffer));
455+
456+
finishToDebuggerMessage();
402457
}
403458
}
404459

405460
void onRemoveFromQueue() {
406461
if (g_debuggerIsConnected) {
462+
startToDebuggerMessage();
463+
407464
char buffer[100];
408465
snprintf(buffer, sizeof(buffer), "%d\n",
409466
MESSAGE_TO_DEBUGGER_REMOVE_FROM_QUEUE
410467
);
411-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
468+
writeDebuggerBuffer(buffer, strlen(buffer));
469+
470+
finishToDebuggerMessage();
412471
}
413472
}
414473

415474
void onValueChanged(const Value *pValue) {
416475
if (g_debuggerIsConnected) {
476+
startToDebuggerMessage();
477+
417478
char buffer[100];
418479
snprintf(buffer, sizeof(buffer), "%d\t%d\t",
419480
MESSAGE_TO_DEBUGGER_VALUE_CHANGED,
420481
(int)pValue
421482
);
422-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
483+
writeDebuggerBuffer(buffer, strlen(buffer));
423484

424485
writeValue(*pValue);
486+
487+
finishToDebuggerMessage();
425488
}
426489
}
427490

428491
void onFlowStateCreated(FlowState *flowState) {
429492
if (g_debuggerIsConnected) {
493+
startToDebuggerMessage();
494+
430495
char buffer[100];
431496
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t%d\t%d\n",
432497
MESSAGE_TO_DEBUGGER_FLOW_STATE_CREATED,
@@ -435,7 +500,7 @@ void onFlowStateCreated(FlowState *flowState) {
435500
(int)(flowState->parentFlowState ? flowState->parentFlowState->flowStateIndex : -1),
436501
flowState->parentComponentIndex
437502
);
438-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
503+
writeDebuggerBuffer(buffer, strlen(buffer));
439504

440505
auto flow = flowState->flow;
441506

@@ -449,7 +514,7 @@ void onFlowStateCreated(FlowState *flowState) {
449514
(int)i,
450515
(int)pValue
451516
);
452-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
517+
writeDebuggerBuffer(buffer, strlen(buffer));
453518

454519
writeValue(*pValue);
455520
}
@@ -466,35 +531,45 @@ void onFlowStateCreated(FlowState *flowState) {
466531
(int)i,
467532
(int)pValue
468533
);
469-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
534+
writeDebuggerBuffer(buffer, strlen(buffer));
470535

471536
writeValue(*pValue);
472537
}
473538
}
539+
540+
finishToDebuggerMessage();
474541
}
475542
}
476543

477544
void onFlowStateDestroyed(FlowState *flowState) {
478545
if (g_debuggerIsConnected) {
546+
startToDebuggerMessage();
547+
479548
char buffer[100];
480549
snprintf(buffer, sizeof(buffer), "%d\t%d\n",
481550
MESSAGE_TO_DEBUGGER_FLOW_STATE_DESTROYED,
482551
(int)flowState->flowStateIndex
483552
);
484-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
553+
writeDebuggerBuffer(buffer, strlen(buffer));
554+
555+
finishToDebuggerMessage();
485556
}
486557
}
487558

488559
void onFlowError(FlowState *flowState, int componentIndex, const char *errorMessage) {
489560
if (g_debuggerIsConnected) {
561+
startToDebuggerMessage();
562+
490563
char buffer[100];
491564
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t",
492565
MESSAGE_TO_DEBUGGER_FLOW_STATE_ERROR,
493566
(int)flowState->flowStateIndex,
494567
componentIndex
495568
);
496-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
569+
writeDebuggerBuffer(buffer, strlen(buffer));
497570
writeString(errorMessage);
571+
572+
finishToDebuggerMessage();
498573
}
499574
}
500575

@@ -534,68 +609,88 @@ void writeLogMessage(const char *str, size_t len) {
534609

535610
void logInfo(FlowState *flowState, unsigned componentIndex, const char *message) {
536611
if (g_debuggerIsConnected) {
612+
startToDebuggerMessage();
613+
537614
char buffer[256];
538615
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t%d\t",
539616
MESSAGE_TO_DEBUGGER_LOG,
540617
LOG_ITEM_TYPE_INFO,
541618
(int)flowState->flowStateIndex,
542619
componentIndex
543620
);
544-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
621+
writeDebuggerBuffer(buffer, strlen(buffer));
545622
writeLogMessage(message);
623+
624+
finishToDebuggerMessage();
546625
}
547626
}
548627

549628
void logScpiCommand(FlowState *flowState, unsigned componentIndex, const char *cmd) {
550629
if (g_debuggerIsConnected) {
630+
startToDebuggerMessage();
631+
551632
char buffer[256];
552633
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t%d\tSCPI COMMAND: ",
553634
MESSAGE_TO_DEBUGGER_LOG,
554635
LOG_ITEM_TYPE_SCPI,
555636
(int)flowState->flowStateIndex,
556637
componentIndex
557638
);
558-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
639+
writeDebuggerBuffer(buffer, strlen(buffer));
559640
writeLogMessage(cmd);
641+
642+
finishToDebuggerMessage();
560643
}
561644
}
562645

563646
void logScpiQuery(FlowState *flowState, unsigned componentIndex, const char *query) {
564647
if (g_debuggerIsConnected) {
648+
startToDebuggerMessage();
649+
565650
char buffer[256];
566651
snprintf(buffer, sizeof(buffer), "%d\t%d\t%d\t%d\tSCPI QUERY: ",
567652
MESSAGE_TO_DEBUGGER_LOG,
568653
LOG_ITEM_TYPE_SCPI,
569654
(int)flowState->flowStateIndex,
570655
componentIndex
571656
);
572-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
657+
writeDebuggerBuffer(buffer, strlen(buffer));
573658
writeLogMessage(query);
659+
660+
finishToDebuggerMessage();
574661
}
575662
}
576663

577664
void logScpiQueryResult(FlowState *flowState, unsigned componentIndex, const char *resultText, size_t resultTextLen) {
578665
if (g_debuggerIsConnected) {
666+
startToDebuggerMessage();
667+
579668
char buffer[256];
580669
snprintf(buffer, sizeof(buffer) - 1, "%d\t%d\t%d\t%d\tSCPI QUERY RESULT: ",
581670
MESSAGE_TO_DEBUGGER_LOG,
582671
LOG_ITEM_TYPE_SCPI,
583672
(int)flowState->flowStateIndex,
584673
componentIndex
585674
);
586-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
675+
writeDebuggerBuffer(buffer, strlen(buffer));
587676
writeLogMessage(resultText, resultTextLen);
677+
678+
finishToDebuggerMessage();
588679
}
589680
}
590681

591682
void onPageChanged(int pageId) {
592683
if (g_debuggerIsConnected) {
684+
startToDebuggerMessage();
685+
593686
char buffer[100];
594687
snprintf(buffer, sizeof(buffer), "%d\t%d\n",
595688
MESSAGE_TO_DEBUGGER_PAGE_CHANGED,
596689
-pageId - 1
597690
);
598-
eez::mcu::ethernet::writeDebuggerBuffer(buffer, strlen(buffer));
691+
writeDebuggerBuffer(buffer, strlen(buffer));
692+
693+
finishToDebuggerMessage();
599694
}
600695
}
601696

src/eez/flow/flow.h

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void onDebuggerClientDisconnected();
4242
void onDebuggerInputAvailable();
4343

4444
void executeScpi();
45+
void flushToDebuggerMessage();
4546

4647
} // flow
4748
} // eez

src/eez/memory.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ static const uint32_t FILE_VIEW_BUFFER_SIZE = 3 * 512 * 1024;
5555
#endif
5656

5757
static uint8_t * const ALLOC_BUFFER = FILE_VIEW_BUFFER + FILE_VIEW_BUFFER_SIZE;
58-
static const uint32_t ALLOC_BUFFER_SIZE = 1024 * 1024;
58+
static const uint32_t ALLOC_BUFFER_SIZE = (1024 - 32) * 1024;
5959

60-
static uint8_t * const SOUND_TUNES_MEMORY = ALLOC_BUFFER + ALLOC_BUFFER_SIZE;
60+
static uint8_t * const FLOW_TO_DEBUGGER_MESSAGE_BUFFER = ALLOC_BUFFER + ALLOC_BUFFER_SIZE;
61+
static const uint32_t FLOW_TO_DEBUGGER_MESSAGE_BUFFER_SIZE = 32 * 1024;
62+
63+
static uint8_t * const SOUND_TUNES_MEMORY = FLOW_TO_DEBUGGER_MESSAGE_BUFFER + FLOW_TO_DEBUGGER_MESSAGE_BUFFER_SIZE;
6164
static const uint32_t SOUND_TUNES_MEMORY_SIZE = 32 * 1024;
6265

6366
static uint8_t * const FILE_MANAGER_MEMORY = SOUND_TUNES_MEMORY + SOUND_TUNES_MEMORY_SIZE;

src/eez/tasks.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,10 @@ void lowPriorityThreadOneIter() {
298298
flow::executeScpi();
299299
}
300300

301+
else if (type == FLOW_FLUSH_TO_DEBUGGER_MESSAGE) {
302+
flow::flushToDebuggerMessage();
303+
}
304+
301305
else {
302306
if (type == THREAD_MESSAGE_SAVE_LIST) {
303307
int err;

src/eez/tasks.h

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ enum LowPriorityThreadMessage {
8888
MP_LAST_MESSAGE_TYPE,
8989

9090
FLOW_EXECUTE_SCPI,
91+
FLOW_FLUSH_TO_DEBUGGER_MESSAGE,
9192

9293
THREAD_MESSAGE_SAVE_LIST,
9394
THREAD_MESSAGE_SD_DETECT_IRQ,

0 commit comments

Comments
 (0)