From d37127485acc27491dfb5d07d74b0553b45ba8c7 Mon Sep 17 00:00:00 2001 From: Newsdee Date: Sun, 19 Jun 2016 00:17:46 +0800 Subject: [PATCH] Restrict joystick test to only show buttons declared by joystick (like in Windows) --- charrom.h | 13 +++++- menu.c | 106 ++++++++++++++++++++++++++++++++++++------------ menu.h | 5 ++- osd.c | 14 ++++++- osd.h | 7 +++- usb/hid.c | 4 +- usb/hidparser.c | 31 +++++++------- usb/hidparser.h | 21 +++++----- 8 files changed, 142 insertions(+), 59 deletions(-) diff --git a/charrom.h b/charrom.h index 550da10..e39d8c6 100644 --- a/charrom.h +++ b/charrom.h @@ -24,6 +24,17 @@ Write enable . . . . . . . . 0x70,0x70,0x70,0x70,0x7c,0x72,0x02,0x0c +Middle Dot +. . . . . . . . +. . . . . . . . +. . . * * . . . +. . . * * . . . +. . . . . . . . +. . . . . . . . +. . . . . . . . +. . . . . . . . +0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00 + */ // *character font @@ -56,7 +67,7 @@ unsigned char charfont[128][8] = {0x70,0x70,0x70,0x70,0x7c,0x72,0x02,0x0c}, // 24 [0x18] write enable {0x3e,0x3e,0x22,0x22,0x22,0x3e,0x3e,0x00}, // 25 [0x19] unchecked checkbox {0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x00}, // 26 [0x1a] checked checkbox - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 27 [0x1b] + {0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00}, // 27 [0x1b] middle dot {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 28 [0x1c] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 29 [0x1d] {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 30 [0x1e] diff --git a/menu.c b/menu.c index 4c9f44d..0fe63ee 100644 --- a/menu.c +++ b/menu.c @@ -86,8 +86,8 @@ extern char DirEntryLFN[MAXDIRENTRIES][261]; char DirEntryInfo[MAXDIRENTRIES][5]; // disk number info of dir entries char DiskInfo[5]; // disk number info of selected entry -extern const char version[]; +extern const char version[]; const char *config_tos_mem[] = {"512 kB", "1 MB", "2 MB", "4 MB", "8 MB", "14 MB", "--", "--" }; const char *config_tos_wrprot[] = {"none", "A:", "B:", "A: and B:"}; const char *config_tos_usb[] = {"none", "control", "debug", "serial", "parallel", "midi"}; @@ -242,22 +242,20 @@ static void substrcpy(char *d, char *s, char idx) { #define HELPTEXT_DELAY 10000 #define FRAME_DELAY 150 -//assumes big endian +// prints input as a string of binary (on/off) values +// assumes big endian, returns using special characters (checked box/unchecked box) void siprintbinary(char* buffer, size_t const size, void const * const ptr) { unsigned char *b = (unsigned char*) ptr; unsigned char byte; int i, j; - siprintf(buffer, "%*s", size-1, ""); + memset(buffer, '\0', size); for (i=size-1;i>=0;i--) { for (j=0;j<8;j++) { byte = (b[i] >> j) & 1; - if(byte) - strcat(buffer, "1"); - else - strcat(buffer, "0"); + buffer[j]=byte?'\x1a':'\x19'; } } return; @@ -278,6 +276,7 @@ void get_joystick_state( char *joy_string, char *joy_string2, unsigned int joy_n if (vjoy==0) { memset(joy_string2, ' ', 8); memset(joy_string2+8, '\x14', 1); + memset(joy_string2+9, ' ', 1); return; } strcpy(joy_string, " \x12 X Y L R L2 R2 L3"); @@ -298,7 +297,6 @@ void get_joystick_state( char *joy_string, char *joy_string2, unsigned int joy_n if(!(vjoy & JOY_SELECT))memset(joy_string2+16, ' ', 3); if(!(vjoy & JOY_START)) memset(joy_string2+20, ' ', 3); if(!(vjoy & JOY_R3)) memset(joy_string2+24, ' ', 2); - return; } @@ -307,37 +305,46 @@ void get_joystick_state_usb( char *s, unsigned char joy_num ) { (in reverse binary format to correspont to MIST.INI mapping entries) */ char buffer[5]; + unsigned short i; + char binary_string[9]="00000000"; + unsigned char joy = 0; + unsigned int max_btn = 1; if (OsdNumJoysticks()==0 || (joy_num==1 && OsdNumJoysticks()<2)) { strcpy( s, " "); return; } - char binary_string[9]="00000000"; - unsigned char joy = 0; - if(joy_num==0) + if(joy_num==0) { joy = OsdUsbJoyGet(); - else + max_btn = OsdUsbGetNumButtons(); + } + else { joy = OsdUsbJoyGetB(); - siprintf(s, " USB: "); + max_btn = OsdUsbGetNumButtonsB(); + } + siprintf(s, " USB: ---- 0000 0000 0000"); siprintbinary(binary_string, sizeof(joy), &joy); - binary_string[0]=binary_string[0]=='1'?'>':'-'; - binary_string[1]=binary_string[1]=='1'?'<':'-'; - binary_string[2]=binary_string[2]=='1'?'\x13':'-'; - binary_string[3]=binary_string[3]=='1'?'\x12':'-'; - - memcpy( buffer, &binary_string[0], 4 ); - buffer[4]='\0'; - strcat(s, buffer ); - strcat(s, " "); - memcpy( buffer, &binary_string[4], 4 ); - buffer[4]='\0'; - strcat(s, buffer ); + s[7] = binary_string[0]=='\x1a'?'>':'\x1b'; + s[8] = binary_string[1]=='\x1a'?'<':'\x1b'; + s[9] = binary_string[2]=='\x1a'?'\x13':'\x1b'; + s[10] = binary_string[3]=='\x1a'?'\x12':'\x1b'; + s[12] = binary_string[4]; + s[13] = max_btn>1 ? binary_string[5] : ' '; + s[14] = max_btn>2 ? binary_string[6] : ' '; + s[15] = max_btn>3 ? binary_string[7] : ' '; if(joy_num==0) joy = OsdUsbJoyGetExtra(); else joy = OsdUsbJoyGetExtraB(); siprintbinary(binary_string, sizeof(joy), &joy); - strcat(s, binary_string); + s[17] = max_btn>4 ? binary_string[0] : ' '; + s[18] = max_btn>5 ? binary_string[1] : ' '; + s[19] = max_btn>6 ? binary_string[2] : ' '; + s[20] = max_btn>7 ? binary_string[3] : ' '; + s[22] = max_btn>8 ? binary_string[4] : ' '; + s[23] = max_btn>9 ? binary_string[5] : ' '; + s[24] = max_btn>10 ? binary_string[6] : ' '; + s[25] = max_btn>11 ? binary_string[7] : ' '; return; } @@ -1033,6 +1040,7 @@ void HandleUI(void) case MENU_8BIT_CONTROLLERS1: helptext = helptexts[HELPTEXT_NONE]; menumask=0x1f; + //menumask=0x3f; OsdSetTitle("Inputs", 0); menustate = MENU_8BIT_CONTROLLERS2; parentstate=MENU_8BIT_CONTROLLERS1; @@ -1042,8 +1050,10 @@ void HandleUI(void) OsdWrite(3, " Keyboard Test \x16", menusub==2, 0); OsdWrite(4, " USB status \x16", menusub==3, 0); OsdWrite(5, "", 0, 0); + //OsdWrite(5, " CHR test \x16", menusub==4, 0); OsdWrite(6, "", 0, 0); OsdWrite(7, STD_EXIT, menusub==4, 0); + //OsdWrite(7, STD_EXIT, menusub==5, 0); break; case MENU_8BIT_CONTROLLERS2: @@ -1072,6 +1082,12 @@ void HandleUI(void) menustate=MENU_8BIT_USB1; menusub = 0; break; + /*case 4: + // character rom test + menustate=MENU_8BIT_CHRTEST1; + menusub = 0; + break; + */ case 4: // Exit to system menu menustate=MENU_8BIT_SYSTEM1; @@ -1249,6 +1265,44 @@ void HandleUI(void) } break; + case MENU_8BIT_CHRTEST1: + helptext = helptexts[HELPTEXT_NONE]; + menumask=0; + OsdSetTitle("CHR", 0); + menustate = MENU_8BIT_CHRTEST2; + parentstate=MENU_8BIT_CHRTEST1; + strcpy(usb_id, " "); + for(i=1; i<24; i++) { + if(i<4 || i>13) + usb_id[i] = i; + else + usb_id[i] = ' '; + } + OsdWrite(0, usb_id, 0, 0); + for(i=0; i<24; i++) usb_id[i] = i+24; + OsdWrite(1, usb_id, 0, 0); + for(i=0; i<24; i++) usb_id[i] = i+(24*2); + OsdWrite(2, usb_id, 0, 0); + for(i=0; i<24; i++) usb_id[i] = i+(24*3); + OsdWrite(3, usb_id, 0, 0); + for(i=0; i<24; i++) usb_id[i] = i+(24*4); + OsdWrite(4, usb_id, 0, 0); + strcpy(usb_id, " "); + for(i=0; i<8; i++) usb_id[i] = i+(24*5); + OsdWrite(5, usb_id, 0, 0); + //for(i=0; i<24; i++) usb_id[i] = i+(24*6); + OsdWrite(6, "", 0, 0); + OsdWrite(7, STD_SPACE_EXIT, menusub==0, 0); + break; + + case MENU_8BIT_CHRTEST2: + + if(c==KEY_SPACE) { + menustate = MENU_8BIT_CONTROLLERS1; + menusub = 1; + } + break; + /******************************************************************/ /* mist main menu */ /******************************************************************/ diff --git a/menu.h b/menu.h index b3ab832..441f2f3 100644 --- a/menu.h +++ b/menu.h @@ -104,7 +104,10 @@ enum MENU MENU_8BIT_KEYTEST1, MENU_8BIT_KEYTEST2, MENU_8BIT_USB1, - MENU_8BIT_USB2 + MENU_8BIT_USB2, + MENU_8BIT_CHRTEST1, + MENU_8BIT_CHRTEST2 + }; // UI strings, used by boot messages diff --git a/osd.c b/osd.c index e430363..bbd21c4 100644 --- a/osd.c +++ b/osd.c @@ -794,9 +794,11 @@ uint8_t OsdUsbJoyGetExtraB() { /* connected HID information */ static unsigned int usb_vid; static unsigned int usb_pid; -void OsdUsbIdSet(unsigned int vid, unsigned int pid) { +static unsigned int num_buttons; +void OsdUsbIdSet(unsigned int vid, unsigned int pid, unsigned int num) { usb_vid=vid; usb_pid=pid; + num_buttons = num; } unsigned int OsdUsbVidGet() { return usb_vid; @@ -804,13 +806,18 @@ unsigned int OsdUsbVidGet() { unsigned int OsdUsbPidGet() { return usb_pid; } +unsigned int OsdUsbGetNumButtons() { + return num_buttons; +} /* connected HID information - joy 2*/ static unsigned int usb_vid_b; static unsigned int usb_pid_b; -void OsdUsbIdSetB(unsigned int vid, unsigned int pid) { +static unsigned int num_buttons_b; +void OsdUsbIdSetB(unsigned int vid, unsigned int pid, unsigned int num) { usb_vid_b=vid; usb_pid_b=pid; + num_buttons_b = num; } unsigned int OsdUsbVidGetB() { return usb_vid_b; @@ -818,6 +825,9 @@ unsigned int OsdUsbVidGetB() { unsigned int OsdUsbPidGetB() { return usb_pid_b; } +unsigned int OsdUsbGetNumButtonsB() { + return num_buttons_b; +} /* keyboard data */ static unsigned char key_modifier = 0; diff --git a/osd.h b/osd.h index 8701cab..b1fbcf8 100644 --- a/osd.h +++ b/osd.h @@ -156,17 +156,20 @@ unsigned char OsdNumJoysticksSet(unsigned char num); void OsdUsbJoySet(uint8_t usbjoy, uint8_t usbextra); uint8_t OsdUsbJoyGet(); uint8_t OsdUsbJoyGetExtra(); -void OsdUsbIdSet(unsigned int vid, unsigned int pid); +void OsdUsbIdSet(unsigned int vid, unsigned int pid, unsigned int num_buttons); unsigned int OsdUsbVidGet(); unsigned int OsdUsbPidGet(); +unsigned int OsdUsbGetNumButtons(); + // USB raw data for joystick 2 void OsdUsbJoySetB(uint8_t usbjoy, uint8_t usbextra); uint8_t OsdUsbJoyGetB(); uint8_t OsdUsbJoyGetExtraB(); -void OsdUsbIdSetB(unsigned int vid, unsigned int pid); +void OsdUsbIdSetB(unsigned int vid, unsigned int pid, unsigned int num_buttons); unsigned int OsdUsbVidGetB(); unsigned int OsdUsbPidGetB(); +unsigned int OsdUsbGetNumButtonsB(); // keyboard status void OsdKeyboardSet( unsigned char modifier, char* pressed, int* pressed_ps2); //get usb and ps2 codes diff --git a/usb/hid.c b/usb/hid.c index fe89335..a865aca 100644 --- a/usb/hid.c +++ b/usb/hid.c @@ -737,10 +737,10 @@ static void usb_process_iface (usb_hid_iface_info_t *iface, // report joystick 1 to OSD if ( iface->jindex==0) { - OsdUsbIdSet( conf->joystick_mouse.vid, conf->joystick_mouse.pid ); + OsdUsbIdSet( conf->joystick_mouse.vid, conf->joystick_mouse.pid, conf->joystick_mouse.button_count ); OsdUsbJoySet( jmap, btn_extra ); } else if (iface->jindex==1) { - OsdUsbIdSetB( conf->joystick_mouse.vid, conf->joystick_mouse.pid ); + OsdUsbIdSetB( conf->joystick_mouse.vid, conf->joystick_mouse.pid, conf->joystick_mouse.button_count ); OsdUsbJoySetB( jmap, btn_extra ); } // map virtual joypad diff --git a/usb/hidparser.c b/usb/hidparser.c index 13575eb..eaaaa6f 100644 --- a/usb/hidparser.c +++ b/usb/hidparser.c @@ -130,21 +130,21 @@ bool parse_report_descriptor(uint8_t *rep, uint16_t rep_size, hid_report_t *conf // we are currently skipping an unknown/unsupported collection) if(skip_collection) { if(!type) { // main item - // any new collection increases the depth of collections to skip - if(tag == 10) { - skip_collection++; - collection_depth++; - } + // any new collection increases the depth of collections to skip + if(tag == 10) { + skip_collection++; + collection_depth++; + } - // any end collection decreases it - if(tag == 12) { - skip_collection--; - collection_depth--; + // any end collection decreases it + if(tag == 12) { + skip_collection--; + collection_depth--; - // leaving the depth the generic desktop was valid for - if(generic_desktop > collection_depth) - generic_desktop = -1; - } + // leaving the depth the generic desktop was valid for + if(generic_desktop > collection_depth) + generic_desktop = -1; + } } @@ -173,6 +173,7 @@ bool parse_report_descriptor(uint8_t *rep, uint16_t rep_size, hid_report_t *conf conf->joystick_mouse.button[b].byte_offset = this_bit/8; conf->joystick_mouse.button[b].bitmask = 1 << (this_bit%8); } + conf->joystick_mouse.button_count = report_count * report_size; } // we found at least one button which is all we want to accept this as a valid @@ -345,7 +346,7 @@ bool parse_report_descriptor(uint8_t *rep, uint16_t rep_size, hid_report_t *conf case 7: hidp_extreme_debugf("REPORT_SIZE(%d)", value); report_size = value; - break; + break; case 8: hidp_extreme_debugf("REPORT_ID(%d)", value); @@ -354,7 +355,7 @@ bool parse_report_descriptor(uint8_t *rep, uint16_t rep_size, hid_report_t *conf case 9: hidp_extreme_debugf("REPORT_COUNT(%d)", value); - report_count = value; + report_count = value; break; default: diff --git a/usb/hidparser.h b/usb/hidparser.h index 5c3cbef..afdff01 100644 --- a/usb/hidparser.h +++ b/usb/hidparser.h @@ -15,27 +15,28 @@ typedef struct { union { struct { struct { - uint16_t offset; - uint8_t size; - struct { - uint16_t min; - uint16_t max; - } logical; + uint16_t offset; + uint8_t size; + struct { + uint16_t min; + uint16_t max; + } logical; } axis[2]; // x and y axis struct { - uint8_t byte_offset; - uint8_t bitmask; + uint8_t byte_offset; + uint8_t bitmask; } button[12]; // 12 buttons max struct { - uint16_t offset; - uint8_t size; + uint16_t offset; + uint8_t size; } hat; // 1 hat (joystick only) // for downstream mapping uint16_t vid; uint16_t pid; + uint8_t button_count; } joystick_mouse; };