И еще вопрос про робота на javascript. Задача - осуществление определенных действий по нажатию определенной последовательности кнопок на пульте (сын пароль хочет). Понятно, что нужную последовательность кодов кнопок необходимо записать в массив и потом сравнить его с фактической последовательностью. Проблема в том, что ИК приемник считал код кнопки и забыл. И я вот читаю массивы, читаю примеры создания форм для идентификации, но никак не соображу, как заставить устройство запоминать последовательность нажатий для ее последующего сравнения. В какую сторону хоть копать?
2018-01-07 01:43:54

Участники:
@karapuz - 3, @infidel - 3, @Ilya-S-Zharskiy - 1, @rkit - 1

@rkit
Всю последовательность не надо запоминать. Достаточно сравнивать по мере ввода.
#2894081/1 2018-01-07 01:59:20
@infidel
Не, ну по идее же у тебя какой то эвент на обработку любой команды с пульта есть? В нем помимо основной работы в первую очередь клади в массив нажатую кнопку. А потом в этом же или в другом эвенте (например по таймеру или по idle) проверяй, совпал ли массив с эталоном и если да - массив зачистить/испортить, действие выполнить. Я не очень понимаю контекст, но из общих соображений как то так бы делал.
#2894081/2 2018-01-07 02:34:04
@infidel
P.S. для твоих целей в js лучше всего подойдёт очередь, queue. Через .push кидаешь в хвост очереди новый код кнопки, тут же проверяешь ее длину и если она больше требуемой - через .shift убиваешь самый старый код из начала. Так будет проще всего потом сравнивать с эталоном - у тебя в очереди будут постоянно жить Х последних кодов кнопок по порядку их нажатия. https://stackoverflow.com/a/1590262
#2894081/3 2018-01-07 02:42:32
@karapuz
Спасибо, кажется понял. Теперь буду пробовать реализовать.
#2894081/4 → /3 2018-01-07 02:47:33
@karapuz
А контекст происходящего вот :) http://wiki.amperka.ru/robot
#2894081/5 → /2 2018-01-07 02:50:57
@Ilya-S-Zharskiy
А зачем изобретать велосипед с квадратными колёсами Научитесь английскому и гуглению, а все "пароли" давно уже реализованы Переучиваться потом сыну дороже выйдет
#2894081/6 → /4 2018-01-07 08:28:05
@karapuz
В общем я тут что-то написал. По задумке должна загораться лампочка при нажатии последовательности из двух кнопок (в массиве pass). В итоге массив press заполняется, его длинна не более двух кодов кнопок, но вот лампочка загорается не при нажатии определенных кнопок в определенной последовательности, а при нажатии любой из нужных кнопок. Видимо я как-то не так сравниваю массивы, но сам что-то не могу дойти. Помогите var receiver = require('@amperka/ir-receiver') .connect(P3); var projector = require('@amperka/led').connect(P2); var press = []; var pass = [378077439, 378126399]; receiver.on('receive', function(code) { press.push (code);{ if (press.length > 2) { press.shift(); for (var i = 0; i < press.length; i++) { if (press [i] == pass [i]) { projector.turnOn(); } } } } });
#2894081/7 2018-01-07 15:36:26
@infidel
У тебя в цикле сравнения лампочка загорается как только совпали первые два элемента массивов. И дальше пытается загореться повторно для каждой совпадающей пары. Я не знаю есть ли в js функция непосредственного сравнения массивов, но если нет - то надо использовать переменную-флаг. Перед началом цикла сравнения выставляем флаг в true, а дальше в цикле если обнаружили НЕсовпадение пары элементов массивов - сбрасываем его в false (и можем валить из цикла через break, чтобы не тратить время зря на ненужную проверку дальше). После цикла проверяем, что флаг остался true, если да - массивы совпадают, можно жечь лампу. P.S. и я бы вынес этот цикл сравнения из под условия на проверку длины массива, в тело обработчика события. А то у тебя он срабатывает сейчас только если длина массива превысила 2, т.е. только если код был набран не сразу, а перед ним что то ещё было нажато.
#2894081/8 → /7 2018-01-07 23:49:08