#c #avr #hid #atmega #custom-keyboard
#c #avr #hid #atmega #пользовательская клавиатура
Вопрос:
Я только начал программировать свой ATmega8 с помощью V-USB link: https://www.obdev.at/products/vusb/index.html . Я пытаюсь сделать так, чтобы клавиатура witch нажимала CTRL ALT. Для этого я изменил одну из ссылок проекта «СКРЫТЫЕ клавиши»: https://www.obdev.at/products/vusb/hidkeys.html . Я добавил и изменил:
//line 150, added definitions
#define KEY_DELETE 42
#define ALT_RIG 230
#define ALT_LEF 226
#define CTRL_LEF 224
(У меня есть значения определений с этой стороны: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf (со страницы 53))
//line 204, modified code
static const uchar keyReport[NUM_KEYS 1][2] PROGMEM = {
/* none */ {0, 0}, /* no key pressed */
/* 1 */ {0, KEY_A},
/* 2 */ {0, KEY_B},
/* 3 */ {0, KEY_C},
/* 4 */ {0, KEY_D},
/* 5 */ {0, KEY_E},
/* 6 */ {0, KEY_F},
/* 7 */ {0, KEY_G},
/* 8 */ {0, KEY_H},
/* 9 */ {0, KEY_I},
/* 10 */ {0, 0},
/* 11 */ {0, 0},
/* 12 */ {MOD_CONTROL_LEFT, ALT_RIG}, //CTRL ALT
/* 13 */ {0, KEY_J},
/* 14 */ {0, KEY_K},
/* 15 */ {0, KEY_L},
/* 16 */ {0, KEY_M},
/* 17 */ {0, KEY_N},
};
По какой-то причине «нажатие» клавиш (CTRL ALT) с помощью uC (ATmega8) не работает. (Я проверяю это, одновременно нажимая (когда клавиши из uC (должны быть нажаты)) клавишу DEL на моей «истинной» клавиатуре — тогда должно появиться «характерное» окно управления системой (Windows 7).) Я понятия не имею, почему это не работает. Как я могу это сделать, чтобы мой uC нажимал CTRL ALT?
Ответ №1:
Дескриптор отчета в примере программы определяет 2-байтовый отчет для представления одного нажатия клавиши. Первый байт содержит 8 бит, каждый из которых представляет модификатор ключа (левый ctrl, правый alt, сдвиг влево и т.д.), А следующий байт — это индекс, представляющий использование ключа (клавиша A, клавиша B, клавиша Delete и т.д.).
Вам нужно логически ИЛИ желаемые ключевые модификаторы в первом байте. Самый простой способ — просто сложить их вместе. Например, для отправки Ctrl Alt Delete вы могли бы закодировать:
{MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE}
Не забудьте впоследствии отправить {0, 0}, чтобы указать, что в данный момент не нажаты никакие клавиши.
Комментарии:
1. Это работает! Спасибо за помощь. Во время программирования мне приходит в голову одна вещь. Можно щелкнуть по всей последовательности CTRL ALT DEL, чтобы отобразить «синее» окно на ПК? Я пытался ее закодировать, но безрезультатно…
2. О, я написал неправильно. Я имею в виду, что ctrl alt работают (потому что, когда я нажимаю del на моей реальной клавиатуре, появляется синее окно), но вся последовательность ctrl alt del (
{MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE}
) не работает (синее окно не появляется). Более того, когда в коде есть только del ({0, KEY_DELETE}
), кнопка del работает исправно. Только если в коде похоже{MOD_CONTROL_LEFT MOD_ALT_LEFT, KEY_DELETE}
, что это не работает как «настоящие» ctrl alt delete. Я пробовал много модификаций этого кода, но это не работает. Что я могу с этим сделать?3. Я подозреваю, что какая-то ошибка Windows, потому что, когда я говорю своей самодельной USB-клавиатуре отправить ctrl alt delete в мою систему Ubuntu 20.10 Linux, она ведет себя так, как ожидалось. Вы должны помнить, чтобы отпустить клавиши, отправив {0,0}, хотя — в противном случае ОС будет думать, что вы постоянно нажимаете эти клавиши.
4. Итак, я попробовал Win7, Win8, Win10, MS Server 2016 и новейшую Ubuntu, а ctrl alt del от uC не работает ни на одной из этих ОС. Я понятия не имею, почему она не работает. В любом случае, большое вам спасибо за помощь.