From b520e08957f7a04ba66b81183855eceae396b24d Mon Sep 17 00:00:00 2001 From: harbaum Date: Wed, 11 Sep 2013 08:11:09 +0000 Subject: [PATCH] Small ikbd cleanups --- debug.h | 3 ++- ikbd.c | 41 ++++++++++++++++++++--------------------- ikbd.h | 1 + keycodes.h | 18 +++++++++--------- menu.c | 11 ++++++++--- osd.c | 12 ------------ tos.c | 4 ++++ user_io.c | 11 +++++++++-- 8 files changed, 53 insertions(+), 48 deletions(-) diff --git a/debug.h b/debug.h index d222783..19e3ad7 100644 --- a/debug.h +++ b/debug.h @@ -32,8 +32,9 @@ #define tos_debugf(...) #endif -#if 0 +#if 1 // ikbd debug output in red +#define IKBD_DEBUG #define ikbd_debugf(a, ...) iprintf("\033[1;31mIKBD: " a "\033[0m\n", ##__VA_ARGS__) #else #define ikbd_debugf(...) diff --git a/ikbd.c b/ikbd.c index 92b85eb..7f8676e 100644 --- a/ikbd.c +++ b/ikbd.c @@ -59,9 +59,9 @@ static struct { unsigned char mouse_abs_scale_x, mouse_abs_scale_y; unsigned char mouse_abs_buttons; unsigned short mouse_pos_x, mouse_pos_y; -} ikbd; -// #define IKBD_DEBUG + unsigned int tx_cnt; // tx byte counter for debugging +} ikbd; void ikbd_init() { // reset ikbd state @@ -80,11 +80,14 @@ void ikbd_init() { ikbd.date_buffer[5] = 0; } +void ikbd_reset(void) { + ikbd.tx_cnt = 0; + ikbd.state |= IKBD_STATE_WAIT4RESET; +} + static void enqueue(unsigned short b) { - if(((wptr + 1)&(QUEUE_LEN-1)) == rptr) { - // ikbd_debugf("!!!!!!! tx queue overflow !!!!!!!!!"); + if(((wptr + 1)&(QUEUE_LEN-1)) == rptr) return; - } tx_queue[wptr] = b; wptr = (wptr+1)&(QUEUE_LEN-1); @@ -307,11 +310,14 @@ void ikbd_handle_input(unsigned char cmd) { void ikbd_poll(void) { #ifdef IKBD_DEBUG - static int sent = 0; static unsigned long xtimer = 0; + static int last_cnt = 0; if(CheckTimer(xtimer)) { xtimer = GetTimer(2000); - ikbd_debugf("sent %d", sent); + if(ikbd.tx_cnt != last_cnt) { + ikbd_debugf("sent bytes: %d", ikbd.tx_cnt); + last_cnt = ikbd.tx_cnt; + } } #endif @@ -365,12 +371,11 @@ void ikbd_poll(void) { SPI(UIO_IKBD_OUT); SPI(tx_queue[rptr]); DisableIO(); + + ikbd.tx_cnt++; } rptr = (rptr+1)&(QUEUE_LEN-1); -#ifdef IKBD_DEBUG - sent++; -#endif } void ikbd_joystick(unsigned char joystick, unsigned char map) { @@ -378,9 +383,6 @@ void ikbd_joystick(unsigned char joystick, unsigned char map) { // is enabled? if(ikbd.state & IKBD_STATE_JOYSTICK_EVENT_REPORTING) { -#ifdef IKBD_DEBUG - ikbd_debugf("joy %d %x", joystick, map); -#endif // only report joystick data for joystick 0 if the mouse is disabled if((ikbd.state & IKBD_STATE_MOUSE_DISABLED) || (joystick == 1)) { @@ -401,10 +403,6 @@ void ikbd_joystick(unsigned char joystick, unsigned char map) { } } } -#ifdef IKBD_DEBUG - else - ikbd_debugf("no monitor, drop joy %d %x", joystick, map); -#endif // save state of joystick for interrogation mode ikbd.joystick[joystick] = map; @@ -462,7 +460,7 @@ void ikbd_mouse(unsigned char b, char x, char y) { x /= ikbd.mouse_abs_scale_x; y /= ikbd.mouse_abs_scale_y; - // ikbd_debugf("abs inc %d %d -> ", x, y); + // ikbd_debugf("abs inc %d %d -> ", x, y); if(x < 0) { x = -x; @@ -500,12 +498,13 @@ void ikbd_mouse(unsigned char b, char x, char y) { // advance the ikbd time by one second void ikbd_update_time(void) { static const char mdays[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + short year = 1900 + ikbd.date_buffer[0]; char is_leap = (!(year % 4) && (year % 100)) || !(year % 400); - ikbd_debugf("time update %u:%02u:%02u %u.%u.%u", - ikbd.date_buffer[3], ikbd.date_buffer[4], ikbd.date_buffer[5], - ikbd.date_buffer[2], ikbd.date_buffer[1], year); + // ikbd_debugf("time update %u:%02u:%02u %u.%u.%u", + // ikbd.date_buffer[3], ikbd.date_buffer[4], ikbd.date_buffer[5], + // ikbd.date_buffer[2], ikbd.date_buffer[1], year); // advance seconds ikbd.date_buffer[5]++; diff --git a/ikbd.h b/ikbd.h index c0c2838..f8e2047 100644 --- a/ikbd.h +++ b/ikbd.h @@ -3,6 +3,7 @@ void ikbd_init(void); void ikbd_poll(void); +void ikbd_reset(void); void ikbd_joystick(unsigned char joy, unsigned char map); void ikbd_mouse(unsigned char buttons, char x, char y); void ikbd_keyboard(unsigned char code); diff --git a/keycodes.h b/keycodes.h index 7c038af..4436542 100644 --- a/keycodes.h +++ b/keycodes.h @@ -188,11 +188,11 @@ const unsigned short usb2atari[] = { 0x09, // 25: 8 0x0a, // 26: 9 0x0b, // 27: 0 - 0x1c | OSD_LOC, // 28: Return - 0x01 | OSD_LOC, // 29: Escape - 0x0e | OSD_LOC, // 2a: Backspace + 0x1c, // 28: Return + 0x01, // 29: Escape + 0x0e, // 2a: Backspace 0x0f, // 2b: Tab - 0x39 | OSD_LOC, // 2c: Space + 0x39, // 2c: Space 0x0c, // 2d: - 0x0d, // 2e: = 0x1a, // 2f: [ @@ -222,15 +222,15 @@ const unsigned short usb2atari[] = { NUM_LOCK_TOGGLE, // 47: Scroll Lock MISS, // 48: Pause 0x52, // 49: Insert - 0x47 | OSD_LOC, // 4a: Home - 0x62 | OSD_LOC, // 4b: Page Up + 0x47, // 4a: Home + 0x62, // 4b: Page Up 0x53, // 4c: Delete MISS, // 4d: End - 0x61 | OSD_LOC, // 4e: Page Down + 0x61, // 4e: Page Down 0x4d, // 4f: Right Arrow 0x4b, // 50: Left Arrow - 0x50 | OSD_LOC, // 51: Down Arrow - 0x48 | OSD_LOC, // 52: Up Arrow + 0x50, // 51: Down Arrow + 0x48, // 52: Up Arrow NUM_LOCK_TOGGLE, // 53: Num Lock 0x65, // 54: KP / 0x66, // 55: KP * diff --git a/menu.c b/menu.c index 5f68cc1..f7d2c27 100644 --- a/menu.c +++ b/menu.c @@ -189,10 +189,16 @@ void HandleUI(void) } } break; - case KEY_MENU : + case KEY_MENU: menu = true; break; - case KEY_ESC : + + // Within the menu the esc key acts as the menu key. problem: + // if the menu is left with a press of ESC, then the follwing + // break code for the ESC key when the key is released will + // reach the core which never saw the make code. Simple solution: + // react on break code instead of make code + case KEY_ESC | KEY_UPSTROKE : if (menustate != MENU_NONE2) menu = true; break; @@ -2629,7 +2635,6 @@ void ErrorMessage(const char *message, unsigned char code) { void InfoMessage(char *message) { - OsdWaitVBL(); if (menustate != MENU_INFO) { // OsdClear(); diff --git a/osd.c b/osd.c index baf45f6..19568bc 100644 --- a/osd.c +++ b/osd.c @@ -636,18 +636,6 @@ void OsdClear(void) DisableOsd(); } -void OsdWaitVBL(void) -{ -// unsigned long pioa_old = 0; -// unsigned long pioa = 0; -// -// while ((~pioa ^ pioa_old) & INIT_B) -// { -// pioa_old = pioa; -// pioa = *AT91C_PIOA_PDSR; -// } -} - // enable displaying of OSD void OsdEnable(unsigned char mode) { diff --git a/tos.c b/tos.c index d5014e8..b3e223f 100644 --- a/tos.c +++ b/tos.c @@ -626,6 +626,8 @@ void tos_upload(char *name) { tos_write("Booting ... "); + ikbd_reset(); + // let cpu run (release reset) config.system_ctrl &= ~TOS_CONTROL_CPU_RESET; mist_set_control(config.system_ctrl); @@ -814,6 +816,8 @@ void tos_eject_all() { } void tos_reset(char cold) { + ikbd_reset(); + tos_update_sysctrl(config.system_ctrl | TOS_CONTROL_CPU_RESET); // set reset if(cold) { diff --git a/user_io.c b/user_io.c index 9bd1a2f..da794a3 100644 --- a/user_io.c +++ b/user_io.c @@ -348,9 +348,16 @@ void user_io_osd_key_enable(char on) { } static char key_used_by_osd(unsigned short s) { - if((s & OSD_LOC) && !(s & 0xff)) return true; // this key is only used in OSD and has no keycode + // this key is only used in OSD and has no keycode + if((s & OSD_LOC) && !(s & 0xff)) return true; + + // no keys are suppressed if the OSD is inactive if(!osd_eats_keys) return false; - return ((s & OSD_LOC) != 0); + + // in atari mode eat all keys if the OSD is online, + // else none as it's up to the core to forward keys + // to the OSD + return (core_type == CORE_TYPE_MIST); } void user_io_kbd(unsigned char m, unsigned char *k) {