diff --git a/firmware/console/binary/tooth_logger.cpp b/firmware/console/binary/tooth_logger.cpp index 3608841cc6..7c57a77db3 100644 --- a/firmware/console/binary/tooth_logger.cpp +++ b/firmware/console/binary/tooth_logger.cpp @@ -127,9 +127,9 @@ void DisableToothLogger() { setToothLogReady(false); } -CompositeBuffer* GetToothLoggerBuffer() { +static CompositeBuffer* GetToothLoggerBufferImpl(sysinterval_t timeout) { CompositeBuffer* buffer; - msg_t msg = filledBuffers.fetch(&buffer, TIME_INFINITE); + msg_t msg = filledBuffers.fetch(&buffer, timeout); if (msg == MSG_TIMEOUT) { setToothLogReady(false); @@ -144,6 +144,14 @@ CompositeBuffer* GetToothLoggerBuffer() { return buffer; } +CompositeBuffer* GetToothLoggerBufferNonblocking() { + return GetToothLoggerBufferImpl(TIME_IMMEDIATE); +} + +CompositeBuffer* GetToothLoggerBufferBlocking() { + return GetToothLoggerBufferImpl(TIME_INFINITE); +} + void ReturnToothLoggerBuffer(CompositeBuffer* buffer) { chibios_rt::CriticalSectionLocker csl; diff --git a/firmware/console/binary/tooth_logger.h b/firmware/console/binary/tooth_logger.h index 1a70210c7e..746fa92e33 100644 --- a/firmware/console/binary/tooth_logger.h +++ b/firmware/console/binary/tooth_logger.h @@ -55,7 +55,10 @@ struct CompositeBuffer { // Get a reference to the buffer // Returns nullptr if no buffer is available -CompositeBuffer* GetToothLoggerBuffer(); +CompositeBuffer* GetToothLoggerBufferNonblocking(); +// Blocks until a buffer is available +CompositeBuffer* GetToothLoggerBufferBlocking(); + // Return a buffer to the pool once its contents have been read void ReturnToothLoggerBuffer(CompositeBuffer*); diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index 28c06dbf7e..b9e17b3104 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -749,7 +749,7 @@ int TunerStudio::handleCrcCommand(TsChannelBase* tsChannel, char *data, int inco break; case TS_COMPOSITE_READ: { - auto toothBuffer = GetToothLoggerBuffer(); + auto toothBuffer = GetToothLoggerBufferNonblocking(); if (toothBuffer) { tsChannel->sendResponse(TS_CRC, reinterpret_cast(toothBuffer->buffer), toothBuffer->nextIdx * sizeof(composite_logger_s), true); @@ -793,7 +793,7 @@ int TunerStudio::handleCrcCommand(TsChannelBase* tsChannel, char *data, int inco { EnableToothLoggerIfNotEnabled(); - auto toothBuffer = GetToothLoggerBuffer(); + auto toothBuffer = GetToothLoggerBufferNonblocking(); if (toothBuffer) { tsChannel->sendResponse(TS_CRC, reinterpret_cast(toothBuffer->buffer), toothBuffer->nextIdx * sizeof(composite_logger_s), true); diff --git a/firmware/hw_layer/mmc_card.cpp b/firmware/hw_layer/mmc_card.cpp index 9b8b1a9f9a..699b7d643c 100644 --- a/firmware/hw_layer/mmc_card.cpp +++ b/firmware/hw_layer/mmc_card.cpp @@ -579,7 +579,7 @@ static void sdTriggerLogger() { EnableToothLogger(); while (true) { - auto buffer = GetToothLoggerBuffer(); + auto buffer = GetToothLoggerBufferBlocking(); logBuffer.write(reinterpret_cast(buffer->buffer), buffer->nextIdx * sizeof(composite_logger_s));