-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathactcmdInterface.cpp
More file actions
231 lines (205 loc) · 8.72 KB
/
actcmdInterface.cpp
File metadata and controls
231 lines (205 loc) · 8.72 KB
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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include "actcmdInterface.h"
CActCmdInterface::CActCmdInterface()
{
m_pCmdList = (cmdItem_t *)(m_msg + SCMSG_HEADER_LEN);
}
/***************************************************************
* @func Init
* @brief 接口初始化:每次生成新的act-cmd命令列表前调用
* @param
* _uid:要生成Act-cmd命令组的uid,需要与Action uid对应(1到126之间)
* _cmdCnt:要生成Act-cmd命令组包含的命令数量(1至16之间)
* @retval
***************************************************************/
void CActCmdInterface::Init(const UC _uid, const UC _cmdCnt) {
// 数据初始化
memset(m_msg, 0x00, sizeof(m_msg));
memset(m_strOutput, 0x00, sizeof(m_strOutput));
m_msg[0] = ACT_CMD_MSG_HEAD_0; // 'C'
m_msg[1] = ACT_CMD_MSG_HEAD_1; // 'F'
m_msg[2] = 1; // total_pack
m_msg[3] = 1; // current_pack
m_nCmdCnt = _cmdCnt;
m_nPayloadLen = _cmdCnt * sizeof(cmdItem_t);
m_msg[4] = m_nPayloadLen >> 8; // len_h
m_msg[5] = m_nPayloadLen & 0xFF; // len_low
m_msg[6] = _uid;
m_nCmdIndex = 0;
}
/***************************************************************
* @func AddCmd_PowerSwitch
* @brief 添加命令:快速开关命令
* @param
* _devTag:DevTag,参见eDeviceTag_t
* _sw: 开关状态,取值[0..2],既DEVICE_SW_OFF, DEVICE_SW_ON, DEVICE_SW_TOGGLE
* _delay:延时多少秒执行
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_PowerSwitch(const UC _devTag, const UC _sw, const US _delay) {
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = _devTag; // DevTag
lv_cmd->head.cmd = CMD_SERIAL; // 快速开关
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = 1; // 快速开关命令参数长度
lv_cmd->body.sw = _sw; // 开关状态
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_ChangeScenario
* @brief 添加命令:场景切换命令
* @param _scenario:场景ID
* _delay:延时多少秒执行
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_ChangeScenario(const UC _scenario, const US _delay)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = DevTag_GW; // DevTag必须为DevTag_GW
lv_cmd->head.cmd = CMD_SCENARIO; // 切换场景
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = 1; // 场景切换命令参数长度
lv_cmd->body.scenario_id = _scenario; // 场景ID
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_SetState
* @brief 添加命令:设备开关命令
* @param
* _devTag:DevTag,参见eDeviceTag_t
* _sw: 开关状态,取值[0..2],既DEVICE_SW_OFF, DEVICE_SW_ON, DEVICE_SW_TOGGLE
* _delay:延时多少秒执行
* _opTime: 渐变操作时长(秒),可选参数,仅对DevTag_LED设备有效
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_SetState(const UC _devTag, const UC _sw, const US _delay, const US _opTime)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = _devTag; // DevTag
lv_cmd->head.cmd = CMD_POWER; // 设备开关
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
// 设备开关命令参数长度
if(_devTag == DevTag_LED) {
lv_cmd->head.paramLen = sizeof(V_STATUS_t);
lv_cmd->body.status.sw = _sw; // 开关状态
lv_cmd->body.status.delayopTime = _opTime; // 渐变操作时长(秒)
} else {
lv_cmd->head.paramLen = 1;
lv_cmd->body.sw = _sw; // 开关状态
}
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_BRControl
* @brief 添加命令:照明亮度
* @param
* _br:亮度,亮度具体值0-100
* _op:控制方式,0-设置亮度值,1-增加亮度(相对值),2-减少亮度(相对值);
* _delay:延时多少秒执行
* _opTime: 渐变操作时长(秒),可选参数,仅对DevTag_LED设备有效
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_BRControl(const UC _br, const UC _op, const US _delay, const US _opTime)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = DevTag_LED; // DevTag必须为DevTag_LED
lv_cmd->head.cmd = CMD_BRIGHTNESS; // 级别调整
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = sizeof(V_PERCENTAGE_t); // 照明亮度命令参数长度
lv_cmd->body.percentage.br = _br; // 亮度
lv_cmd->body.percentage.opt = _op; // 操作符
lv_cmd->body.percentage.delayopTime = _opTime; // 渐变操作时长(秒)
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_WLControl
* @brief 添加命令:照明波长
* @param
* _wl:色温或波长,具体色温值2700-6500占2个字节,高8位在前,低8位在后
* _op:控制方式,0-设置色温或波长值,1-增加色温或波长(相对值),2-减少色温或波长(相对值);
* _delay:延时多少秒执行
* _opTime: 渐变操作时长(秒),可选参数,仅对DevTag_LED设备有效
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_WLControl(const US _wl, const UC _op, const US _delay, const US _opTime)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = DevTag_LED; // DevTag必须为DevTag_LED
lv_cmd->head.cmd = CMD_CCT; // 照明波长
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = sizeof(V_LEVEL_t); // 照明波长命令参数长度
lv_cmd->body.wavL.wl = _wl; // 色温或波长
lv_cmd->body.wavL.opt = _op; // 操作符
lv_cmd->body.wavL.delayopTime = _opTime; // 渐变操作时长(秒)
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_LightControl
* @brief 添加命令:调节亮度及波长命令
* @param
* _br:亮度,亮度具体值0-100
* _wl:色温或波长,具体色温值2700-6500占2个字节,高8位在前,低8位在后
* _op:控制方式,低4位为br控制方式,高4位是cct/wl控制方式;
* _delay:延时多少秒执行
* _opTime: 渐变操作时长(秒),可选参数,仅对DevTag_LED设备有效
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_LightControl(const UC _br, const US _wl, const UC _op, const US _delay, const US _opTime)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = DevTag_LED; // DevTag必须为DevTag_LED
lv_cmd->head.cmd = CMD_COLOR; // 亮度及波长
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = sizeof(V_HUE_t); // 亮度及波长命令参数长度
lv_cmd->body.br_wl.br = _br; // 亮度
lv_cmd->body.br_wl.wl = _wl; // 色温或波长
lv_cmd->body.br_wl.opt = _op; // 操作符
lv_cmd->body.br_wl.delayopTime = _opTime; // 渐变操作时长(秒)
// 下一条
m_nCmdIndex++;
}
/***************************************************************
* @func AddCmd_FanControl
* @brief 添加命令:风扇控制命令
* @param
* _speed:风扇开关和风速
* _op:操作符,OPERATOR_SET(0), OPERATOR_ADD(1), OPERATOR_SUB(2),默认为0
* _delay:延时多少秒执行
* @retval
***************************************************************/
void CActCmdInterface::AddCmd_FanControl(const UC _speed, const UC _op, const US _delay)
{
// 指向当前命令
cmdItem_t *lv_cmd = m_pCmdList + m_nCmdIndex;
lv_cmd->head.devTag = DevTag_Fan; // DevTag必须为DevTag_Fan
lv_cmd->head.cmd = CMD_BRIGHTNESS; // 级别调整
lv_cmd->head.delayTime = Second2DelayTime(_delay); // 延时执行
lv_cmd->head.paramLen = sizeof(V_WIND_t); // 风速命令参数长度
lv_cmd->body.wind.speed = _speed; // 风扇开关和风速
lv_cmd->body.wind.opt = _op; // 操作符
// 下一条
m_nCmdIndex++;
}
// 生成命令字符串:返回字符串指针和长度
US CActCmdInterface::Build(char **_pstrActCmd)
{
// 计算crc16
US lv_crc16 = usCRC16(m_msg + SCMSG_HEADER_LEN, m_nPayloadLen);
m_msg[7] = lv_crc16 >> 8;
m_msg[8] = lv_crc16 & 0xFF;
// 字节数组 转 Hex字符串(注意:长度翻倍)
ByteToString(m_msg, m_strOutput, GetMsgLen());
// 返回字符串指针和长度
*_pstrActCmd = m_strOutput;
return(GetMsgStringLen());
}