From de384465d7aedf421541bc5cf84a0bca9571ae75 Mon Sep 17 00:00:00 2001 From: Hare Date: Fri, 30 Jun 2023 09:37:37 +0800 Subject: [PATCH] Smoke/CO: Update the handling of DeviceMuted Cannot mute when critical alarms exist --- .../smoke-co-alarm-server.cpp | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp index 2f4909cbd4dbc0..403955d33e41d5 100644 --- a/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp +++ b/src/app/clusters/smoke-co-alarm-server/smoke-co-alarm-server.cpp @@ -151,7 +151,58 @@ bool SmokeCoAlarmServer::SetDeviceMuted(EndpointId endpointId, MuteStateEnum new if (success && (deviceMuted != newDeviceMuted)) { - success = SetAttribute(endpointId, Attributes::DeviceMuted::Id, Attributes::DeviceMuted::Set, newDeviceMuted); + if (newDeviceMuted == MuteStateEnum::kMuted) + { + AlarmStateEnum alarmState; + success = GetAttribute(endpointId, Attributes::SmokeState::Id, Attributes::SmokeState::Get, alarmState); + if (success && (alarmState == AlarmStateEnum::kCritical)) + { + success = false; + } + + if (success) + { + success = GetAttribute(endpointId, Attributes::COState::Id, Attributes::COState::Get, alarmState); + if (success && (alarmState == AlarmStateEnum::kCritical)) + { + success = false; + } + } + + if (success) + { + success = GetAttribute(endpointId, Attributes::BatteryAlert::Id, Attributes::BatteryAlert::Get, alarmState); + if (success && (alarmState == AlarmStateEnum::kCritical)) + { + success = false; + } + } + + if (success) + { + success = GetAttribute(endpointId, Attributes::InterconnectSmokeAlarm::Id, Attributes::InterconnectSmokeAlarm::Get, + alarmState); + if (success && (alarmState == AlarmStateEnum::kCritical)) + { + success = false; + } + } + + if (success) + { + success = + GetAttribute(endpointId, Attributes::InterconnectCOAlarm::Id, Attributes::InterconnectCOAlarm::Get, alarmState); + if (success && (alarmState == AlarmStateEnum::kCritical)) + { + success = false; + } + } + } + + if (success) + { + success = SetAttribute(endpointId, Attributes::DeviceMuted::Id, Attributes::DeviceMuted::Set, newDeviceMuted); + } if (success) {