-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
Copy pathmicrowave-oven-control-server.h
206 lines (168 loc) · 8.79 KB
/
microwave-oven-control-server.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*
*
* Copyright (c) 2023 Project CHIP Authors
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <app-common/zap-generated/cluster-objects.h>
#include <app/AttributeAccessInterface.h>
#include <app/CommandHandlerInterface.h>
#include <app/clusters/mode-base-server/mode-base-server.h>
#include <app/clusters/operational-state-server/operational-state-server.h>
#include <protocols/interaction_model/StatusCode.h>
namespace chip {
namespace app {
namespace Clusters {
namespace MicrowaveOvenControl {
constexpr uint32_t kDefaultCookTimeSec = 30u;
constexpr uint32_t kMinCookTimeSec = 1u;
constexpr uint8_t kDefaultMinPowerNum = 10u;
constexpr uint8_t kDefaultMaxPowerNum = 100u;
constexpr uint8_t kDefaultPowerStepNum = 10u;
class Delegate;
class Instance : public CommandHandlerInterface, public AttributeAccessInterface
{
public:
/**
* @brief Creates a Microwave Oven Control cluster instance. The Init() function needs to be called for this instance
* to be registered and called by the interaction model at the appropriate times.
* @param aDelegate A pointer to the delegate to be used by this server.
* Note: the caller must ensure that the delegate lives throughout the instance's lifetime.
* @param aEndpointId The endpoint on which this cluster exists. This must match the zap configuration.
* @param aClusterId The ID of the Microwave Oven Control cluster to be instantiated.
* @param aFeature The bitmask value that identifies which features are supported by this instance.
* @param aOpStateInstance The reference of Operational State Instance.
* @param aMicrowaveOvenModeInstance The reference of Microwave Oven Mode Instance.
* Note: a MicrowaveOvenControl instance must relies on an Operational State instance and a Microwave Oven Mode instance.
* Caller must ensure those 2 instances are live and initialized before initializing MicorwaveOvenControl instance.
*/
Instance(Delegate * aDelegate, EndpointId aEndpointId, ClusterId aClusterId, BitMask<MicrowaveOvenControl::Feature> aFeature,
Clusters::OperationalState::Instance & aOpStateInstance, Clusters::ModeBase::Instance & aMicrowaveOvenModeInstance);
~Instance() override;
/**
* @brief Initialise the Microwave Oven Control server instance.
* This function must be called after defining an Instance class object.
* @return Returns an error if the given endpoint and cluster ID have not been enabled in zap or if the
* CommandHandler or AttributeHandler registration fails, else returns CHIP_NO_ERROR.
* This method also checks if the feature setting is valid, if invalid it will returns CHIP_ERROR_INVALID_ARGUMENT.
*/
CHIP_ERROR Init();
bool HasFeature(MicrowaveOvenControl::Feature feature) const;
uint8_t GetCountOfSupportedWattLevels() const;
uint32_t GetCookTimeSec() const;
void SetCookTimeSec(uint32_t cookTimeSec);
private:
Delegate * mDelegate;
EndpointId mEndpointId;
ClusterId mClusterId;
BitMask<MicrowaveOvenControl::Feature> mFeature;
Clusters::OperationalState::Instance & mOpStateInstance;
Clusters::ModeBase::Instance & mMicrowaveOvenModeInstance;
uint32_t mCookTimeSec = kDefaultCookTimeSec;
uint8_t mSupportedWattLevels = 0;
/**
* IM-level implementation of read
* @return appropriately mapped CHIP_ERROR if applicable
*/
CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
/**
* @brief Inherited from CommandHandlerInterface
*/
void InvokeCommand(HandlerContext & ctx) override;
/**
* @brief Handle Command: SetCookingParameters.
* @param ctx Returns the Interaction Model status code which was user determined in the business logic.
* If the input value is invalid, returns the Interaction Model status code of INVALID_COMMAND.
* If the operational state is not in 'Stopped', returns the Interaction Model status code of INVALID_IN_STATE.
*/
void HandleSetCookingParameters(HandlerContext & ctx, const Commands::SetCookingParameters::DecodableType & req);
/**
* @brief Handle Command: AddMoreTime.
* @param ctx Returns the Interaction Model status code which was user determined in the business logic.
* If the cook time value is out of range, returns the Interaction Model status code of CONSTRAINT_ERROR.
* If the operational state is in 'Error', returns the Interaction Model status code of INVALID_IN_STATE.
*/
void HandleAddMoreTime(HandlerContext & ctx, const Commands::AddMoreTime::DecodableType & req);
};
/** @brief
* Defines methods for implementing application-specific logic for the MicrowaveOvenControl Cluster.
*/
class Delegate
{
public:
Delegate() = default;
virtual ~Delegate() = default;
/**
* @brief Handle Command Callback in application: SetCookingParameters.
* @return Returns the Interaction Model status code which was user determined in the business logic.
* @param cookMode: the input cook mode value. Callee needs to define the cooking mode value in the Microwave Oven Mode
* instance.
* @param cookTimeSec: the input cook time value.
* @param startAfterSetting: if true, the cooking operation will start after handling the command.
* @param powerSettingNum: the input power setting value.
* @param wattSettingIndex: the input watts setting index.
* Note: powerSettingNum and wattSettingIndex must be mutually exclusive.
* If using power as number, wattSettingIndex will be set to NullOptional.
* If using power in watts, powerSettingNum will be set to NullOptional.
*/
virtual Protocols::InteractionModel::Status HandleSetCookingParametersCallback(uint8_t cookMode, uint32_t cookTimeSec,
bool startAfterSetting,
Optional<uint8_t> powerSettingNum,
Optional<uint8_t> wattSettingIndex) = 0;
/**
* @brief Handle Command Callback in application: AddMoreTime.
* @return Returns the Interaction Model status code which was user determined in the business logic.
* @param finalCookTimeSec: the cook time value after adding input time.
*/
virtual Protocols::InteractionModel::Status HandleModifyCookTimeSecondsCallback(uint32_t finalCookTimeSec) = 0;
/**
* Get the watt setting from the supported watts list.
* @param index The index of the watt setting to be returned. It is assumed that watt setting are indexable from 0 and with no
* gaps.
* @param wattSetting A reference to receive the watt setting on success.
* @return Returns a CHIP_NO_ERROR if there was no error and the label was returned successfully,
* CHIP_ERROR_NOT_FOUND if the index in beyond the list of available labels.
*/
virtual CHIP_ERROR GetWattSettingByIndex(uint8_t index, uint16_t & wattSetting) = 0;
virtual uint32_t GetMaxCookTimeSec() const = 0;
virtual uint8_t GetPowerSettingNum() const = 0;
virtual uint8_t GetMinPowerNum() const = 0;
virtual uint8_t GetMaxPowerNum() const = 0;
virtual uint8_t GetPowerStepNum() const = 0;
virtual uint8_t GetCurrentWattIndex() const = 0;
virtual uint16_t GetWattRating() const = 0;
private:
friend class Instance;
Instance * mInstance = nullptr;
/**
* This method is used by the SDK to set the instance pointer. This is done during the instantiation of a Instance object.
* @param aInstance A pointer to the Instance object related to this delegate object.
*/
void SetInstance(Instance * aInstance) { mInstance = aInstance; }
protected:
Instance * GetInstance() const { return mInstance; }
};
/**
* @brief Check if the given cook time is in range.
*/
bool IsCookTimeSecondsInRange(uint32_t cookTimeSec, uint32_t maxCookTimeSec);
/**
* @brief Check if the given cooking power is in range.
*/
bool IsPowerSettingNumberInRange(uint8_t powerSettingNum, uint8_t minCookPowerNum, uint8_t maxCookPowerNum);
} // namespace MicrowaveOvenControl
} // namespace Clusters
} // namespace app
} // namespace chip