forked from SiliconLabsSoftware/matter_sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLightSwitchMgr.h
135 lines (108 loc) · 4.19 KB
/
LightSwitchMgr.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
/*
*
* Copyright (c) 2020 Project CHIP Authors
* Copyright (c) 2018 Nest Labs, Inc.
* 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 "AppEvent.h"
#include <app-common/zap-generated/ids/Clusters.h>
#include <app/clusters/bindings/bindings.h>
#include <app/util/basic-types.h>
#include <cmsis_os2.h>
#include <lib/core/CHIPError.h>
#include <lib/support/CodeUtils.h>
#include <platform/CHIPDeviceLayer.h>
#include <string>
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters::LevelControl;
class LightSwitchMgr
{
public:
enum class LightSwitchAction : uint8_t
{
Toggle, // Triggers an toggle command
On, // Triggers an On command
Off // Trigger an Off command
};
struct GenericSwitchEventData
{
chip::EndpointId endpoint;
chip::EventId event;
};
static constexpr Clusters::LevelControl::Commands::Step::Type stepCommand = {
.stepSize = 1, .transitionTime = 0, .optionsMask = 0, .optionsOverride = 0
};
struct Timer
{
typedef void (*Callback)(Timer & timer);
Timer(uint32_t timeoutInMs, Callback callback, void * context);
~Timer();
void Start();
void Stop();
void Timeout();
Callback mCallback = nullptr;
void * mContext = nullptr;
bool mIsActive = false;
osTimerId_t mHandler = nullptr;
private:
static void TimerCallback(void * timerCbArg);
};
CHIP_ERROR Init(chip::EndpointId lightSwitchEndpoint, chip::EndpointId genericSwitchEndpoint);
void GenericSwitchOnInitialPress();
void GenericSwitchOnShortRelease();
void TriggerLightSwitchAction(LightSwitchAction action, bool isGroupCommand = false);
void TriggerLevelControlAction(StepModeEnum stepMode, bool isGroupCommand = false);
StepModeEnum getStepMode();
AppEvent CreateNewEvent(AppEvent::AppEventTypes type);
static LightSwitchMgr & GetInstance() { return sSwitch; }
/**
* @brief Event handler when a button is pressed
* Function posts an event for button processing
*
* @param button BUTTON0 or BUTTON1
* @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED,
* SL_SIMPLE_BUTTON_RELEASED
*/
static void ButtonEventHandler(uint8_t button, uint8_t btnAction);
static void AppEventHandler(AppEvent * aEvent);
private:
static LightSwitchMgr sSwitch;
Timer * mLongPressTimer = nullptr;
bool mFunctionButtonPressed = false; // True when button0 is pressed, used to trigger factory reset
bool mActionButtonPressed = false; // True when button1 is pressed, used to initiate toggle or level-up/down
bool mActionButtonSuppressed = false; // True when both button0 and button1 are pressed, used to switch step direction
bool mResetWarning = false;
// Default Step direction for Level control
StepModeEnum stepDirection = StepModeEnum::kUp;
static void OnLongPressTimeout(Timer & timer);
LightSwitchMgr() = default;
/**
* @brief This function will be called when PB0 is
* long-pressed to trigger the factory-reset
*/
void HandleLongPress();
static void GenericSwitchWorkerFunction(intptr_t context);
chip::EndpointId mLightSwitchEndpoint = chip::kInvalidEndpointId;
chip::EndpointId mGenericSwitchEndpoint = chip::kInvalidEndpointId;
/**
* @brief Button event processing function
* Function triggers a switch action sent to the CHIP task
*
* @param aEvent button event being processed
*/
static void SwitchActionEventHandler(AppEvent * aEvent);
};