2424#include  "attribute_store_defined_attribute_types.h" 
2525#include  "ZW_classcmd.h" 
2626#include  "zpc_attribute_resolver.h" 
27+ #include  "zwave_command_classes_utils.h" 
2728
2829// Includes from other Unify Components 
2930#include  "dotdot_mqtt.h" 
3435#include  "attribute_timeouts.h" 
3536#include  "sl_log.h" 
3637
38+ #define  LOG_TAG  "zwave_command_class_switch_color"
39+ 
40+ [[maybe_unused ]]
41+ static  void  set_desired_duration (attribute_store_node_t  state_node ,
42+                                  uint32_t  duration )
43+ {
44+   attribute_store_node_t  duration_node 
45+     =  attribute_store_get_first_child_by_type (
46+       state_node ,
47+       ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
48+ 
49+   attribute_store_set_node_attribute_value (duration_node ,
50+                                            DESIRED_ATTRIBUTE ,
51+                                            (uint8_t  * )& duration ,
52+                                            sizeof (duration ));
53+ }
54+ 
55+ static  void  set_reported_duration (attribute_store_node_t  state_node ,
56+                                   uint32_t  duration )
57+ {
58+   attribute_store_node_t  duration_node 
59+     =  attribute_store_get_first_child_by_type (
60+       state_node ,
61+       ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
62+ 
63+   attribute_store_set_node_attribute_value (duration_node ,
64+                                            REPORTED_ATTRIBUTE ,
65+                                            (uint8_t  * )& duration ,
66+                                            sizeof (duration ));
67+ }
68+ 
69+ [[maybe_unused ]]
3770static  void 
3871  set_all_color_switch_durations (attribute_store_node_t  state_node ,
3972                                 attribute_store_node_value_state_t  value_state ,
@@ -64,6 +97,34 @@ static void
6497  }
6598}
6699
100+ static  void  switch_color_undefine_reported (attribute_store_node_t  state_node )
101+ {
102+   zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
103+     state_node ,
104+     ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
105+     attribute_stop_transition );
106+ 
107+   attribute_store_node_t  duration_node 
108+       =  attribute_store_get_first_child_by_type (
109+         state_node ,
110+         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
111+   color_component_id_duration_t  duration  =  0 ;
112+   attribute_store_undefine_desired (duration_node );
113+   attribute_store_set_reported (duration_node ,
114+                                & duration ,
115+                                sizeof (duration ));
116+ 
117+   sl_log_debug (LOG_TAG , "Transition time expired, probe color" );
118+   zwave_command_class_switch_color_invoke_on_all_attributes (
119+     state_node ,
120+     ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
121+     attribute_store_undefine_desired );
122+   zwave_command_class_switch_color_invoke_on_all_attributes (
123+     state_node ,
124+     ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
125+     attribute_store_undefine_reported );
126+ }
127+ 
67128// FIXME: UIC-1901 This function belongs to zwave_command_class_switch_color.rs, but this 
68129// component really cannot interact with the attribute resolver. 
69130static  void 
@@ -78,12 +139,22 @@ static void
78139    return ;
79140  }
80141
142+   attribute_store_node_t  duration_node 
143+       =  attribute_store_get_first_child_by_type (
144+         state_node ,
145+         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
146+ 
147+   color_component_id_duration_t  duration  =  0 ;
148+   attribute_store_get_desired (duration_node ,
149+                               & duration ,
150+                               sizeof (duration ));
151+ 
152+   clock_time_t  zwave_desired_duration 
153+     =  zwave_duration_to_time ((uint8_t )duration );
154+ 
81155  switch  (event ) {
82156    case  FRAME_SENT_EVENT_OK_SUPERVISION_WORKING :
83-       zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
84-         state_node ,
85-         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
86-         & attribute_store_set_reported_as_desired );
157+       attribute_store_set_reported_as_desired (duration_node );
87158      break ;
88159
89160    case  FRAME_SENT_EVENT_OK_SUPERVISION_SUCCESS :
@@ -95,11 +166,44 @@ static void
95166        state_node ,
96167        ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
97168        & attribute_store_undefine_desired );
98-       set_all_color_switch_durations (state_node , REPORTED_ATTRIBUTE , 0 );
99-       set_all_color_switch_durations (state_node , DESIRED_ATTRIBUTE , 0 );
169+       set_reported_duration (state_node , 0 );
170+       attribute_store_undefine_desired (duration_node );
171+       break ;
172+ 
173+     case  FRAME_SENT_EVENT_OK_NO_SUPERVISION :
174+       zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
175+         state_node ,
176+         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
177+         attribute_stop_transition );
178+       if (zwave_desired_duration  >  0 ) {
179+         // Should we estimate reported color values during transition 
180+         // and publish them as reported, like we did for level cluster? 
181+ 
182+         zwave_command_class_switch_color_invoke_on_all_attributes (
183+           state_node ,
184+           ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
185+           attribute_store_undefine_desired );
186+ 
187+         attribute_store_set_reported_as_desired (duration_node );
188+         attribute_store_undefine_desired (duration_node );
189+ 
190+         // Probe again after this duration 
191+         attribute_timeout_set_callback (state_node ,
192+                                        zwave_desired_duration  +  PROBE_BACK_OFF ,
193+                                        & switch_color_undefine_reported );
194+       } else  {
195+         zwave_command_class_switch_color_invoke_on_all_attributes (
196+           state_node ,
197+           ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
198+           attribute_store_undefine_desired );
199+         zwave_command_class_switch_color_invoke_on_all_attributes (
200+           state_node ,
201+           ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
202+           attribute_store_undefine_reported );
203+         attribute_store_undefine_desired (duration_node );
204+       }
100205      break ;
101206
102-     // FRAME_SENT_EVENT_OK_NO_SUPERVISION: 
103207    // FRAME_SENT_EVENT_OK_SUPERVISION_NO_SUPPORT: 
104208    // FRAME_SENT_EVENT_OK_SUPERVISION_FAIL: 
105209    default :
@@ -115,14 +219,8 @@ static void
115219        state_node ,
116220        ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
117221        & attribute_store_undefine_reported );
118-       zwave_command_class_switch_color_invoke_on_all_attributes (
119-         state_node ,
120-         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
121-         & attribute_store_undefine_desired );
122-       zwave_command_class_switch_color_invoke_on_all_attributes (
123-         state_node ,
124-         ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
125-         & attribute_store_undefine_reported );
222+       attribute_store_undefine_desired (duration_node );
223+       attribute_store_undefine_reported (duration_node );
126224      break ;
127225  }
128226
@@ -190,4 +288,4 @@ void zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value
190288      ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_COLOR_COMPONENT_ID ,
191289      index );
192290  }
193- }
291+ }
0 commit comments