From 8c063d60a5248f48f4244f077eb3a7f84de912a5 Mon Sep 17 00:00:00 2001
From: Jake <jake.read@cba.mit.edu>
Date: Mon, 12 Mar 2018 12:37:38 -0400
Subject: [PATCH] update with packet handling architecture

---
 .../.vs/atsams70-usbcdc/v14/.atsuo            | Bin 17920 -> 47104 bytes
 .../mkrouter-v04/.vs/mkrouter-v04/v14/.atsuo  | Bin 85504 -> 85504 bytes
 .../mkrouter-v04/mkrouter-v04/Debug/Makefile  |   7 +++
 .../mkrouter-v04/Debug/makedep.mk             |   2 +
 .../mkrouter-v04/mkrouter-v04.cproj           |   6 +++
 .../mkrouter-v04/src/apahandler.c             |  28 ++++++++++++
 .../mkrouter-v04/src/apahandler.h             |  16 +++++++
 .../mkrouter-v04/mkrouter-v04/src/apaport.c   |  42 +++++++-----------
 .../mkrouter-v04/mkrouter-v04/src/apaport.h   |   1 +
 .../mkrouter-v04/mkrouter-v04/src/hardware.h  |  14 +++---
 embedded/mkrouter-v04/mkrouter-v04/src/main.c |  34 +++++++++-----
 11 files changed, 107 insertions(+), 43 deletions(-)
 create mode 100644 embedded/mkrouter-v04/mkrouter-v04/src/apahandler.c
 create mode 100644 embedded/mkrouter-v04/mkrouter-v04/src/apahandler.h

diff --git a/embedded/atsams70-usbcdc/.vs/atsams70-usbcdc/v14/.atsuo b/embedded/atsams70-usbcdc/.vs/atsams70-usbcdc/v14/.atsuo
index b99671cfee44497af4e62ee3fe3c86b8fb4d9cdb..5ab1c8ce251f875c4591d926849a248579d4afb2 100644
GIT binary patch
literal 47104
zcmca`Uhu)fjZzO8(10BSGsD0CoD6J8;*1Oo3`{V-00RRHl>hJl|NkIiW(Ed^|D#|?
zg+LHPK0`i334;QID?=Vb2}2P>B`7M1#$pVt@HmI34IH`^^k?ra+;*8!lYxQZfILJ|
z07DT&K0_9RCqo`X8bdyVD?<fDf=E(~feCIuDBy|FR>#1=AOKb9&rr%x!jQv|$&d%e
z=?uXPB@BrSB@C%xw-_;4KviO=)EJl;6&M&8#Gq*(yDCi4J5ZqrhFpdmh5&{{hGd3p
zhD3&RhExWBh608XhD?ThhCGI1s5)Gf3Ih`($loxGOC7R!6axc;0w}XGFfgz)Ffjau
zX-1+!d77VrfdND-Lur__1_J{F2Ll5GCj$e6DAeCDIS|c-MGPd45A!iFFz{m0r^LX(
zpvAzzpv}O*pu@nxpv%C(pvS<#pwGa-V8Fn@V93D0V8p<{V9db4;KRVcV9LP2V8+0}
zV9vk*jyX#P1_mnz1_o;e1_m1j1_oOO1_nC@1_pZu1_lQP1_nn41_mbv1_oya1_l=f
z1_oCK1_n0<1_pNq1_loX1_n<C1_mz%1_p0v7=XggkAZ=~pMilPfPsM_kb!|Ah=GA2
zn1O*Ign@w}l!1XEjDdk6oPmKMf`Ne{5~>fB-thT<pycS8{}-gsLF9i>rU8c`{quj*
zX#R)ie^|O>g_Z+?3=9mQd=C>xreS3PDF1UaFfi~y^FK%&goU8_R~Sko>m|e<&Hsc#
zh&J-DHXW!s0L38)gW7zcdI46(gUWMQe1qg+7*wW#*r0d^#kmNytOJROGcYhnAn`$B
zAS}zkz#zxKzyPZLK}CQf0|Nu7j0e>*Dhvz^stgPaY77hv>I@7FpmYXmD-c`$o6w>B
z2l;`R@*kuQ8AmfPFvKu0FvK!2FvKx1FvK%3FeETAFeEZCFeEWBFeEcDFr+XrFr+dt
zFr*=cTP6boLly%ALpD?_mw|yHkAZ<9AIdLeU|=X>U;wuhN}yt83=9nA3=H6w6sR=^
zaz`}-149i114AuTO+5nxLjzLz3u<>2Fyt`gGZZnTG87@Tf{<Gdm~0g?+FvpZ3=9`Q
z2?|_~;%<MrFl2)LhG{E81lIlm^+iBA1R;Z)<;%dp@I(?K?*wlDW;5h6Br+5+WE1Ug
zh;9Z383rasP#yxMYhvvOwFy9J8)QZZLn1>lLpFmCLncEpLkUALLk2hwN*I#CEmI=e
zf8cf#C=U{AKd4;-%G)6OL2d`N+eh<1aqT})UK$ShALI{EdV%%7M)Uv3%>RV?zsBGm
z7O14ajzRrjP&$HP?5a>j3m6y}R6qp}f$|@eCXK<pJ5>G1JT(R;22i^J)@DVP!^JKI
z^#zHxAJntNWfG{ZLi+ea6{rrzZ6wJuu&@Wwq-yqONMguh@MTD6C}MC1k2ruvK0qTu
z#SCHK9yERvl^B>9L2Wru`<+<(LH%@4odYu2nIQ*U1A=VJWJqNw$8ZHm6>bcx|3Up1
zV(kZ&eJ~S48S=obo<xQehE#?W23UER%8<-Z0&Z2oRAQ%<$Y}qNVm~MkV7D0}3d(<=
z_A<!tAPf=3Pa@l&%a99>^%#a?aJ#RJA(J7QA(f$+A%>xpp_n0wA%-Ct9!DT{3PUnO
z3^=r4YC$Sf7%~~+8Il=5vU&{33<sxJ2{SwJ6!F*IV4QL4GkAO$<UV8!a^($17X~Ya
z7zP*cIA8%o5<@;i1%m>E215YYJ;h+xB{JkNXfnhwI5RjgI5NaA6o6G{F~DLeh9Q?B
z8!QHDO@i95F$}2;xeQ6*IEBP)40u$pm?4oNm!X)!oWX!W7wSWZs|m{&GZcaSo(y(V
z8bc;SIyiJd<8)~Z@nE-uYLOHMJ%$X1NoOt^t?^!zt~Dubt=fLi^B~_M`yRw*V2H50
z(|$jHZ<T_L$sYd&?0q0r^u)uZ{0H?HAt6dQ^afM;PdNNRy;|IUg5`fw>Oau<_Y<g*
zqvijQFaJrN|3EJPQR}-9h9Yp8SOTAqDFXM5VY3m?M1w>bFfcKK<^e$cNn-OKvi&X$
zsSHUBr3~rdnU5ldaBwM|%#Z=DgODu3!Bk*iVg!v>fyN?<wI9^=2aQ#Mj6}EJ2|WIh
z$dJuYz>p7~5yIaJ&|qL<0F7ON#>j}ZA2e4q17taP&H>f`p!yzE{}MX`1Zw|+?1f>d
zv3M!aoDC?xK#IZ`iWx${V<0);`m2H=7+mkd>UNMCd>GXJ1DOXJF9f*(pIVq4Xl?{F
zUIXHXFk~_m!0UR*7)UBZ9=HtxikmV9Lk0uz><>saCf1^`{Y9w!HDUnGAYs}I69JXK
zAb-O!OdKDbfz<vdWWO<ZmJ7FOAp1e%r=W3DkQ;ETM9AbYFfjarazW`0)Z#B<$YTJt
zvfLOl8FIjR54B`K?;Ak1GgvV&F@nbPKz4&LOdKDLn*Z~`BVD-+pja<q2nXl66o!0;
za)tnge1>9%OuTcUpz;Sa_6)Kcgz?!6lLOVL1)xbpaQ?$>e<-v~>;f*6KqIv<6A-i>
z0}~@?C=*nk5NkiO|AQIw8FIiQeUSNHNH{~<mZc0uV4EQ_2s@EkIt)yVQqcJ<V(kZw
zf5t&OV8f~X4eF<WVlx}u{=UC@itwZB&*epx)l$+DZ*BpF8YqO2F$2SuVbuSC^w&Ur
z57zHtJjTxFR$ejx@RIqrE2zLlX(fQd02Ce!42__&=>Px!pfm{*9mOLn1VBA}Qv1K4
zxf0NN8BjkzXjkEm0-NTTx3$*#(*I)HK&c8n1VLiR7?jpveDwbB5N!W34(0aW==e_(
zbku5K#((w=aQ!pT@sFPWVdVm`G^P59wP(1h`!~SpkDU6)ks+AD4Lb6QFa09ggP_rE
z#JFz^xL=VBZY6G+_<p}<Vt8;9i&akMaud+h3`R={Rzff`$blAyq6{HVV;Xwn*T~^V
z?sz+BL@1A;k|B>F6+BNu+;}@oR}n)#xX%L_smBOZaE}jUI;uL@_&c)u@x?!A+#fW%
zRLKB~f6)9zC3rp~6+Bx3as_Cv3*-(^yBV@BSb<7;0_NL+3?oQl1<lZaT$2Ny*GUG?
zfPltYVBt~>o)3uu_q{>6rW8ECgDRWHV8mbu&NB=QpdRlD2I{1Ikh?%}P0vt5Zox7z
zfTn`K3}N4(=L_s{p3jiWPyij>DT2l$Xtn3LVc>I+zw#JB{SnCO)f>aWPq2Ie8iy`o
zD1rJ8G<G~ZeFqv91&!p5mcF=3Ujt~a1<kkI83rl52wdN!gXe$J7}CJ=4v;(y8ciL(
zJ_Mz7(45JIVGxIqlD8OII)P?&)=<e;#H{E*SEI{N#$do;!hpFR1X(5#obDhg4Kx=h
zFpS!JptULZ+QgvN9b}9gwRHztQ<KAx11(`dtM`Xj>ICIE&>H6*bWEL?{Tj#!J+b4h
zsI64cEZcC16I5S;=FPQ+QU1f;_6DsuBc{Iv$-ST!AE-A3>Y0LiZlE<~p!Odq4TIJ>
z?4n~DCZ~jj^+ysJ3K&2bw5J5*e$XBl&|KveD!CulLI#BuXq5&%#~?tfB}*7e844I+
zbsuQ=s>WzahK?LyOUa<NLO!&H0j<{^e(3;|LqRK{Uk!s44vIn0o_zFGu80-{WW)@#
z`f3Z6{EJ@NV9U|yYLHuYsB3@`GO!W}weFE-U|<-|F$Egi1=Ssp^~jLD{&K^pgaV~d
zd~ID)$A3Zf6KEgZP#)O?m9d~xBOrMby2uC5<P~U*9qRf^(9Aw)CnBiUPGxXpC}1dH
z@CC1U2d%^ci6R?k#=yh~%159*y`Xu2WI0@HP)!NyDT3r-YpbxWy9CJ-!g6G+{{z)M
z7eRx*;By*4{)MbJ^JPc`uYv=e!2uc}4FLBOL9L4v1~>3pEYK=7)E${-WY`b#JE$E8
z@*C<ZJ5X$ZR=lNy=T$)adO>RNVbJ<lP`HCeazQjcwJ^DK1_lO@dJvz`{uhvo$`}k8
zKx^he>d`T1{Taw!7)F=J#z$WN;lYr}kOFQq<S_&@<S^thxPe#1f%0w<9roWiK~G)*
z?SIN=C}qfFNMZ0{$Y%iU2ZE(dY<_@=f!1Gw`jw!)?w~M$iQ}U|`2}=t2}lk0^?#sq
zc=8!?h&TyGkBsyOYJ-FJ?t|<{O@E{7zp<4=s5u@KY6z^sz{CjJdjXmeBR2j)WB7w*
z{rBkpkG!G2{|{xo0wQJNW+9iqBYpip?oc9L29)n%n0Q^(Qwg&hM3ZXj==y)qXm}|D
zsAUHlZ$sXHK<xT|P<alTu_8A7k@Fw+`k$or{|vDDoLKvj*Z+gscgXF3(Ebll8wlhs
z(EbC^UL<^J3e^4q%@%;>QHZr4)b@M?H59k~mEirmpjHr6DOQS{{ZGi@k8Zy&c;7In
zms5$d7X?=v0Mz~konZv>I|yTSB$^<oy#P9U2PBMcKlb(qa;gOBLSPdz+JB%CD%k$7
zZB!Z$Kp&OCHgZGF`H-($7pzMOJ}<HP*u&GI$DOdQ+e3sBZWgE?2JH$mkhT9Bq!|?P
zAR1&152(+b>{ybUnxhw7Qks&PuNRzJRF;{XTCC@pSCU$kmYAGctfLT?T2!2wpJ!{X
zX8?ja3eKfDC8b5Fwt1<gB}IujItl@$NjaIx-l>%#`Pr#?wkbwtCWeMamS&b_CT7XW
zmMkC}w=f1*7MG;v>N)4<<fJB-Waj4;>$#`qr50r->-l6Bmn0ZQM`L%4OJYf)Q&DPS
zc0qn-UWs#lURq|ljskYIRCRc4EU3f87N1#?np?~oUz}N$$`M}%2@Vzp1|959z~<cO
zSWsYdaBzYQ1O+|_vx7OHzya}Cw1_tjWEiL&57I|3409(X_JQ1uuAdY!Q2k}VP{Clr
zV1NQ4r<!7y!Db)m+%jkIX%3KHC8$pgT6L?y0IF3Wy9z-kJ5(@OFqnbQb8uuR0oS}a
z3^Cx7w?HdjK)c;y7|a>;7z`L<7|Ixu8O#|VYx8p$av9RVC#8W-PNS7g$qb;?R_Ol2
z#RrY$;F2Ro92EaO;C+aL<rEBJT#ZlzazBDcItx@6fiOrXIc702FmN$EKK|^E+Pg~M
zrfiN#?^!pd!wdpVO@Iu>gRgQzR<kmKmVsg}?*{LNhpqqS!Lt4vMZu;aRGGr2M0O29
zH^UZypBTb!N1eR5HEetWniwx)fE^zII!5T(F!mc_GBk$a%Lwr&WQj{Lbj!e_VeD(j
za;+GKcO$@$pp*<ciWHP%zl|{e!WQJU4Droe_$I?)X&E`5Vg3e9w!up57={BwF!n*U
zDPpn8GH`1S)S??&2Rz^(AOS5{h8=tdYT*v_)?sqCZXz$h0bP{<@`nd%uM>1GA526S
z-XF!rf~kVhc$)b%lLC!p`ZAO<<bd}qLhcR$^&dei10lU&(COW_4B$Zt25ay<dNqR!
zgENCGgBgP}gE@mMgE50HgDZn8gAs!ngD!&!gA0Q>gC&D5g9TW`i2>wy3kFjLO9m4L
zCk9IfM+O%L3kFLDbB0<5J%$v9a&X@nw9*H%A`x<b2<Wa0n601@N9=BcoS+C&%K<)j
zotkd52H(0tO%wGP5aXpa42}#z489C{3~3CYS$xom*%=H@3_0L))Da;Ly77a$ZU|yX
z1)q@wsxDI*h;;{OrL!aWRMAX^GKN$JXNEKe&`Jzj1`hB|DwsY4-C07jgbOtobPf_|
z*A)lDEk+kB11kfoY8Pi$GiP&GV_jEQBQsqS7jsKp3nMcpT>}eKOA{wcM;8lA^V*uk
zlH$bNVsiuC(&D7#l;jvRzFu-cQGQm9i&czEQGP*EeuaWYKx$EOeqLgZW{k6wV+=?-
zHMyiXCO5k%zqBN^C?+*GDK#Y}H3i)$41RG@a!hVwW}aShO-;3hld*-7g^`7>nUR5!
zuA!lep{|96xq+^Mfq{XWg}JG@rHfJR^C9K8WbjyQ42X(P&dE>C*2^H)qfdvdM@x&7
zi1+62A>~cSV7Hj${M_99yqIF>R6q<kUSl9xC?>x+nRvg~v@;E*jEc?krNv1x$vKI|
z#WA3gBPA6yI}%fxk{O?zl1zN2uE~dn11PJ5FgVYn5g>68uC1{N&d(_YO_123mt8eA
z)dnU`7LHC9M!Jrs=0>_EZmw>+mZr|Gx~4`(MkXdEPG(MKCPTOsNy<+wN+CXpbq$#m
zhP~FQsdh3lH?S};ch+^Wa5mF5v2=CPwQzNE)wOW7a4|JAGcz`KG_0*LFf&a{OioPG
zO|wWf)ipLSwbZpRv`Eu6G)^{6N-;7|O-xG#btM=XCLCLS^VN=Ahv8gFaxl0IXYa8=
znhfzYZj#X2{3Gn3;tYh*N;)tXBo4xQAi}_)CNs>*Kd9Wm+dVzs(b3V-FE}*AH8kDP
z(a{OSbqsWNj07>#Ec7iiKn%wSzu+JPPsgHSlVr0%kVsHoV5p&!qoZ?0R(Y94WMC*r
z&@0(BBPzMv(b1*Y*U{0@+{H0DrL52$q`}KAI5fy9%q1frBg`))*e%G(Ex^p%C!jRQ
z*}ps^KiD%f)7jZGKRq=oBGb$=%E>#tG%(B5)iE&GJj^#JJu}QXJ<y^gpe)cOAT8Xb
zqSVVfBRnWH$SJ?jvLvuHASk5Rv(zoT(8#bbskF2-MO#0h%Eve)H?`Ej%*Z4uEiF0K
zw4mHH#oXMqs-V);yE4cz)g>}9B{eM4x!A<i-Q6#}B;O#y(ZZwDz}MG2DY($k$y3|O
z*CjpNRbSgV*f^=oA~M}1)xR>?-!CuI+%Ux_z`G(ez{4>)$T-i<)zv50$+^lWFel9;
zD74Bi*WAqAw<5*aJKw+}Jt`>CxhO9(B{H<qt->(H&nzr6#5=h-Pe0$a&@#|7BrmkI
z!qUY&I5a5J*d)i*#J{S-(J0+CB`hc>-8D6%z@i|jpxCLxIlU;++}zwrJJ~Va$;H^k
zBs4EHLfb4Sy*x0{tSYd~#~@EX-_6n4H95;Q%{kE{(8Dn~EhRN6**nkF*CXF7*VrYq
z(#fRQ$EheiDy<+i)YU03&^t8KHQUh4BFQwxFEp^Q*xR(yC9Tr0BqX@BASX$?D$FUc
z+$Ynx+#=F1C(JClG9x3@(aAL=v9cg5J;yyH$tTCfIkM2q)34MpMLRj%+&e2OBcLq6
z(>NqEFu=voNxP!dJUh}X(Zo5dFxV|1&@0)^FVEL9)!4<*&(A#ABrL4J(Ac?1zrwIo
z+rPBjuqe^7IM}UNKdsy=x4_@6$h^=jEU`2{F~F%byE53sI4vO9G9|3Y%Pq&<&p9m3
zvmhckB&Ed3C!@$kJKHhI$<4qd%rea>+aTB1E5j$F%+b>;)36}NH{By8#mghiKf=7g
zrNrCE!#z7OE2zrS#XQ6_t2iYiB(x&ktH8}M$1f?{$JE<3BqUthJ;O98G{n8IpvW>)
zU%R|m+pj!1Dl^kRTi+ntyRtB&L|fY{#kV9gwJOogu*}sd%{fHh$uis7C?q*O&pFM+
zqbky;IMpC9**)Al&E2oSIlaonBBQL*FU!=x$2%uCtsInPoV<cUO<jw!z0%XuZ9#of
zXa@{JNiZ-nF))A@5<&Qo3oJpKQCvoJTbC8wG_I#vnT@S=irF+DX!|D&@-p8u6;bAU
zS|*zM1-W^c6gm~SmbwS$n|Y@N<~h6Mn?&XKdx!Zs7MEsbr=)mz1%~?MyL$vxxP}?H
z8w5L-gcs&}rg(UI28Bijngly%S2%{|6lWJkd4>2^6qV%_rD<!2nwlGzhWPnLWICFp
zn46d7SX5;h8mFgwIGY)UxLf#SCk1EbczOrBS$Y^*M&y+kCZ(2Dl^5jsyE!}O2O8&9
znIx5^I(tUs8JH9qSSF_xRt7|*6&U6DN4VxXrxlj_mz1OgxJL#XoBMbM1_t|9qy?Gf
zR(M2dTc&zMc$J2@7MHsP8JC-9WV_}1`kH1080Us~c!vbJ8G9!B2D#;=g?NT(d-z+F
zMCDqR6o*&3`<bUDh9yOW=jf*;W<{D?W*e0yW#<N$g%?B`x*PfCI{I5$CWgDFY8$1O
zm8N(`1i4nFCufDam}C@3Wd@sMWH=_~WSh7+hgKzfnP?~G`Z{W-q?v?QW%^dR8-}_E
zhx_@O`e!+11r}xnmSmSEr}%lLYy0NsxtFI`1}7SaXB(E5mX}AAx|XGTxCfQG6lUg^
zns^wyS@`D{<(meWmj~uLR~h9OI~AF_n+I!qnmW7rgocDTl@*x#1(fQ$y1P3?rE5Ed
zI0hz}_<9Fs78s-y`=_KCC#4%yY6t2E6}e`4qy*(v6eebxgl8s~yBBIZJ31LyhF3*~
zM}_-jRJogGI#+0i_-B@xIaazyRap3&_@$;N`x$5(I)?=pc)CTF6(k2H273qkS%&9?
z=M`yt82Sa68@TzDm-?pWnPhu~WSi>y29^d@7FGm%R_3_)h3EVEl!qqfdnLIAx;f_*
zI|mr#nfUmnSo*mbq!s2Qx<piFq!(L;Ip>sm>1Rh)`dN4cRph3G>6_$anr9~E26!8$
zXQf4!xq4b=I~o-GI_q2bW+a+ur#j}EMFjh6dw6AMrdv3rl!xaPg%_l{cqD?FHIBrT
z-=IrKAmz8p0no+5phZ|ty1^lkakXSia}zW3)FfR?3v+W_6Qk5r-NZD*WZmSXBtr}1
zlw@-w3xish(cV2|$gYMHJ|NJ|NZ0Zo|LDY^a?F82UNLyN!YhU-Kc7S=zaTfyB>lpY
z^z@umANNRSS2x#CSJ(7P$5JOh16M!G$V|hOg1}<O5+_#|*P@`nU_&>jV6$S6kPJt|
zD${(gh)6f5@QVCW@2t?m@X`<ur>sOj1K0B8D92*20Iw+L$g13wG(%(m5<`RHU{7O<
zs+_8V>?#WjOMUaAypW1?j|$5GBj+mZl-vlvR5z2VjPfL>vVgqG5RXv(l+wI{)B@x3
zbhpUTBp1)J;)sBJ<0KdDv`F)G-#jCK_lydkAd8?RCvUT2m#P4dyf9~XUyBMu=OV)p
zN3%4?D4$BhL<@7vtb!cZ@+?<>r|?{D*D~!YvygI&v~n|-h*Ect+#I)p)PP7&qhymX
z?-Xz2Jag~JG+&c+i{QwR4DDp6RQIgX$_V#VCvCGLcZ={+4@V2_e1D&k3bS-Wzbs!P
zCxa^Qs46oT1LNSpVlT^pG}j<6Gavmzw^YaUyz&Ykukebnj7pCjzX+#1C!=I%i`<~}
zsPaTVOQRf*(2%73Vr|19<3RTu=YmS-^3WikimJqlR4?Dca-WjmfS@vywA_-E5bv^z
zh(ec)iik9C_bSiIpv<5U{{lxR&)l%k@G28G=a8fTGdHh{LbGzeQo~4#;@l*E^Tc$Q
zvH;&AP-nm=EXt@n$-^@x(KprIpwQVhFyGg}*+}2Rt<<Bez}wF}$fVFHAR;-*&@58h
zB)2rf$z9(+NLxSOt)$E(#5kzf+||?2J;Wd~GdskrBG)|2F)K1VBCV+0IH(}XG{`5-
zBskG0ximM-T-(Piv_ikC$jQi4Kin(QEi5cNs46@uBt6j2KP#*t$3L*r-89iJv(z~~
z$|ENvB_p)3Dl*I~*}Kp!(#P8?(A(KLt*X2<DAL)lBFVd`!ZfuqIm;=(A|)syCpjZG
zv7p%1AS5iX&@I(HJ3lhSt1vVz(<Cg>ph!O{s4}u3(9JO-EHNY0NI%NRtf(;AB|Xg|
z$T>gUtX$ipJSf?>JiScY-8U_%#LcL(D9qPCINvP*+!b(i&2bCK4lWJMbp~BK52-Pr
zB%~wY2&y^2A`%C}p=_5CGPchJp7#Jx2V~K#+y~i_nGTs^p|@3|t@+W`{Ag=_@VDkI
zzy&afkT~GLz`)=NTBbi@W|Db8MI>zcIfpI<F?irbFN3a@jTXkEh4E-%JopP^8&Ek6
z#h^wr=sX&ip<5V}I3W)yjG>z7Q$7xaWitl(aE50#VmKqfFR>!9!reD9O*`8)!n-Iv
z&(NaG$iT%i-NnR5+cCu~)H5U8z|GvCz@scAJ1ES_EF!7G#MQ^ZJHIg8AhI~LFx;im
z%RJOI$g<G0vLwAAGbh=sG%w8{*}uxyJU2Wr*up5WveeQr(;_e>BfF@|D_c9wFSjB)
zBi|#pqBt|DptPbm!^tHp&%`y?Im|*o&pfl-qRd0zB_qq*H@!3|$E>I*(b+67Dcvlk
z%rMO@B*!u&D$_DG)yUb%JuNKKBQdHd(KyS=J2bS?$u}~ovdSZ@*snC8pfIo`!p*2W
zGA+=(vNWTlz|YV>BsAAMH_a<Kx!lO8A~C5XJKNXCA~`dnD$zXGQrj)eve3w+sG=~`
zyVStTFtE@>J1t#5G{ZcsBqi0yASyiE*d@#-(k#-+zbq@S$iz1#Jjyr9%-Ji~Ki|ty
z-`Ok5GcPE~FDf9=t<>K!*E1ljG_g3iDy7oYy{ghUBP1Z#GNmv--O?o_!Ys8S+r-s5
z!n-8gt-zzg+{vIk*(21iDka0KETAN{!lWcPqsqfDyEw?y#XHK`%+txk+%w<Q&(zB`
z&EM3~&(9^W#4^vzF)A@6q%<ulD!ekpAThGS!l=sJEwrE{HOt(@F*`Ngt;9JiBR4R@
zJ=7qm!Z2Uo+1bC$->WJl#it@&KRG=!C$u!jyErT}*|#t}-6<_O)hD^ED!VeZDmSyZ
zDk|74BqSrr%q1+iC@is3J1;As%rnw7E5#*0#oyC3#62R(u`<Lb&@eI7yEHS;!rM1I
zE!fvFAhbL%D9F4lC8IROw9qfCFxkyGBGa+l%g`&|%P-5wJ;Jcq*WKJADy_7@J;FRS
zHQzs{O54Y@%*m<HFQYU!B-_k2)T7v<%)QV}-#4is&7{bs(!jmY(A70G$hFMS*eTmB
z&@8abBFnJ6)X&f)-_703EixrTza+G<AS=l-*D${#BG)m+39=A?nDK6Cd5l82(0f%D
zKiV1~+6)??Spr$!N=K`futHXJ7(iCGf){%r2$<Z!E&FgQgB6VhVV>r}<$g}C0p_JX
z87XP*&cP*a8Ig%azCnpzF8Yq)Ma~AU!BqxMmN`-3j#=7H*>1&QVNSlDiJsw}#ep8~
zrM_8N`T?aW1;$YkDXykIhFRI^MsCJYMycA`5mC7YL8%6Y1?EZarI{`%fkrvT$=MlM
zkuF}|MU@3^K_2EVDcU7&g?Zj3CKlmt7RBY^2AR$gWlqK6PUc?v<-y6u?gox725Ih=
z0sdZ|Uapo#e%k3C1y0$a+8Ggf{)u^MZk`4iX~j<2Ss8AnJ{dX5h2hSoS)qYtfv$xm
zxhej>u2C6*p;_7)0R<IV24<E~r50YH#U4f;&bjGXVcO-U=@F&r1(nHFzQL&#c_kkC
z=0Qd|h5nAN=9!7vp;cL#mSy4DndYXMo-SoB{y6~=p}Bz>Q66Q68RjOz7A|4#sji;p
zVSb50W=3Vf-X#{rq3-VKF8OJ0o*q$Q;ZB*3iRs0TsR32xzU7s9iN&E+X+Ak&rjD)w
zKIYD@E>3}t#fiD;5uR?TKH08L#l;5s!KFoB-hR%mdCnpEnNj6s=>f^+j_!H6hDl}>
z!6rd2+G$3C87}1>hMu1JZl-1VL8e8a{s!)beg+j`{>5H}d8VG(1{K9w9u;l@<<8oU
z0VTOPMS13yfvHiTg$?*dGa>gWfp#H)HhQSMdcO;$tQh4CcnCzC2klEB-x(?lPT<?a
zv%&Yo7cpcr6f-C=gn{?%fNqO2V1S);h}{lQx&Up{r%h1`+9?1U$3PkC1v!MxCa*Ln
z#}33~V4zQf8alcGvT^`yhc@RiY?ozVV7Ne~)0+qKJoY?>eDEovkaKTAr*V$n>H#`G
z1$2XYGW5)K(3wx8=Rc3$|Cc;^{~rVL9YCNuX!QO+7ltB+e1-ysB!+y33I@<QO#uv`
zdohc_XMZO$<bY3Xa%OO1aAW}876ekA#Q@nq3OY1kAWMJ9spp^#(xdnPflkfN2cKg;
zm}3l<T0nQ*fc8s6>TS?Y)Y1F@K&POk!tbnw9JB(ueRcHyzoAwxVZY%JbW6<W{eOf?
zCt^+%MOTBk@dcj@a@{Y<z`!utQvmf83K&N3|0BNcL{DF|KJS)+Vf6k#LL~;QO#!;G
zh2HnU!Hy(^9F7LMwGZSPQtw*_9b*K#r5n_KOJx9^M-DOxa<U7gg#<dUc=Y~1NbG__
znBF(X!;Z}a9digdZKoJ|_bupFqtW~SU~N}yDH+sD8@>N;sPw5pF^D))4aSRS039F)
zx-%ggI;sd7y&t{*Zy?JeSlpoB)Cd~M0o5I&_y57}x{hH;X23oEI}-2z8&uobFlMJ{
aeV7J@g#*3Q8^b{$0el$!=yOufqXz)^Ur}TL

delta 864
zcmZqpz|_#gIKe=c0R{vZ7}yvX7#JBC82<hL{~sjGIN6a!cw@pFMn>kz3uP2|A5NSR
zv+Xh?A4raOaut*3<ipH{jK-6{GWm0eGcYiSF)%PpPEZq>oWP#K0aC>c6L`QR!e+$4
zz`(&U`4_WN2nPcL11AFm0~Z4W14s=I0|Nsu)M9=H1_l8J1_nU}1_mJp1_ogU1_lwR
z9LNHYMG_1Q43Z2C3{ngX4AKk?3^E{l3b;fV|7{GcW}L+2!^jAB@PwRcAP2KDFfceU
zf*j1r`2YX^|4bm|V0XGpO#Z>-J^3(`;ba3Q7REc11O2@x9}%_@1t|kzP*D8+|NlRT
z{<m3B<u&6ZE|JYVDsLDUg)lBYpv5@3A)IBR0n20#t_BXUqW}N@PoBV~A_?N?L){Hx
z!|}#IW5!856->(+Cs*-!ae(~I4s*~0Z;8o2cmh~Jo(G5I111qh!^x$*eyofvAVo21
z5|bY=iLe@g0(0_Dd9TTbgX||aDL8R}!V(k~Fl}sl3=9lm43mE;cyWNj6BLeMxrD%E
zPDW4=fMNhF0*W0K1_p*WrpdpAy(S-FHeghqTq+Vg*~7zPlBhE$BPd~j0uih_!FRzV
zQH9A09?FxQMQtZHc(`zgGB7ZJ;t(wVKvZFprwhoG$t9i_CcAjpOm2{IVF9JI$zbPu
zWw3xE4y-sqHiZKe%b*wq3q0^vm=xr~0SbFi41>iIf*ymTs3bUm1C$ixKp_E&zXwbr
zlN+K~7&#{YboGKLaXZh+2ucp1BnHv!t}r>m-vtz_i$d7>e4$B>5tP*BCQnS1V`gLk
z(~PW>ucbU?1hXesr>)!Uklw%~6$VX$Amt2<j0_WwEx-9{N3H_{<K%=|16Gi)nI|_2
V8%~<lGPy<AX7d3p2gXHnqyT8V`iB4j

diff --git a/embedded/mkrouter-v04/.vs/mkrouter-v04/v14/.atsuo b/embedded/mkrouter-v04/.vs/mkrouter-v04/v14/.atsuo
index a8662d2983c89c479af448fae747adfa9a1b875b..64e30274b17acc61f6deec3d279cf22bcc97bfd5 100644
GIT binary patch
delta 172
zcmZpe!`d*1b%Md<58j*-0t^gn3=9m63=9na{{R2a0A-7A43uVKE8zGeCbVmE5!=Pd
z&dhIl|NsC0e*psngBSw?gWSYG;mH9kEF6FT|Nk$}z`(FMhDC>wk#}<^>w3=37ThP8
zHVIX*GG3cpDPBGKi?GgS1&IgDj2kvHO8sY?%sAI*`Z^9q_Q{rV?<Z$y=}j!)m>j3N
ZXpsWXA{nMl8W~K@83x-k3>as~0sv}>ICKC2

delta 270
zcmZpe!`d*1b%KE+69W_oFfgz%FfcGOFfjc4|NlQol$n8nL1<&3G!yfOIWm*;*;*O>
zHh*QZX5?MKz`*eL|NsA@3=9l%69a`O2e7bkh%+!S{Qv*||K=DL9mdHWoE4kcEI0)~
zW(6=XFa$C%Fa$9$Fl_eVH{h6DA?!W*u(%<sKLZ29z0E(x*;y9pFimEhYczcw2P6At
zOBHv<$qgC`lP`EEOfHUhSfs!+NxMQggJIA6iUl`b8#cGBeXKw6kmXN?iGh-vmuSQ=
zPE3r@oB?&fOa=yqSquyevl$o|<}ffY%w=F;m<RP1$brHe1M3+lH~MEZXBceHFkqY^
F3jk#~S?vG-

diff --git a/embedded/mkrouter-v04/mkrouter-v04/Debug/Makefile b/embedded/mkrouter-v04/mkrouter-v04/Debug/Makefile
index 93993eb..4540728 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/Debug/Makefile
+++ b/embedded/mkrouter-v04/mkrouter-v04/Debug/Makefile
@@ -78,6 +78,7 @@ SUBDIRS :=  \
 
 # Add inputs and outputs from these tool invocations to the build variables 
 C_SRCS +=  \
+../src/apahandler.c \
 ../src/apaport.c \
 ../src/pin.c \
 ../src/ringbuffer.c \
@@ -101,6 +102,7 @@ ASM_SRCS +=
 
 
 OBJS +=  \
+src/apahandler.o \
 src/apaport.o \
 src/pin.o \
 src/ringbuffer.o \
@@ -117,6 +119,7 @@ src/ASF/sam/utils/syscalls/gcc/syscalls.o \
 src/main.o
 
 OBJS_AS_ARGS +=  \
+src/apahandler.o \
 src/apaport.o \
 src/pin.o \
 src/ringbuffer.o \
@@ -133,6 +136,7 @@ src/ASF/sam/utils/syscalls/gcc/syscalls.o \
 src/main.o
 
 C_DEPS +=  \
+src/apahandler.d \
 src/apaport.d \
 src/pin.d \
 src/ringbuffer.d \
@@ -149,6 +153,7 @@ src/ASF/sam/utils/syscalls/gcc/syscalls.d \
 src/main.d
 
 C_DEPS_AS_ARGS +=  \
+src/apahandler.d \
 src/apaport.d \
 src/pin.d \
 src/ringbuffer.d \
@@ -205,6 +210,8 @@ LINKER_SCRIPT_DEP+=  \
 
 
 
+
+
 
 
 
diff --git a/embedded/mkrouter-v04/mkrouter-v04/Debug/makedep.mk b/embedded/mkrouter-v04/mkrouter-v04/Debug/makedep.mk
index 6c73410..fc88d27 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/Debug/makedep.mk
+++ b/embedded/mkrouter-v04/mkrouter-v04/Debug/makedep.mk
@@ -2,6 +2,8 @@
 # Automatically-generated file. Do not edit or delete the file
 ################################################################################
 
+src\apahandler.c
+
 src\apaport.c
 
 src\pin.c
diff --git a/embedded/mkrouter-v04/mkrouter-v04/mkrouter-v04.cproj b/embedded/mkrouter-v04/mkrouter-v04/mkrouter-v04.cproj
index 2224fe6..3ec3f73 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/mkrouter-v04.cproj
+++ b/embedded/mkrouter-v04/mkrouter-v04/mkrouter-v04.cproj
@@ -475,6 +475,12 @@
     <Folder Include="src\config\" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="src\apahandler.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="src\apahandler.h">
+      <SubType>compile</SubType>
+    </Compile>
     <Compile Include="src\apaport.c">
       <SubType>compile</SubType>
     </Compile>
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.c b/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.c
new file mode 100644
index 0000000..f89cb7a
--- /dev/null
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.c
@@ -0,0 +1,28 @@
+/*
+ * apahandler.c
+ *
+ * Created: 3/12/2018 11:55:30 AM
+ *  Author: Jake
+ */ 
+
+#include "hardware.h"
+#include "apahandler.h"
+
+void apa_handle_packet(uint8_t *packet, uint8_t length){
+	// dirty debug reply
+	uart_sendchars_buffered(&up0, packet, length);
+	// through packet
+	for(int i = 0; i < length; i ++){
+		if(packet[i] == APA_END_ADDR_DELIMITER){
+			// data begins
+			// check we have data after addr delimiter
+			if(i + 1 < length){
+				int thelight = packet[i+1] % 10;
+				pin_toggle(lights[thelight]);
+				break;
+			} else {
+				break;
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.h b/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.h
new file mode 100644
index 0000000..12673cb
--- /dev/null
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/apahandler.h
@@ -0,0 +1,16 @@
+/*
+ * apahandler.h
+ *
+ * Created: 3/12/2018 11:55:40 AM
+ *  Author: Jake
+ */ 
+
+
+#ifndef APAHANDLER_H_
+#define APAHANDLER_H_
+
+#include <asf.h>
+
+void apa_handle_packet(uint8_t *packet, uint8_t length);
+
+#endif /* APAHANDLER_H_ */
\ No newline at end of file
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/apaport.c b/embedded/mkrouter-v04/mkrouter-v04/src/apaport.c
index f0b81a0..4748bf3 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/src/apaport.c
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/apaport.c
@@ -31,40 +31,36 @@ void apaport_reset(apaport_t *apap){
 void apaport_scan(apaport_t *apap, uint32_t maxpackets){
 	// scan through for completely received packets
 	while(apap->packets_ready <= maxpackets){
+		// check that we have bytes to read out of the buffer
 		if(rb_empty(apap->uart->rbrx)){
 			pin_set(apap->stlr);
 			break;
 		}
-		// pull bytes out of buffer and segment into packets
-		pin_clear(apap->stlg);
-		delay_ms(1);
-		pin_set(apap->stlg);
-		delay_ms(1);
-		
+		// pull bytes out of buffer into the packet structure
 		apap->packets[apap->packet_num][apap->packet_position] = rb_get(apap->uart->rbrx);
 		apap->packet_position ++;
-		
+		// now segment, point to them
 		if(apap->packet_position >= apap->packets[apap->packet_num][0]){
 			// length is 1st byte, like array[n] not array[n-1]
 			// now volley for next pass
+			// packet_num is index of head of packet buffer (just an array)
 			apap->packet_num = (apap->packet_num + 1) % APAPORT_NUM_STATIC_PACKETS; // inc. and loop
+			// packets_ready is the number of ready-state packets in that buffer (array)
 			apap->packets_ready ++;
+			// the position, in bytes, where we are currently operating.
+			// at this point, we have come to the end, so we're resetting counter for the next
 			apap->packet_position = 0;
 		}
-	} // end 1st scan for packets, now we know we have apaport->packet_num packets completely received
-
-	// handle packets	
+	} 
+	// end 1st scan for packets, now we know we have apaport->packet_num packets completely received
+	// now we handle those packets	
 	while(apap->packets_ready > 0){
+		// the particular packet index
 		uint32_t p = (apap->packet_num + APAPORT_NUM_STATIC_PACKETS - apap->packets_ready) % APAPORT_NUM_STATIC_PACKETS;
-		// handle these!
-		delay_ms(50);
-		pin_clear(apap->stlg);
-		delay_ms(50);
-		pin_set(apap->stlg);
 		// now to handle
+		// [p][0] is length of packet
 		if(apap->packets[p][1] == APA_ADDR_POINTER){
-			// packet is ours! mark and somehow get to level up?
-			// application_apa_handler_t takes it?
+			apa_handle_packet(apap->packets[p], apap->packets[p][0]);
 		} else if(apap->packets[p][1] == APA_ADDR_FLOOD){
 			// loop through bytes to find pointer and increment
 			apapacket_increment_pointer(apap->packets[p], apap->portnum);
@@ -91,14 +87,13 @@ void apaport_scan(apaport_t *apap, uint32_t maxpackets){
 			// double / triple check pointer to pointer
 			uart_sendchars_buffered(apap->uarts[port], apap->packets[p], apap->packets[p][0]);
 		}
-		// debug reply
-		uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]);
+		// debug reply (at the moment, reply is handled in apa_handle_packet
+		// uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]);
 		apap->packets_ready --;
 	}
 }
 
 void apapacket_increment_pointer(uint8_t *packet, uint8_t portnum){
-	// implement after debug
 	for(int i = 2; i < packet[0]; i ++){ 
 		// loop through bytes to find pointer and increment
 		if(packet[i] == APA_ADDR_POINTER){
@@ -107,18 +102,13 @@ void apapacket_increment_pointer(uint8_t *packet, uint8_t portnum){
 			break; // we can finish scan now, not looping senselessly through rest of packet
 		}
 	}
-	/*
-	if(apap->packets[p][i] == APA_ADDR_POINTER){
-		apap->packets[p][i-1] = APA_ADDR_POINTER; // increment pointer forwards
-		apap->packets[p][i] = apap->portnum; // port received on is this one
-	}
-	*/
 }
 
 // UNIT TESTS:
 /*
  flood packets
  multiple receptions? handle in app?
+ packets no end addr bar delimiter, packets no pointer, general white noise
  packets varying length
  packets wrong length ? very hard to catch w/o hella state ... timeout?
 	packets no end addr delimiter?
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/apaport.h b/embedded/mkrouter-v04/mkrouter-v04/src/apaport.h
index 57216e4..912629e 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/src/apaport.h
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/apaport.h
@@ -10,6 +10,7 @@
 #define APAPORT_H_
 
 #include <asf.h>
+#include "apahandler.h"
 #include "uartport.h"
 #include "pin.h"
 
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/hardware.h b/embedded/mkrouter-v04/mkrouter-v04/src/hardware.h
index 6cbd4c8..e0cc586 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/src/hardware.h
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/hardware.h
@@ -32,7 +32,10 @@ pin_t np4stlr;
 pin_t np4stlg;
 pin_t np4stlb;
 
-pin_t *lights[] = {&np0stlr, &np0stlb, &np1stlr, &np1stlb, &np2stlr, &np2stlb, &np3stlr, &np3stlb, &np4stlr, &np4stlb};
+// array of ptrs to lights
+// init in main.c
+#define NUM_LIGHTS 12
+pin_t *lights[NUM_LIGHTS];
 
 // ringbuffers
 ringbuffer_t up0rbrx;
@@ -53,11 +56,12 @@ uartport_t up2;
 uartport_t up3;
 uartport_t up4;
 
-// array of ptrs to uarts
-uartport_t *ups[] = {&up0, &up1, &up2, &up3, &up4};
-	
-// apaports
+// array of ptrs to uartports
+// inits in main.c
+#define NUM_UPS 5
+uartport_t *ups[NUM_UPS];
 
+// apaports
 apaport_t apap0;
 
 
diff --git a/embedded/mkrouter-v04/mkrouter-v04/src/main.c b/embedded/mkrouter-v04/mkrouter-v04/src/main.c
index 7cfc83b..324a341 100644
--- a/embedded/mkrouter-v04/mkrouter-v04/src/main.c
+++ b/embedded/mkrouter-v04/mkrouter-v04/src/main.c
@@ -123,6 +123,27 @@ void initports(void){
 	uart_init(&up4, 81, UART_IS_PERIPHERAL_C);
 }
 
+void listsetup(void){
+	// array of ptrs to lights
+	lights[0] = &np0stlr;
+	lights[1] = &np0stlb;
+	lights[2] = &np1stlr;
+	lights[3] = &np1stlb;
+	lights[4] = &np2stlr;
+	lights[5] = &np2stlb;
+	lights[6] = &np3stlr;
+	lights[7] = &np3stlb;
+	lights[8] = &np4stlr;
+	lights[9] = &np4stlb;
+
+	// array of ptrs to uarts
+	ups[0] = &up0;
+	ups[1] = &up1;
+	ups[2] = &up2;
+	ups[3] = &up3;
+	ups[4] = &up4;
+}
+
 int main (void){
 	sysclk_init();
 	board_init();
@@ -130,26 +151,15 @@ int main (void){
 	setupinterrupts();
 	lightsetup();
 	initports();
+	listsetup();
 	
 	apaport_build(&apap0, 0, &up0, ups, 5, &np0stlr, &np0stlg, &np0stlb);
-	// does it use numports, or global?
-	
 	apaport_reset(&apap0);
 	
 	while(1){
-		//lightstoggle();
 		apaport_scan(&apap0, 2);
 		pin_toggle(&np4stlg);
 		
-		/*
-		uint8_t hello[] = {'h', 'e', 'l', 'l', 'o'};
-		for(int i = 0; i < 5; i ++){
-			if(!rb_empty(ups[i]->rbrx)){
-				uart_sendchars_buffered(ups[i], hello, 5);
-				uart_sendchar_buffered(ups[i], rb_get(ups[i]->rbrx));
-			}	
-		}
-		*/
 		delay_ms(75);
 	}
 }
-- 
GitLab