static uint8_t kbuf_head = 0;
static uint8_t kbuf_tail = 0;
+typedef struct {
+ uint8_t modifier;
+ uint8_t reserved;
+ uint8_t keycode[6];
+} keyboard_report_t;
+
+static keyboard_report_t keyboard_report; // sent to PC
/* transfer keyboard report from buffer */
void vusb_transfer_keyboard(void)
if (usbInterruptIsReady()) {
if (kbuf_head != kbuf_tail) {
usbSetInterrupt((void *)&kbuf[kbuf_tail], sizeof(report_keyboard_t));
- if (!debug_keyboard) {
- print("keys: ");
- for (int i = 0; i < REPORT_KEYS; i++) { phex(kbuf[kbuf_tail].keys[i]); print(" "); }
- print(" mods: "); phex((kbuf[kbuf_tail]).mods); print("\n");
- }
kbuf_tail = (kbuf_tail + 1) % KBUF_SIZE;
+ if (debug_keyboard) {
+ print("V-USB: kbuf["); pdec(kbuf_tail); print("->"); pdec(kbuf_head); print("](");
+ phex((kbuf_head < kbuf_tail) ? (KBUF_SIZE - kbuf_tail + kbuf_head) : (kbuf_head - kbuf_tail));
+ print(")\n");
+ }
}
}
}
} else {
debug("kbuf: full\n");
}
+
+ // NOTE: send key strokes of Macro
+ usbPoll();
+ vusb_transfer_keyboard();
}
}
}
-/*
+
typedef struct {
- uint8_t report_id;
- uint8_t data0;
- uint8_t data1;
-} __attribute__ ((packed)) vusb_system_report_t;
-*/
+ uint8_t report_id;
+ uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
static void send_system(uint16_t data)
{
-/*
- // Not need static?
- static uint8_t report[] = { REPORT_ID_SYSTEM, 0, 0 };
- report[1] = data&0xFF;
- report[2] = (data>>8)&0xFF;
-*/
-/*
- vusb_system_report_t r = {
+ static uint16_t last_data = 0;
+ if (data == last_data) return;
+ last_data = data;
+
+ report_extra_t report = {
.report_id = REPORT_ID_SYSTEM,
- .data0 = data&0xFF,
- .data1 = (data>>8)&0xFF
+ .usage = data
};
if (usbInterruptIsReady3()) {
- usbSetInterrupt3((void *)&r, sizeof(vusb_system_report_t));
+ usbSetInterrupt3((void *)&report, sizeof(report));
}
-*/
}
static void send_consumer(uint16_t data)
if (data == last_data) return;
last_data = data;
- // Not need static?
- static uint8_t report[] = { REPORT_ID_CONSUMER, 0, 0 };
- report[1] = data&0xFF;
- report[2] = (data>>8)&0xFF;
+ report_extra_t report = {
+ .report_id = REPORT_ID_CONSUMER,
+ .usage = data
+ };
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&report, sizeof(report));
}
if(rq->bRequest == USBRQ_HID_GET_REPORT){
debug("GET_REPORT:");
/* we only have one report type, so don't look at wValue */
- usbMsgPtr = (void *)keyboard_report_prev;
- return sizeof(*keyboard_report_prev);
+ usbMsgPtr = (void *)&keyboard_report;
+ return sizeof(keyboard_report);
}else if(rq->bRequest == USBRQ_HID_GET_IDLE){
debug("GET_IDLE: ");
//debug_hex(vusb_idle_rate);
*
* from an example in HID spec appendix
*/
-PROGMEM uchar keyboard_hid_report[] = {
+const PROGMEM uchar keyboard_hid_report[] = {
0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x06, // Usage (Keyboard),
0xA1, 0x01, // Collection (Application),
* http://www.keil.com/forum/15671/
* http://www.microsoft.com/whdc/device/input/wheel.mspx
*/
-PROGMEM uchar mouse_hid_report[] = {
+const PROGMEM uchar mouse_hid_report[] = {
/* mouse */
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
* contains: device, interface, HID and endpoint descriptors
*/
#if USB_CFG_DESCR_PROPS_CONFIGURATION
-PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
+const PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
9 + (9 + 9 + 7) + (9 + 9 + 7), 0,