From f39868397acdc4cdcb71b58926dee62327933336 Mon Sep 17 00:00:00 2001
From: Mart Lubbers <mart@martlubbers.net>
Date: Wed, 5 Apr 2017 11:13:11 +0200
Subject: [PATCH] update

---
 client/.gitignore   |   1 +
 client/client.c     |  30 +++++-------
 client/linux/client | Bin 37712 -> 0 bytes
 client/mem.c        |   3 ++
 client/task.c       | 112 +++++++++++++++++++++++++++++++-------------
 client/task.h       |  15 +++---
 6 files changed, 103 insertions(+), 58 deletions(-)
 delete mode 100755 client/linux/client
 create mode 100644 client/mem.c

diff --git a/client/.gitignore b/client/.gitignore
index e6a8598..9308325 100644
--- a/client/.gitignore
+++ b/client/.gitignore
@@ -3,3 +3,4 @@ main
 build
 *.bin
 .dep
+linux/client
diff --git a/client/client.c b/client/client.c
index 6502fb7..59c611f 100644
--- a/client/client.c
+++ b/client/client.c
@@ -79,34 +79,28 @@ void loop(void)
 #endif
 	debug("Loop");
 
-	int ct;
+	struct task *t;
 	long cyclestart;
-	struct task *curtask;
 
 	read_message();
 
 	//Run tasks
 	cyclestart = getmillis();
-	for(ct = 0; ct<MAXTASKS; ct++){
-		//See whether the task is even in use
-		if((curtask = task_get(ct)) == NULL){
-//			debug("Task %d not implemented\n", ct);
-			continue;
-		}
+	for(struct task *t = task_head(); t != NULL; t = task_next(t)){
 		//interrupt task
-		if(is_interrupt_task(curtask) && had_interrupt(curtask)){
-			debug("Interrupt task %d not implemented", ct);
-			run_task(curtask);
+		if(is_interrupt_task(t) && had_interrupt(t)){
+			debug("Interrupt task %d not implemented", t->taskid);
+			run_task(t);
 		//Interval task, and interval passed
-		} else if(cyclestart-curtask->lastrun > curtask->interval){
-			debug("Running interval task: %d", ct);
-			run_task(curtask);
+		} else if(cyclestart-t->lastrun > t->interval){
+			debug("Running interval task: %d", t->taskid);
+			run_task(t);
 
 			//Oneshot task, thus disable
-			if(curtask->interval == 0){
-				curtask->used = false;
-			}
-			curtask->lastrun = cyclestart;
+//			if(t->interval == 0){
+//				curtask->used = false;
+//			}
+			t->lastrun = cyclestart;
 		}
 	}
 }
diff --git a/client/linux/client b/client/linux/client
deleted file mode 100755
index b269fc2426cdf10b7d7f99a5cc5cf001ea469782..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 37712
zcmeHw3w%`7wf8>r%E@y=5+H!p;VB>l0*Ig@1dI-dLJ=&eIEG~M(7c+NLGY@@1}xK<
zUTCeQEh@FG*GF6Ji~1JSg4*6*+Fo0FYkR4!-igpkwYR2<=KKHm<II^!2KC<iyWjWw
zemyW}uf6tKYp=cb+G{^@&deujmtWwqEMYFMI8QKlq)=fN>4MTvYXHe2F;C><K2b~%
z0p$G>r^*+p1f}Zg*P=~oYrGe!51)A+g~(1%(R3y?8Zu>lxvt0OsS=Y45t0b<QP;x@
zWEN>i0w%So5U#_fLd{3@$ah@x9oKv&Jwm~_OlsQ4w(+xCw=X+ApG>$+N?KkkUx_zJ
zc$UhGtaQ1q&!mR$qu`^SAM`5KgsXIYx$H7o>u*wBy_nJ3vSIF=8LbV|TU*)_o2GA?
zH+TBnIaRTas#&t#luz0VFIgjNGIk6hN1ZG1p~+c3^5dtyUFChR_0^9QpK>hq*_Xw4
zCY?h1kKjWYvRwqMQV(&b;xpwVx1KWpjUK1BfXcY`BNxiRs0__nHU$1VIq<A&DEdcp
z;6I)NUz-EJJ_r7zIq-XO;J=sye?|`cBRTND0X~FJ_H`Z*L)n42q3~zrz%S2%pO6E8
z4EPW}+1JBB3{`J;4*X3y@S}3z>3AWOWnT<~<Fb*+UxUw3`Y?<Rg})5=VPdp6vM2;d
z2opEz0TVB3LV(hEf$>();WbypI_j^D#zkXeYa-SxqMKUcqB-8t9uu9>uC9(Q5o>8`
zuWJ>ZiFgcLv3Rsy#G<Xy`nYI|w#C4?p{2b+bVchLL@eIWk$@=B)-wYEA`xqiMmt4Q
zG#+nhi*__N)NK}Z@s1WzS6?6PjEhL5ep6kfu?2OsTptBjSAAP2uv9P-i`R9<BW-mp
z?c%zwmUvWbZ0zi6X^%IG$kNppM^Hhui7IuizIaJ%M|*U2-G<gEn48)<+BI`TM3!xg
ztkQH#TI*u5XiTvW$$a7RrHhwDW>w9qI#XKABZmGbT=+Dch8S@eZ}?9L6CV?!Tk=UW
znn+yEe4(=9NRa}L=y}2P;~tGal-0i`e`sMyGBUPl(K3J7g)fj8bvxq1m$>jL7oIWI
zT*qB_`nb9JU3hqza~VJ6+{zg1Ts0vH5`U_M)U8stD-T&^IfW0o@Ony>1(RKPGiR}2
zrVH<$*XOzL?s;vI3(vaE6?WlGAFynt3y+R;uC*?_Uh2rQt6g~Ag%aQF!WTPIgy?kP
zgD(6g7vA_1i?_J&!(8;+U3hoA*x|yLyXbeh@WWmBJudtR7ye!sexwWkkPBbw!awZ7
zk8$Dmx$y4EH{5;94)^$b&kTw1wtaEWz@c#Wv-UG$;LN*$8kqPs+=Hhr0>peXCH5T|
zz%}tp%v;PKlKIavPnYW3C-a|Xp03pQkj#IQdAd;F9+|(MdAd&D4w>&_o-Wh3Mdq(z
zp03i@Df1hcr;GGmE%TQ%PuJ*MDf6qC=g{k0B=gIdr;GH>l=;QX(>3}+GJiJnbcw!F
znV-cxhiIRW`Kip)HTsUf2gJm2%+n?Mj>!CI=IIK3hh)BtdAdN~KAA6Io?YMfkj#6S
zuV8+U%)dPcdAdN~4w)Z^eB%z}<yHO1rOBUO6;8e!?*7B^m8+Nc`Y#U&5$-Mi{b@`V
zJPl_U82*#lA@P^sY3EDS^AHg3^)p!$p3)yqz7p>4FWER8-FqkK*uDAd2aYsK`t{GS
zR~xH>r)`z>L1a?$pZQ6}{~r1Gzvm4nkB9fC7KW_@;h(-2uY|CVYhgu7nBvctw`D;c
z<cP%S;qC<&f&nTeUx^omdlr-dpDKn$Q(@fJAMnou!g_PCK2|l9?p`Pog?(3nQt6HQ
z`(~-e^ikx%q4l!A311q%`Pe*oSUCB_bMFicgnPEhBw2ezgTWtc;UYHpgMG=`mk!n*
zW6KZLrkI3#KYs{3T%L$Wwh)p0<(uILdTL)v9)NBBj2J4*QVkeAedob1duosMuC$VC
zj)m(Fg?mtkbtt%31o!Ui?jIZc)SK|+<i2ok#WqSrx4Z=jJw6YKd;PB=1Nwm@-L=Q8
zzT=?HEiJXUyMJo%Q$NZUSOrIL1dgRwP+-rRRPSOdS(}2uaQ$;ivFCz&?c{U&k9e*9
zMDGgsc3P_BI8?TtOYRTXKfV1{KP>=_JV&SW)TU(PQax*q^)9oL7em+!;hr^U<qN^R
zW#L`hZ<EwJ`es9~?zWWGH&p{*4etu>-73q2Pws<+4Bp`0pS8S@kH8@deirWSf-V&N
z1_YzfdLelr`OB0SLy@}l{R}apXML)7iPNe~bGICl!c@D$x?N~7yTUq@JeYb1gFg9m
zxc(Wfvy^%RrP4$nQdkHPMhZAb3UD=b>%QQf`;t$~=IfgJMku1*mG1%Fo${m&lSEGd
zW2G@!-9VH663z;;55zuYe=@TlDd6_p0uE%?pWL539(-_rhA&XYDlH>Cs134nQ{Asw
z;rgEi_ue*~?h}0S-@f?PJ2dxxV{Qs5&Z)@Oeep5bssNYwFsGKIemUp{>GUM#m7xu@
zbzh?5LyPOs;@nMC{+%sq-qXR`(8*b?oAF`zKR=lNbxfOV&IhW0_h9}9KMem}gZVo?
z3_qPbyZs-A|Bk`@uQM799*h_s$=YLmKSe1c3@nr$EpU;_p;?XwfbZTXS#Qt5YAceX
zBZd~iTCbo^uCOz7tWO?H&A}W`i<t1zH&(VLb8rXu9zs>UVHHW!VVOZH`3p#SvP_53
z-^1-cP`!2F$f)-|a%Ke;1f|dKd*8}m#WIE#KH8GaPxTI_c5CI1E*-l3tEL?DhMZnj
zV)Av(h;j=35mqc}3N63_7lh~3z7)K5Z$BpL-USDpLf>#9c7$(!mJ|6E>!0Dg{^&!1
zpG500k1kj;4a<io|8rnqhbpXDeJR$kr3Y$X7e{9Y_tw77ke)mgw)SB@4DUbU3ByRe
z{!*|7_xe2D$1Q{i%rmvG!$-E)zP{zg*XuVPJZkL#(2y908g8yMiq=7wAw~8MfBcLP
zC)`K5pj4{CPNzey;NJDGr!K%c5vJRJ#I8v`o0_L`HN8c?aQ)ARP_6^Ql0_cLS_ops
zyP@cogKoQ~`#qMX=_+1Sx!hG$m@0A^=*_7i(L>p}2wot8&y&RT3?u!6(_xpw|8sNg
z0@neb$9gITL#0+rHFMR_tZG23dUp(feA~WY`04%qwsOMClk!e;c+n4k#M<Gh0#^8Y
zKs&IbDZQfRO64zfmef5!r@n&Q_F8mU?ZD7J^U@TlyLhUOqIQ8iH|;k-3+v?2{mPT_
zb~?P!y&9xS_tOFGcwUYG?c}LHVZV~<!)<%*pXl*@n-Obr8-EN0J5C?mR&!F~*CwL{
z6?A|<&3`($ZMY<cFJF)9(vH@ua=9Jt0f>>loU4~V&3aDeXmuoT9BmTDpb8tWVPrg&
zU{@4NC300TR`KWPil1V{=C;@?r<-m>SKI?q)fKw|sRhaC9b`_2j^HgfV)rH$%yzR-
z^2TEaY6nE$g_s_}mBY(6qDpoWLiN`2lTwD2a_7_@3vTOEeVIe%BvMKn=OB1@lH10=
z!4Ot9z6FEqsZQGXzQU6!{e<GrVdJ)w^4{$5!p4hFN_quIX&cl7+7TzEondI7+}Ex5
zOl(ueChSx+)Y&r)Lq_hIa`(+|CmMGcDk9y25R;qtZig4DUjfpi({d9h+{9HN-k}_C
zJo(NcpLDr_EjJF-2XA@s-GKp2pfV88z}&0)?gfkrMCSPp;%)>G6+aO4j5i+LoLh^d
z6O1dym*%G04=NZDZkQOKo9e5I>gc(d%5S{cD83Pk4yE`orT7*H!3ZadGPF-7QXEc4
zZ^&Kg)N})u=cW?r222{7YCl#CFONqv*QAma*5D4f9_JCJ9p6G&QteoZD1i=m*g=d%
zJ5&=M-Gq}LvxHfM0F`>@*pN$@DNyKj?9f{dRbtTtHO5a<eKOR-#kcXNYT@FS3zy?g
z#rK*Z=MwY+Vggqzl<TZm63{{}J8sLPFPjz1Eh?v?{4;4~wx5ABDihsZvO9qf{s7|?
zCo5bX+~R0*rW&&uO<JTh31eLR*vv8&8TAKp)E~%E|DUFs`f&!M?Dw3u-;1iqGOE3U
z2&cO1OBh>*+F1MRT2SKx;oDf1UHU1f8r967II_+v6rxd{C>=eE_B=oMgXpo;!T{HD
zOY5KIa<1iPQX`A2(eozBzSwRDe<1fNjo5KyS2o(Hf`NA31KFh~IJLVhzSdFYnf$@c
z`Your3d@%AB=F&bKFm4@`*DW-@Awt>Q1R||U50+^0jMI>&4992SjijvvHb7HX`2VW
z2E$JjTjXl)^ZWD~3>2~tTuZWY$VrvpW|m|w_c~3fFP>_kia`*eAp=9H_$Dhv8B|OG
zR4V=!kX}e7Z#>acd%``wp21*L(=Rua8AZD$$X?Qi5H4L;W53VodM>;-bvdL<o!7{v
zr1XET)0C5)X)A@g`|E>S_d|UEpBU5KUl82-mdw?~8?nya$`RT3V~L5yPwnoHeWIYd
zzahS%k7By}<MGb!{zN>~cOSACVE^P)@UIvusW;yk80foK72V+!J;I_VuqWy3RYi9>
zMR&63kAE2$IGV_i#(|$|#){_Xdf*>)=-Y{3iSwPKwZPx&;4dToHMH^Qbl~rE@H`+r
zI$HJw<3YM$A`7e?x;r>8rM`~pQhQ*^aI*IJ!P*nhRrI}x8@dDiSc_tmq{7`drbKY-
z57-nQ1)%6Nm<MqXFvsNgsQd&nvf2wBeZGZ}XsCYLhi1fOu4jvl-ox?Z@$i(ViAnox
zc>dEjtuTT@j-aSZ&~^xNF`*w5h0Gt=QVOZ6K8jB6U@d5MckKzQ`^FQ#;Ah5S0!iDT
z6mA(#CXTZ@|J`##WCff5DS)XqI9uvJkHbda{hQn?f0K(*$QP-@95dg8ebm5s5##vi
z>)bJOlcQW++TkA^j_9i(hN(sBivJiGFr;CQSkx~Kfsq^TJu?m#m{`?w7r3;xW)3T&
zYNrF=-9L~hf~}KaNcp67{IBCr9pRSaDQF(<DehzL(SLdC(%*mm%g=_w$>+jvy%yg8
zb{?Vq{R?S%?$?j&0e17TJ<u<Fu=WTNrYWXUkw-AC!23VXKLFu;{sa!_ll|C`t~rsc
z?eFnFJ0>K0S1#1s#sHdLe<0lR_zy|m<G%-`U)=xNXzNh-k%dzZJxVKJqy6)jS$qD$
zaPn=ECvVf_*HPFeE8L5t>E3M=u{3#zPhW^fc?%~Gq;|cMZvGcA0i^usj~@SmOf?W}
zdcLQHjystSV~^ucG>JUfQp6nUrxp)A{?|r_gj5(kbN3u<unwkv{Rht6{@ajCN2X-|
z_SzFY{>MNb?!EYgVoCl4<jX<scDT2b$G5LJu^mx*?;3pcfH{mQQFZx^=sPz(1v_L6
ztBUM0khwIKemAt}+Z>*8Clmb-4%s{KW?6}|2rQL;3jb``N7q8D?#XIZhL-akQ4c{>
z&c=MiAxmbEg%FA!!=F_S*7mb2X!#QuJfIP&n|==mr04Uzs1FmavPLzu0^Rkb!+b1K
zmub4-HXmew_6dj958A#zQE-p{m$O1hN;&d&@zkpK%tt`S2<L|YIK?CoeMb=iI#LPp
z<S$r$HmiaVk?LVpJ^ouk)w8A_C-UL_FMBDhhbpyddEb9o%0po5$AM;#|4fk2fBMFS
z;9Lc;8*LrLjcQJX@MP@?#4hoP`DjMSX~uc5$5E<R?x<InR`1K0F;uuYhKi+h|I^i|
z5`K59m!r71_Q<0g)y|6a_rJrR`Y`xCF#I3bG6Y4g-43R{$dY93%X0iZ$v#n?@ok7s
z`kxtzhWnqu-9)4vn3hsqpu^Y)8UsRA6_x{{kP7M8)key&q`U!?Pr@VUU58PjAz49^
zi6qfOr4|U)>%%|>11w`5;QB1GJ^ne!DMi@^pnn8((mxjH9{(8Jjo=ar{xN7^)_lUB
zJ(3=&Hy=B~lH?PUWyJgbTAAqh*V~NT^5nKone=W#g2^xxoKm|bIOXCU!6|F@1gETj
zC^#j$FF2*`P;g4(NN~!H#}96s2TIf=4sJUa&`eo(Ee6-NMaUx9tz?qi#y`)ZU7sC6
z+kKu);htWl$WPc%J_msEE|w<`sHN7KF6A)?nE^}k`$^urU@;Z|%5E3{&Zzu<p`rH;
z&(Tl;&6O8V0>nx4se0(1y5())(HxPwfe--r8zD>sSVcLws|Ym^x0(>WE49pl76HOp
zcKT28^6&FCAFH{nCOJ^ErUrlepZMx9{!PDkI@3#+CjYuL`Qq{^oaOEC{&&5pvwjQH
zZu?_ARQ+r7_x$C_*On*$dOjo!RJ;`Ke#Q#V|4rgGKHG7{`kE_i*4JEB6M1Gwy3#kF
zfuB*HeENgWHhILVM0<Nnds8T07rQoeT}!+<)EaGXiZ`Dfn%E%Lw0A}8JDS?@ELlUS
zzN4+JuDwAPtR^*{6l=qiX7MPSU6C3X7z6j8fY0ync@3Y%7=F9(`4v9z;j;h{hEert
zeDV<0FT>~S_`HJ8M9i~Me7=s)EBH*rvSSH8H{tUDmN7rVhjnCs9zpq=_*A3(T71qx
zy|*HLzt0Dydp|kZ<&>LC_8;I`hMw^1uFcZ)9ih60hETktBh;3tZw|#8VzH{KDzPeB
zA8pwP%L9SlkcQ8|B{~~meN(hDu>nsMHY2+LU3cmEmxfvzqV4gP#+GPTDA9gxd&hO{
zQifRnM}(;l@cE#0A4Ha$hH`Vs{tFH(3@u@}mdIfzx~w!5o?(o3ZLDi$>p1YFFT0V`
zTuxmer1Q4Kq`~o=V^gMK>(o%_Xw*EANga48<Fm_J+VNB-`07IwXU^JG;3}zWXLk)k
zgj8Q;%c%=B;OS5FA-k(9`td|Gh8=pk9;aM3$q=~9S&+dH>x|YrqArD9(EIhR9WgnA
z+uQM|X-h{tMz-{aP+K$>t80p)DQksTN;`HXI^)U&6B|P99q~|0TW4#u4W5K?ZlZ-T
zt|XN9i$&WTXqkrS#+LeMh+2q=Eus3lL{oEoT4?d+C|sJIgKLehG8Vd`qca{`Ur?~3
zlUl_Jrgw%`u2{7?6k3vq#XH(UogH2AP<x_nL$qreL^swYT4DBi)w5<7WIhC|AEIrL
z54M^S(ZJ_u*?)Bz=sJULg-y`Nj`jj!z{W=CxTGV|+R%P_9A;Dx#D>&kyP;;pzt(6M
z2j}!=F}+i)OzRg5L2l^0P_=mmSU$<CpYdHTAN8euI@(cXfq7oHMn1L+HCoycURhq>
z;q;NP#(2-+y9ASAv#SpymI6NXtAT-iNRJ@plX<1T9vC=`G==!ehdsHN3?V%eF*J<y
zHKcrEZ#QD%4y03G8yMhHIfe8P(g%(X3>-)L9MV$E)?fJ3z`#7Dk04!(^f{!Pkj{P`
z^&^cVeHiJ}*sLB#df?9k1N}%x<8*>&U$sc*A&nzli}XdLn~<j71V7ReoJTy2^em)@
zkv1XiNBUW$m6%hXMmi5E&n?y>EymHtCZuza?m~J6(ua}$?k(^my|W+uNMAr&iJj^7
z*gwxhdIafOq$@G=?m^0{LM6hwewDB`m0Dwp^6VW}UMcZ>Ua}K5K10(m8Jb?;%^F3&
z?-v6Dov^(qDZQYia#^tOI(v&)IQpEavnPx*{O1F(A(v}0bCLf_d}g8#4|8o%Q&M`1
zXGw7&-0k)LC=XgGO6s%~pCgzn<a57<ZmlAroUh^Y8<fvPA3Aa_yw%(7^G@(+NtDCY
z=PU4$?;~~SJP%0<$~lJ5_3)kVusx<8CFdT?C8q-AKKRsU-1T{rvMSay2jyMxHM!O|
zay*Yn2`pcY@>0y>&j5Dn@jU62$5H-Wl;>*iZ76>T<^STYU+MXbyS<Nt?ql$2*%3yM
z^{OG%<0X`@Lpir_jvmX><tI=cM)|ewa!;e9Ctrg39Lj6l<u|1H&qew7P<{#IIP$$q
zr72nel_-B1^Beb!PPu2mk$(fq4`7~L?Uqj%7x{Oi{B4v=e>LrsrK<dKl>0GuXAoz~
zuSx6o63Q!3Ugs|NT<O$*0_AH^UhdY<TjJ<{3dVdGv0##$zb-BRT$Epe@+t1}hIILr
zDE}DBxifL}yEa{Z1In9Fp3y#Ke${@Icb$a)ag=}ZB>XR-ycgvmcl}qS>p!8(Pj{DZ
zNSB}D6XG`T=PExJ<zGhmEwH20KJU%WIJpw#7GmQQZuy>vWd-ct8&G~H%BQ)@o6_~~
zM*00Hf5=@<7#H~;NBP-^xgR6K^uK476mULJFQI%3%A+h_TvGavp2a1VpYhg~gnE68
zOD5my50}imB@ix|*PVB9$)c{3c{L?7Yf2_BE(w7S^oy~lWqh1~*n2PJu$h0q{%(Q4
zTj1{&_`3y8ZUOUNnt2b+P;;u~Wzr&*6=A(^!XK#QwOURJLYQ~Q%zJO<T_Cg89Iffi
z`)`~Vc$xD5d~cwG`CU4ABb3YQUJdAFv)HH0wHjiQR<KahSL$@QPECR-R9%ZgGBtBV
zsRqpYnoD3_BUK{iX$1{_rUs1Owyqxs)bcX*;~-kL2S`bZKbpyWspiM&rpz1rVhbbl
zKhX`vmO<tny|w)RTZws(J-hymx+C~(60h5JdXG-`>hyq4f1%S?b^2GG26PAVnJZqC
zbUIh37wGgdoi^%pqfT$p>FqkbN2hyrdO)X2I`*#G56}<tx^T&ovqO{5k8Wtesma``
z*;O;AS65F_P-xc7>a%9fo>eXA?8;$O|Cj1vAa_niv@2Egv#`EV^eOFT&lvY{(Gpbj
z-EbyF@POQU;O}xd+(6O)9Botd@v%zaJ;uF<ls~)F(2t&=2(C8nJtX~Y7`#gU^=Bvo
zxsuDGWwr_}#eZD3^&VWih)co+0ERM@hcUo&cpmOvJ8uOO%RT~PuP1K=6JH*899}E%
zvPAm-g2d<Z<G=?D{%gsNkMMT45WE^0?^c44_9>A1?STDxW~~69Ud$tG-v{Wh@6V@#
zIDaP)zBe}DF8G%a;d|>Jakulg67DBlntu%leSafdng3hDZxasX|BW>75T2aBgL<7H
zJTrd*@$V9zm%oefdxRGiOd*Z1m<bo`qaaIWRu*hx#v?Op3;6DV&u3i*+|>n)VZMNM
zB{IzgH!x#c8<2Ds)RU}8X5s}uWJ!tDiDXm3*O)1@E<m!S;2erBw`j#r7K~>}g|z{=
z?t-%@pwj9>W_!W&EE#M41CkvD+sHG;>P2Q(!L7_pm6<&SpJV0>nYp*%OUz7@nTHC#
z!c3Jl9Xt;gTuae2q;C5P?qx}}#Wp@G3h!jm?e@QcuF|)gjm*EC1a}Y=`K2trlg+jB
z_YuB(1JI=+U{3@tV1EU<BK9KHF1`f-vFu8T-EOeuqU0!wf}1Gg9E<qiGTeOUDwulu
z7DzZ???xu?+bAu41(5%KR$uyYaQYvRAdCFpkYFCLfzca4R`dg4-^6E_$V(w9{UM9S
z5ChL_1O<F>84}OKK;_L`Nbqso@~YW0WqUzh>9h0W7}w<+>V;iENL2h0)OO)1gnbo1
z#oaDq#^bBt`Iucy@3wsvkAdAT*@hB4_)#<rDdFL?$bc9A?)f(ml>P~~{NM&4OV0#%
ze(BvH3fOeP5j<M4%CkqMwYw6dcVrwz1iU*RzOFJ3a%=dh$a;3JtgK^h1Z8@5E+5rd
zFRYO&bLFU5r?4tjW^LtRRA`NwAcgF^4z->x>!zxs*@H$`aWUq1pWw-&ju@37VZ_J|
zl@=rpju<8!=un}eg6V?HXp#{|APnv6zL*VBfrFqcaL_GG;E=HD&w%|^6y!aKn|&%Y
z^^Nl!035Jy$36dV5bK{W!8ZtA$bQd14|M+J5{wdDNw7c$qQIXMpetk`3cNwIC}bcC
zyhRyy;a0-^gi8w<hys5jTv^CK6nL9(sE~mu@DAb0g$zW26NG0LG7tscB|NW?fhh1E
z;YCFZL;+zj6E0#P3Rp6;vWSB;;E|cNMGQm%pY=`Pt}bFA3Iwe0BGX)S12eWoZ99t?
zhyq126E9*Q3Y1vaA=y;)HD=0W7}!$8Kolsq=)RvU8qbmn>k;6(ix`LkmDcmfY%gLU
z3XHWriDX9+15sd#bsI9fiWrCjQ)OmP5d%@+44JvNh=C|DO=cb{Vjv3WKvcv)6qq4(
z+gHRu6sWd%RQIeXW*`dOULXTeU^g3C$UqdhgP<s6APU^c=Guh}M1i~6S_YyUNM-jU
zS3<9#+QD7`#Ih?T_TLS*T$C~p*$hO1b1dR*2BN^Z3T7Y*ERb+Mqfg%btTUg{C+`6X
zGWz6wLxPMx_Gl_n@_pPE!j%wx<{-&u^s&bfBjZi}%qu{U&+%UnBtt&Oe?cidRR@PM
z{$Z%7Fz{XQl(#g9!aUN6LPnNCyAxPn;o}&Zh52lzzi=`zg$1OsMagx@JcEyHdA+EZ
z57;WEsC@6Dnh=OEz!4fsR!CH+CPa)F!K`(C>J*t1&!|LLyQ>i<MnVbedRE}sdF4p_
z0nN#+t*nm;>jpA=c6NwSwUp99%BfnCJl{p$+TCU($#O`NydO8bBi503#csV>k>|#e
z@9Tzdh1Njwebn%cDkk4Nn&maUF_34|lJ|GumE>nD@<=6{qBB>C5mn@^I#ctp>v&na
zi(p>KH`7!zg5Pvx4fk`n;gZMbNUhyx8Pbuu3NgBsq@^ZE>SZEG#d37DPi~WRKuv&>
z0X2Iq`8x0(z3x(rDvyey9=*0w6PZUvQIA@ac~lhjc;sRX>|AL1?9EUUMSaKs$BEC+
ziO(~0CBes8TFo_MKuvt!{MV4l!^Gz;AS7%~eBQ#(6871g_`F5TcziY|K5y}2WNe>J
z_w<&$gA69V{7)ezT+oUeCO(gv_zLOxzTg}n3+ed2(n_gh42b+YaH~SLh&(<~{5{&y
zJ{6dJuecxtB*xdHL|zgDa`sq>5j84-fr$;`&wwCc4W6B?(3nz7IV7yw=R%5<%Tr#~
z?yrJl7>2`z)R!(?at|rbqw0@@aKjZ;38)!(gP4KOV?~~w&7$N6QqL##7eb0`oI^dJ
zsplK&($A1O_?-3#`KJj`Tf67N62tJ_KGra$Mr2rvu*#&7cU~#Vc9X5Z_=wA&u7rF0
z#4k{+{pnu;(x0;T8vhEyO!x3=w^IJ(Qy#Gz+GwBhDaU9eM!T2sK)D_8aeR9Z$62nN
z5mi8&ZhC`{)3$FbLG6ZI?|+9`z229wnYJH6LEaB>Q#%0vpDzZx+yVICI0tC81Mt7~
z4U)(mfWM!x+5!0gMp*3t{BILhI{^PXgw+nfe}b^u0r=k~tabqY_Xw*UfL~b5s2zac
zk{PuF@OxxN?Ew5fi?g5F0r&$}4>D>8;I}Pmt9AhXBAHP;0Dp;GjH?}hzs#al)egX4
zE?4Gi2jH);c0!uk0r)E|&X{Tk;2&#oouGCA{wdb|$fzBFf2z!=9f1D~nNd3c|1_CV
zI{<%`+(M`wfPaS6P3-{u)z&|u9=!wb>m7i9HybH;0RB4&svUs;PBvHV0Q`5ewVZhQ
zy?6op5OPKASE^n7RRF}YD<zhza*1{C0Q~1z#LFFk|6B!g;`J|(uw3>B?q{8H*&ld7
zf}D5*-;f|D-n`LNr07SujfDSW;w?fVm;HHTh<TqS{S{zzmh{XxOZvsg3|i7J1yU~Q
z*~D~Y(@T136Gk?(q^D1fco$k&*Rbrsc-(MtsPVFPzlySveCu5iAZU$bJg~0emcX;~
zYEk(w<X-ahIK?6V5-2&RW5|tS*r=ssFphqMlowEKFpmBWa~G1zvvV!_g6sS-uMk;j
z0>mY#mzT9$&ex+53Qu7J84871UjW01%P_;~_)-B`j4#<|6LSM#$(VjVe0=fofpO35
zO{{&WQ1b~Ee1K5nTM9Y89vZ<n4yyZl2{HivoDy^ZB5bcmajE}QS~Q<uE#eQ!B|!cO
z!ejT5MEDBO=D<A4DA*EMJb|<+)DT!k5YrgB=ipQHE#!j2=K*uz;vg`3x(&!pb>0QQ
z_`Zo--png;SFz6i^RGM*$W4arigor||4fXGb#^~t73=K35mvFzew(n0b@n@iRjjj5
z5LU6yewVO{b@qFN7Zr1pVGE0ya4|O-wk0zwi@C|LJu<Vlm~)-&v%26eR~K{DV+X8F
z$TSz<z>JP{#oT1rI@T5ckR>HDRBbB$8Z$c96?2ne>sVJjo+TC5O_0`I%uR+}X>n@Y
zUd&B~J=Xdvk{!hiJN6Wd<9b&yHyQR+nb}kPIcCm~nR|=5$*`x%%tOVDJ$99K3wRzb
z<|f0|v96e#47=L84fQ-LeE)z>%AfoP;7T4w|8j{__%3ez$c_Z@3+Uy_0&zAt@<Sjh
z5cExve>?CB_T`sCPJy6`cK)v%xKsqWi?MYuwRh8sGML(T5LCg`zLWM;!PItwX$^1z
zn;ud~AEjNiLIInqNbJ`PR_|hlaTjBsV-Y`$yBPai1y84D3nc9OB=pN$L4PZI1?ar{
zS$&z>&`3~iXe7wES}5acA@~15G{0Qr`H+-xLsK}0n2PU0qK`(YsJsUG;V<B34UfY<
zp5gc6?j8O&V0^>B4cI@NuZ#tT{|D{`Bd!7lnu(E@fPkZH6%a+IG%|B7z|!LTzl4(f
z`#@d%4GI_ed_1T4n?!q*748QpZBs0Kb%0AwZ6kj*wJJI7C&1+A11=d$Lg4m6K*@EC
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

diff --git a/client/mem.c b/client/mem.c
new file mode 100644
index 0000000..38bd6bd
--- /dev/null
+++ b/client/mem.c
@@ -0,0 +1,3 @@
+#include <stdlib.h>
+
+struct task *task_head = NULL;
diff --git a/client/task.c b/client/task.c
index 1c16ce5..12789ce 100644
--- a/client/task.c
+++ b/client/task.c
@@ -5,52 +5,62 @@
 #include "spec.h"
 #include "interface.h"
 
-struct task tasks[MAXTASKS];
+#define TASKSPACE 128
+
+uint8_t taskspace[TASKSPACE] = {0};
+uint8_t *spacepointer = (uint8_t *)&taskspace;
+uint8_t taskid = 0;
+struct task *head = NULL;
 
 void task_init(void)
 {
-	memset(&tasks, 0, sizeof(struct task)*MAXTASKS);
+	memset(&taskspace, 0, TASKSPACE);
+	head = NULL;
 }
 
 void task_register(void)
 {
-	uint8_t ct;
-	uint16_t i;
+	int i;
+	if(spacepointer+sizeof(struct task) > taskspace+TASKSPACE){
+		die("Out of memory... Not enough to allocate taskstruct");
+	}
 
-	for(ct = 0; ct<MAXTASKS; ct++)
-		if(!tasks[ct].used)
-			break;
-	if(ct == MAXTASKS)
-		die("Trying to add too much tasks...");
+	//We haven't had a task before, therefore we initialize head
+	struct task *t = (struct task *)spacepointer;
+	if(head == NULL) {
+		head = t;
+	}
 
-	memset(&tasks[ct], 0, sizeof(struct task));
 	//Read interval
-	tasks[ct].interval = read16();
-	debug("interval: %d\n", tasks[ct].interval);
+	t->interval = read16();
+	debug("interval: %d\n", t->interval);
 
 	//Interrupt task
-	if(is_interrupt_task(&tasks[ct])) {
+	if(is_interrupt_task(t)) {
 
 	}
 
 	//Read tasklength
-	tasks[ct].tlen = read16();
-	debug("task interval: %d, length: %d\n",
-	      tasks[ct].interval, tasks[ct].tlen);
+	t->tasklength = read16();
+	debug("task interval: %d, length: %d\n", t->interval, t->tasklength);
+
+	if(spacepointer+t->tasklength > taskspace+TASKSPACE){
+		die("Out of memory... Not enough to allocate bytes");
+	}
+
+	spacepointer += t->tasklength;
 
-	if(tasks[ct].tlen > MAXTASKSIZE)
-		die("Task is too long: %d", tasks[ct].tlen);
 	//Read task bytecode
-	for(i = 0; i<tasks[ct].tlen; i++){
-		tasks[ct].bc[i] = read_byte();
+	for(i = 0; i<t->tasklength; i++){
+		t->bc[i] = read_byte();
 	}
 	//Return the task number for later removal
-	debug("Received a task of length %d", tasks[ct].tlen);
-	tasks[ct].used = true;
-	tasks[ct].lastrun = 0L;
+	debug("Received a task of length %d", t->tasklength);
+	t->lastrun = 0L;
+	t->taskid = taskid++;
 
 	write_byte('t');
-	write16(ct);
+	write16(t->taskid);
 	write_byte('\n');
 }
 
@@ -66,16 +76,54 @@ bool had_interrupt(struct task* t)
 	(void)t;
 }
 
-void task_delete(void)
+struct task *task_head(void)
 {
-	uint8_t c = read16();
-	tasks[c].used = false;
-	write_byte('d');
-	write16(c);
-	write_byte('\n');
+	return head;
+}
+
+struct task *task_next(struct task *t)
+{
+	if(t == NULL){
+		return NULL;
+	}
+
+	uint8_t *next = (uint8_t *)t;
+	next += sizeof(struct task);
+	next += t->tasklength;
+
+	return next > spacepointer ? NULL : (struct task *)next;
 }
 
-struct task *task_get(int num)
+void task_delete(void)
 {
-	return tasks[num].used ? &tasks[num] : NULL;
+	uint8_t c = read16();
+	struct task *t = NULL;
+	while(t != NULL){
+		if(t->taskid == c){
+			break;
+		}
+		t = task_next(t);
+	}
+	if(t != NULL){
+		//We found the task, now we move everything from the end of the task up
+		//to the spacepointer right
+		uint8_t *start = (uint8_t *)t;
+		uint8_t *end = start + sizeof(struct task) + t->tasklength;
+		debug("Moving %lu bytes\n", spacepointer-end);
+		for(int i = 0; i<spacepointer-end; i++){
+			start[i] = end[i];
+		}
+
+		//Decrement the spacepointer
+		spacepointer -= end-start;
+
+		if(t == head){
+			head = task_next(t);
+		}
+
+		//Write acknowledgement
+		write_byte('d');
+		write16(c);
+		write_byte('\n');
+	}
 }
diff --git a/client/task.h b/client/task.h
index 6542b1c..375aafc 100644
--- a/client/task.h
+++ b/client/task.h
@@ -1,8 +1,5 @@
 #ifndef TASK_H
 #define TASK_H
-
-#define MAXTASKSIZE 1024
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -11,20 +8,22 @@ extern "C" {
 #include <stdbool.h>
 
 struct task {
-	uint8_t bc[MAXTASKSIZE];
-	uint16_t tlen;
+	uint16_t tasklength;
 	uint16_t interval;
-	long lastrun;
-	bool used;
+	unsigned long lastrun;
+	uint8_t taskid;
+	struct task *next;
+	uint8_t *bc;
 };
 
 bool is_interrupt_task(struct task* t);
 bool had_interrupt(struct task* t);
 
+struct task *task_head(void);
+struct task *task_next(struct task *t);
 void task_init(void);
 void task_register(void);
 void task_delete(void);
-struct task *task_get(int num);
 
 #ifdef __cplusplus
 }
-- 
2.20.1