@ray-js/robot-data-stream 0.0.13-beta-11 → 0.0.13-beta-12

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.
@@ -85,7 +85,8 @@ export declare enum CarpetEnum {
85
85
  add = "addCarpet",
86
86
  update = "updateCarpet",
87
87
  delete = "removeCarpet",
88
- query = "carpetQry"
88
+ query = "carpetQry",
89
+ set = "carpetSet"
89
90
  }
90
91
  export declare enum CarpetCleanEnum {
91
92
  query = "carpetCleanQry",
@@ -128,6 +128,7 @@ export let CarpetEnum = /*#__PURE__*/function (CarpetEnum) {
128
128
  CarpetEnum["update"] = "updateCarpet";
129
129
  CarpetEnum["delete"] = "removeCarpet";
130
130
  CarpetEnum["query"] = "carpetQry";
131
+ CarpetEnum["set"] = "carpetSet";
131
132
  return CarpetEnum;
132
133
  }({});
133
134
 
@@ -1,8 +1,16 @@
1
1
  import { BaseResponse } from './type';
2
2
  import { CarpetEnum } from './type/requestType';
3
- interface AddCarpetInput {
4
- shape: ('rectangle' | 'round')[];
5
- polygons: string[];
3
+ import { Point } from '@ray-js/robot-protocol';
4
+ interface CarpetCommonFields {
5
+ autoBoost?: number[];
6
+ fineCleaning?: number[];
7
+ sideBrushRotating?: number[];
8
+ }
9
+ type CarpetShape = 'rectangle' | 'round';
10
+ type CarpetShapeWithCustom = 'rectangle' | 'round' | 'custom';
11
+ interface AddCarpetInput extends CarpetCommonFields {
12
+ shape: CarpetShape[];
13
+ polygons: Array<Point[]>;
6
14
  num: number;
7
15
  type: number[];
8
16
  cleanMode: number[];
@@ -12,11 +20,12 @@ interface AddCarpetResponse extends BaseResponse {
12
20
  id: number;
13
21
  }
14
22
  type TAddCarpet = (carpetInfo: AddCarpetInput) => Promise<AddCarpetResponse>;
15
- interface UpdateCarpetInfo {
23
+ interface UpdateCarpetInfo extends CarpetCommonFields {
16
24
  ids: number[];
17
- shape?: ('rectangle' | 'round')[];
25
+ shape?: CarpetShape[];
18
26
  type?: number[];
19
27
  cleanMode?: number[];
28
+ polygons?: Array<Point[]>;
20
29
  }
21
30
  type TUpdateCarpet = (carpetInfo: UpdateCarpetInfo) => Promise<BaseResponse>;
22
31
  type TDeleteCarpet = (carpetIds: number[]) => Promise<BaseResponse>;
@@ -25,15 +34,40 @@ interface CarpetQueryResponse extends BaseResponse {
25
34
  num: number;
26
35
  polygons: string[];
27
36
  cleanMode: number[];
37
+ autoBoost?: number[];
38
+ fineCleaning?: number[];
39
+ sideBrushRotating?: number[];
28
40
  shape: string[];
29
41
  type: number[];
30
42
  ids: number[];
31
43
  }
32
44
  type TQueryCarpet = () => Promise<CarpetQueryResponse>;
45
+ export interface SetCarpetInput extends CarpetCommonFields {
46
+ num: number;
47
+ polygons: Array<Point[]>;
48
+ cleanMode: number[];
49
+ shape: CarpetShapeWithCustom[];
50
+ ids: number[];
51
+ type?: number[];
52
+ }
53
+ interface SetCarpetResponse extends BaseResponse {
54
+ reqType: CarpetEnum.set;
55
+ num: number;
56
+ polygons: string[];
57
+ cleanMode: number[];
58
+ autoBoost?: number[];
59
+ fineCleaning?: number[];
60
+ sideBrushRotating?: number[];
61
+ shape: string[];
62
+ ids: number[];
63
+ type?: number[];
64
+ }
65
+ type TSetCarpet = (carpetInfo: SetCarpetInput) => Promise<SetCarpetResponse>;
33
66
  export declare const useCarpet: (devId: string) => {
34
67
  addCarpet: TAddCarpet;
35
68
  updateCarpet: TUpdateCarpet;
36
69
  deleteCarpet: TDeleteCarpet;
37
70
  queryCarpet: TQueryCarpet;
71
+ setCarpet: TSetCarpet;
38
72
  };
39
73
  export {};
@@ -1,17 +1,50 @@
1
1
  import "core-js/modules/esnext.iterator.constructor.js";
2
2
  import "core-js/modules/esnext.iterator.every.js";
3
+ import "core-js/modules/esnext.iterator.map.js";
4
+ import { pointsToString } from 'src/utils';
3
5
  import { createSetCommonParams } from './createCommonOptions';
4
6
  import { normalResolve } from './promise';
5
7
  import { CarpetEnum } from './type/requestType';
6
8
 
9
+ // 公共的地毯属性类型
10
+
11
+ // 形状类型定义
12
+
7
13
  // 添加地毯的输入参数(批量添加)
8
14
 
9
15
  // 添加地毯响应类型
10
16
 
11
17
  // 更新地毯的输入参数
12
18
 
19
+ // 更新地毯发送数据的类型(polygons 已转换为字符串)
20
+
13
21
  // 查询地毯响应类型
14
22
 
23
+ // 设置地毯的输入参数
24
+
25
+ // 设置地毯响应类型
26
+
27
+ // 验证形状数组的辅助函数
28
+ const validateShape = function (shape, allowedShapes) {
29
+ let fieldName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'shape';
30
+ if (!shape.every(s => allowedShapes.includes(s))) {
31
+ throw new Error(`${fieldName} must contain only ${allowedShapes.map(s => `"${s}"`).join(', ')}`);
32
+ }
33
+ };
34
+
35
+ // 发送 MQTT 消息并返回 Promise 的辅助函数
36
+ const sendMqttMessage = (devId, reqType, message) => {
37
+ const params = createSetCommonParams({
38
+ deviceId: devId,
39
+ reqType,
40
+ message
41
+ });
42
+ ty.device.sendMqttMessage(params);
43
+ const {
44
+ taskId
45
+ } = params.message;
46
+ return normalResolve(reqType, taskId);
47
+ };
15
48
  export const useCarpet = devId => {
16
49
  /**
17
50
  * 添加地毯(批量添加)
@@ -36,63 +69,61 @@ export const useCarpet = devId => {
36
69
  * @returns Promise<CarpetQueryResponse> 响应结果,包含地毯数量、轮廓点集合、清洁属性和形状等信息
37
70
  */
38
71
 
72
+ /**
73
+ * 设置地毯(一次性设置所有地毯)
74
+ * @param carpetInfo 地毯信息,包含数量、轮廓点集合、清洁属性、形状和ID等
75
+ * @returns Promise<SetCarpetResponse> 响应结果,包含设置后的地毯信息
76
+ */
77
+
39
78
  return {
40
79
  addCarpet: carpetInfo => {
41
80
  // 参数验证
42
81
  if (!carpetInfo) {
43
82
  throw new Error('carpetInfo is required');
44
83
  }
45
- if (!Array.isArray(carpetInfo.shape)) {
84
+ if (!Array.isArray(carpetInfo.shape) || carpetInfo.shape.length === 0) {
46
85
  throw new Error('carpetInfo.shape is required and must be a non-empty array');
47
86
  }
48
- if (!carpetInfo.shape.every(s => ['rectangle', 'round'].includes(s))) {
49
- throw new Error('carpetInfo.shape must contain only "rectangle" or "round"');
50
- }
51
- if (!Array.isArray(carpetInfo.polygons)) {
87
+ validateShape(carpetInfo.shape, ['rectangle', 'round'], 'carpetInfo.shape');
88
+ if (!Array.isArray(carpetInfo.polygons) || carpetInfo.polygons.length === 0) {
52
89
  throw new Error('carpetInfo.polygons is required and must be a non-empty array');
53
90
  }
54
- if (typeof carpetInfo.num !== 'number') {
91
+ if (typeof carpetInfo.num !== 'number' || carpetInfo.num <= 0) {
55
92
  throw new Error('carpetInfo.num is required and must be a positive number');
56
93
  }
57
- if (!Array.isArray(carpetInfo.type)) {
94
+ if (!Array.isArray(carpetInfo.type) || carpetInfo.type.length === 0) {
58
95
  throw new Error('carpetInfo.type is required and must be a non-empty array');
59
96
  }
60
- if (!Array.isArray(carpetInfo.cleanMode)) {
97
+ if (!Array.isArray(carpetInfo.cleanMode) || carpetInfo.cleanMode.length === 0) {
61
98
  throw new Error('carpetInfo.cleanMode is required and must be a non-empty array');
62
99
  }
63
100
  try {
64
101
  const sendData = {
65
102
  shape: carpetInfo.shape,
66
- polygons: carpetInfo.polygons,
103
+ polygons: carpetInfo.polygons.map(i => pointsToString(i)),
67
104
  num: carpetInfo.num,
68
105
  type: carpetInfo.type,
69
- cleanMode: carpetInfo.cleanMode
106
+ cleanMode: carpetInfo.cleanMode,
107
+ autoBoost: carpetInfo.autoBoost,
108
+ fineCleaning: carpetInfo.fineCleaning,
109
+ sideBrushRotating: carpetInfo.sideBrushRotating
70
110
  };
71
- const params = createSetCommonParams({
72
- deviceId: devId,
73
- reqType: CarpetEnum.add,
74
- message: {
75
- carpetInfo: sendData
76
- }
111
+ return sendMqttMessage(devId, CarpetEnum.add, {
112
+ carpetInfo: sendData
77
113
  });
78
- ty.device.sendMqttMessage(params);
79
- const {
80
- taskId
81
- } = params.message;
82
- return normalResolve(CarpetEnum.add, taskId);
83
114
  } catch (error) {
84
115
  throw error instanceof Error ? error : new Error('Failed to add carpet');
85
116
  }
86
117
  },
87
118
  updateCarpet: carpetInfo => {
88
119
  // 参数验证:只验证 id,其他字段可选
89
- if (!carpetInfo || !Array.isArray(carpetInfo.ids)) {
90
- throw new Error('carpetInfo.ids is required and must be a array');
120
+ if (!carpetInfo || !Array.isArray(carpetInfo.ids) || carpetInfo.ids.length === 0) {
121
+ throw new Error('carpetInfo.ids is required and must be a non-empty array');
91
122
  }
92
123
 
93
124
  // 验证 shape 字段(如果提供)
94
- if (carpetInfo.shape !== undefined && !carpetInfo.shape.every(s => ['rectangle', 'round'].includes(s))) {
95
- throw new Error('carpetInfo.shape must be "rectangle" or "round"');
125
+ if (carpetInfo.shape !== undefined) {
126
+ validateShape(carpetInfo.shape, ['rectangle', 'round'], 'carpetInfo.shape');
96
127
  }
97
128
  try {
98
129
  // 构建发送数据,只包含传入的字段
@@ -110,60 +141,85 @@ export const useCarpet = devId => {
110
141
  if (carpetInfo.cleanMode !== undefined) {
111
142
  sendData.cleanMode = carpetInfo.cleanMode;
112
143
  }
113
- const params = createSetCommonParams({
114
- deviceId: devId,
115
- reqType: CarpetEnum.update,
116
- message: {
117
- carpetInfo: sendData
118
- }
144
+ if (carpetInfo.autoBoost !== undefined) {
145
+ sendData.autoBoost = carpetInfo.autoBoost;
146
+ }
147
+ if (carpetInfo.fineCleaning !== undefined) {
148
+ sendData.fineCleaning = carpetInfo.fineCleaning;
149
+ }
150
+ if (carpetInfo.sideBrushRotating !== undefined) {
151
+ sendData.sideBrushRotating = carpetInfo.sideBrushRotating;
152
+ }
153
+ // 特殊处理 polygons(需要转换)
154
+ if (carpetInfo.polygons !== undefined) {
155
+ sendData.polygons = carpetInfo.polygons.map(i => pointsToString(i));
156
+ }
157
+ return sendMqttMessage(devId, CarpetEnum.update, {
158
+ carpetInfo: sendData
119
159
  });
120
- ty.device.sendMqttMessage(params);
121
- const {
122
- taskId
123
- } = params.message;
124
- return normalResolve(CarpetEnum.update, taskId);
125
160
  } catch (error) {
126
161
  throw error instanceof Error ? error : new Error('Failed to update carpet');
127
162
  }
128
163
  },
129
164
  deleteCarpet: carpetIds => {
130
165
  // 参数验证
131
- if (!carpetIds || !Array.isArray(carpetIds)) {
132
- throw new Error('carpetId is required and must be a number');
166
+ if (!Array.isArray(carpetIds) || carpetIds.length === 0) {
167
+ throw new Error('carpetIds is required and must be a non-empty array');
133
168
  }
134
169
  try {
135
- const params = createSetCommonParams({
136
- deviceId: devId,
137
- reqType: CarpetEnum.delete,
138
- message: {
139
- carpetInfo: {
140
- ids: carpetIds
141
- }
170
+ return sendMqttMessage(devId, CarpetEnum.delete, {
171
+ carpetInfo: {
172
+ ids: carpetIds
142
173
  }
143
174
  });
144
- ty.device.sendMqttMessage(params);
145
- const {
146
- taskId
147
- } = params.message;
148
- return normalResolve(CarpetEnum.delete, taskId);
149
175
  } catch (error) {
150
176
  throw error instanceof Error ? error : new Error('Failed to delete carpet');
151
177
  }
152
178
  },
153
179
  queryCarpet: () => {
154
180
  try {
155
- const params = createSetCommonParams({
156
- deviceId: devId,
157
- reqType: CarpetEnum.query
158
- });
159
- ty.device.sendMqttMessage(params);
160
- const {
161
- taskId
162
- } = params.message;
163
- return normalResolve(CarpetEnum.query, taskId);
181
+ return sendMqttMessage(devId, CarpetEnum.query, {});
164
182
  } catch (error) {
165
183
  throw error instanceof Error ? error : new Error('Failed to query carpet');
166
184
  }
185
+ },
186
+ setCarpet: carpetInfo => {
187
+ // 参数验证
188
+ if (!carpetInfo) {
189
+ throw new Error('carpetInfo is required');
190
+ }
191
+ if (typeof carpetInfo.num !== 'number' || carpetInfo.num <= 0) {
192
+ throw new Error('carpetInfo.num is required and must be a positive number');
193
+ }
194
+ if (!Array.isArray(carpetInfo.polygons) || carpetInfo.polygons.length === 0) {
195
+ throw new Error('carpetInfo.polygons is required and must be a non-empty array');
196
+ }
197
+ if (!Array.isArray(carpetInfo.cleanMode) || carpetInfo.cleanMode.length === 0) {
198
+ throw new Error('carpetInfo.cleanMode is required and must be a non-empty array');
199
+ }
200
+ if (!Array.isArray(carpetInfo.shape) || carpetInfo.shape.length === 0) {
201
+ throw new Error('carpetInfo.shape is required and must be a non-empty array');
202
+ }
203
+ validateShape(carpetInfo.shape, ['rectangle', 'round', 'custom'], 'carpetInfo.shape');
204
+ if (!Array.isArray(carpetInfo.ids) || carpetInfo.ids.length === 0) {
205
+ throw new Error('carpetInfo.ids is required and must be a non-empty array');
206
+ }
207
+ try {
208
+ const sendData = {
209
+ num: carpetInfo.num,
210
+ polygons: carpetInfo.polygons.map(i => pointsToString(i)),
211
+ cleanMode: carpetInfo.cleanMode,
212
+ autoBoost: carpetInfo.autoBoost,
213
+ fineCleaning: carpetInfo.fineCleaning,
214
+ sideBrushRotating: carpetInfo.sideBrushRotating,
215
+ shape: carpetInfo.shape,
216
+ ids: carpetInfo.ids,
217
+ type: carpetInfo.type
218
+ };
219
+ return sendMqttMessage(devId, CarpetEnum.set, sendData);
220
+ } catch (error) {
221
+ throw error instanceof Error ? error : new Error('Failed to set carpet');
222
+ }
167
223
  }
168
224
  };
169
225
  };
@@ -3,7 +3,7 @@ export type Point = {
3
3
  y: number;
4
4
  };
5
5
  export declare const emitter: import("mitt").Emitter<Record<import("mitt").EventType, unknown>>;
6
- export declare const pointsToString: (points: Point[], origin: Point) => string;
6
+ export declare const pointsToString: (points: Point[], origin?: Point) => string;
7
7
  export declare const isJSONString: (str: any) => boolean;
8
8
  export declare const parseJSON: (str: any) => any;
9
9
  export declare const logger: (type: 'warn' | 'error' | 'info', params: {
@@ -9,8 +9,8 @@ const pointToString = point => {
9
9
  export const pointsToString = (points, origin) => {
10
10
  let newPoints = [];
11
11
  try {
12
- const ox = origin.x;
13
- const oy = origin.y;
12
+ const ox = (origin === null || origin === void 0 ? void 0 : origin.x) || 0;
13
+ const oy = (origin === null || origin === void 0 ? void 0 : origin.y) || 0;
14
14
  newPoints = map(points, i => {
15
15
  return {
16
16
  x: floor(i.x - ox, 0),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ray-js/robot-data-stream",
3
- "version": "0.0.13-beta-11",
3
+ "version": "0.0.13-beta-12",
4
4
  "description": "扫地机P2P数据流标准化组件",
5
5
  "main": "lib/index",
6
6
  "files": [