/
ViomiZoneCleaningCapability.js
70 lines (60 loc) · 2.34 KB
/
ViomiZoneCleaningCapability.js
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
const attributes = require("../ViomiCommonAttributes");
const BasicControlCapability = require("../../../core/capabilities/BasicControlCapability");
const ThreeIRobotixMapParser = require("../../3irobotix/ThreeIRobotixMapParser");
const ZoneCleaningCapability = require("../../../core/capabilities/ZoneCleaningCapability");
/**
* @extends ZoneCleaningCapability<import("../ViomiValetudoRobot")>
*/
class ViomiZoneCleaningCapability extends ZoneCleaningCapability {
/**
* @private
* @returns {import("./ViomiBasicControlCapability")}
*/
getBasicControlCapability() {
return this.robot.capabilities[BasicControlCapability.TYPE];
}
/**
* @param {Array<import("../../../entities/core/ValetudoZone")>} valetudoZones
* @returns {Promise<void>}
*/
async start(valetudoZones) {
let areas = [];
const basicControlCap = this.getBasicControlCapability();
// The app sends set_uploadmap [1] when the "draw area" button is pressed.
// The robot seems to end up in a weird state if we don't do this.
await this.robot.sendCommand("set_uploadmap", [1]);
valetudoZones.forEach(zone => {
const pA = ThreeIRobotixMapParser.CONVERT_TO_THREEIROBOTIX_COORDINATES(zone.points.pA.x, zone.points.pA.y);
const pC = ThreeIRobotixMapParser.CONVERT_TO_THREEIROBOTIX_COORDINATES(zone.points.pC.x, zone.points.pC.y);
areas.push([areas.length,
attributes.ViomiArea.NORMAL,
pA.x.toFixed(4),
pA.y.toFixed(4),
pA.x.toFixed(4),
pC.y.toFixed(4),
pC.x.toFixed(4),
pC.y.toFixed(4),
pC.x.toFixed(4),
pA.y.toFixed(4),
].join("_"));
});
await this.robot.sendCommand("set_zone", [areas.length].concat(areas), {});
await basicControlCap.setRectangularZoneMode(attributes.ViomiOperation.START);
}
/**
* @returns {import("../../../core/capabilities/ZoneCleaningCapability").ZoneCleaningCapabilityProperties}
*/
getProperties() {
return {
zoneCount: {
min: 1,
max: 10
},
iterationCount: {
min: 1,
max: 1
}
};
}
}
module.exports = ViomiZoneCleaningCapability;