From f97ae6d23d069f8a180cf35de14fc77098de90c7 Mon Sep 17 00:00:00 2001 From: wolfv6 Date: Sat, 28 May 2016 12:37:40 -0600 Subject: [PATCH] document --- doc/keybrd_library_developer_guide.md | 21 ++++++++++++ doc/keybrd_library_user_guide.md | 2 +- tutorials/breadboard_keyboard_supplies.ods | Bin 18224 -> 18409 bytes tutorials/tutorial_3a_multi-layer_keyboard.md | 31 +++++++++--------- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/doc/keybrd_library_developer_guide.md b/doc/keybrd_library_developer_guide.md index 1f67fff..40b5624 100644 --- a/doc/keybrd_library_developer_guide.md +++ b/doc/keybrd_library_developer_guide.md @@ -106,6 +106,27 @@ Most derived-class names start with the base class name followed by "_" and a na This convention leads to class names that convey information about the classes inheritance. Underscore delineates base class name and sub-class name. Capital letters delineate words. +## Layer-class naming conventions +*Code_Layer* class names are concatenations of "Code_", "Layer" or layer name, and persistence. +Example persistences are: +* "Lock" - layer remains active after the layer key is released +* "Hold" - layer is active for as long as layer key is held down + +Example Code_Layer class names: +* Code_LayerHold +* Code_LayerLock + +*StateLayer* class names start with "StateLayer" and end with a descriptive name. +Example StateLayer class names: +* StateLayer - basic StateLayer class in keybrd library +* StateLayer_DH - main StateLayer for the keybrd_DH library +* StateLayer_MF - StateLayer for Mouse Function sub-layers in the keybrd_DH library + +*Code_Layered* class names start with "Code_Layered" and end with a descriptive name. +Example Code_Layered class names: +* Code_LayeredScSc +* Key_LayeredKeysArray + ## Style guide Following the style guide makes it easier for the next programmer to understand your code. * For class names, see above section "Class naming conventions" diff --git a/doc/keybrd_library_user_guide.md b/doc/keybrd_library_user_guide.md index 30c66b9..8df2b00 100644 --- a/doc/keybrd_library_user_guide.md +++ b/doc/keybrd_library_user_guide.md @@ -205,7 +205,7 @@ The standard [IBM PC keyboard](http://en.wikipedia.org/wiki/IBM_PC_keyboard) has Many compact keyboards have an additional [Fn layer](http://en.wikipedia.org/wiki/Fn_key). The [Neo layout](http://neo-layout.org/index_en.html) has 6 layers. -**Layer code** - is an integer assigned to a layer. +**Layer id** - is an integer assigned to a layer. **Layer scheme** - is a system for changing layers while typing. A single-layer scheme does not change layers. diff --git a/tutorials/breadboard_keyboard_supplies.ods b/tutorials/breadboard_keyboard_supplies.ods index 292159b4f982e91453cec0d2060d60528f40932a..1e5f2099729eb3b060aa7a12a058ebb27e7a7c5f 100644 GIT binary patch delta 16496 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 ULi=BZfP|AkB`6?_MgGD5KM2%ZumAu6 delta 16293 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 u&1q-2>hWG*#T6e){BYOgwM?ISh&r1Dexqz5| zXo~yTj2+_Y2)(S;kYhOC#LK^Vr(UrRz@I}`H<>@ko4>dGPOK3?e@ zsozsx7}Ty0`r@97GG+4cr_k6bmh`N&%Po_}O;9>E;Acta4-Uy3wATu2!3Eggg-1Z$ zTNf!{2KIm)U)^4ZTzn8M>ixA2xDlmftpd?3UU=#4t|+VfH?sOuEvi?UwH2BWMcwiw z?Af@aCq1s{aZa^+ueqjRZ&yYu>J`h`DtnFLUeW4=G#9t;FH9#vC+!vhV2eRFJp-VnlbAB>o+ z9*m}|k>Q2yeZ;_fW-0z559e5lcg~}0qf$3nfWSAqbIu|~$cJg?vfRQEvh#KfZ8w{S zyL)n0e!y~DHw~IVc3^uM$SnR)hTBX1bbWapK759p#gJq$dw^=~`-Y?*=?*M6s#bTq z^)zFw_2TKXZk{)oprCO&_f|MAV%vwe$HM6cqEdZ*4{9gx{Up27L!u*QwivBadoIVUc`CA!ejl#+Yj#I;uv3c5l~D z0yCmxEm0cMnHY6tCNhdcD+hEtlc9tp#x+ZrqbNaq^xnOdR+nw4COS3|L=W9jYQDKd z=t=Q|RH;>&dHp>f&bkSXWDFee0JCJGxRVn_XDB8rE*_YSMAPqh5O8SsGKJO)@6(!-MZziYsCzoUxi^_qfYohJ*{JT zFw)Hx?XpCQmB+{UZa`JpXZ9Dxb+PVJt-OL$)* zO8op6;-yNQocDhW<4#b0gjYXo`4m~_yn=>bn<7Y#SBWOO41j!!5_aTKG@e)@di-ve znZn{)kRZY~;)pddtM9T^FFc$agWj>yg^PiBWp=Ls{+Hf)hJb4n`sfa~(SQf4BoS6d z#X^GEpX-hd$zH97MMAk7#xCp{iF0c)$i-WY<4dB(Y*5&mC0zNrSff32al*#xit=8n}u^-H5 zqYk@7C0M_9y6X-ew$%UFQ7IS0z=iveCNbcj)}Wq zV1YwYA2rZe%YY;NkfRSK?w895{tvSuVlpLr=Bahuv9;O{Pv>XD@y#ZgGv5u|r2?*>JpqB9y>^&V z`S&d(IfOYhJc_ofdek=)xySB%b_*4u6ft%GY zPwg8b1Sq7eI(rS*Fd+CoT1C*&wY!&Pe1#*r@MQ5ap|8L(wuBpcr)(Sh0f%9KReGTCivN#dxMozW$tM6Z8Gq^ah# zO(xk4*$k}z%apRz0u5Om(i9emU(1S(-QAIG&(oAp;z}n^*TRpmvI3l%J+#zayI*^z8 z#$}r9;YC7qQ|R(JQHbC^hT{WrR`_R4>@b=gIj-h|1_UA7AV<%^%I?9wNcHa@cm&^Z zU)4J>`ea8CjkkNCRdJY2Fs`%47~C&7k@m5T>L<}Q^hIHVa)z^b@ljQXoN=?NwJu~O z(HSU{DCYvwLd7{Rl#xmCq+{$2ih(Fl!EF)^-2MT5hSJn;Ug55^ z_GLp0YNCC*N}%8|x_pHD7%Ulu=Mr47jA?Oear(4yvNHP~MDxtN=v&Hfe;>6zKxK5q*!Ef`?5iQIrZ>{3I z3x$$jIWgz2k_&fVjr5WPs_MAgduEQC&W2K+R|&fOg7mTFk0l}B;G5YX^B|x`Imd{z zJze+%8Q{#Np5-pTRB<@35%PS4a6Tj*r#?tzv;4){lxj_o^*&|lCN5oK)|iJ&3%=H4 z!$H~V7--{0Nt09j8p<_l%j|%v<9g;%KVdn~*3Q_&?GS&L$0gkboKrG&<5)W6(Q@0> zFZw>Nn&M=_W*XY<(lngD*}yA@^=IJFx|c7fxa<1i2e*4f)(7$gL~b}WbJ6cSI@7zn z>h>qpsg>mklxES*AGwdj41&HjyppH(1Xks(9B#Lc$m}dVOW_uD{WT4KoM_KwoOArK z6@Y2vP#Kn^)@NKxAkNrs!@Kyv=Q8Ca4jUN+7+vP}yZ3B6J?BISaW%d8DS1wX&9ZBD z#7{epoYs&qDm38{jWtQCHFVdYN^ml$;6v{;q^LDP>=c+kD4#0kCb?$jX{3z;LSn1?Yo3?WNlKHvbyAIb{8ImECpX%jYTgRts1?4o$cTI@s_fVJ#ex<`h+ibUvy6^z$FFd{2=Omjh6*`|(^EpKzcYPsW? zBW_iYBb4b0%y(8f=huBkDnt>5)fU88jXH3B?cH}Af^dLN_IWvMVSJ@c5q z^UNCvHmeV1Csi}J9_ZHV`TJ)u=9MxKbD8i;`m^1c-M@abv)u0BeGRNMgNb}JtW_1! zB8*=rYqv^NLzt~DLijM1jZ|YI>b}76gZu}#(X`fDQ}{4=Vz`NwU#^{8BFnnj-1#bu z6%ROyz9o=96@AI2Ou0%#-KM0=4q^1rZ{#(XdumR~aJpi3bCb14Q<>FB?}a7{BuhRO zR0N7%2M$~~?7D&9J^q?)ug*r2YHRL-wbOs@dU)k4a|$0gKDmPeQY*^mNhnf7-_5%b)78TMbW}m--rf^(C11m*tHcvzFV+{XClSn&lhclX zL&L;EbWnA8<9(GkuZElKZZ8&~^X6ViVAQb-d5J)m6 zNoi1E^dI>X>K;3C7PyQFY6%fK%;k1p889O}@DmfeF}AN`;0tQ&yTU2EV|xDp7cO6U zx^^2q8#Ssgyy{{J{Z-zZ@O=<^)H_K~?Ym{abN{*Dp&*GJmBrV#{6F9;@{BPb@whRS6AryC`7R8hX#tb`O?Hf+E6_qN< zp-FN*oCBSnP5^5Io3pEiNgv@7-|c6o&{|rW?uzlLe=xN2T8HX(mJbn~#6mY)Reg!@ zAgMcip-q1fJOQSBmcMuTLjXSmAGS#3e6oPACtX{gcR#*-|GdxF+S*;eyWLAT$jSJ8 z8~qG;xbyn4Tio|3eMm6{xt5o327sJoj-4&cK-+#Pc zL}Yw1{PXx}n11!=?zSsK_{X2ab&_7`4RJ?rxH!7|tZP#abt6B01cA`#4SD{m-s)ctz!a8)13R1c)9 z7mnuDeH2~8>#WbZeUYU6h$}GT!Ud%`;%CxwI!t|Gi3QaTKBOramO7Uk- z@y9g%nnt>XV zH-`+v_1Ldl64`CiDuJjc{AVMX!im=|h50@D4=SlI5S@#9U+ye}+nm#(UE)=565tIG z{@V6zXIhCGaKGTq`EVwfeJv#~AZBHywXEDf&aS}n)hogE9izm)lk|eJjgcPah$;pW zmfh_!At3eM6R%*YHzMT+!gakO-g}QEe7odq)GrrV{vCZI7ctF{zJh-l_inJbCUrca zt5vq_WBq5uCd`53RJ16i!iW%ie`3DY)@eGSo$<{Aa4B4KtT4FS?rZVP!B$c}A^qr^ z5z162{)r8$N`(?Ft|`R=LB{=K6#+)h(&=45n{qoZNI?nJHf?Fj&i!azRo~lwNaS}5 z?52XQsj98P$9VkfJ>ymlfp|@wx^|h(+Eu+Hdk||i?LIz8_9yna@SuyI!aH*Ai~TKg zX55!qi?zoD8S}Cm)GyP8-z}{6b@Xp18;96`^0>30#X&&pDtq+Z2g5ytPO9IG+zB|z zSHFla(mfoxy~w`!F0K$#`=5)aP0@q}CY9kF|7XrWefR|P$S9P40ALUNy_x}#l~k0d z6EhC^uiGZDu(1E!Hc5%0AOY%mt?{4+ZW$%*tq9VE>$e?3`o<2{epNO7mU2zKj-gB; zFO(ch_9M^&(Lu~byzlbS>sAr5LI9Rdgjj=#{b0eSTJI zaQa62LhY^|;qf^#paNzxLA>BrJ1EsQnn!h_vchT*iRrLqIb* zieV|Mx$v+c_o&CO3-=<%$ywXEJm~v26@w-E=n_j6TIm?CnV>d@pIuZl!$P^$TIQhl zkJNO#)PS2|W_0m+6s{r6WCo1c>`GDfEh-y$5ZMtb zU0gTS@fp=Lrii9jg9yW6$PE~VHa$$omsw>)3SoP3p;ZjfD3B-6Qk{HP0&>C*yRYm| zc`S+XULV!tgxFSMU~M6JzSkof!{$Gu22<9Wnl-UV|N^RT~ zI#4{0X7BRZ#$Py|*p_1N;GL9mYeZbIQRZyfacgp(J)}(#33TzL*fAo0BL{Y1?xo@E zv~tpNz3z2`H+bT>T8p2;b}N3h7Y}hmbK(NmVa35<{qo+0hi&bViTxtpkKeuvI{> zD$?3l+Kodh*}8H!E`w&v`oFA@=!TzfCmlRdjytZUF4)qyDl>J4eCcfWlF?&pXQ_L? z_w7x7Ni0+jHBO1v_$h$O>+Jd0gdr)O#2UYg=2~ z9!}H^d2?ZCPaJ7xIYSh-Y$m#2ClqV~$XyJ8FPIL7C8W2~p(|WS>CZ75NW5qw;HUJX zHKVk`W!pwiDQlY^!j&w|7p8{mGaN2+8hnZYS|>a&jY8>;!>^ZFN3)f}(=&&G!yh0w zy0wr>d&R*u+mXeWo7hGLbxu-bPbSB%rPJ)2Pr?Uxx|dWnS?~DYhH{Q(Gt-RI?`*|D zusjR!Fwx7j2`kYOL^68lmZ=VY3T#EHv%jcy4jIqhiV7q&T-KzN$cO1WwrKR67g@QX zu@jRld#~FF)l1XnZlzZm;t{7`Wodr9$jOT4#>26Ii`xHIWBafI)5~}p?5&Kt^#-{I zEwN#J#ZGSc?RI^X!YCZ4gUQ2+I5YwzMIqZ!_b^dHA;9F>7yM;5W1O|$LKp!)tF~J@ zmtUzq9?m+5vyHfY&q%m0g>wh}L~`1w7C)VPLp~Z-&>nXDv#GVGlT9PPaGshn+`LS` zbJmfttW`7?YG4w7M41BD%pPNqtc?bFYZy15v-tT(@>_um1RH|8XxVY}3y(FB6tJ7R zSiX5)aN|VCb~6ZW@cWkt)N=G@W+DI)%()*U&@DPqjsWmL>{it?qtCnsLwY9%DYsr- zj;%&NM6Z^wB2&C}GRui9QL2G`Y^!ZyF(;J#^3UCZDm8~$f!joPVbOf}44o9Ag&{JjNjG@0 zQKCvkjg2hL>}@z*4?~IS+@N8;ieKMtA1nfO3MLli=Ql7g&+DZ7?Pmvezw#n`m{(_O zeqYDW>=f z53MeY$+`&_hwjIG602CHnP|G)BzApxnaLqGu^YBhk7VUD(~_T*`=tgoc=E4?W>0 zcFlMzdkCfHq02p{@o^6+%YNuEaUNv&EEP?p9Es{-ZYZQx`HoGl)iIdc9^7_R7l6mD zj2@YYh)(Db10Rki8==026hk9?N%0wB~ei}|m z(thAjGM+lnQNqYXwzT9hpppMZT`~|kC7%0DO1RY7bbWN0Sr4r6fO?b*eGEhkzh|^sC!O&ioYOPOA-j8c=qPRK_TI0n8jkQ&5X^IJ zkjM}=LV{V3O}F4_Edq0dg&RW5Lz+vK!!elOj(RZ#E=9uRIJpnx?Cr&z3D1PLXO!bG zC<#2`rc2Uns=L0rtW797+dk*4{{Fl+xmpti*XI@k><}g%8 zg4bUYCj^@2Q2F~)*O?y(-M{wj=xj@H4fRV|L{8m^owRA7tmv*o+9MA^*)MX^hvimM zu@aJ#xhkM%Hg-A+nG1(=j|@vMoO-N%IDV=CyY<3e?u?x^>>7g#5}hf_PSKCzkyD!} zkO*Mtg9tIhWY`ujsVRtg_kY<|BsP4Ooh~ZdHK{a{5Uk|n-yhbr16@ro+5&wBzh#s0 zb7%Ryo3*!h<%HS;+qX8h4A4;0*+2QbuYCl#rn3^F8_`yN5hGClR680u79OzBrv{1v zvB|MzGx=bMK0l&6uGtPWB0JS#?g__W=Xr)V9iB85vv$l1{5!A;r4JmUGrw->IGrr5 zzs{d6zQ@Lsh}G1sIV{>dw4u<~qHdtBBV~?KD+zGwYXt3BbS*SJ#+u!|-d@<7!M(zT z6jDRq`+YhaUwja}?VvQ@M}RVYM8H3QddjlMXgkX zCBZvuYaJ#AW|=j=t`ASEVbh}bJYEPijBX-m+3Z{qi)eyq0=~_b~kP_OYbC zTS=H4db)@PtPvMwie*OVp_>q_OWZro#0$g!`XU0Wh^Gofr4{C$^L;|w03|(Rw%TX( zJGVkW-X!&^$)6W^79rBmk`9pp6>E65<*VM?V+x42q$!Ry=^Y<2kD!VChNP%p3FTbd zeVb}7P`9M1?qAxQn~Qr)w$9HV5vwHjKi`zUiW4;-M@y1cvai)!N6k$tcx+syK=2K z+Z6Cp`|g)^SFd7{80GFxxn=hYLhEu~H*C~t{)m=&zmLRD>WD}PXnXpji-+vD%Y zf5*xlacLt%^>=u}YX&4y2rP^)kqG#{7i>1RAKsm=X~i$&N}Gq8k>Ir1RmFwxGZwV5 zng_y8Lw3G|vnt_Q{xEw0QP+BLzc+UXb-iykj5SEhcE9UN5@0(42c9R-Th~sJk}K;x ztEyS%%gtM}uOyF2TA1W}3d*4PkCqLaH_kZ{0$pDFUy9QM#>R|}{=jVGhQ&g&c};9$ z8(aq@-Obk<8Kv#qoIcSTli|W(%^D@4&>?w32!+Efjv}vJ6egnkO`#M!ZJqXt#J>O8 zIo-YA9R=f)q|g`yj(4)|$>(N`&831rW6l?XQYS{L&L8F$sd7nScI~a?;o~+kX=OE$B?{Mv{( zqAA~_1YqJ|(YZ#+5`#)^1jo!00opLiNs)(MCcg{i&-qh<-JtOCEH;Mzwj7Y@yDM9T zSE&&HEHW(D_r}O#e){%dnKNb&t-uN)RP_xNUb3hS(!irim7ym~+G@8$AAIw)j6vgg z75`n*Og1)G?b}TiI5cOaMb@|>FGv%~uzSr=_OVo4Py$1@af5>YW}|=7_k)CWv(qhu zN^K z5t=4oBU1|W3KKC&H14faa?4CWUJO(Rl<#7E*pc~V*-W-~8f)vZ zH|@|sQHlkIATB1ZJ^phN8R@fqv5%R-=gLVGLMV-RkEb+5VT(NgQFq-B;@)2BHQb}- zCMNijNv>}13vzC;t+b+JSpY#(sS9 zq8xJ#gF-VA@Q4i~xn4C}O%pThryQG^8of2fTg)g3Y0q%!$ly^lG9fphv+P~Go2$xb zTukj|%IH}mf185mctc2C=@4~$fkyzXQYI!v*;}5}k>PMm+Yjw8MMj`FK@pk4%m;`DSj^Nhjw(pWa++@ova@Dl`C88w1 zPw@wWf96(!1e~%63;_5F@xSIarJtJtNZq9;=XK)f0iMSLN3XtJ@^(zExEz5Y-PXK* zd**aLwAt+_u15>NLVe4^5oRY&z?hz{S39+5#R;`w@Zy8hhp{4ykx8%ltwi#9tGIFZ z;AF)ZFB_SGh7f~kHIH!{Zn_iXOr3tPKhEUcW-f!;IH?>xtQsz#zBdWWbaq?{|kcPX(eQ+X+Y9(=iF?9UMZ!B_cRN`!se-s8MUvuZY?mJ>`pA@O)fbY=A>FZ zO6y8uGkX2w*q(EKh%tfz1Zgw+3)&GOGckYRS*oDDXB{5Tye?0vbZVeWx2^%g>v_>J z%ri_%t9_$9mEb(m20*4)-@4`ki$Dq#KibBQ&)29SI3fs!q>r+oxz#L)^GipOs~XZb`h`gZzoR?x?BjWyy3R^Vl1?_-+qEfY&e z-LWef(Lc{jaS^jf*M4`OzIVA-T7M|ufhbZ~-Lk0oBdd!` z+F)`!Ge#w{2R1^zW@a26Xc3WjtHaywDjZ@q(Amd-lw3;dMpQuoosI6>?3!PY8=v;==e#q(`RtnE&2i#Q1bPfYL^xuQGE$6(zD9Lw5XA|44Blcz-FTV|mAHs&m= zyHJ4wV$=LUobkbCUC+p8AuxK-af!uDAB2Wp{!|p>5b18X$26`C1ZNxcZw=ZS?((9Q z_r(}f^jABh+*fGO=KCz-_Rh@4zU*ST3&tW0-z;DY$kW1^rc#8DelExvBu6=H6jmRt zx@r2x%@E@p3$Od|Amw(@B*fm0s&Md!i-Bzreh}8h`>$mDxicq3&|jF2E1;!X?Qy`7T5HQagH3bCVnAc zSEJ*=sAmS*YM9B~JeUk)w~#q3d7fS&5ET;tbqrfv>9@|td8eN1Lpmbtt1Hos2_(zr z2I)(nlS2{OtSKibR#PzYL=bF!&9Ag^eive?{>26_sKa;BJPqlB~OGUc133n`%uc9U>Yx&r473A3mau zhj=cv*WknQywI6=y`iyepd^*-{CdMkeqi7bV;!6?}kbSr7T? zQR*t)a>`vEMsHh@Mh|YI3yUi{9N(1PX?=GmzV7I9snNFIt2^uh3z5$rEl#l)dt@im z(A0&eB;H};0>QsN3mL|<^s&)bNr|$ElH--5<0ttfkZ!D@A68111F)JT(=#g(W)2Zq z1#MmYx>fgJ5+U1^#DLRgec!r2c{!w*qW!U1yD@tH4JzM z>Xw*sy?l(7qT1sEWQD^%aM&X8th_xy`<==Nyt-*TN!W@Sh&-MOEIqEwV)$z)Msnif z4JVVvaX+G+{lP&ht@4t_lPQpoPlg$&S*wVhg&&9secEnO9v&n`-=8OOQgcu9vxFq2 ze!Y2(q(*Z|B05xq>`}0qSUnrrBkdtzR&8JIX~pU_#ozFQi3>O5_~GT{C2NbgM(P$D z2v_^Fnl^hc8`gTsi4VqbEUxvBVQs0evSY@_y|3;0(g+_jt_IRP3TWHQyE|@e;`DA0 z%+iX;a%wEUfeDiF3PoG^o>GN0~ui zKC;jJT5{dr`IL>ES7IcIwBrMce?Pochi!f4hcACZ{Ij_!X&EE;LIVKql>cjUYi<(~ z0E76)0mdXkmeMVX`7ga7%KdK%BdY#yIVbW3=D)+TQw&A<{+maZ5-x)Ne`#bXc!d85 z-~Nlo`R}`baCsyV|9$u0&bDSGG1LG0sH-^p{~P3;(j?AH`cK&Rf7+4%YFz)37Rgf( zB=EKW5&BPk4BH=Vt$py7oVbJS9K^ zhyNe&{~R;;{}K30y>bBnZtgzz7H^HcJ_X7V3S;lCVYssG~qZ4cPWznmaR?Elk3Fq9M*Y0MN}Ni>-M X;}Ff4CIFWfP3e}Vfvyt!r=kBJ6T1#5 diff --git a/tutorials/tutorial_3a_multi-layer_keyboard.md b/tutorials/tutorial_3a_multi-layer_keyboard.md index a1d397b..f4b98dd 100644 --- a/tutorials/tutorial_3a_multi-layer_keyboard.md +++ b/tutorials/tutorial_3a_multi-layer_keyboard.md @@ -4,11 +4,11 @@ When you finish this tutorial you will be able to be able to modify a multi-laye ## Multi-layer nomenclature **[layers](http://deskthority.net/wiki/Layer)** are key bindings provided by the keyboard firmware. For example, -* The full-size [IBM PC keyboard](http://en.wikipedia.org/wiki/IBM_PC_keyboard) has one layer. +* The classic [IBM PC keyboard](http://en.wikipedia.org/wiki/IBM_PC_keyboard) has one layer. * Many compact keyboards have an additional [Fn layer](http://en.wikipedia.org/wiki/Fn_key). * The [Neo layout](http://neo-layout.org/index_en.html) has 6 layers. -**layer code** - is an integer used to identify a layer. +**layer id** - is an integer used to identify a layer. **active layer** - is the layer currently used by the keyboard. @@ -17,19 +17,20 @@ When you finish this tutorial you will be able to be able to modify a multi-laye ## Pseudo code for simple layer scheme The following pseudo code has just enough detail to show how layer schemes work. -**Layer** objects select the active layer. -When a Layer object is pressed, it tells StateLayer to update the active layer. -There is one Key_Layer object for each layer. Each Key_Layer object has a unique layer Id number. +**Key_Layer** objects select the active layer. +The "layer" variable is a layer id number. +When a Key_Layer object is pressed, it tells StateLayer to update the active layer. ``` class Key_Layer { int layer StateLayer& refStateLayer - press() { refStateLayer.setLayer(layer) } + press() { refStateLayer.setActiveLayer(layer) } } ``` -A **StateLayer**'s activeLayer is always up to date. +**StateLayer** objects keep track of the active layer. +A StateLayer's activeLayer is always up to date. ``` class StateLayer { @@ -39,9 +40,9 @@ class StateLayer } ``` -**Layered** objects contain an array of Key pointers, one Key pointer for each layer. -Layer Id numbers are used as array indexes in the Key_Layered ptrsKeys array. -When a Layered object is pressed, it gets the active layer from StateLayer, and then presses the key of the active layer. +**Key_Layered** objects contain multiple Key pointers, one Key pointer for each layer. +Layer ids are used like indexes to select the appropriate key. +When a Key_Layered object is pressed, it gets the active layer from StateLayer, and then sends the key of the active layer. ``` class Key_Layered { @@ -58,7 +59,7 @@ Dependency diagram | Key_Layer | +-----------+ | - |setLayer() + |setActiveLayer() | v +------------+ @@ -66,7 +67,7 @@ Dependency diagram +------------+ ^ | - |getLayer() + |getActiveLayer() | +-------------+ | Key_Layered | @@ -76,14 +77,14 @@ Dependency diagram There are several layer scheme-classes to choose from. You can view all the class definitions in the [keybrd library](../src/). -Layer classes include: +Key_Layer classes include: * Code_LayerHold * Code_LayerLock -There is only one StateLayer class: +A basic StateLayer class is: * StateLayer -Layered classes include: +Key_Layered classes include: * Code_LayeredScSc * Code_LayeredCodeSc * Code_LayeredCodeCode