Skip to content
Snippets Groups Projects
Commit 9a36e63d authored by echicken's avatar echicken :chicken:
Browse files

Don't send heartbeat if we've written something within the heartbeat interval....

Don't send heartbeat if we've written something within the heartbeat interval. (This didn't solve my problem anyway so might be best to just move heartbeat back to SerialDevice exclusively.)
parent a9361a5a
No related branches found
No related tags found
No related merge requests found
...@@ -35,7 +35,7 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -35,7 +35,7 @@ export default abstract class Device extends js.global.EventEmitter {
private readyEvent: number; private readyEvent: number;
private heartbeatInterval: number; private heartbeatInterval: number;
private heartbeatEvent: number; private heartbeatEvent: number;
private lastHeartbeat?: number; private lastWrite: number;
private initTime: number; private initTime: number;
private initTimeout: number; private initTimeout: number;
private readonly timeoutMs: number = RESPONSE_TIMEOUT * 1000; private readonly timeoutMs: number = RESPONSE_TIMEOUT * 1000;
...@@ -58,8 +58,9 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -58,8 +58,9 @@ export default abstract class Device extends js.global.EventEmitter {
this.ackHandlers = {}; this.ackHandlers = {};
this.responseHandlers = {}; this.responseHandlers = {};
this.purgeEvent = js.setInterval(this.purgeHandlers, this.timeoutMs, this); this.purgeEvent = js.setInterval(this.purgeHandlers, this.timeoutMs, this);
this.heartbeatInterval = heartbeatInterval; this.heartbeatInterval = heartbeatInterval * 1000;
this.heartbeatEvent = -1; this.heartbeatEvent = -1;
this.lastWrite = Date.now();
this.initTime = Date.now(); this.initTime = Date.now();
this.initTimeout = CONNECT_TIMEOUT * 1000; this.initTimeout = CONNECT_TIMEOUT * 1000;
} }
...@@ -126,10 +127,7 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -126,10 +127,7 @@ export default abstract class Device extends js.global.EventEmitter {
if (!this.ready && now - this.initTime > this.initTimeout) this.error(`initialization timeout (configCompleteId not received from device)`); if (!this.ready && now - this.initTime > this.initTimeout) this.error(`initialization timeout (configCompleteId not received from device)`);
this.read(); this.read();
this.purgeHandlers(); this.purgeHandlers();
if (this.lastHeartbeat === undefined || now - this.lastHeartbeat >= this.heartbeatInterval) {
this.lastHeartbeat = now;
this.sendHeartbeat(); this.sendHeartbeat();
}
this._cycle(); this._cycle();
} }
...@@ -187,7 +185,7 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -187,7 +185,7 @@ export default abstract class Device extends js.global.EventEmitter {
if (this.readyEvent > -1) js.clearTimeout(this.readyEvent); if (this.readyEvent > -1) js.clearTimeout(this.readyEvent);
this.emit('ready'); this.emit('ready');
// @ts-expect-error shut up // @ts-expect-error shut up
this.heartbeatEvent = js.setInterval(function () { this.sendHeartbeat(); }, 30000, this) this.heartbeatEvent = js.setInterval(function () { this.sendHeartbeat(); }, this.heartbeatInterval, this)
} }
break; break;
case 'metadata': case 'metadata':
...@@ -278,7 +276,9 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -278,7 +276,9 @@ export default abstract class Device extends js.global.EventEmitter {
if (data.length > MAXLEN) this.error(`write: packet length ${data.length} exceeds maximum length ${MAXLEN}`); if (data.length > MAXLEN) this.error(`write: packet length ${data.length} exceeds maximum length ${MAXLEN}`);
const header = [START1, START2, (data.length>>8)&0xFF, data.length&0xFF]; const header = [START1, START2, (data.length>>8)&0xFF, data.length&0xFF];
const buffer = new Uint8Array([...header, ...data]); const buffer = new Uint8Array([...header, ...data]);
return this.sendToDevice(buffer); const res = this.sendToDevice(buffer);
if (res) this.lastWrite = Date.now();
return res;
} }
/** Assembles a [MeshPacket](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.MeshPacket) based on your parameters and writes it to the device. */ /** Assembles a [MeshPacket](https://buf.build/meshtastic/protobufs/docs/main:meshtastic#meshtastic.MeshPacket) based on your parameters and writes it to the device. */
...@@ -584,6 +584,7 @@ export default abstract class Device extends js.global.EventEmitter { ...@@ -584,6 +584,7 @@ export default abstract class Device extends js.global.EventEmitter {
/** You probably don't need to call this directly. It's only really needed for SerialDevice, and is handled there for you even in synchronous scripts. */ /** You probably don't need to call this directly. It's only really needed for SerialDevice, and is handled there for you even in synchronous scripts. */
sendHeartbeat(): void { sendHeartbeat(): void {
if (Date.now() - this.lastWrite < this.heartbeatInterval) return;
const toRadio: protobuf.Mesh.ToRadio = new protobuf.Mesh.ToRadio({ const toRadio: protobuf.Mesh.ToRadio = new protobuf.Mesh.ToRadio({
payloadVariant: { payloadVariant: {
case: 'heartbeat', case: 'heartbeat',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment