diff --git a/Demos/communication/Lin/LinMasterDemo.cpp b/Demos/communication/Lin/LinMasterDemo.cpp index eef858e12..46784a019 100644 --- a/Demos/communication/Lin/LinMasterDemo.cpp +++ b/Demos/communication/Lin/LinMasterDemo.cpp @@ -104,14 +104,6 @@ class LinMaster : public ApplicationBase { const auto linId{static_cast(linFrame.id)}; - if (_linController->Status() != LinControllerStatus::Operational) - { - std::stringstream ss; - ss << "LIN Frame with ID=" << linId << " not sent, since the controller is not operational"; - GetLogger()->Warn(ss.str()); - return; - } - _linController->SendFrame(linFrame, responseType); std::stringstream ss; diff --git a/SilKit/IntegrationTests/ITest_NetSimLin.cpp b/SilKit/IntegrationTests/ITest_NetSimLin.cpp index d0fa28d65..3a5f4f3dc 100644 --- a/SilKit/IntegrationTests/ITest_NetSimLin.cpp +++ b/SilKit/IntegrationTests/ITest_NetSimLin.cpp @@ -557,8 +557,8 @@ TEST_F(ITest_NetSimLin, networksimulation_lin_dynamic) { SendLinFrames(now, linController, callCounts.silKitSentMsgLin.SentFramesTrivial); SendLinFrameHeaders(now, linController, callCounts.silKitSentMsgLin.SentFrameHeadersTrivial); - WakeupOnce(now, linController); GoToSleepOnce(now, linController); + WakeupOnce(now, linController); } }, _stepSize); diff --git a/SilKit/source/services/lin/LinController.cpp b/SilKit/source/services/lin/LinController.cpp index 67c980962..a24625613 100644 --- a/SilKit/source/services/lin/LinController.cpp +++ b/SilKit/source/services/lin/LinController.cpp @@ -220,6 +220,12 @@ void LinController::WarnOnReceptionWhileInactive() const _logger->Warn(errorMsg); } +void LinController::WarnOnReceptionWhileSleeping() const +{ + std::string warnMsg = fmt::format("Sleeping LinController received a transmission. This transmission is ignored!"); + _logger->Warn(warnMsg); +} + void LinController::WarnOnUnneededStatusChange(LinControllerStatus status) const { std::string errorMsg = @@ -756,6 +762,12 @@ void LinController::ReceiveMsg(const IServiceEndpoint* from, const LinTransmissi return; } + if(_controllerStatus == LinControllerStatus::Sleep || _controllerStatus == LinControllerStatus::Unknown) + { + WarnOnReceptionWhileSleeping(); + return; + } + const auto& frame = msg.frame; bool isGoToSleepFrame = frame.id == GoToSleepFrame().id && frame.data == GoToSleepFrame().data; diff --git a/SilKit/source/services/lin/LinController.hpp b/SilKit/source/services/lin/LinController.hpp index 5313c2534..e9cd28d6a 100644 --- a/SilKit/source/services/lin/LinController.hpp +++ b/SilKit/source/services/lin/LinController.hpp @@ -187,6 +187,7 @@ class LinController void WarnOnReceptionWithInvalidLinId(LinId invalidLinId, const std::string& fromParticipantName, const std::string& fromServiceName) const; void WarnOnReceptionWhileInactive() const; + void WarnOnReceptionWhileSleeping() const; void WarnOnUnneededStatusChange(LinControllerStatus status) const; void WarnOnInvalidLinId(LinId invalidLinId, const std::string& callingMethodName) const; void WarnOnUnusedResponseMode(const std::string& callingMethodName) const; diff --git a/SilKit/source/services/lin/SimBehaviorTrivial.cpp b/SilKit/source/services/lin/SimBehaviorTrivial.cpp index ac31fc09e..89c14e49f 100644 --- a/SilKit/source/services/lin/SimBehaviorTrivial.cpp +++ b/SilKit/source/services/lin/SimBehaviorTrivial.cpp @@ -5,6 +5,7 @@ #include "LinController.hpp" #include "SimBehaviorTrivial.hpp" #include "Assert.hpp" +#include "LoggerMessage.hpp" namespace SilKit { namespace Services { @@ -88,11 +89,25 @@ void SimBehaviorTrivial::SendMsgImpl(MsgT&& msg) void SimBehaviorTrivial::SendMsg(LinSendFrameRequest&& msg) { + auto controllerStatus = _parentController->Status(); + if(controllerStatus == LinControllerStatus::Sleep || controllerStatus == LinControllerStatus::Unknown) + { + Logging::Warn(_participant->GetLogger(), + "LinController not operational. SendFrameRequest will not be sent!"); + return; + } _parentController->SendFrameHeader(msg.frame.id); } void SimBehaviorTrivial::SendMsg(LinTransmission&& msg) { + auto controllerStatus = _parentController->Status(); + if(controllerStatus == LinControllerStatus::Sleep || controllerStatus == LinControllerStatus::Unknown) + { + Logging::Warn(_participant->GetLogger(), + "LinController not operational. LinTransmission will not be sent!"); + return; + } SendMsgImpl(msg); } diff --git a/docs/changelog/versions/latest.md b/docs/changelog/versions/latest.md index f89fb7b5c..d21c92516 100644 --- a/docs/changelog/versions/latest.md +++ b/docs/changelog/versions/latest.md @@ -1,3 +1,5 @@ # [5.0.4] - UNRELEASED -> This changelog entry is still empty. \ No newline at end of file +## Fixed + +- `Lin controller`: fixed tx/rx behaviour when controller is not operational