From f8a3e51db6dd90176f694ce7dd4a0e597d3b41f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damian=20Kr=C3=B3lik?= <66667989+Damian-Nordic@users.noreply.github.com> Date: Wed, 22 Jan 2025 22:48:53 +0100 Subject: [PATCH] [diag] go back to sleep after transmission (#11181) When "diag radio sleep" is followed by "diag send" or "diag repeat", the radio switches to and stays in the receive mode after a transmission. Normally, the MAC layer is responsible for putting the radio back to sleep but the MAC layer is bypassed when using the diag commands. Make sure that the radio goes back to sleep after a transmission when the sleep mode is on. This helps command like "diag repeat" work more reliably as the transmission is less likely to be interferred with the accidental frame reception. Signed-off-by: Damian Krolik --- src/core/diags/factory_diags.cpp | 13 ++++++++++++- src/core/diags/factory_diags.hpp | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/diags/factory_diags.cpp b/src/core/diags/factory_diags.cpp index e315e65fb..cb5dd774c 100644 --- a/src/core/diags/factory_diags.cpp +++ b/src/core/diags/factory_diags.cpp @@ -343,8 +343,12 @@ Error Diags::ProcessChannel(uint8_t aArgsLength, char *aArgs[]) VerifyOrExit(IsChannelValid(channel), error = kErrorInvalidArgs); mChannel = channel; - IgnoreError(Get().Receive(mChannel)); otPlatDiagChannelSet(mChannel); + + if (!mIsSleepOn) + { + IgnoreError(Get().Receive(mChannel)); + } } exit: @@ -620,6 +624,7 @@ Error Diags::RadioReceive(void) SuccessOrExit(error = Get().SetTransmitPower(mTxPower)); otPlatDiagChannelSet(mChannel); otPlatDiagTxPowerSet(mTxPower); + mIsSleepOn = false; exit: return error; @@ -634,6 +639,7 @@ Error Diags::ProcessRadio(uint8_t aArgsLength, char *aArgs[]) if (StringMatch(aArgs[0], "sleep")) { SuccessOrExit(error = Get().Sleep()); + mIsSleepOn = true; } else if (StringMatch(aArgs[0], "receive")) { @@ -861,6 +867,11 @@ void Diags::TransmitDone(Error aError) VerifyOrExit(mDiagSendOn); mDiagSendOn = false; + if (mIsSleepOn) + { + IgnoreError(Get().Sleep()); + } + switch (aError) { case kErrorNone: diff --git a/src/core/diags/factory_diags.hpp b/src/core/diags/factory_diags.hpp index 51dc03335..3ff02f61b 100644 --- a/src/core/diags/factory_diags.hpp +++ b/src/core/diags/factory_diags.hpp @@ -259,6 +259,7 @@ private: bool mIsAsyncSend : 1; bool mRepeatActive : 1; bool mDiagSendOn : 1; + bool mIsSleepOn : 1; #endif ReceiveConfig mReceiveConfig;