diff --git a/TNC/HdlcFrame.cpp b/TNC/HdlcFrame.cpp index 5bfd2f1..a101a7c 100644 --- a/TNC/HdlcFrame.cpp +++ b/TNC/HdlcFrame.cpp @@ -3,6 +3,7 @@ #include "HdlcFrame.hpp" #include "Log.h" +#include "cmsis_os.h" namespace mobilinkd { namespace tnc { namespace hdlc { @@ -25,4 +26,14 @@ IoFrame* acquire() return result; } + +IoFrame* acquire_wait() +{ + IoFrame* result = nullptr; + while ((result = ioFramePool().acquire()) == nullptr) { + osThreadYield(); + } + return result; +} + }}} // mobilinkd::tnc::hdlc diff --git a/TNC/HdlcFrame.hpp b/TNC/HdlcFrame.hpp index aadf5a0..09fc2c7 100644 --- a/TNC/HdlcFrame.hpp +++ b/TNC/HdlcFrame.hpp @@ -205,6 +205,7 @@ IoFramePool& ioFramePool(void); void release(IoFrame* frame); IoFrame* acquire(void); +IoFrame* acquire_wait(void); }}} // mobilinkd::tnc::hdlc diff --git a/TNC/KissHardware.cpp b/TNC/KissHardware.cpp index 330a7bd..7b00d72 100644 --- a/TNC/KissHardware.cpp +++ b/TNC/KissHardware.cpp @@ -235,7 +235,7 @@ void Hardware::handle_request(hdlc::IoFrame* frame) { output_gain = *it << 8; ++it; output_gain += *it; - DEBUG("SET_OUTPUT_VOLUME = %d", output_gain); + DEBUG("SET_OUTPUT_GAIN = %d", output_gain); audio::setAudioOutputLevel(); update_crc(); [[fallthrough]]; diff --git a/TNC/SerialPort.cpp b/TNC/SerialPort.cpp index 6fbd2e8..30848a3 100644 --- a/TNC/SerialPort.cpp +++ b/TNC/SerialPort.cpp @@ -56,7 +56,7 @@ extern "C" void startSerialTask(void const* arg) State state = WAIT_FBEGIN; - hdlc::IoFrame* frame = hdlc::acquire(); + hdlc::IoFrame* frame = hdlc::acquire_wait(); HAL_UART_Receive_IT(&huart3, &rxBuffer, 1); @@ -72,7 +72,7 @@ extern "C" void startSerialTask(void const* arg) hdlc::release(frame); ERROR("UART Error: %08lx", evt.value.v); uart_error.store(HAL_UART_ERROR_NONE); - frame = hdlc::acquire(); + frame = hdlc::acquire_wait(); HAL_UART_Receive_IT(&huart3, &rxBuffer, 1); continue; } @@ -94,8 +94,12 @@ extern "C" void startSerialTask(void const* arg) break; case FEND: frame->source(hdlc::IoFrame::SERIAL_DATA); - osMessagePut(ioEventQueueHandle, reinterpret_cast(frame), osWaitForever); - frame = hdlc::acquire(); + if (osMessagePut(ioEventQueueHandle, reinterpret_cast(frame), osWaitForever) != osOK) + { + hdlc::release(frame); + } + osDelay(10); + frame = hdlc::acquire_wait(); state = WAIT_FBEGIN; break; default: @@ -113,7 +117,7 @@ extern "C" void startSerialTask(void const* arg) if (not frame->push_back(FESC)) { hdlc::release(frame); state = WAIT_FBEGIN; // Drop frame; - frame = hdlc::acquire(); + frame = hdlc::acquire_wait(); } break; case TFEND: @@ -126,7 +130,7 @@ extern "C" void startSerialTask(void const* arg) default: hdlc::release(frame); state = WAIT_FBEGIN; // Drop frame; - frame = hdlc::acquire(); + frame = hdlc::acquire_wait(); } break; }