From ad5b98b5ea0ab5ad25ad2a0e382c0cbda5b4429c Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Sun, 19 May 2024 21:55:25 -0500 Subject: [PATCH] maple: add maple_bus_ft6_key_scan_codes --- headers.mk | 3 + maple/maple_bus_ft6_key_scan_codes.hpp | 90 ++++++++++++++++++ regs/gen/maple_key_scan_codes.py | 25 +++++ regs/maple_bus_ft6_key_scan_codes.csv | 84 ++++++++++++++++ ...g.ods => maple_bus_ft6_key_scan_codes.ods} | Bin 16782 -> 17241 bytes 5 files changed, 202 insertions(+) create mode 100644 maple/maple_bus_ft6_key_scan_codes.hpp create mode 100644 regs/gen/maple_key_scan_codes.py create mode 100644 regs/maple_bus_ft6_key_scan_codes.csv rename regs/{maple_bus_ft6_key_mapping.ods => maple_bus_ft6_key_scan_codes.ods} (54%) diff --git a/headers.mk b/headers.mk index dee807a..8c8b254 100644 --- a/headers.mk +++ b/headers.mk @@ -53,6 +53,9 @@ maple/maple_bus_ft0.hpp: regs/maple_bus_ft0.csv regs/gen/maple_data_format.py maple/maple_bus_ft6.hpp: regs/maple_bus_ft6.csv regs/gen/maple_data_format.py python regs/gen/maple_data_format.py $< > $@ +maple/maple_bus_ft6_key_scan_codes.hpp: regs/maple_bus_ft6_key_scan_codes.csv regs/gen/maple_key_scan_codes.py + python regs/gen/maple_key_scan_codes.py $< > $@ + maple/maple_bus_ft8.hpp: regs/maple_bus_ft8.csv regs/gen/maple_data_format.py python regs/gen/maple_data_format.py $< > $@ diff --git a/maple/maple_bus_ft6_key_scan_codes.hpp b/maple/maple_bus_ft6_key_scan_codes.hpp new file mode 100644 index 0000000..3ce6bbc --- /dev/null +++ b/maple/maple_bus_ft6_key_scan_codes.hpp @@ -0,0 +1,90 @@ +#include + +namespace ft6 { + namespace scan_codes { + constexpr uint32_t no_operation = 0x0; + constexpr uint32_t rollover_error = 0x1; + constexpr uint32_t post_fail = 0x2; + constexpr uint32_t undefined_error = 0x3; + constexpr uint32_t a_A = 0x4; + constexpr uint32_t b_B = 0x5; + constexpr uint32_t c_C = 0x6; + constexpr uint32_t d_D = 0x7; + constexpr uint32_t e_E = 0x8; + constexpr uint32_t f_F = 0x9; + constexpr uint32_t g_G = 0xa; + constexpr uint32_t h_H = 0xb; + constexpr uint32_t i_I = 0xc; + constexpr uint32_t j_J = 0xd; + constexpr uint32_t k_K = 0xe; + constexpr uint32_t l_L = 0xf; + constexpr uint32_t m_M = 0x10; + constexpr uint32_t n_N = 0x11; + constexpr uint32_t o_O = 0x12; + constexpr uint32_t p_P = 0x13; + constexpr uint32_t q_Q = 0x14; + constexpr uint32_t r_R = 0x15; + constexpr uint32_t s_S = 0x16; + constexpr uint32_t t_T = 0x17; + constexpr uint32_t u_U = 0x18; + constexpr uint32_t v_V = 0x19; + constexpr uint32_t w_W = 0x1a; + constexpr uint32_t x_X = 0x1b; + constexpr uint32_t y_Y = 0x1c; + constexpr uint32_t z_Z = 0x1d; + constexpr uint32_t _1_exclam = 0x1e; + constexpr uint32_t _2_at = 0x1f; + constexpr uint32_t _3_numbersign = 0x20; + constexpr uint32_t _4_dollar = 0x21; + constexpr uint32_t _5_percent = 0x22; + constexpr uint32_t _6_asciicircum = 0x23; + constexpr uint32_t _7_ampersand = 0x24; + constexpr uint32_t _8_asterisk = 0x25; + constexpr uint32_t _9_parenleft = 0x26; + constexpr uint32_t _0_parenright = 0x27; + constexpr uint32_t return = 0x28; + constexpr uint32_t esc = 0x29; + constexpr uint32_t backspace = 0x2a; + constexpr uint32_t tab = 0x2b; + constexpr uint32_t spacebar = 0x2c; + constexpr uint32_t minus_underscore = 0x2d; + constexpr uint32_t equal_plus = 0x2e; + constexpr uint32_t bracketleft_braceleft = 0x2f; + constexpr uint32_t bracketright_braceright = 0x30; + constexpr uint32_t backslash_bar = 0x31; + constexpr uint32_t _unknown_ = 0x32; + constexpr uint32_t semicolon_colon = 0x33; + constexpr uint32_t apostrophe_quotedbl = 0x34; + constexpr uint32_t grave_asciitilde = 0x35; + constexpr uint32_t comma_less = 0x36; + constexpr uint32_t period_greater = 0x37; + constexpr uint32_t slash_question = 0x38; + constexpr uint32_t caps_lock = 0x39; + constexpr uint32_t F1 = 0x3a; + constexpr uint32_t F2 = 0x3b; + constexpr uint32_t F3 = 0x3c; + constexpr uint32_t F4 = 0x3d; + constexpr uint32_t F5 = 0x3e; + constexpr uint32_t F6 = 0x3f; + constexpr uint32_t F7 = 0x40; + constexpr uint32_t F8 = 0x41; + constexpr uint32_t F9 = 0x42; + constexpr uint32_t F10 = 0x43; + constexpr uint32_t F11 = 0x44; + constexpr uint32_t F12 = 0x45; + constexpr uint32_t print_screen = 0x46; + constexpr uint32_t scroll_lock = 0x47; + constexpr uint32_t pause = 0x48; + constexpr uint32_t insert = 0x49; + constexpr uint32_t home = 0x4a; + constexpr uint32_t page_up = 0x4b; + constexpr uint32_t delete = 0x4c; + constexpr uint32_t end = 0x4d; + constexpr uint32_t page_down = 0x4e; + constexpr uint32_t left = 0x4f; + constexpr uint32_t right = 0x50; + constexpr uint32_t down = 0x51; + constexpr uint32_t up = 0x52; + } +} + diff --git a/regs/gen/maple_key_scan_codes.py b/regs/gen/maple_key_scan_codes.py new file mode 100644 index 0000000..36738de --- /dev/null +++ b/regs/gen/maple_key_scan_codes.py @@ -0,0 +1,25 @@ +import sys + +from csv_input import read_input +from generate import renderer + +def render_row(row): + usage = row['usage'] + code = int(row['code'], 16) + yield f"constexpr uint32_t {usage} = {hex(code)};" + +def render_rows(rows): + yield "#include " + yield "" + yield "namespace ft6 {" + yield "namespace scan_codes {" + for row in rows: + yield from render_row(row) + yield "}" + yield "}" + +if __name__ == "__main__": + rows = read_input(sys.argv[1]) + render, out = renderer() + render(render_rows(rows)) + print(out.getvalue()) diff --git a/regs/maple_bus_ft6_key_scan_codes.csv b/regs/maple_bus_ft6_key_scan_codes.csv new file mode 100644 index 0000000..ba9eae7 --- /dev/null +++ b/regs/maple_bus_ft6_key_scan_codes.csv @@ -0,0 +1,84 @@ +"code","usage" +"0x00","no_operation" +"0x01","rollover_error" +"0x02","post_fail" +"0x03","undefined_error" +"0x04","a_A" +"0x05","b_B" +"0x06","c_C" +"0x07","d_D" +"0x08","e_E" +"0x09","f_F" +"0x0a","g_G" +"0x0b","h_H" +"0x0c","i_I" +"0x0d","j_J" +"0x0e","k_K" +"0x0f","l_L" +"0x10","m_M" +"0x11","n_N" +"0x12","o_O" +"0x13","p_P" +"0x14","q_Q" +"0x15","r_R" +"0x16","s_S" +"0x17","t_T" +"0x18","u_U" +"0x19","v_V" +"0x1a","w_W" +"0x1b","x_X" +"0x1c","y_Y" +"0x1d","z_Z" +"0x1e","_1_exclam" +"0x1f","_2_at" +"0x20","_3_numbersign" +"0x21","_4_dollar" +"0x22","_5_percent" +"0x23","_6_asciicircum" +"0x24","_7_ampersand" +"0x25","_8_asterisk" +"0x26","_9_parenleft" +"0x27","_0_parenright" +"0x28","return" +"0x29","esc" +"0x2a","backspace" +"0x2b","tab" +"0x2c","spacebar" +"0x2d","minus_underscore" +"0x2e","equal_plus" +"0x2f","bracketleft_braceleft" +"0x30","bracketright_braceright" +"0x31","backslash_bar" +"0x32","_unknown_" +"0x33","semicolon_colon" +"0x34","apostrophe_quotedbl" +"0x35","grave_asciitilde" +"0x36","comma_less" +"0x37","period_greater" +"0x38","slash_question" +"0x39","caps_lock" +"0x3a","F1" +"0x3b","F2" +"0x3c","F3" +"0x3d","F4" +"0x3e","F5" +"0x3f","F6" +"0x40","F7" +"0x41","F8" +"0x42","F9" +"0x43","F10" +"0x44","F11" +"0x45","F12" +"0x46","print_screen" +"0x47","scroll_lock" +"0x48","pause" +"0x49","insert" +"0x4a","home" +"0x4b","page_up" +"0x4c","delete" +"0x4d","end" +"0x4e","page_down" +"0x4f","left" +"0x50","right" +"0x51","down" +"0x52","up" diff --git a/regs/maple_bus_ft6_key_mapping.ods b/regs/maple_bus_ft6_key_scan_codes.ods similarity index 54% rename from regs/maple_bus_ft6_key_mapping.ods rename to regs/maple_bus_ft6_key_scan_codes.ods index 453bee399ee305590264467e8bfb6aab1c4bbbf6..2a7c6ab861556a9105cdb36bfec308241589fc83 100644 GIT binary patch delta 6560 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 delta 6063 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 %ckXA!Io{JFtd#K??kyG~s9Kyy@9^ zhQ_W7fzYnad}9b~vZmQMe|8Y(kzMk<{N{SF$!~nu6mbl6G~-=$x_iFmd$dx_-m;@_>60fs$r$wjfke#jzdgB#3n2 zF`n71&7%MiiAOtCu137+6bs&VE?u5IGmg#KWsk-JlrL9xG1{1liUnJgQWA>pIU#Cd z7cEYP^kQ&pXKWOBaT<<*`)PFL+C(0;wHB-?k1t)L6+%?E5Uc>8i?(2NTt^V0=GBVoQ0B)_u6!o+@ zBKsKOg(I3KF*{4f04?sLP>Sxcj0nQirlpItWk!lUZu#OMbPIYyGutUlBAsT~rmMC! zX86(z#+RWVs8W;SFVS-)>?hk(`Qp}S{+t|3p}sx9YNYY$-Xe6(ev`|5${8iSw>s^pVAvbrJ(OVX;*|p zYR%JcXeTbb{Y$uow&C$&ja3n6LDfCAyz3-d$H=RAZpng}~?2piRLaYi_4*G#UQ zPzsOM#zXUy^%r)*VV0a6-{qZt?B+~{!Y?p|kxJ2Ho0pu>z4L*FQx>W9+&$0g1Kp{p zo(PJO8+!rIPYYxH{Rdn7rb`L*qqj2jx!Fm2T;rp!l~0P14B?9UMwliSUlgvq0OqfN z=g678&s0+bl>(trUbbJMC1zfJma{`Wtwf^K{>_d?iyrT=dtI0gyquSpccgP8lahlP z@j0Ru-=+mZV#3glU#G^a9KUZpK4v6-Ss&_3%dF6{QJy~`Y+tfoYG4rk3EQ1uv!dRT zOX3RkY^1r7He#{_!uM0jGAx1@NKsTQ!0H_Lx#Wux^EUo|dS2RCY+OQ6Nb2ev3v#P0 z0!Uy@!lM+v5IqmHBbC<32)k1Y3B2rAZBf}efe&Jj6`*B7M8( zPUr+Cnt>Iy~Mw(m$sgs zj&An9E9U-_MZJ}W#6fLsodc4LOO<$eE(~RC^$Thwo`+|y52=!2&~#)9@l@N51dh=F zD{t68UWV%k)|876@5f|Y4?NBsArUz&?8A>TBww$RZDQw!%K%BI@J%-5hcZdQHs`ff^;cQSZVg+5yV<1hH{uHptyF8N{ zS$A<8>G(v;-5ChqKlZmzt+oN2=H%W^Z8*RsNxTo<4$QNJ{}^@BT4>$$KWN<0LkYxi z3C^kxbeLd}Ui%`}f~dayL|=~D`ZA?5w%kfxl^w>18$zH)G2YmXTy z`6Df%SVX*vu);9G#qA>GvLC(%a4H@6hw*g~V2E0?ZdN#7VQ`|lC!#HKnm+sLV%e)K z6G-n?J8d29_wu8K4#Sa8w}k@xMfo1+vp;LL*;oBhmFg0LDVn&cAd(g{(m6AW>+qE( zN9!o|7plN}dwq145Jf*5jU%=SXubY~9qKA|vY@*ev-8JLUJh9W3l{bQY)C7jOLm0o3WB+cRRIHFM0VsQn)yoY0iplU#CVxh5|#r z2ITS5$o95>C@oc12mA^0&h zTLFWIU#W+QSP=8P0lX%%;Dy)uGUhO|f*|Fki-9Dsbo|z~l^HX#T3z;wH&%Rso36J! z3w7I9r{oU&SK8iH)Uj5o0nK*ZW8~jhA9UXgy%W37zx}deN!pTq!p738AHNzzM@hrK z{Ag6*)pn`WwM7T`lzj-3A{5t?v?l@n`4i9qzHZ&nAobtKQVm#8aMkKz-XyN5;@eW* zL(3MyXk#!3(5&YNzIv6W_b{dgkkvg<_)-=-qlUND^BW7u`yo>3mOwp_!cV*EMxK%cU$R|tt`wHJTJm~XcW+5n`F$#pm zi*Y+-OgQP7Z!-cBdW+Q7-3mH}xM(Md4nA@wS!In!8j4rng4OdUt_rRfy7$m-0T(ON zy3l?`-2Av_cyod;+dj3vTNrpL=i247N07>`-RDA>>Ow?ReVx8mjzgSP8gWG)xG|Kx zLElolUCkYMnj5U2Hg8TdN_TdVS;2){Yhv;4dJ!24If0RovIBowHO z?tK26azUWGKIFfnpWxqJiH