Bugfix: arm failsafe was reporting wrong status

This commit is contained in:
ivmarkov 2023-04-25 19:47:48 +00:00
parent d12e1cfa13
commit 40a476e0d9

View file

@ -22,7 +22,6 @@ use crate::data_model::objects::*;
use crate::data_model::sdm::failsafe::FailSafe; use crate::data_model::sdm::failsafe::FailSafe;
use crate::interaction_model::core::Transaction; use crate::interaction_model::core::Transaction;
use crate::tlv::{FromTLV, TLVElement, TLVWriter, TagType, ToTLV, UtfStr}; use crate::tlv::{FromTLV, TLVElement, TLVWriter, TagType, ToTLV, UtfStr};
use crate::transport::session::Session;
use crate::utils::rand::Rand; use crate::utils::rand::Rand;
use crate::{attribute_enum, cmd_enter}; use crate::{attribute_enum, cmd_enter};
use crate::{command_enum, error::*}; use crate::{command_enum, error::*};
@ -173,18 +172,18 @@ impl GenCommCluster {
pub fn invoke( pub fn invoke(
&mut self, &mut self,
session: &mut Session, transaction: &mut Transaction,
cmd: &CmdDetails, cmd: &CmdDetails,
data: &TLVElement, data: &TLVElement,
encoder: CmdDataEncoder, encoder: CmdDataEncoder,
) -> Result<(), Error> { ) -> Result<(), Error> {
match cmd.cmd_id.try_into()? { match cmd.cmd_id.try_into()? {
Commands::ArmFailsafe => self.handle_command_armfailsafe(session, data, encoder)?, Commands::ArmFailsafe => self.handle_command_armfailsafe(transaction, data, encoder)?,
Commands::SetRegulatoryConfig => { Commands::SetRegulatoryConfig => {
self.handle_command_setregulatoryconfig(data, encoder)? self.handle_command_setregulatoryconfig(transaction, data, encoder)?
} }
Commands::CommissioningComplete => { Commands::CommissioningComplete => {
self.handle_command_commissioningcomplete(session, encoder)?; self.handle_command_commissioningcomplete(transaction, encoder)?;
} }
} }
@ -195,7 +194,7 @@ impl GenCommCluster {
fn handle_command_armfailsafe( fn handle_command_armfailsafe(
&mut self, &mut self,
session: &Session, transaction: &mut Transaction,
data: &TLVElement, data: &TLVElement,
encoder: CmdDataEncoder, encoder: CmdDataEncoder,
) -> Result<(), Error> { ) -> Result<(), Error> {
@ -203,23 +202,33 @@ impl GenCommCluster {
let p = FailSafeParams::from_tlv(data)?; let p = FailSafeParams::from_tlv(data)?;
self.failsafe let status = if self
.failsafe
.borrow_mut() .borrow_mut()
.arm(p.expiry_len, session.get_session_mode()) .arm(p.expiry_len, transaction.session().get_session_mode())
.map_err(|e| e.remap(|_| true, Error::Busy))?; .is_err()
{
CommissioningError::ErrBusyWithOtherAdmin as u8
} else {
CommissioningError::Ok as u8
};
let cmd_data = CommonResponse { let cmd_data = CommonResponse {
error_code: CommissioningError::ErrBusyWithOtherAdmin as u8, error_code: status,
debug_txt: UtfStr::new(b""), debug_txt: UtfStr::new(b""),
}; };
encoder encoder
.with_command(RespCommands::ArmFailsafeResp as _)? .with_command(RespCommands::ArmFailsafeResp as _)?
.set(cmd_data) .set(cmd_data)?;
transaction.complete();
Ok(())
} }
fn handle_command_setregulatoryconfig( fn handle_command_setregulatoryconfig(
&mut self, &mut self,
transaction: &mut Transaction,
data: &TLVElement, data: &TLVElement,
encoder: CmdDataEncoder, encoder: CmdDataEncoder,
) -> Result<(), Error> { ) -> Result<(), Error> {
@ -238,19 +247,22 @@ impl GenCommCluster {
encoder encoder
.with_command(RespCommands::SetRegulatoryConfigResp as _)? .with_command(RespCommands::SetRegulatoryConfigResp as _)?
.set(cmd_data) .set(cmd_data)?;
transaction.complete();
Ok(())
} }
fn handle_command_commissioningcomplete( fn handle_command_commissioningcomplete(
&mut self, &mut self,
session: &Session, transaction: &mut Transaction,
encoder: CmdDataEncoder, encoder: CmdDataEncoder,
) -> Result<(), Error> { ) -> Result<(), Error> {
cmd_enter!("Commissioning Complete"); cmd_enter!("Commissioning Complete");
let mut status: u8 = CommissioningError::Ok as u8; let mut status: u8 = CommissioningError::Ok as u8;
// Has to be a Case Session // Has to be a Case Session
if session.get_local_fabric_idx().is_none() { if transaction.session().get_local_fabric_idx().is_none() {
status = CommissioningError::ErrInvalidAuth as u8; status = CommissioningError::ErrInvalidAuth as u8;
} }
@ -259,7 +271,7 @@ impl GenCommCluster {
if self if self
.failsafe .failsafe
.borrow_mut() .borrow_mut()
.disarm(session.get_session_mode()) .disarm(transaction.session().get_session_mode())
.is_err() .is_err()
{ {
status = CommissioningError::ErrInvalidAuth as u8; status = CommissioningError::ErrInvalidAuth as u8;
@ -272,7 +284,10 @@ impl GenCommCluster {
encoder encoder
.with_command(RespCommands::CommissioningCompleteResp as _)? .with_command(RespCommands::CommissioningCompleteResp as _)?
.set(cmd_data) .set(cmd_data)?;
transaction.complete();
Ok(())
} }
} }
@ -288,7 +303,7 @@ impl Handler for GenCommCluster {
data: &TLVElement, data: &TLVElement,
encoder: CmdDataEncoder, encoder: CmdDataEncoder,
) -> Result<(), Error> { ) -> Result<(), Error> {
GenCommCluster::invoke(self, transaction.session_mut(), cmd, data, encoder) GenCommCluster::invoke(self, transaction, cmd, data, encoder)
} }
} }