вызов кода
Дано
Дан промышленный протокол со следующей операцией чтения
/ *** операция чтения из определенного количества байтов, начиная с заданной позиции
и выполняет предоставленный обратный вызов с полезной нагрузкой чтения
@ param startстартовый регистр
@ длина параметра количество байтов для чтения (важно: максимальная длина равна 10!)
@ param callback обратный вызов получаетсчитывать полезную нагрузку типа Buffer в качестве параметра * /
industrialProtocol.read(start, length, callback)
e.g. industrialProtocol.read(3, 1, callback) => callback(err, payload)
Функция чтения обеспечивает доступ к сегменту данных любого устройства с этим протоколом.
Предполагается сегмент данныхс 4096 байтами представляется следующим образом: сегмент данных 0 1 2 3 4…. 4096 байт
Реализация
Пожалуйста, реализуйте алгоритм, который считывает несколько значений с устройства и передает его соответствующим функциям обратного вызова наиболее эффективным способом. Созданная вами функция должна легко использоваться, например, в ситуации, когда выполняется регулярный опрос по интересующим регистрам. Мы считаем функцию чтения медленной и дорогой, поэтому постараемся свести к минимуму количество обращений к функции чтения и объединить несколько операций чтения в меньшее число.
/ ** * *
* @param inputList List of values to read: [{3, 2, callbackA}, {4, 1,
callbackB}]
* [{start, length, callback}, ….]
*/
yourFunction(inputList)
Example aggregation:
inputList = [{3, 1, cb1}, {4, 1, cb2}]
➔ industrialProtocol.read(3, 1, cb1) & industrialProtocol.read(4, 1, cb2)
➔ Aggregation: industrialProtocol.read(3, 2) ➔ cb1(payload1) & cb2(payload2)
Убедитесь, что каждый обратный вызов вызывается с правильной полезной нагрузкой.
Мое решение для агрегированного чтения:
exports.getAggregateRead = (inputList) => {
// var inputList = [{start: 3, length: 1 }, { start: 4, length: 8}];
var startRegisterArray = inputList.map(input => {
return input.start;
});
var endRegisterArray = inputList.map(input => {
return input.start + input.length;
});
var aggregrateRead = {};
aggregrateRead.start = Math.min(...startRegisterArray);
aggregrateRead.length = Math.max(...endRegisterArray) - aggregrateRead.start;
return aggregrateRead;
}
Однако я не знаком с буферами Node.js и незнать, как приступить к следующим шагам. Любые выводы будут полезны.
Я уже провалил вызов кода, так что это не обман, а скорее подготовка к следующему.