diff options
Diffstat (limited to 'usb-keyboardmouse/usb-keyboardmouse.c')
-rw-r--r-- | usb-keyboardmouse/usb-keyboardmouse.c | 75 |
1 files changed, 59 insertions, 16 deletions
diff --git a/usb-keyboardmouse/usb-keyboardmouse.c b/usb-keyboardmouse/usb-keyboardmouse.c index de796f5..649cb65 100644 --- a/usb-keyboardmouse/usb-keyboardmouse.c +++ b/usb-keyboardmouse/usb-keyboardmouse.c @@ -25,6 +25,7 @@ #include <avr/wdt.h> #include <avr/interrupt.h> #include <avr/power.h> +#include <stdio.h> #include "util.h" #include "led.h" @@ -37,6 +38,8 @@ www.lufa-lib.org */ #include <LUFA/Drivers/USB/USB.h> +#include "LUFA/Drivers/Peripheral/Serial.h" +#include <LUFA/Drivers/Misc/RingBuffer.h> #include "lufa-descriptor-keyboardmouse.h" static uint8_t PrevKeyboardHIDReportBuffer[sizeof(USB_KeyboardReport_Data_t)]; @@ -95,6 +98,11 @@ void EVENT_USB_Device_StartOfFrame(void) } /* end LUFA CDC-ACM specific definitions*/ +FILE serial_stream; +static RingBuffer_t keyboard_buffer; +static uint8_t keyboard_buffer_data[16]; +static RingBuffer_t mouse_buffer; +static uint8_t mouse_buffer_data[16]; bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, uint8_t* const ReportID, @@ -102,19 +110,26 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn void* ReportData, uint16_t* const ReportSize) { + if (HIDInterfaceInfo == &Keyboard_HID_Interface) { USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; - /* no key has been pressed - just return */ - return 0; - -/* - KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; - KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_A; + if(!RingBuffer_IsEmpty(&keyboard_buffer)) { + uint8_t received_byte = RingBuffer_Remove(&keyboard_buffer); + switch(received_byte) { + case '1': KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_1_AND_EXCLAMATION; break; + case '2': KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_2_AND_AT; break; + case '3': KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_3_AND_HASHMARK; break; + case '4': KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_4_AND_DOLLAR; break; + case 'c': KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_CAPS_LOCK; break; + default: return 0; // no key has been pressed - just return + } + } +// KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; *ReportSize = sizeof(USB_KeyboardReport_Data_t); return false; -*/ + } else { @@ -122,15 +137,17 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn MouseReport->Y = 0; MouseReport->X = 0; -/* - MouseReport->Y = -1; // UP - MouseReport->Y = 1; // DOWN - MouseReport->X = -1; // LEFT - MouseReport->X = 1; // RIGHT -*/ -/* - MouseReport->Button |= (1 << 0); // Button 1 -*/ + if(!RingBuffer_IsEmpty(&mouse_buffer)) { + uint8_t received_byte = RingBuffer_Remove(&mouse_buffer); + switch(received_byte) { + case 'w': MouseReport->Y = -1; break; // UP + case 's': MouseReport->Y = 1; break; // DOWN + case 'a': MouseReport->X = -1; break; // LEFT + case 'd': MouseReport->X = 1; break; // RIGHT + case 'q': MouseReport->Button |= (1 << 0); break; // Button 1 + case 'e': MouseReport->Button |= (1 << 1); break; // Button 2 + } + } *ReportSize = sizeof(USB_MouseReport_Data_t); return true; } @@ -167,9 +184,35 @@ int main(void) cpu_init(); led_init(); USB_Init(); + + Serial_Init(115200, false); + Serial_CreateStream(&serial_stream); + stdin = stdout = stderr = &serial_stream; + RingBuffer_InitBuffer(&keyboard_buffer, keyboard_buffer_data, sizeof(keyboard_buffer_data)); + RingBuffer_InitBuffer(&mouse_buffer, mouse_buffer_data, sizeof(mouse_buffer_data)); + sei(); for(;;) { + if(Serial_IsCharReceived()) { + int received_byte = fgetc(stdin); + switch(received_byte) { + case '1': + case '2': + case '3': + case '4': + case 'c': + RingBuffer_Insert(&keyboard_buffer, (uint8_t)received_byte); break; + case 'w': + case 's': + case 'a': + case 'd': + case 'q': + case 'e': + RingBuffer_Insert(&mouse_buffer, (uint8_t)received_byte); break; + } + } + HID_Device_USBTask(&Keyboard_HID_Interface); HID_Device_USBTask(&Mouse_HID_Interface); USB_USBTask(); |