Свершилось!
https://rutube.ru/video/a2e5ef51a04f...2e5737beef343/
Вид для печати
В общем, как выяснилось, не все мыши одинаково полезны. Несмотря на то, что протокол вроде как один, но мыши ведут себя по-разному. То есть, есть некоторые стандартны, но их несколько. У меня из 4-х мышей заработали только 2 со стандартной ардуиновской библиотекой. Перепробовал несколько. Одна из них подтянула ещё одну мышь. Но одна мышь вот просто ни в какую! Это A4Tech OP-720. И что интересно, это абсолютный новодел, который я копил может быть с год назад, и у него на хвосте именно разъём PS/2. Эта мышь прекрасно работает в режиме STREAM (когда она сама генерирует передачу данных), но шлёт нули в режиме REMOTE (когда отвечает на запросы). Для нашего случая STREAM не годится, нужен именно REMOTE. Что я только не делал, и какие эксперименты только не ставил - не отдаёт дельты и кнопки, но при этом отдаёт статус и колесо. В итоге накопал инфу, что частенько мыши A4Tech и некоторые другие капризны к протоколу, и нужно вбивать костыли, чтобы добиться от них данных. Однако есть прекрасный альтернативный способ, который называется "STREAM-triggered REMOTE", когда на время запроса мышь кратковременно переводится в STREAM, получаются данные и потом снова блокируется от неё передача. Так сделано для капризных мышей в ранних драйверах Linux. В итоге мне удалось завести все имеющиеся у меня мыши. Ну как удалось? Они все шлют корректные дельты, кнопки и колесо в консоль для визуального контроля. Но совместить эту логику с протоколом Специалиста у меня не получается - отваливаются две моих мыши. Обе MicroSoft Explorer: одна 3.0A, вторая 4.0. Это особый род мышей с наворотами, которые требуют отдельной "магической" последовательности разрешения (200, 100, 80), чтобы перевести их в стандартный режим. И такая инициализация проходит, и в консоль отправляются правильные данные, но не в Специалист. Честно говоря, я уже устал. Поэтому хотел бы в личке пообщаться с кем-то, кто хорошо шарит в С/C++ и сможет помочь понять, что не так.
Ладно, понимаю, что придётся всё решать самому. Просто поделюсь тем, что накопал.
В нашем случае можно накостылить что-то со STREAM-режимом, но решение получается совершенно нестабильным. Сбивается синхронизация обмена с мышью, потому что всё время приходится отвлекаться на передачу данных в Специалист. Эта передача ломает тайминги протокола PS/2. В результате приходят битые пакеты. Валидировать можно только принимаемый байт. А отследить начало пакета нет никакой возможность, потому что начало пакета никак не помечается, при этом поток данных идёт непрерывно. Можно лишь по каким-то косвенным данным ПРЕДПОЛАГАТЬ, что вот это и есть начало нового пакета. Я пробовал разные методы. Например, мы знаем, что в байте статуса 3-й бит всегда должен быть 1, и что колесо не может передавать значения больше, чем +3 и меньше, чем -3. Плюс ещё можно сравнивать с предыдущими значениями и т.д. Какие-то из фильтров дают более-менее приемлемый результат, но по итогу всё равно проскакивают ошибочные пакеты, которые похожи на настоящие (проходят сквозь фильтры), но таковыми не являются. А это значит, что бывают случайные нажатия кнопок и/или перескакивания мыши. На текущий момент у меня закончились мысли, как сделать стабильный опрос мышей в режиме STREAM. А это значит, что моя единственная мышь A4Tech OP-720 с разъёмом PS/2 не будет работать. И не потому что я её как-то не так инициализирую и опрашиваю, а потому что она так устроена. Выяснилось, что есть и другие мыши с подобным поведением, и не только у A4Tech. Необходимо это иметь ввиду.
Хорошая новость в том, что если мышь полноценно поддерживает REMOTE-режим, то её можно заставить стабильно работать со Специалистом. Три остальных своих мыши (USB/PS2) я работать заставил. Никаких случайных нажатий кнопок, никакого дрожания курсора. Потребовались небольшие доработки в скетче и драйвере на Специалисте.
Но отмечу, что мышью на Специалисте всё-таки комфортно пользоваться не получится. Разрешение у экрана Специалиста мелкое, а мышь реагирует на минимальное перемещение и выдаёт сразу большую дельту. В итоге очень сложно точно позиционировать курсор. Для тестирования мыши я написал несколько тестов и игру Сапёр. В Сапёре довольно сложно попасть у нужную ячейку - мышь постоянно перескакивает. Я, безусловно, первым делом попробовал делить на два принимаемую дельту. Мышь стала ленивой, и стало получше, но всё равно до уровня комфорта на обычном компьютере не дотягивает.
Вот такие дела...
раньше такое делали на PIC`е. например PIC16F628A
https://devstratum.ru/hardware/amiga...ivka-fdd-gotek