@ledvance/ui-biz-bundle 1.1.70 → 1.1.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,443 +1,442 @@
1
- import { hex2Int, spliceByStep } from '@ledvance/base/src/utils/common';
2
- import { Utils } from '@tuya/tuya-panel-lamp-sdk';
3
- import { MoodInfo, MoodNodeInfo } from './Interface';
4
- import { getDefaultMood } from './MoodInfo';
5
- const { nToHS, toFixed, sToN } = Utils;
6
-
7
- // light source
8
- export function dp2Obj(dp: string, isFan: boolean = false, isUVCFan?: boolean): MoodInfo {
9
- console.log(dp, '< ---- dppppp')
10
- if (!dp || dp?.length <= 8) return getDefaultMood();
11
- let dpCopy = dp;
12
- let fanEnable: undefined | boolean = undefined;
13
- let fanSpeed: undefined | number = undefined;
14
- let mode = 0;
15
- let speed = 75;
16
- const id = hex2Int(dpCopy.slice(0, 2));
17
- dpCopy = dpCopy.slice(2);
18
- if (isFan) {
19
- fanEnable = hex2Int(dpCopy.slice(0, 2)) === 1;
20
- dpCopy = dpCopy.slice(2);
21
- fanSpeed = hex2Int(dpCopy.slice(0, 2));
22
- dpCopy = dpCopy.slice(2);
23
- }
24
- const nodes: MoodNodeInfo[] = spliceByStep(dpCopy, 26).map(nodeHex => {
25
- let hex = nodeHex;
26
- speed = isUVCFan ? 101 - hex2Int(hex.slice(0, 2)) : hex2Int(hex.slice(0, 2));
27
- hex = hex.slice(2);
28
- speed = isUVCFan ? 101 - hex2Int(hex.slice(0, 2)) : hex2Int(hex.slice(0, 2));
29
- hex = hex.slice(2);
30
- mode = hex2Int(hex.slice(0, 2));
31
- hex = hex.slice(2);
32
- const h = hex2Int(hex.slice(0, 4));
33
- hex = hex.slice(4);
34
- const s = Math.round(hex2Int(hex.slice(0, 4)) / 10);
35
- hex = hex.slice(4);
36
- const v = Math.round(hex2Int(hex.slice(0, 4)) / 10);
37
- hex = hex.slice(4);
38
- const brightness = Math.round(hex2Int(hex.slice(0, 4)) / 10);
39
- hex = hex.slice(4);
40
- const colorTemp = Math.round(hex2Int(hex.slice(0, 4)) / 10);
41
- const isColorNode = h !== 0 || s !== 0 || v !== 0;
42
- return {
43
- h,
44
- s,
45
- v,
46
- brightness,
47
- colorTemp,
48
- isColorNode,
49
- };
50
- });
51
- return {
52
- id,
53
- version: 0,
54
- mainLamp: {
55
- mode,
56
- speed,
57
- fanEnable,
58
- fanSpeed,
59
- nodes,
60
- enable: true,
61
- },
62
- secondaryLamp: {
63
- mode: 0,
64
- speed: 100,
65
- nodes: [],
66
- enable: true,
67
- },
68
- };
69
- }
70
-
71
- export function obj2Dp(mood: MoodInfo, isFan: boolean = false, isUVCFan?: boolean): string {
72
- const { mainLamp } = mood;
73
- let fanEnableHex = '';
74
- let fanSpeedHex = '';
75
- const idHex = mood.id.toString(16).padStart(2, '0');
76
- if (isFan) {
77
- fanEnableHex = (mainLamp.fanEnable ? 1 : 0).toString(16).padStart(2, '0');
78
- fanSpeedHex = (mainLamp.fanSpeed || 1).toString(16).padStart(2, '0');
79
- }
80
- const hex =
81
- idHex +
82
- fanEnableHex +
83
- fanSpeedHex +
84
- mainLamp.nodes
85
- ?.map(node => {
86
- const switchingIntervalHex = (isUVCFan ? 101 - mainLamp.speed : mainLamp.speed)
87
- .toString(16)
88
- .padStart(2, '0');
89
- const transitionTimeHex = (isUVCFan ? 101 - mainLamp.speed : mainLamp.speed)
90
- .toString(16)
91
- .padStart(2, '0');
92
- const transitionModeHex = mainLamp.mode.toString(16).padStart(2, '0');
93
- const hHex = node.h.toString(16).padStart(4, '0');
94
- const sHex = (node.s * 10).toString(16).padStart(4, '0');
95
- const vHex = (node.v * 10).toString(16).padStart(4, '0');
96
- const brightnessHex = (node.brightness * 10).toString(16).padStart(4, '0');
97
- const colorTempHex = (node.colorTemp * 10).toString(16).padStart(4, '0');
98
- return (
99
- switchingIntervalHex +
100
- transitionTimeHex +
101
- transitionModeHex +
102
- hHex +
103
- sHex +
104
- vHex +
105
- brightnessHex +
106
- colorTempHex
107
- );
108
- })
109
- .join('');
110
- return hex;
111
- }
112
-
113
- // strip,string light
114
- export function stripDp2Obj(dp: string, isStringLight: boolean = false): MoodInfo {
115
- if (!dp) return getDefaultMood();
116
- const version = hex2Int(dp.slice(0, 2));
117
- const id = hex2Int(dp.slice(2, 4));
118
- const mode = hex2Int(dp.slice(4, 6));
119
- const intervalTime = hex2Int(dp.slice(6, 8));
120
- const changeTime = hex2Int(dp.slice(8, 10));
121
- const speed = intervalTime || changeTime;
122
- const optionA = hex2Int(dp.slice(10, 12)).toString(2).padStart(8, '0');
123
- const segmented = sToN(optionA.slice(0, 1), 2);
124
- const loop = sToN(optionA.slice(1, 2), 2);
125
- const excessive = sToN(optionA.slice(2, 3), 2);
126
- const direction = sToN(optionA.slice(3, 4), 2);
127
- const expand = sToN(optionA.slice(4, 6), 2);
128
- const reserved1 = sToN(optionA.slice(6, 7), 2);
129
- const reserved2 = sToN(optionA.slice(7, 8), 2);
130
- // 这两个目前灯具用不上
131
- // const optionB = toN(dp.slice(12, 14))
132
- // const optionC = toN(dp.slice(14, 16))
133
- let nodes = [] as MoodNodeInfo[];
134
- if (isStringLight) {
135
- nodes = spliceByStep(dp.slice(16, dp.length), 16).map(nodeHex => {
136
- const v = hex2Int(nodeHex.slice(0, 2));
137
- const h = hex2Int(nodeHex.slice(2, 6));
138
- const s = hex2Int(nodeHex.slice(6, 8));
139
- const brightness = hex2Int(nodeHex.slice(8, 12)) / 10;
140
- const colorTemp = hex2Int(nodeHex.slice(12, 16)) / 10;
141
- const isColorNode = v > 0 && brightness === 0;
142
- return { h, s, v, brightness, colorTemp, isColorNode };
143
- });
144
- } else {
145
- const bright = hex2Int(dp.slice(16, 18));
146
- nodes = spliceByStep(dp.slice(18, dp.length), 6).map(nodeHex => {
147
- const h = hex2Int(nodeHex.slice(0, 4));
148
- const s = hex2Int(nodeHex.slice(4, 6));
149
- const v = bright;
150
- const brightness = 0;
151
- const colorTemp = 0;
152
- const isColorNode = true;
153
- return { h, s, v, brightness, colorTemp, isColorNode };
154
- });
155
- }
156
-
157
- return {
158
- version,
159
- id,
160
- mainLamp: {
161
- mode,
162
- speed,
163
- direction,
164
- segmented,
165
- loop,
166
- excessive,
167
- expand,
168
- reserved1,
169
- reserved2,
170
- nodes,
171
- enable: true,
172
- },
173
- secondaryLamp: {
174
- mode,
175
- speed,
176
- nodes: [],
177
- enable: true,
178
- },
179
- };
180
- }
181
-
182
- export function stripObj2Dp(mood: MoodInfo, isStringLight: boolean = false) {
183
- const {
184
- expand = 0,
185
- reserved1 = 0,
186
- reserved2 = 0,
187
- // mixedIds = [],
188
- segmented = 0,
189
- loop = 0,
190
- excessive = 0,
191
- direction = 0,
192
- mode,
193
- speed,
194
- nodes,
195
- } = mood.mainLamp;
196
- const versionHex = nToHS(mood.version);
197
- const idHex = nToHS(mood.id);
198
- const modeHex = nToHS(mode);
199
- const intervalTimeHex = nToHS(speed);
200
- const changeTimeHex = nToHS(speed);
201
- const optionAHex = nToHS(
202
- parseInt(
203
- `${segmented}${loop}${excessive}${direction}${toFixed(
204
- expand.toString(2),
205
- 2
206
- )}${reserved1}${reserved2}`,
207
- 2
208
- )
209
- );
210
- const optionBHex = nToHS(0);
211
- const optionCHex = nToHS(0);
212
- let nodeHex = '';
213
- if (isStringLight) {
214
- nodeHex = nodes
215
- .map(node => {
216
- return `${nToHS(node.v)}${nToHS(node.h, 4)}${nToHS(node.s)}${nToHS(
217
- node.brightness * 10,
218
- 4
219
- )}${nToHS(node.colorTemp * 10, 4)}`;
220
- })
221
- .join('');
222
- } else {
223
- const brightHex = nToHS(nodes[0].v);
224
- nodeHex =
225
- brightHex +
226
- nodes
227
- .map(node => {
228
- return `${nToHS(node.h, 4)}${nToHS(node.s)}`;
229
- })
230
- .join('');
231
- }
232
-
233
- return (
234
- versionHex +
235
- idHex +
236
- modeHex +
237
- intervalTimeHex +
238
- changeTimeHex +
239
- optionAHex +
240
- optionBHex +
241
- optionCHex +
242
- nodeHex
243
- );
244
- }
245
-
246
- // mix light
247
- export function MixObj2Dp(mood: MoodInfo) {
248
- const { mainLamp, secondaryLamp } = mood;
249
- const versionHex = nToHS(mood.version);
250
- const idHex = nToHS(mood.id);
251
- const lamps = [mainLamp, secondaryLamp];
252
- const lampsHex = lamps
253
- .map(lamp => {
254
- let lampHex = lamp.enable ? '01' : '00';
255
- const nodes = lamp.nodes || [];
256
- lampHex += nToHS(nodes.length || 0);
257
- if (nodes.length === 0 || !lamp.enable) {
258
- return lampHex;
259
- }
260
- lampHex += nToHS(lamp.type);
261
- lampHex += nodes
262
- .map(node => {
263
- let nodeHex = '';
264
- nodeHex += nToHS(lamp.speed);
265
- nodeHex += nToHS(lamp.speed);
266
- nodeHex += nToHS(lamp.mode);
267
- switch (
268
- lamp.type // 1:W 只有亮度,2:CW 亮度+色温,3:RGB HSV,4:RGBC HSV+色温,5:RGBCW HSV+色温+亮度
269
- ) {
270
- case 1:
271
- nodeHex += nToHS(node.brightness * 10, 4);
272
- break;
273
- case 2:
274
- nodeHex += nToHS(node.brightness * 10, 4);
275
- nodeHex += nToHS(node.colorTemp * 10, 4);
276
- break;
277
- case 3:
278
- nodeHex += nToHS(node.h, 4);
279
- nodeHex += nToHS(node.s * 10, 4);
280
- nodeHex += nToHS(node.v * 10, 4);
281
- break;
282
- case 4:
283
- nodeHex += nToHS(node.h, 4);
284
- nodeHex += nToHS(node.s * 10, 4);
285
- nodeHex += nToHS(node.v * 10, 4);
286
- nodeHex += nToHS(node.colorTemp * 10, 4);
287
- break;
288
- case 5:
289
- nodeHex += nToHS(node.h, 4);
290
- nodeHex += nToHS(node.s * 10, 4);
291
- nodeHex += nToHS(node.v * 10, 4);
292
- nodeHex += nToHS(node.brightness * 10, 4);
293
- nodeHex += nToHS(node.colorTemp * 10, 4);
294
- break;
295
- }
296
- return nodeHex;
297
- })
298
- .join('');
299
- return lampHex;
300
- })
301
- .join('');
302
- return versionHex + idHex + lampsHex;
303
- }
304
-
305
- export function MixDp2Obj(dp: string): MoodInfo {
306
- if (!dp) return getDefaultMood();
307
- const result = { mainLamp: {}, secondaryLamp: {} } as MoodInfo;
308
- result.version = sToN(dp.slice(0, 2));
309
- result.id = sToN(dp.slice(2, 4));
310
- const mainEnable = sToN(dp.slice(4, 6)) === 1;
311
- const mainNum = sToN(dp.slice(6, 8));
312
- let sliceDp = dp.slice(8);
313
- result.mainLamp.enable = mainEnable;
314
- result.mainLamp.nodes = [];
315
- if (mainEnable && mainNum) {
316
- result.mainLamp.type = sToN(sliceDp.slice(0, 2));
317
- sliceDp = sliceDp.slice(2);
318
- for (let i = 0; i < mainNum; i++) {
319
- result.mainLamp.speed = sToN(sliceDp.slice(0, 2));
320
- result.mainLamp.mode = sToN(sliceDp.slice(4, 6));
321
- sliceDp = sliceDp.slice(6);
322
- const node = {} as MoodNodeInfo;
323
- switch (result.mainLamp.type) {
324
- case 1:
325
- node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
326
- node.isColorNode = false;
327
- sliceDp = sliceDp.slice(4);
328
- break;
329
- case 2:
330
- node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
331
- node.colorTemp = sToN(sliceDp.slice(4, 8)) / 10;
332
- node.isColorNode = false;
333
- sliceDp = sliceDp.slice(8);
334
- break;
335
- case 3:
336
- node.h = sToN(sliceDp.slice(0, 4));
337
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
338
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
339
- node.isColorNode = true;
340
- sliceDp = sliceDp.slice(12);
341
- break;
342
- case 4:
343
- node.h = sToN(sliceDp.slice(0, 4));
344
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
345
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
346
- node.colorTemp = sToN(sliceDp.slice(12, 16)) / 10;
347
- node.isColorNode = true;
348
- sliceDp = sliceDp.slice(16);
349
- break;
350
- case 5:
351
- node.h = sToN(sliceDp.slice(0, 4));
352
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
353
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
354
- node.brightness = sToN(sliceDp.slice(12, 16)) / 10;
355
- node.colorTemp = sToN(sliceDp.slice(16, 20)) / 10;
356
- node.isColorNode = true;
357
- sliceDp = sliceDp.slice(20);
358
- break;
359
- }
360
- result.mainLamp.nodes.push(node);
361
- }
362
- }
363
- const secondaryEnable = sToN(sliceDp.slice(0, 2)) === 1;
364
- const secondaryNum = sToN(sliceDp.slice(2, 4));
365
- result.secondaryLamp.enable = secondaryEnable;
366
- result.secondaryLamp.nodes = [];
367
- sliceDp = sliceDp.slice(4);
368
- if (secondaryEnable && secondaryNum) {
369
- result.secondaryLamp.type = sToN(sliceDp.slice(0, 2));
370
- sliceDp = sliceDp.slice(2);
371
- for (let i = 0; i < secondaryNum; i++) {
372
- result.secondaryLamp.speed = sToN(sliceDp.slice(0, 2));
373
- result.secondaryLamp.mode = sToN(sliceDp.slice(4, 6));
374
- sliceDp = sliceDp.slice(6);
375
- const node = {} as MoodNodeInfo;
376
- switch (result.secondaryLamp.type) {
377
- case 1:
378
- node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
379
- node.isColorNode = true;
380
- sliceDp = sliceDp.slice(4);
381
- break;
382
- case 2:
383
- node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
384
- node.colorTemp = sToN(sliceDp.slice(4, 8)) / 10;
385
- node.isColorNode = false;
386
- sliceDp = sliceDp.slice(8);
387
- break;
388
- case 3:
389
- node.h = sToN(sliceDp.slice(0, 4));
390
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
391
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
392
- node.isColorNode = true;
393
- sliceDp = sliceDp.slice(12);
394
- break;
395
- case 4:
396
- node.h = sToN(sliceDp.slice(0, 4));
397
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
398
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
399
- node.colorTemp = sToN(sliceDp.slice(12, 16)) / 10;
400
- node.isColorNode = true;
401
- sliceDp = sliceDp.slice(16);
402
- break;
403
- case 5:
404
- node.h = sToN(sliceDp.slice(0, 4));
405
- node.s = sToN(sliceDp.slice(4, 8)) / 10;
406
- node.v = sToN(sliceDp.slice(8, 12)) / 10;
407
- node.brightness = sToN(sliceDp.slice(12, 16)) / 10;
408
- node.colorTemp = sToN(sliceDp.slice(16, 20)) / 10;
409
- node.isColorNode = true;
410
- sliceDp = sliceDp.slice(20);
411
- break;
412
- }
413
- result.secondaryLamp.nodes.push(node);
414
- }
415
- }
416
-
417
- return result;
418
- }
419
-
420
- export function MixCeilingDpObj(mainDp: string, secondaryDp: string): MoodInfo {
421
- const mainLamp = dp2Obj(mainDp);
422
- const secondaryLamp = secondaryDp ? stripDp2Obj(secondaryDp) : '';
423
- return {
424
- id: 0,
425
- version: 0,
426
- mainLamp: {
427
- id: mainLamp.id,
428
- version: mainLamp.version,
429
- ...mainLamp.mainLamp,
430
- },
431
- secondaryLamp: secondaryLamp
432
- ? {
433
- id: secondaryLamp.id,
434
- version: secondaryLamp.version,
435
- ...secondaryLamp.secondaryLamp,
436
- }
437
- : {
438
- mode: 0,
439
- speed: 75,
440
- nodes: [],
441
- },
442
- };
443
- }
1
+ import { hex2Int, spliceByStep } from '@ledvance/base/src/utils/common';
2
+ import { Utils } from '@tuya/tuya-panel-lamp-sdk';
3
+ import { MoodInfo, MoodNodeInfo } from './Interface';
4
+ import { getDefaultMood } from './MoodInfo';
5
+ const { nToHS, toFixed, sToN } = Utils;
6
+
7
+ // light source
8
+ export function dp2Obj(dp: string, isFan: boolean = false, isUVCFan?: boolean): MoodInfo {
9
+ if (!dp || dp?.length <= 8) return getDefaultMood();
10
+ let dpCopy = dp;
11
+ let fanEnable: undefined | boolean = undefined;
12
+ let fanSpeed: undefined | number = undefined;
13
+ let mode = 0;
14
+ let speed = 75;
15
+ const id = hex2Int(dpCopy.slice(0, 2));
16
+ dpCopy = dpCopy.slice(2);
17
+ if (isFan) {
18
+ fanEnable = hex2Int(dpCopy.slice(0, 2)) === 1;
19
+ dpCopy = dpCopy.slice(2);
20
+ fanSpeed = hex2Int(dpCopy.slice(0, 2));
21
+ dpCopy = dpCopy.slice(2);
22
+ }
23
+ const nodes: MoodNodeInfo[] = spliceByStep(dpCopy, 26).map(nodeHex => {
24
+ let hex = nodeHex;
25
+ speed = isUVCFan ? 101 - hex2Int(hex.slice(0, 2)) : hex2Int(hex.slice(0, 2));
26
+ hex = hex.slice(2);
27
+ speed = isUVCFan ? 101 - hex2Int(hex.slice(0, 2)) : hex2Int(hex.slice(0, 2));
28
+ hex = hex.slice(2);
29
+ mode = hex2Int(hex.slice(0, 2));
30
+ hex = hex.slice(2);
31
+ const h = hex2Int(hex.slice(0, 4));
32
+ hex = hex.slice(4);
33
+ const s = Math.round(hex2Int(hex.slice(0, 4)) / 10);
34
+ hex = hex.slice(4);
35
+ const v = Math.round(hex2Int(hex.slice(0, 4)) / 10);
36
+ hex = hex.slice(4);
37
+ const brightness = Math.round(hex2Int(hex.slice(0, 4)) / 10);
38
+ hex = hex.slice(4);
39
+ const colorTemp = Math.round(hex2Int(hex.slice(0, 4)) / 10);
40
+ const isColorNode = h !== 0 || s !== 0 || v !== 0;
41
+ return {
42
+ h,
43
+ s,
44
+ v,
45
+ brightness,
46
+ colorTemp,
47
+ isColorNode,
48
+ };
49
+ });
50
+ return {
51
+ id,
52
+ version: 0,
53
+ mainLamp: {
54
+ mode,
55
+ speed,
56
+ fanEnable,
57
+ fanSpeed,
58
+ nodes,
59
+ enable: true,
60
+ },
61
+ secondaryLamp: {
62
+ mode: 0,
63
+ speed: 100,
64
+ nodes: [],
65
+ enable: true,
66
+ },
67
+ };
68
+ }
69
+
70
+ export function obj2Dp(mood: MoodInfo, isFan: boolean = false, isUVCFan?: boolean): string {
71
+ const { mainLamp } = mood;
72
+ let fanEnableHex = '';
73
+ let fanSpeedHex = '';
74
+ const idHex = mood.id.toString(16).padStart(2, '0');
75
+ if (isFan) {
76
+ fanEnableHex = (mainLamp.fanEnable ? 1 : 0).toString(16).padStart(2, '0');
77
+ fanSpeedHex = (mainLamp.fanSpeed || 1).toString(16).padStart(2, '0');
78
+ }
79
+ const hex =
80
+ idHex +
81
+ fanEnableHex +
82
+ fanSpeedHex +
83
+ mainLamp.nodes
84
+ ?.map(node => {
85
+ const switchingIntervalHex = (isUVCFan ? 101 - mainLamp.speed : mainLamp.speed)
86
+ .toString(16)
87
+ .padStart(2, '0');
88
+ const transitionTimeHex = (isUVCFan ? 101 - mainLamp.speed : mainLamp.speed)
89
+ .toString(16)
90
+ .padStart(2, '0');
91
+ const transitionModeHex = mainLamp.mode.toString(16).padStart(2, '0');
92
+ const hHex = node.h.toString(16).padStart(4, '0');
93
+ const sHex = (node.s * 10).toString(16).padStart(4, '0');
94
+ const vHex = (node.v * 10).toString(16).padStart(4, '0');
95
+ const brightnessHex = (node.brightness * 10).toString(16).padStart(4, '0');
96
+ const colorTempHex = (node.colorTemp * 10).toString(16).padStart(4, '0');
97
+ return (
98
+ switchingIntervalHex +
99
+ transitionTimeHex +
100
+ transitionModeHex +
101
+ hHex +
102
+ sHex +
103
+ vHex +
104
+ brightnessHex +
105
+ colorTempHex
106
+ );
107
+ })
108
+ .join('');
109
+ return hex;
110
+ }
111
+
112
+ // strip,string light
113
+ export function stripDp2Obj(dp: string, isStringLight: boolean = false): MoodInfo {
114
+ if (!dp) return getDefaultMood();
115
+ const version = hex2Int(dp.slice(0, 2));
116
+ const id = hex2Int(dp.slice(2, 4));
117
+ const mode = hex2Int(dp.slice(4, 6));
118
+ const intervalTime = hex2Int(dp.slice(6, 8));
119
+ const changeTime = hex2Int(dp.slice(8, 10));
120
+ const speed = intervalTime || changeTime;
121
+ const optionA = hex2Int(dp.slice(10, 12)).toString(2).padStart(8, '0');
122
+ const segmented = sToN(optionA.slice(0, 1), 2);
123
+ const loop = sToN(optionA.slice(1, 2), 2);
124
+ const excessive = sToN(optionA.slice(2, 3), 2);
125
+ const direction = sToN(optionA.slice(3, 4), 2);
126
+ const expand = sToN(optionA.slice(4, 6), 2);
127
+ const reserved1 = sToN(optionA.slice(6, 7), 2);
128
+ const reserved2 = sToN(optionA.slice(7, 8), 2);
129
+ // 这两个目前灯具用不上
130
+ // const optionB = toN(dp.slice(12, 14))
131
+ // const optionC = toN(dp.slice(14, 16))
132
+ let nodes = [] as MoodNodeInfo[];
133
+ if (isStringLight) {
134
+ nodes = spliceByStep(dp.slice(16, dp.length), 16).map(nodeHex => {
135
+ const v = hex2Int(nodeHex.slice(0, 2));
136
+ const h = hex2Int(nodeHex.slice(2, 6));
137
+ const s = hex2Int(nodeHex.slice(6, 8));
138
+ const brightness = hex2Int(nodeHex.slice(8, 12)) / 10;
139
+ const colorTemp = hex2Int(nodeHex.slice(12, 16)) / 10;
140
+ const isColorNode = v > 0 && brightness === 0;
141
+ return { h, s, v, brightness, colorTemp, isColorNode };
142
+ });
143
+ } else {
144
+ const bright = hex2Int(dp.slice(16, 18));
145
+ nodes = spliceByStep(dp.slice(18, dp.length), 6).map(nodeHex => {
146
+ const h = hex2Int(nodeHex.slice(0, 4));
147
+ const s = hex2Int(nodeHex.slice(4, 6));
148
+ const v = bright;
149
+ const brightness = 0;
150
+ const colorTemp = 0;
151
+ const isColorNode = true;
152
+ return { h, s, v, brightness, colorTemp, isColorNode };
153
+ });
154
+ }
155
+
156
+ return {
157
+ version,
158
+ id,
159
+ mainLamp: {
160
+ mode,
161
+ speed,
162
+ direction,
163
+ segmented,
164
+ loop,
165
+ excessive,
166
+ expand,
167
+ reserved1,
168
+ reserved2,
169
+ nodes,
170
+ enable: true,
171
+ },
172
+ secondaryLamp: {
173
+ mode,
174
+ speed,
175
+ nodes: [],
176
+ enable: true,
177
+ },
178
+ };
179
+ }
180
+
181
+ export function stripObj2Dp(mood: MoodInfo, isStringLight: boolean = false) {
182
+ const {
183
+ expand = 0,
184
+ reserved1 = 0,
185
+ reserved2 = 0,
186
+ // mixedIds = [],
187
+ segmented = 0,
188
+ loop = 0,
189
+ excessive = 0,
190
+ direction = 0,
191
+ mode,
192
+ speed,
193
+ nodes,
194
+ } = mood.mainLamp;
195
+ const versionHex = nToHS(mood.version);
196
+ const idHex = nToHS(mood.id);
197
+ const modeHex = nToHS(mode);
198
+ const intervalTimeHex = nToHS(speed);
199
+ const changeTimeHex = nToHS(speed);
200
+ const optionAHex = nToHS(
201
+ parseInt(
202
+ `${segmented}${loop}${excessive}${direction}${toFixed(
203
+ expand.toString(2),
204
+ 2
205
+ )}${reserved1}${reserved2}`,
206
+ 2
207
+ )
208
+ );
209
+ const optionBHex = nToHS(0);
210
+ const optionCHex = nToHS(0);
211
+ let nodeHex = '';
212
+ if (isStringLight) {
213
+ nodeHex = nodes
214
+ .map(node => {
215
+ return `${nToHS(node.v)}${nToHS(node.h, 4)}${nToHS(node.s)}${nToHS(
216
+ node.brightness * 10,
217
+ 4
218
+ )}${nToHS(node.colorTemp * 10, 4)}`;
219
+ })
220
+ .join('');
221
+ } else {
222
+ const brightHex = nToHS(nodes[0].v);
223
+ nodeHex =
224
+ brightHex +
225
+ nodes
226
+ .map(node => {
227
+ return `${nToHS(node.h, 4)}${nToHS(node.s)}`;
228
+ })
229
+ .join('');
230
+ }
231
+
232
+ return (
233
+ versionHex +
234
+ idHex +
235
+ modeHex +
236
+ intervalTimeHex +
237
+ changeTimeHex +
238
+ optionAHex +
239
+ optionBHex +
240
+ optionCHex +
241
+ nodeHex
242
+ );
243
+ }
244
+
245
+ // mix light
246
+ export function MixObj2Dp(mood: MoodInfo) {
247
+ const { mainLamp, secondaryLamp } = mood;
248
+ const versionHex = nToHS(mood.version);
249
+ const idHex = nToHS(mood.id);
250
+ const lamps = [mainLamp, secondaryLamp];
251
+ const lampsHex = lamps
252
+ .map(lamp => {
253
+ let lampHex = lamp.enable ? '01' : '00';
254
+ const nodes = lamp.nodes || [];
255
+ lampHex += nToHS(nodes.length || 0);
256
+ if (nodes.length === 0 || !lamp.enable) {
257
+ return lampHex;
258
+ }
259
+ lampHex += nToHS(lamp.type);
260
+ lampHex += nodes
261
+ .map(node => {
262
+ let nodeHex = '';
263
+ nodeHex += nToHS(lamp.speed);
264
+ nodeHex += nToHS(lamp.speed);
265
+ nodeHex += nToHS(lamp.mode);
266
+ switch (
267
+ lamp.type // 1:W 只有亮度,2:CW 亮度+色温,3:RGB HSV,4:RGBC HSV+色温,5:RGBCW HSV+色温+亮度
268
+ ) {
269
+ case 1:
270
+ nodeHex += nToHS(node.brightness * 10, 4);
271
+ break;
272
+ case 2:
273
+ nodeHex += nToHS(node.brightness * 10, 4);
274
+ nodeHex += nToHS(node.colorTemp * 10, 4);
275
+ break;
276
+ case 3:
277
+ nodeHex += nToHS(node.h, 4);
278
+ nodeHex += nToHS(node.s * 10, 4);
279
+ nodeHex += nToHS(node.v * 10, 4);
280
+ break;
281
+ case 4:
282
+ nodeHex += nToHS(node.h, 4);
283
+ nodeHex += nToHS(node.s * 10, 4);
284
+ nodeHex += nToHS(node.v * 10, 4);
285
+ nodeHex += nToHS(node.colorTemp * 10, 4);
286
+ break;
287
+ case 5:
288
+ nodeHex += nToHS(node.h, 4);
289
+ nodeHex += nToHS(node.s * 10, 4);
290
+ nodeHex += nToHS(node.v * 10, 4);
291
+ nodeHex += nToHS(node.brightness * 10, 4);
292
+ nodeHex += nToHS(node.colorTemp * 10, 4);
293
+ break;
294
+ }
295
+ return nodeHex;
296
+ })
297
+ .join('');
298
+ return lampHex;
299
+ })
300
+ .join('');
301
+ return versionHex + idHex + lampsHex;
302
+ }
303
+
304
+ export function MixDp2Obj(dp: string): MoodInfo {
305
+ if (!dp) return getDefaultMood();
306
+ const result = { mainLamp: {}, secondaryLamp: {} } as MoodInfo;
307
+ result.version = sToN(dp.slice(0, 2));
308
+ result.id = sToN(dp.slice(2, 4));
309
+ const mainEnable = sToN(dp.slice(4, 6)) === 1;
310
+ const mainNum = sToN(dp.slice(6, 8));
311
+ let sliceDp = dp.slice(8);
312
+ result.mainLamp.enable = mainEnable;
313
+ result.mainLamp.nodes = [];
314
+ if (mainEnable && mainNum) {
315
+ result.mainLamp.type = sToN(sliceDp.slice(0, 2));
316
+ sliceDp = sliceDp.slice(2);
317
+ for (let i = 0; i < mainNum; i++) {
318
+ result.mainLamp.speed = sToN(sliceDp.slice(0, 2));
319
+ result.mainLamp.mode = sToN(sliceDp.slice(4, 6));
320
+ sliceDp = sliceDp.slice(6);
321
+ const node = {} as MoodNodeInfo;
322
+ switch (result.mainLamp.type) {
323
+ case 1:
324
+ node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
325
+ node.isColorNode = false;
326
+ sliceDp = sliceDp.slice(4);
327
+ break;
328
+ case 2:
329
+ node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
330
+ node.colorTemp = sToN(sliceDp.slice(4, 8)) / 10;
331
+ node.isColorNode = false;
332
+ sliceDp = sliceDp.slice(8);
333
+ break;
334
+ case 3:
335
+ node.h = sToN(sliceDp.slice(0, 4));
336
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
337
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
338
+ node.isColorNode = true;
339
+ sliceDp = sliceDp.slice(12);
340
+ break;
341
+ case 4:
342
+ node.h = sToN(sliceDp.slice(0, 4));
343
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
344
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
345
+ node.colorTemp = sToN(sliceDp.slice(12, 16)) / 10;
346
+ node.isColorNode = true;
347
+ sliceDp = sliceDp.slice(16);
348
+ break;
349
+ case 5:
350
+ node.h = sToN(sliceDp.slice(0, 4));
351
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
352
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
353
+ node.brightness = sToN(sliceDp.slice(12, 16)) / 10;
354
+ node.colorTemp = sToN(sliceDp.slice(16, 20)) / 10;
355
+ node.isColorNode = true;
356
+ sliceDp = sliceDp.slice(20);
357
+ break;
358
+ }
359
+ result.mainLamp.nodes.push(node);
360
+ }
361
+ }
362
+ const secondaryEnable = sToN(sliceDp.slice(0, 2)) === 1;
363
+ const secondaryNum = sToN(sliceDp.slice(2, 4));
364
+ result.secondaryLamp.enable = secondaryEnable;
365
+ result.secondaryLamp.nodes = [];
366
+ sliceDp = sliceDp.slice(4);
367
+ if (secondaryEnable && secondaryNum) {
368
+ result.secondaryLamp.type = sToN(sliceDp.slice(0, 2));
369
+ sliceDp = sliceDp.slice(2);
370
+ for (let i = 0; i < secondaryNum; i++) {
371
+ result.secondaryLamp.speed = sToN(sliceDp.slice(0, 2));
372
+ result.secondaryLamp.mode = sToN(sliceDp.slice(4, 6));
373
+ sliceDp = sliceDp.slice(6);
374
+ const node = {} as MoodNodeInfo;
375
+ switch (result.secondaryLamp.type) {
376
+ case 1:
377
+ node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
378
+ node.isColorNode = true;
379
+ sliceDp = sliceDp.slice(4);
380
+ break;
381
+ case 2:
382
+ node.brightness = sToN(sliceDp.slice(0, 4)) / 10;
383
+ node.colorTemp = sToN(sliceDp.slice(4, 8)) / 10;
384
+ node.isColorNode = false;
385
+ sliceDp = sliceDp.slice(8);
386
+ break;
387
+ case 3:
388
+ node.h = sToN(sliceDp.slice(0, 4));
389
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
390
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
391
+ node.isColorNode = true;
392
+ sliceDp = sliceDp.slice(12);
393
+ break;
394
+ case 4:
395
+ node.h = sToN(sliceDp.slice(0, 4));
396
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
397
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
398
+ node.colorTemp = sToN(sliceDp.slice(12, 16)) / 10;
399
+ node.isColorNode = true;
400
+ sliceDp = sliceDp.slice(16);
401
+ break;
402
+ case 5:
403
+ node.h = sToN(sliceDp.slice(0, 4));
404
+ node.s = sToN(sliceDp.slice(4, 8)) / 10;
405
+ node.v = sToN(sliceDp.slice(8, 12)) / 10;
406
+ node.brightness = sToN(sliceDp.slice(12, 16)) / 10;
407
+ node.colorTemp = sToN(sliceDp.slice(16, 20)) / 10;
408
+ node.isColorNode = true;
409
+ sliceDp = sliceDp.slice(20);
410
+ break;
411
+ }
412
+ result.secondaryLamp.nodes.push(node);
413
+ }
414
+ }
415
+
416
+ return result;
417
+ }
418
+
419
+ export function MixCeilingDpObj(mainDp: string, secondaryDp: string): MoodInfo {
420
+ const mainLamp = dp2Obj(mainDp);
421
+ const secondaryLamp = secondaryDp ? stripDp2Obj(secondaryDp) : '';
422
+ return {
423
+ id: 0,
424
+ version: 0,
425
+ mainLamp: {
426
+ ...mainLamp.mainLamp,
427
+ id: mainLamp.id,
428
+ version: mainLamp.version,
429
+ },
430
+ secondaryLamp: secondaryLamp
431
+ ? {
432
+ ...secondaryLamp.mainLamp,
433
+ version: secondaryLamp.version,
434
+ id: secondaryLamp.id
435
+ }
436
+ : {
437
+ mode: 0,
438
+ speed: 75,
439
+ nodes: [],
440
+ },
441
+ };
442
+ }