@@ -8,29 +8,33 @@ using namespace chip::app::Clusters::Thermostat;
8
8
using namespace chip ::app::Clusters::Thermostat::Structs;
9
9
10
10
// built in presets will be prefixed with B
11
- constexpr const char * kBuiltInOneHandle = " B1 " ;
11
+ constexpr const char * kBuiltInPOneHandle = " BP1 " ;
12
12
constexpr const char * kOccupiedName = " Occupied Default" ;
13
13
14
- constexpr const char * kBuiltinTwoHandle = " B2 " ;
14
+ constexpr const char * kBuiltinPTwoHandle = " BP2 " ;
15
15
constexpr const char * kUnoccupiedName = " Unoccupied Default" ;
16
16
17
17
constexpr const int kMaxPresets = 10 ;
18
18
19
- // user presets will be prefixed with U
20
- static const char * userPresetPrefix = " U" ;
21
- static uint32_t nextNewHandle = 0 ;
19
+ // user presets will be prefixed with UP
20
+ static const char * userPresetPrefix = " UP" ;
21
+ static uint32_t nextNewPresetHandle = 0 ;
22
+
23
+ // user schedules will be prefixed with US
24
+ static const char * userSchedulePrefix = " US" ;
25
+ static uint32_t nextNewScheduleHandle = 0 ;
22
26
23
27
static PresetStruct::Type BuiltInPresets[] = {
24
28
{ .presetHandle =
25
- DataModel::Nullable<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltInOneHandle ), strlen (kBuiltInOneHandle ))),
29
+ DataModel::Nullable<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltInPOneHandle ), strlen (kBuiltInPOneHandle ))),
26
30
.presetScenario = PresetScenarioEnum::kOccupied ,
27
31
.name = Optional<DataModel::Nullable<chip::CharSpan>>(
28
32
DataModel::Nullable<chip::CharSpan>(chip::CharSpan (kOccupiedName , strlen (kOccupiedName )))),
29
33
.coolingSetpoint = Optional<int16_t >(2400 ),
30
34
.heatingSetpoint = Optional<int16_t >(1800 ),
31
35
.builtIn = DataModel::Nullable<bool >(true ) },
32
36
{ .presetHandle =
33
- DataModel::Nullable<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltinTwoHandle ), strlen (kBuiltinTwoHandle ))),
37
+ DataModel::Nullable<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltinPTwoHandle ), strlen (kBuiltinPTwoHandle ))),
34
38
.presetScenario = PresetScenarioEnum::kUnoccupied ,
35
39
.name = Optional<DataModel::Nullable<chip::CharSpan>>(
36
40
DataModel::Nullable<chip::CharSpan>(chip::CharSpan (kUnoccupiedName , strlen (kUnoccupiedName )))),
@@ -39,12 +43,36 @@ static PresetStruct::Type BuiltInPresets[] = {
39
43
.builtIn = DataModel::Nullable<bool >(true ) }
40
44
};
41
45
46
+ // built in schedules will be prefixed with B
47
+ constexpr const char * kBuiltInSOneHandle = " BS1" ;
48
+ constexpr const char * kBuildInScheduleOneName = " Schedule1" ;
49
+ constexpr const char * kBuiltinSTwoHandle = " BS2" ;
50
+ constexpr const char * kBuildInScheduleTwoName = " Schedule2" ;
51
+ constexpr const int kMaxSchedules = 10 ;
52
+
53
+ static ScheduleStruct::Type BuiltInSchedules[] = {
54
+ {
55
+ .scheduleHandle = DataModel::Nullable<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltInSOneHandle ), strlen (kBuiltInSOneHandle ))),
56
+ .systemMode = SystemModeEnum::kAuto ,
57
+ .name = Optional<chip::CharSpan>(chip::CharSpan (kBuildInScheduleOneName , strlen (kBuildInScheduleOneName ))),
58
+ .presetHandle = Optional<chip::ByteSpan>(chip::ByteSpan (Uint8::from_const_char (kBuiltInPOneHandle ), strlen (kBuiltInPOneHandle ))),
59
+ .transitions = DataModel::List<const Structs::ScheduleTransitionStruct::Type>(),
60
+ .builtIn = Optional<DataModel::Nullable<bool >>(DataModel::Nullable<bool >(true ))
61
+ },
62
+ };
63
+
42
64
static unsigned int gsActivePresetsEmptyIndex = 0 ;
43
65
static std::array<PresetStruct::Type, kMaxPresets > gsActivePresets;
44
66
45
67
static unsigned int gsEditingPresetsEmptyIndex = 0 ;
46
68
static std::array<PresetStruct::Type, kMaxPresets > gsEditingPresets;
47
69
70
+ static unsigned int gsActiveSchedulesEmptyIndex = 0 ;
71
+ static std::array<ScheduleStruct::Type, kMaxSchedules > gsActiveSchedules;
72
+
73
+ static unsigned int gsEditingSchedulesEmptyIndex = 0 ;
74
+ static std::array<ScheduleStruct::Type, kMaxSchedules > gsEditingSchedules;
75
+
48
76
static void onEditStart (ThermostatMatterScheduleManager * mgr)
49
77
{
50
78
ChipLogProgress (Zcl, " ThermstatScheduleManager - onEditStart" );
@@ -54,30 +82,61 @@ static void onEditCancel(ThermostatMatterScheduleManager * mgr)
54
82
{
55
83
ChipLogProgress (Zcl, " ThermstatScheduleManager - onEditCancel" );
56
84
gsEditingPresetsEmptyIndex = 0 ;
85
+ gsEditingSchedulesEmptyIndex = 0 ;
57
86
}
58
87
59
88
static EmberAfStatus onEditCommit (ThermostatMatterScheduleManager * mgr)
60
89
{
61
90
EmberAfStatus status = EMBER_ZCL_STATUS_SUCCESS;
62
91
63
92
ChipLogProgress (Zcl, " ThermstatScheduleManager - onEditCommit" );
64
- Span<PresetStruct::Type> oldPresets = Span<PresetStruct::Type>(gsActivePresets).SubSpan (0 , gsActivePresetsEmptyIndex);
65
- Span<PresetStruct::Type> newPresets = Span<PresetStruct::Type>(gsEditingPresets).SubSpan (0 , gsEditingPresetsEmptyIndex);
66
93
67
- status = mgr->ThermostatMatterScheduleManager ::ValidatePresetsForCommitting (oldPresets, newPresets);
68
- SuccessOrExit (status);
94
+ if (gsEditingPresetsEmptyIndex != 0 )
95
+ {
96
+ Span<PresetStruct::Type> oldPresets = Span<PresetStruct::Type>(gsActivePresets).SubSpan (0 , gsActivePresetsEmptyIndex);
97
+ Span<PresetStruct::Type> newPresets = Span<PresetStruct::Type>(gsEditingPresets).SubSpan (0 , gsEditingPresetsEmptyIndex);
98
+
99
+ status = mgr->ThermostatMatterScheduleManager ::ValidatePresetsForCommitting (oldPresets, newPresets);
100
+ SuccessOrExit (status);
69
101
70
- // New presets look good, lets generate some new ID's for the new presets.
71
- for (unsigned int index = 0 ; index < gsEditingPresetsEmptyIndex; ++index )
102
+ // New presets look good, lets generate some new ID's for the new presets.
103
+ for (unsigned int index = 0 ; index < gsEditingPresetsEmptyIndex; ++index )
104
+ {
105
+ if (gsEditingPresets[index ].presetHandle .IsNull () || gsEditingPresets[index ].presetHandle .Value ().empty ())
106
+ {
107
+ char handle[16 ];
108
+ snprintf (handle, 16 , " %s%d" , userPresetPrefix, nextNewPresetHandle++);
109
+ gsEditingPresets[index ].presetHandle .SetNonNull (ByteSpan ((const unsigned char *) handle, strlen (handle)));
110
+ }
111
+ }
112
+ }
113
+
114
+ if (gsEditingSchedulesEmptyIndex != 0 )
72
115
{
73
- if (gsEditingPresets[index ].presetHandle .IsNull () || gsEditingPresets[index ].presetHandle .Value ().empty ())
116
+ Span<ScheduleStruct::Type> oldSchedules = Span<ScheduleStruct::Type>(gsActiveSchedules).SubSpan (0 , gsActiveSchedulesEmptyIndex);
117
+ Span<ScheduleStruct::Type> newSchedules = Span<ScheduleStruct::Type>(gsEditingSchedules).SubSpan (0 , gsEditingSchedulesEmptyIndex);
118
+ Span<PresetStruct::Type> presets = gsEditingPresetsEmptyIndex > 0 ? Span<PresetStruct::Type>(gsEditingPresets).SubSpan (0 , gsEditingPresetsEmptyIndex) :
119
+ Span<PresetStruct::Type>(gsActivePresets).SubSpan (0 , gsActivePresetsEmptyIndex);
120
+
121
+ status = mgr->ThermostatMatterScheduleManager ::ValidateSchedulesForCommitting (oldSchedules, newSchedules, presets);
122
+ SuccessOrExit (status);
123
+
124
+ // New schedules look good, lets generate some new ID's for the new schedules.
125
+ for (unsigned int index = 0 ; index < gsEditingSchedulesEmptyIndex; ++index )
74
126
{
75
- char handle[16 ];
76
- snprintf (handle, 16 , " %s%d" , userPresetPrefix, nextNewHandle++);
77
- gsEditingPresets[index ].presetHandle .SetNonNull (ByteSpan ((const unsigned char *) handle, strlen (handle)));
127
+ if (gsEditingSchedules[index ].scheduleHandle .IsNull () || gsEditingSchedules[index ].scheduleHandle .Value ().empty ())
128
+ {
129
+ char handle[16 ];
130
+ snprintf (handle, 16 , " %s%d" , userSchedulePrefix, nextNewScheduleHandle++);
131
+ gsEditingSchedules[index ].scheduleHandle .SetNonNull (ByteSpan ((const unsigned char *) handle, strlen (handle)));
132
+ }
78
133
}
79
134
}
80
135
136
+
137
+ // Everything *SHOULD* be validated now, so lets commit them.
138
+
139
+
81
140
// copy the presets to the active list.
82
141
gsActivePresets = gsEditingPresets;
83
142
gsEditingPresetsEmptyIndex = 0 ;
0 commit comments