@robotical/webapp-types 3.14.23 → 3.14.25
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.
- package/dist-types/src/application/RAFTs/Marty/Marty.d.ts +2 -0
- package/dist-types/src/application/RAFTs/Marty/Marty.js +3 -0
- package/dist-types/src/application/RAFTs/Marty/PublishedDataAnalyser.d.ts +58 -0
- package/dist-types/src/application/RAFTs/Marty/PublishedDataAnalyser.js +204 -0
- package/dist-types/src/application/RAFTs/Marty/published-data-helpers.d.ts +17 -0
- package/dist-types/src/application/RAFTs/Marty/published-data-helpers.js +122 -0
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ import { MartyWifiManager } from "./MartyWifiManager";
|
|
|
8
8
|
import MartyAddonsManager from "./MartyAddonsManager";
|
|
9
9
|
import CalibrationManager from "./CalibrationManager";
|
|
10
10
|
import { RICNotificationsManager } from "./notifications-manager/RICNotificationsManager";
|
|
11
|
+
import PublishedDataAnalyser from "./PublishedDataAnalyser";
|
|
11
12
|
export declare class Marty extends RAFT implements RICInterface {
|
|
12
13
|
id: string;
|
|
13
14
|
type: RaftTypeE;
|
|
@@ -17,6 +18,7 @@ export declare class Marty extends RAFT implements RICInterface {
|
|
|
17
18
|
addonsManager: MartyAddonsManager;
|
|
18
19
|
calibrationManager: CalibrationManager;
|
|
19
20
|
ricNotificationManager: RICNotificationsManager;
|
|
21
|
+
publishedDataAnalyser: PublishedDataAnalyser;
|
|
20
22
|
_ledLcdColours: RICLedLcdColours;
|
|
21
23
|
private rssiValues;
|
|
22
24
|
private MAX_RSSI_VALUES_N;
|
|
@@ -58,6 +58,7 @@ import CalibrationManager from "./CalibrationManager";
|
|
|
58
58
|
import Logger from "../../../services/logger/Logger";
|
|
59
59
|
import { AppSentMessage } from "../../../types/communication-between-apps/wrapper-communication";
|
|
60
60
|
import { RICNotificationsManager } from "./notifications-manager/RICNotificationsManager";
|
|
61
|
+
import PublishedDataAnalyser from "./PublishedDataAnalyser";
|
|
61
62
|
var SHOW_LOGS = true;
|
|
62
63
|
var TAG = "Marty";
|
|
63
64
|
var Marty = /** @class */ (function (_super) {
|
|
@@ -77,6 +78,8 @@ var Marty = /** @class */ (function (_super) {
|
|
|
77
78
|
// Calibration Manager
|
|
78
79
|
_this.calibrationManager = new CalibrationManager(_this);
|
|
79
80
|
_this.ricNotificationManager = new RICNotificationsManager(_this);
|
|
81
|
+
// Published data analyser
|
|
82
|
+
_this.publishedDataAnalyser = new PublishedDataAnalyser(_this);
|
|
80
83
|
// Colours to use for LED patterns
|
|
81
84
|
_this._ledLcdColours = [
|
|
82
85
|
{ led: "#202000", lcd: "#FFFF00" },
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import EventEmitter from "events";
|
|
3
|
+
import RAFT from "../RAFT";
|
|
4
|
+
import type { RICStateInfo } from "@robotical/roboticaljs";
|
|
5
|
+
import { type ColourSensorValues } from "./published-data-helpers";
|
|
6
|
+
interface MartyState {
|
|
7
|
+
colourSensed: "blue" | "green" | "red" | "yellow" | "purple" | "unclear" | "air";
|
|
8
|
+
lightSense: "none" | "high" | "mid" | "low";
|
|
9
|
+
objectSense: "none" | "near";
|
|
10
|
+
noiseSense: "none" | "detected";
|
|
11
|
+
}
|
|
12
|
+
declare class PublishedDataAnalyser extends EventEmitter {
|
|
13
|
+
private marty;
|
|
14
|
+
martyState: MartyState;
|
|
15
|
+
private pubSub;
|
|
16
|
+
lightSenseDetection: LightSenseDetection;
|
|
17
|
+
colourSensedDetection: ColourSensedDetection;
|
|
18
|
+
objectSenseDetection: ObjectSenseDetection;
|
|
19
|
+
noiseSenseDetection: NoiseSenseDetection;
|
|
20
|
+
eventsMap: {
|
|
21
|
+
colourSensed: Record<MartyState["colourSensed"], string>;
|
|
22
|
+
lightSense: Record<MartyState["lightSense"], string>;
|
|
23
|
+
objectSense: Record<MartyState["objectSense"], string>;
|
|
24
|
+
noiseSense: Record<MartyState["noiseSense"], string>;
|
|
25
|
+
};
|
|
26
|
+
connectedSensors: {
|
|
27
|
+
colourSensor: boolean;
|
|
28
|
+
lightSensor: boolean;
|
|
29
|
+
objectSensor: boolean;
|
|
30
|
+
noiseSensor: boolean;
|
|
31
|
+
};
|
|
32
|
+
constructor(marty: RAFT);
|
|
33
|
+
subscribeToPublishedData(): void;
|
|
34
|
+
unsubscribeFromPublishedData(): void;
|
|
35
|
+
analyse(data: RICStateInfo): void;
|
|
36
|
+
setColourSensed(colour: MartyState["colourSensed"]): void;
|
|
37
|
+
setLightSense(lightSense: MartyState["lightSense"]): void;
|
|
38
|
+
setObjectSense(objectSense: MartyState["objectSense"]): void;
|
|
39
|
+
setNoiseSense(noiseSense: MartyState["noiseSense"]): void;
|
|
40
|
+
}
|
|
41
|
+
declare class ColourSensedDetection {
|
|
42
|
+
private thresholds;
|
|
43
|
+
detectColourSensed({ r, g, b, clear, air }: ColourSensorValues, analyser: PublishedDataAnalyser): void;
|
|
44
|
+
}
|
|
45
|
+
declare class LightSenseDetection {
|
|
46
|
+
private lowLightThreshold;
|
|
47
|
+
private midLightThreshold;
|
|
48
|
+
private highLightThreshold;
|
|
49
|
+
detectLightSense(lightSenseValues: [number, number, number], analyser: PublishedDataAnalyser): void;
|
|
50
|
+
}
|
|
51
|
+
declare class ObjectSenseDetection {
|
|
52
|
+
detectObjectSense(objectSenseValue: boolean, analyser: PublishedDataAnalyser): void;
|
|
53
|
+
}
|
|
54
|
+
declare class NoiseSenseDetection {
|
|
55
|
+
private noiseThreshold;
|
|
56
|
+
detectNoiseSense(noiseSenseValue: number, analyser: PublishedDataAnalyser): void;
|
|
57
|
+
}
|
|
58
|
+
export default PublishedDataAnalyser;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
var __extends = (this && this.__extends) || (function () {
|
|
2
|
+
var extendStatics = function (d, b) {
|
|
3
|
+
extendStatics = Object.setPrototypeOf ||
|
|
4
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
+
return extendStatics(d, b);
|
|
7
|
+
};
|
|
8
|
+
return function (d, b) {
|
|
9
|
+
if (typeof b !== "function" && b !== null)
|
|
10
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
+
extendStatics(d, b);
|
|
12
|
+
function __() { this.constructor = d; }
|
|
13
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
+
};
|
|
15
|
+
})();
|
|
16
|
+
import EventEmitter from "events";
|
|
17
|
+
import { createRaftPubSubscriptionHelper } from "../raft-subscription-helpers";
|
|
18
|
+
import { getColourSensor, getLightSensor, getObjectSensor, getNoiseSensor, getRGBFromColourSensorVals, getHueChroma, getLightSenseValues, getObjectIsTouchingFromVals, getNoiseSenseValue, } from "./published-data-helpers";
|
|
19
|
+
var PublishedDataAnalyser = /** @class */ (function (_super) {
|
|
20
|
+
__extends(PublishedDataAnalyser, _super);
|
|
21
|
+
function PublishedDataAnalyser(marty) {
|
|
22
|
+
var _this = _super.call(this) || this;
|
|
23
|
+
_this.marty = marty;
|
|
24
|
+
_this.lightSenseDetection = new LightSenseDetection();
|
|
25
|
+
_this.colourSensedDetection = new ColourSensedDetection();
|
|
26
|
+
_this.objectSenseDetection = new ObjectSenseDetection();
|
|
27
|
+
_this.noiseSenseDetection = new NoiseSenseDetection();
|
|
28
|
+
_this.eventsMap = {
|
|
29
|
+
colourSensed: {
|
|
30
|
+
blue: "blue",
|
|
31
|
+
green: "green",
|
|
32
|
+
red: "red",
|
|
33
|
+
yellow: "yellow",
|
|
34
|
+
purple: "purple",
|
|
35
|
+
unclear: "unclear",
|
|
36
|
+
air: "air",
|
|
37
|
+
},
|
|
38
|
+
lightSense: {
|
|
39
|
+
high: "highLightSense",
|
|
40
|
+
mid: "midLightSense",
|
|
41
|
+
low: "lowLightSense",
|
|
42
|
+
none: "noLightSense",
|
|
43
|
+
},
|
|
44
|
+
objectSense: {
|
|
45
|
+
none: "noObjectSense",
|
|
46
|
+
near: "objectNear",
|
|
47
|
+
},
|
|
48
|
+
noiseSense: {
|
|
49
|
+
none: "noNoiseSense",
|
|
50
|
+
detected: "noiseDetected",
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
_this.connectedSensors = {
|
|
54
|
+
colourSensor: false,
|
|
55
|
+
lightSensor: false,
|
|
56
|
+
objectSensor: false,
|
|
57
|
+
noiseSensor: false,
|
|
58
|
+
};
|
|
59
|
+
_this.marty = marty;
|
|
60
|
+
_this.martyState = {
|
|
61
|
+
colourSensed: "unclear",
|
|
62
|
+
lightSense: "none",
|
|
63
|
+
objectSense: "none",
|
|
64
|
+
noiseSense: "none",
|
|
65
|
+
};
|
|
66
|
+
_this.pubSub = null;
|
|
67
|
+
_this.subscribeToPublishedData();
|
|
68
|
+
return _this;
|
|
69
|
+
}
|
|
70
|
+
PublishedDataAnalyser.prototype.subscribeToPublishedData = function () {
|
|
71
|
+
var _this = this;
|
|
72
|
+
this.pubSub = createRaftPubSubscriptionHelper(this.marty, this.marty.id);
|
|
73
|
+
this.pubSub.subscribe(function (data) {
|
|
74
|
+
_this.analyse(data.stateInfo);
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
PublishedDataAnalyser.prototype.unsubscribeFromPublishedData = function () {
|
|
78
|
+
var _a;
|
|
79
|
+
(_a = this.pubSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
|
|
80
|
+
};
|
|
81
|
+
PublishedDataAnalyser.prototype.analyse = function (data) {
|
|
82
|
+
if (!data)
|
|
83
|
+
return;
|
|
84
|
+
var colourSensor = getColourSensor(data);
|
|
85
|
+
var lightSensor = getLightSensor(data);
|
|
86
|
+
var objectSensor = getObjectSensor(data);
|
|
87
|
+
var noiseSensor = getNoiseSensor(data);
|
|
88
|
+
colourSensor &&
|
|
89
|
+
this.colourSensedDetection.detectColourSensed(getRGBFromColourSensorVals(colourSensor), this);
|
|
90
|
+
(objectSensor || colourSensor) &&
|
|
91
|
+
this.objectSenseDetection.detectObjectSense(getObjectIsTouchingFromVals(objectSensor, colourSensor), this);
|
|
92
|
+
lightSensor &&
|
|
93
|
+
this.lightSenseDetection.detectLightSense(getLightSenseValues(lightSensor), this);
|
|
94
|
+
noiseSensor &&
|
|
95
|
+
this.noiseSenseDetection.detectNoiseSense(getNoiseSenseValue(noiseSensor), this);
|
|
96
|
+
this.connectedSensors.colourSensor = !!colourSensor;
|
|
97
|
+
this.connectedSensors.lightSensor = !!lightSensor;
|
|
98
|
+
this.connectedSensors.objectSensor = !!objectSensor || !!colourSensor;
|
|
99
|
+
this.connectedSensors.noiseSensor = !!noiseSensor;
|
|
100
|
+
};
|
|
101
|
+
PublishedDataAnalyser.prototype.setColourSensed = function (colour) {
|
|
102
|
+
this.martyState.colourSensed = colour;
|
|
103
|
+
this.emit(this.eventsMap.colourSensed[colour]);
|
|
104
|
+
};
|
|
105
|
+
PublishedDataAnalyser.prototype.setLightSense = function (lightSense) {
|
|
106
|
+
this.martyState.lightSense = lightSense;
|
|
107
|
+
this.emit(this.eventsMap.lightSense[lightSense]);
|
|
108
|
+
};
|
|
109
|
+
PublishedDataAnalyser.prototype.setObjectSense = function (objectSense) {
|
|
110
|
+
this.martyState.objectSense = objectSense;
|
|
111
|
+
this.emit(this.eventsMap.objectSense[objectSense]);
|
|
112
|
+
};
|
|
113
|
+
PublishedDataAnalyser.prototype.setNoiseSense = function (noiseSense) {
|
|
114
|
+
this.martyState.noiseSense = noiseSense;
|
|
115
|
+
this.emit(this.eventsMap.noiseSense[noiseSense]);
|
|
116
|
+
};
|
|
117
|
+
return PublishedDataAnalyser;
|
|
118
|
+
}(EventEmitter));
|
|
119
|
+
var ColourSensedDetection = /** @class */ (function () {
|
|
120
|
+
function ColourSensedDetection() {
|
|
121
|
+
this.thresholds = [
|
|
122
|
+
{ hue: [0, 10], chroma: [50, 200], clear: [40, 150], name: "red" },
|
|
123
|
+
{ hue: [20, 50], chroma: [40, 300], clear: [100, 255], name: "yellow" },
|
|
124
|
+
{ hue: [85, 160], chroma: [5, 100], clear: [25, 150], name: "green" },
|
|
125
|
+
{ hue: [180, 220], chroma: [40, 230], clear: [55, 255], name: "blue" },
|
|
126
|
+
{ hue: [200, 320], chroma: [0, 40], clear: [25, 150], name: "purple" },
|
|
127
|
+
{ hue: [345, 361], chroma: [50, 200], clear: [40, 150], name: "red" },
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
ColourSensedDetection.prototype.detectColourSensed = function (_a, analyser) {
|
|
131
|
+
var r = _a.r, g = _a.g, b = _a.b, clear = _a.clear, air = _a.air;
|
|
132
|
+
if (air) {
|
|
133
|
+
return analyser.setColourSensed("air");
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
var _b = getHueChroma(r, g, b), hue = _b[0], chroma = _b[1];
|
|
137
|
+
for (var _i = 0, _c = this.thresholds; _i < _c.length; _i++) {
|
|
138
|
+
var colour = _c[_i];
|
|
139
|
+
if (colour.hue[0] <= hue &&
|
|
140
|
+
hue <= colour.hue[1] &&
|
|
141
|
+
colour.chroma[0] <= chroma &&
|
|
142
|
+
chroma <= colour.chroma[1] &&
|
|
143
|
+
colour.clear[0] <= clear &&
|
|
144
|
+
clear <= colour.clear[1]) {
|
|
145
|
+
return analyser.setColourSensed(colour.name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return analyser.setColourSensed("unclear");
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
return ColourSensedDetection;
|
|
152
|
+
}());
|
|
153
|
+
var LightSenseDetection = /** @class */ (function () {
|
|
154
|
+
function LightSenseDetection() {
|
|
155
|
+
this.lowLightThreshold = 30;
|
|
156
|
+
this.midLightThreshold = 250;
|
|
157
|
+
this.highLightThreshold = 500;
|
|
158
|
+
}
|
|
159
|
+
LightSenseDetection.prototype.detectLightSense = function (lightSenseValues, analyser) {
|
|
160
|
+
var lightSenseValue1 = lightSenseValues[0], lightSenseValue2 = lightSenseValues[1], lightSenseValue3 = lightSenseValues[2];
|
|
161
|
+
var avgLightSense = (lightSenseValue1 + lightSenseValue2 + lightSenseValue3) / 3;
|
|
162
|
+
if (avgLightSense >= this.highLightThreshold) {
|
|
163
|
+
analyser.setLightSense("high");
|
|
164
|
+
}
|
|
165
|
+
else if (avgLightSense >= this.midLightThreshold) {
|
|
166
|
+
analyser.setLightSense("mid");
|
|
167
|
+
}
|
|
168
|
+
else if (avgLightSense >= this.lowLightThreshold) {
|
|
169
|
+
analyser.setLightSense("low");
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
analyser.setLightSense("none");
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
return LightSenseDetection;
|
|
176
|
+
}());
|
|
177
|
+
var ObjectSenseDetection = /** @class */ (function () {
|
|
178
|
+
function ObjectSenseDetection() {
|
|
179
|
+
}
|
|
180
|
+
ObjectSenseDetection.prototype.detectObjectSense = function (objectSenseValue, analyser) {
|
|
181
|
+
if (objectSenseValue) {
|
|
182
|
+
analyser.setObjectSense("near");
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
analyser.setObjectSense("none");
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
return ObjectSenseDetection;
|
|
189
|
+
}());
|
|
190
|
+
var NoiseSenseDetection = /** @class */ (function () {
|
|
191
|
+
function NoiseSenseDetection() {
|
|
192
|
+
this.noiseThreshold = 300;
|
|
193
|
+
}
|
|
194
|
+
NoiseSenseDetection.prototype.detectNoiseSense = function (noiseSenseValue, analyser) {
|
|
195
|
+
if (noiseSenseValue > this.noiseThreshold) {
|
|
196
|
+
analyser.setNoiseSense("detected");
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
analyser.setNoiseSense("none");
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
return NoiseSenseDetection;
|
|
203
|
+
}());
|
|
204
|
+
export default PublishedDataAnalyser;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RICStateInfo, ROSSerialAddOnStatus } from "@robotical/roboticaljs";
|
|
2
|
+
export type ColourSensorValues = {
|
|
3
|
+
r: number;
|
|
4
|
+
g: number;
|
|
5
|
+
b: number;
|
|
6
|
+
clear: number;
|
|
7
|
+
air: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare const getColourSensor: (stateInfo: RICStateInfo) => ROSSerialAddOnStatus | null;
|
|
10
|
+
export declare const getRGBFromColourSensorVals: (status: ROSSerialAddOnStatus) => ColourSensorValues;
|
|
11
|
+
export declare const getHueChroma: (r: number, g: number, b: number) => [number, number];
|
|
12
|
+
export declare const getLightSensor: (stateInfo: RICStateInfo) => ROSSerialAddOnStatus | null;
|
|
13
|
+
export declare const getLightSenseValues: (status: ROSSerialAddOnStatus | null) => [number, number, number];
|
|
14
|
+
export declare const getObjectSensor: (stateInfo: RICStateInfo) => ROSSerialAddOnStatus | null;
|
|
15
|
+
export declare const getObjectIsTouchingFromVals: (obstacleStatus: ROSSerialAddOnStatus | null, colourStatus: ROSSerialAddOnStatus | null) => boolean;
|
|
16
|
+
export declare const getNoiseSensor: (stateInfo: RICStateInfo) => ROSSerialAddOnStatus | null;
|
|
17
|
+
export declare const getNoiseSenseValue: (status: ROSSerialAddOnStatus | null) => number;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { RIC_WHOAMI_TYPE_CODE_ADDON_COLOUR, RIC_WHOAMI_TYPE_CODE_ADDON_IRFOOT, RIC_WHOAMI_TYPE_CODE_ADDON_LIGHT, RIC_WHOAMI_TYPE_CODE_ADDON_NOISE, } from "@robotical/ricjs-robotical-addons/dist/RICRoboticalAddOns";
|
|
2
|
+
/* COLOUR SENSOR HELPERS */
|
|
3
|
+
export var getColourSensor = function (stateInfo) {
|
|
4
|
+
if (!stateInfo.addOnInfo || !stateInfo.addOnInfo.addons)
|
|
5
|
+
return null;
|
|
6
|
+
var colourSensor = stateInfo.addOnInfo.addons.find(function (addon) { return addon.whoAmI === RIC_WHOAMI_TYPE_CODE_ADDON_COLOUR; });
|
|
7
|
+
return colourSensor || null;
|
|
8
|
+
};
|
|
9
|
+
export var getRGBFromColourSensorVals = function (status) {
|
|
10
|
+
if (!status || !status.vals)
|
|
11
|
+
return { r: 0, g: 0, b: 0, clear: 0, air: false };
|
|
12
|
+
var BLUE_KEY_WORD = "Blue";
|
|
13
|
+
var GREEN_KEY_WORD = "Green";
|
|
14
|
+
var RED_KEY_WORD = "Red";
|
|
15
|
+
var CLEAR_KEY_WORD = "Clear";
|
|
16
|
+
var AIR_KEY_WORD = "Air";
|
|
17
|
+
var r = 0, g = 0, b = 0, clear = 0;
|
|
18
|
+
var air = false;
|
|
19
|
+
for (var key in status.vals) {
|
|
20
|
+
if (key.includes(RED_KEY_WORD)) {
|
|
21
|
+
r = status.vals[key];
|
|
22
|
+
}
|
|
23
|
+
else if (key.includes(GREEN_KEY_WORD)) {
|
|
24
|
+
g = status.vals[key];
|
|
25
|
+
}
|
|
26
|
+
else if (key.includes(BLUE_KEY_WORD)) {
|
|
27
|
+
b = status.vals[key];
|
|
28
|
+
}
|
|
29
|
+
else if (key.includes(CLEAR_KEY_WORD)) {
|
|
30
|
+
clear = status.vals[key];
|
|
31
|
+
}
|
|
32
|
+
else if (key.includes(AIR_KEY_WORD)) {
|
|
33
|
+
air = Boolean(status.vals[key]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { r: r, g: g, b: b, clear: clear, air: air };
|
|
37
|
+
};
|
|
38
|
+
export var getHueChroma = function (r, g, b) {
|
|
39
|
+
var maxVal = Math.max(r, g, b);
|
|
40
|
+
var minVal = Math.min(r, g, b);
|
|
41
|
+
var chroma = maxVal - minVal;
|
|
42
|
+
var hue = 0;
|
|
43
|
+
if (chroma === 0)
|
|
44
|
+
return [0, 0]; // avoid NaN when r=g=b
|
|
45
|
+
if (r > g && r > b) {
|
|
46
|
+
hue = (((g - b) / chroma) % 6) * 60;
|
|
47
|
+
}
|
|
48
|
+
else if (g > b) {
|
|
49
|
+
hue = ((b - r) / chroma + 2) * 60;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
hue = ((r - g) / chroma + 4) * 60;
|
|
53
|
+
}
|
|
54
|
+
if (hue < 0)
|
|
55
|
+
hue += 360;
|
|
56
|
+
return [hue, chroma];
|
|
57
|
+
};
|
|
58
|
+
/* END OF COLOUR SENSOR HELPERS */
|
|
59
|
+
/* LIGHT SENSOR HELPERS */
|
|
60
|
+
export var getLightSensor = function (stateInfo) {
|
|
61
|
+
if (!stateInfo.addOnInfo || !stateInfo.addOnInfo.addons)
|
|
62
|
+
return null;
|
|
63
|
+
var lightSensor = stateInfo.addOnInfo.addons.find(function (addon) { return addon.whoAmI === RIC_WHOAMI_TYPE_CODE_ADDON_LIGHT; });
|
|
64
|
+
return lightSensor || null;
|
|
65
|
+
};
|
|
66
|
+
export var getLightSenseValues = function (status) {
|
|
67
|
+
if (!status || !status.vals)
|
|
68
|
+
return [0, 0, 0];
|
|
69
|
+
var readings = [];
|
|
70
|
+
for (var key in status.vals) {
|
|
71
|
+
readings.push(status.vals[key]);
|
|
72
|
+
}
|
|
73
|
+
return readings;
|
|
74
|
+
};
|
|
75
|
+
/* END OF LIGHT SENSOR HELPERS */
|
|
76
|
+
/* OBJECT SENSOR HELPERS */
|
|
77
|
+
export var getObjectSensor = function (stateInfo) {
|
|
78
|
+
if (!stateInfo.addOnInfo || !stateInfo.addOnInfo.addons)
|
|
79
|
+
return null;
|
|
80
|
+
var objectSensor = stateInfo.addOnInfo.addons.find(function (addon) { return addon.whoAmI === RIC_WHOAMI_TYPE_CODE_ADDON_IRFOOT; });
|
|
81
|
+
return objectSensor || null;
|
|
82
|
+
};
|
|
83
|
+
export var getObjectIsTouchingFromVals = function (obstacleStatus, colourStatus) {
|
|
84
|
+
// if either the ir from the ir or the colour sensors indicate touching, return true
|
|
85
|
+
var isTouching = false;
|
|
86
|
+
var TOUCHING_KEY_WORD = "Touch";
|
|
87
|
+
if (obstacleStatus && obstacleStatus.vals) {
|
|
88
|
+
for (var key in obstacleStatus.vals) {
|
|
89
|
+
if (key.endsWith(TOUCHING_KEY_WORD)) {
|
|
90
|
+
isTouching = isTouching || Boolean(obstacleStatus.vals[key]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (colourStatus && colourStatus.vals) {
|
|
95
|
+
for (var key in colourStatus.vals) {
|
|
96
|
+
if (key.endsWith(TOUCHING_KEY_WORD)) {
|
|
97
|
+
isTouching = isTouching || Boolean(colourStatus.vals[key]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return isTouching;
|
|
102
|
+
};
|
|
103
|
+
/* END OF OBJECT SENSOR HELPERS */
|
|
104
|
+
/* NOISE SENSOR HELPERS */
|
|
105
|
+
export var getNoiseSensor = function (stateInfo) {
|
|
106
|
+
if (!stateInfo.addOnInfo || !stateInfo.addOnInfo.addons)
|
|
107
|
+
return null;
|
|
108
|
+
var noiseSensor = stateInfo.addOnInfo.addons.find(function (addon) { return addon.whoAmI === RIC_WHOAMI_TYPE_CODE_ADDON_NOISE; });
|
|
109
|
+
return noiseSensor || null;
|
|
110
|
+
};
|
|
111
|
+
export var getNoiseSenseValue = function (status) {
|
|
112
|
+
if (!status || !status.vals)
|
|
113
|
+
return 0;
|
|
114
|
+
var NOISE_KEY_WORD = "HighestSinceLastReading";
|
|
115
|
+
for (var key in status.vals) {
|
|
116
|
+
if (key.includes(NOISE_KEY_WORD)) {
|
|
117
|
+
return status.vals[key];
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return 0;
|
|
121
|
+
};
|
|
122
|
+
/* END OF NOISE SENSOR HELPERS */
|