-
Notifications
You must be signed in to change notification settings - Fork 234
/
hc-sr04.js
122 lines (101 loc) · 2.94 KB
/
hc-sr04.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
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
/*
* Copyright (c) 2022-2023 Moddable Tech, Inc.
*
* This file is part of the Moddable SDK Runtime.
*
* The Moddable SDK Runtime is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Moddable SDK Runtime is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Moddable SDK Runtime. If not, see <http://www.gnu.org/licenses/>.
*
*/
/*
HC-SR04 Sonic Range Finder
*/
import Timer from "timer";
class Sensor {
#input;
#output;
#timer;
#reading = {
near: false,
distance: null,
max: 400
}
#onAlert;
#readingStale = true;
#suppressDuplicates = false;
constructor(options){
const {trigger, sensor, onAlert} = options;
this.#onAlert = onAlert;
this.#input = new sensor.io({
pin: sensor.pin,
edges: sensor.io.RisingToFalling,
mode: sensor.io.InputPullDown,
onReadable: () => this.#onEcho()
});
if (trigger !== undefined) {
this.#output = new trigger.io({
mode: trigger.io.Output,
pin: trigger.pin
});
this.configure({interval: 500, suppressDuplicates: true});
}
}
configure(options = {}){
const {interval, suppressDuplicates} = options;
if (undefined !== interval) {
if (this.#output === undefined)
throw new Error("Configuring interval is only available on instances constructed with a trigger pin.");
Timer.clear(this.#timer);
this.#timer = undefined;
if (interval !== 0) {
this.#timer = Timer.repeat(() => {
this.#output.write(1);
this.#output.write(0);
}, interval);
}
}
if (undefined !== suppressDuplicates) {
this.#suppressDuplicates = suppressDuplicates;
}
}
sample(){
if (!this.#readingStale) {
this.#readingStale = true;
return this.#reading;
}
return undefined;
}
close() {
Timer.clear(this.#timer);
this.#timer = undefined;
this.#input?.close()
this.#output?.close();
this.#input = this.#output = undefined;
}
#onEcho() {
const value = this.#input.read();
this.#readingStale = false;
if (value > 35000) {
const doAlert = (!(this.#suppressDuplicates) || (this.#reading.near !== false));
this.#reading.near = false;
this.#reading.distance = null;
if (doAlert)
this.#onAlert?.();
} else {
this.#reading.near = true;
this.#reading.distance = value / 58;
this.#onAlert?.();
}
}
}
export default Sensor;