-
Notifications
You must be signed in to change notification settings - Fork 2
/
clock-generator.js
60 lines (50 loc) · 1.61 KB
/
clock-generator.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
module.exports = RED => {
RED.nodes.registerType( 'clock-generator', function( config ) {
RED.nodes.createNode( this, config );
let timeout;
let timestamp;
const getPayload = value => config.output == 1 ? !value ? false : true : !value ? 0 : 1;
const setStatus = ( value, flash ) => {
if( timestamp === 0 ) {
this.status( { fill: 'grey', shape: 'dot', text: 'inactive' } );
} else if( flash ) {
this.status( { fill: 'green', shape: 'dot', text: `active: ${ getPayload( value ) } / ${ getPayload( !value ) }` } );
setTimeout( setStatus, 250, value, false );
} else {
this.status( { fill: 'grey', shape: 'dot', text: `active: ${ getPayload( value ) } / ${ getPayload( !value ) }` } );
}
};
const start = () => {
if( timestamp === 0 ) {
timestamp = new Date().getTime();
update( true );
}
};
const stop = () => {
if( timestamp !== 0 ) {
timestamp = 0;
update( false );
}
};
const update = value => {
msg = {
name: config.name,
topic: config.topic,
payload: getPayload( value ),
timestamp: new Date().getTime()
};
setStatus( value, true );
this.send( [ msg, { ...msg, payload: getPayload( !value ) } ] );
if( timestamp !== 0 ) {
while( timestamp <= msg.timestamp ) timestamp += config.period * 500;
timeout = setTimeout( update, timestamp - msg.timestamp, !value );
} else {
clearTimeout( timeout );
}
};
timestamp = !config.init ? 0 : 1;
!config.init ? setStatus() : this.emit( 'input', { payload: false } );
this.on( 'input', msg => msg.payload ? start() : stop() );
this.on( 'close', stop );
} );
};