From 7ed70dcf0fa3fbbf995f17a5c5a62df211312a25 Mon Sep 17 00:00:00 2001 From: banboobee Date: Sat, 13 Aug 2022 13:22:08 +0900 Subject: [PATCH] Serialize the simultaneous commands. --- helpers/getDevice.js | 3 +++ helpers/sendData.js | 12 +++++++----- package.json | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/helpers/getDevice.js b/helpers/getDevice.js index f1e43162..0e99e87f 100644 --- a/helpers/getDevice.js +++ b/helpers/getDevice.js @@ -2,6 +2,7 @@ const ping = require('ping'); const broadlink = require('./broadlink'); const delayForDuration = require('./delayForDuration'); const dgram = require('dgram'); +const Mutex = require('await-semaphore').Mutex; const pingFrequency = 5000; const keepAliveFrequency = 90000; @@ -100,6 +101,8 @@ const discoverDevices = (automatic = true, log, logLevel, deviceDiscoveryTimeout const addDevice = (device) => { if (!device.isUnitTestDevice && (discoveredDevices[device.host.address] || discoveredDevices[device.host.macAddress])) {return;} + device.mutex = new Mutex(); + discoveredDevices[device.host.address] = device; discoveredDevices[device.host.macAddress] = device; } diff --git a/helpers/sendData.js b/helpers/sendData.js index 62c1609e..3199817e 100644 --- a/helpers/sendData.js +++ b/helpers/sendData.js @@ -3,7 +3,7 @@ const assert = require('assert') const { getDevice } = require('./getDevice'); const convertProntoCode = require('./convertProntoCode') -module.exports = ({ host, hexData, log, name, logLevel }) => { +module.exports = async ({ host, hexData, log, name, logLevel }) => { assert(hexData && typeof hexData === 'string', `\x1b[31m[ERROR]: \x1b[0m${name} sendData (HEX value is missing)`); // Check for pronto code @@ -28,8 +28,10 @@ module.exports = ({ host, hexData, log, name, logLevel }) => { if (!device.sendData) {return log(`\x1b[31m[ERROR] \x1b[0mThe device at ${device.host.address} (${device.host.macAddress}) doesn't support the sending of IR or RF codes.`);} if (hexData.includes('5aa5aa555')) {return log(`\x1b[31m[ERROR] \x1b[0mThis type of hex code (5aa5aa555...) is no longer valid. Use the included "Learn Code" accessory to find new (decrypted) codes.`);} - const hexDataBuffer = new Buffer(hexData, 'hex'); - device.sendData(hexDataBuffer, logLevel, hexData); - - if (logLevel <=2) {log(`${name} sendHex (${device.host.address}; ${device.host.macAddress}) ${hexData}`);} + await device.mutex.use(async () => { + const hexDataBuffer = new Buffer(hexData, 'hex'); + device.sendData(hexDataBuffer, logLevel, hexData); + + if (logLevel <=2) {log(`${name} sendHex (${device.host.address}; ${device.host.macAddress}) ${hexData}`);} + }); } diff --git a/package.json b/package.json index d21e4b4d..e7bce6ac 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,8 @@ "node-persist": ">=2.1.0 <3.0.0", "semver": "^7.3.6", "node-arp": "^1.0.6", - "fakegato-history": "^0.6.3" + "fakegato-history": "^0.6.3", + "await-semaphore": "^0.1.3" }, "devDependencies": { "eslint": "^8.12.0",