/* load HID keyboard driver */
usb_hidkb_init();
+wait_kb:
+ /* wait for usb keyboard plugged in */
+ if(!usb_hidkb_inuse()) {
+ print_str("plug in an usb keyboard", 23);
+ }
+ while(!usb_hidkb_inuse());
+
+ print_str("hello keyboard :)", 17);
+
+#define FONT_WIDTH 13
+#define FONT_HEIGHT 15
+#define STDOUT_BORDER_LEFT 20
+#define STDOUT_BORDER_RIGHT 650
+#define STDOUT_BORDER_TOP 20
+#define STDOUT_BORDER_BOTTOM 550
+#define TABSIZE 4
/* you are welcome to make this nice :) */
char str[7];
- u16 i, j, y=20, x=20;
- struct kbrep *k;
+ u16 i, j, ret=0, y=STDOUT_BORDER_TOP, x=STDOUT_BORDER_LEFT;
+ u16 old_x, old_y;
+ struct kbrep *k, *old=NULL;
- while(1) {
- memset(str, '\0', 8);
- j=0;
+ while(usb_hidkb_inuse()) {
+ memset(str, '\0', 7);
k = usb_hidkb_getChars();
+ j=0;
+ old_x = x; /* save actual x and y position for printing after the loop */
+ old_y = y;
for(i=0; k->keys[i]>0; i++) {
- if(x>650) {
- x = 20;
- y += 15;
+
+ /* dropping char's if necessary */
+ if(old) {
+ for(j=0; j < 6; j++) {
+ if(old->keys[j] == k->keys[i]) {
+ ret = 1;
+ break;
+ }
+ }
+ }
+ if(ret) {
+ ret = 0;
+ continue;
}
- if(y>440) {
- y=20;
+ j = 0;
+
+ unsigned char key = usb_hidkb_get_char_from_keycode(k->keys[i],
+ (k->mod & MOD_lshift) || (k->mod & MOD_rshift));
+ /* no key or key not relevant? next, please. */
+ if (key == 0)
+ continue;
+
+ /* RETURN pressed? */
+ if (key == '\n') {
+ x = STDOUT_BORDER_LEFT;
+ y += FONT_HEIGHT;
+ printf("\n");
+ /* TAB pressed? */
+ } else if (key == '\t') {
+ x += (TABSIZE*FONT_WIDTH);
+ printf("\t");
+
+ /* BACKSPACE pressed? */
+ } else if (key == '\r') {
+ /* TODO */
+
+ /* now we have only printable characters left */
+ } else {
+ x += FONT_WIDTH;
+ str[j] = key;
+ j++;
}
- if((k->keys[i] >= 4) && k->keys[i] <= 4+'z'-'a') {
- str[j] = k->keys[i] - 4 + 'a';
- }
- else if (k->keys[i] == 0x28) {
- y += 15;
- x = 20;
+
+ /* line full? break! */
+ if(x > (STDOUT_BORDER_RIGHT-FONT_WIDTH)) {
+ x = STDOUT_BORDER_LEFT;
+ y += FONT_HEIGHT;
+ }
+ /* screen full? start again at top */
+ if(y > (STDOUT_BORDER_BOTTOM-FONT_HEIGHT)) {
+ y = STDOUT_BORDER_TOP;
}
- j++;
}
- if(j > 0) {
- print_str_noscroll(x, y, str);
- printf("y: %d\n", y);
+ if(old) {
+ free(old);
}
- while(j--) {
- x += 13;
+ old = k;
+ if(j > 0) { /* when there was any printable stuff, show it */
+ print_str_noscroll(old_x, old_y, str);
+ printf("%s", str);
}
}
+ goto wait_kb;
+
#if 0
printf("===============================\n");