From c45ffb9a1bd08605ac1230cbcd1e20d851e28f8d Mon Sep 17 00:00:00 2001 From: David Wehr <dawehr@iastate.edu> Date: Sun, 12 Feb 2017 11:53:04 -0600 Subject: [PATCH] Shuffled around #include dependencies to allow the control algorithm diagram to be generated without copying code out of control_algorithm.c --- .../computation_graph/src/computation_graph.c | 6 +- quad/sw/modular_quad_pid/.cproject | 4 +- quad/sw/modular_quad_pid/gen_diagram/Makefile | 4 +- .../sw/modular_quad_pid/gen_diagram/README.md | 9 +- .../modular_quad_pid/gen_diagram/gen_diagram | Bin 19184 -> 23464 bytes .../modular_quad_pid/gen_diagram/generate.c | 174 +----------------- .../modular_quad_pid/gen_diagram/network.dot | 52 +++--- quad/sw/modular_quad_pid/src/PID.h | 3 - .../src/actuator_command_processing.c | 1 + .../modular_quad_pid/src/control_algorithm.c | 5 +- .../src/initialize_components.c | 1 + quad/sw/modular_quad_pid/src/log_data.c | 7 + quad/sw/modular_quad_pid/src/log_data.h | 7 - .../src/send_actuator_commands.c | 1 + .../modular_quad_pid/src/sensor_processing.c | 5 + .../modular_quad_pid/src/sensor_processing.h | 7 +- quad/sw/modular_quad_pid/src/user_input.c | 1 + quad/sw/modular_quad_pid/src/util.c | 12 ++ quad/sw/modular_quad_pid/src/util.h | 12 +- 19 files changed, 74 insertions(+), 237 deletions(-) diff --git a/quad/computation_graph/src/computation_graph.c b/quad/computation_graph/src/computation_graph.c index 412c1d49e..2204f3a58 100644 --- a/quad/computation_graph/src/computation_graph.c +++ b/quad/computation_graph/src/computation_graph.c @@ -221,11 +221,11 @@ int export_dot(const struct computation_graph* graph, FILE* of, int print_output struct graph_node* src_node = &graph->nodes[input_id]; int output_id = node->input_srcs[j].controller_output; const char* output_name = src_node->type->output_names[output_id]; - fprintf(of, "\"%s\" -> \"%s\":f%d", src_node->name, node->name, j+1); + fprintf(of, "\"%s\" -> \"%s\":f%d [label=\"%s", src_node->name, node->name, j+1, output_name); if (print_outputs) { - fprintf(of, " [label=\"%s=%.3f\"]", output_name, src_node->output_values[output_id]); + fprintf(of, "=%.3f", src_node->output_values[output_id]); } - fprintf(of, "\n"); + fprintf(of, "\"]\n"); } } } diff --git a/quad/sw/modular_quad_pid/.cproject b/quad/sw/modular_quad_pid/.cproject index c203f31db..2a974bb61 100644 --- a/quad/sw/modular_quad_pid/.cproject +++ b/quad/sw/modular_quad_pid/.cproject @@ -71,7 +71,7 @@ </toolChain> </folderInfo> <sourceEntries> - <entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> + <entry excluding="gen_diagram|test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> </sourceEntries> </configuration> </storageModule> @@ -147,7 +147,7 @@ </toolChain> </folderInfo> <sourceEntries> - <entry excluding="test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> + <entry excluding="gen_diagram|test" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/> </sourceEntries> </configuration> </storageModule> diff --git a/quad/sw/modular_quad_pid/gen_diagram/Makefile b/quad/sw/modular_quad_pid/gen_diagram/Makefile index 8b917561c..9c7cb2a11 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/Makefile +++ b/quad/sw/modular_quad_pid/gen_diagram/Makefile @@ -1,8 +1,8 @@ QUAD_BLOCKS = ../src/graph_blocks -gen_diagram: generate.c - gcc -o gen_diagram -I. -I../src/ generate.c ../src/computation_graph.c ../src/graph_blocks/*.c +gen_diagram: generate.c ../src/control_algorithm.c ../src/computation_graph.c + gcc -o gen_diagram -I. -I../src/ generate.c ../src/computation_graph.c ../src/control_algorithm.c ../src/graph_blocks/*.c -Dread_flap=freadflap .PHONY: clean clean: diff --git a/quad/sw/modular_quad_pid/gen_diagram/README.md b/quad/sw/modular_quad_pid/gen_diagram/README.md index 1ab705462..87b45825b 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/README.md +++ b/quad/sw/modular_quad_pid/gen_diagram/README.md @@ -2,9 +2,8 @@ The gen_diagram project can create an image of the controller network. Below out Within the `quad/sw/modular_quad_pid` directory: -1. Copy the `control_algorithm_init` function from `src/control_algorithm.c` into `gen_diagram/generate.c`, replacing the previous implementation. -2. Within the `gen_diagram` folder, run `make clean`. Then run `make` to build the new code. -3. Now execute the program with `./gen_diagram` -4. If you have graphviz installed, you can run `dot -Tpng network.dot -o network.png` to generate a PNG file of the graph. +1. Within the `gen_diagram` folder, run `make` to build the new code. +2. Now execute the program with `./gen_diagram` +3. If you have graphviz installed, you can run `dot -Tpng network.dot -o network.png` to generate a PNG file of the graph. -Enjoy your new diagram! \ No newline at end of file +Enjoy your new diagram! diff --git a/quad/sw/modular_quad_pid/gen_diagram/gen_diagram b/quad/sw/modular_quad_pid/gen_diagram/gen_diagram index 5d50c13396d1172f12984958207f5e271945d385..b350954e504a0b94686727a78ab635227a34fda8 100755 GIT binary patch literal 23464 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 Y7r)T>%vFC4zc5e9#B0>qc5_kvUo8ovcK`qY literal 19184 zcmcg!4Rlo1oxk}Ygb$MeQ3FzaA}G3M802H42)-l?OlSgQNDx+VGGrzsOOnaX2OlaQ zZqz!RqUq|{Vz=GncH48%<L+X6x=X1Cg181+P7U>o-Ll=tqMaC8qf(o#)Y;$vfA4+s zW-<}G=j`5`dH;L=-}is-{lE9_doO$3wJY-T@`Nt=Vws@U-XfDx@+gF>nwtt&Atne@ zTrXydB4EbhXEKGLtZ6u+RBKqQ_zD0E@vF#}h>CoZD;my}XjqU%dq|M%rHiSm624F_ zn;HsXFoNXBSBI0EfK6P{aEJ1vmmK3_@R86YH&@BcRdO2kE5|g{{iD9ouR-Z;$T!iV zwn;!N=VKZYFBR{*(E!zZ=5iCz<cfxuBwA>w<?ewT`T0eQLowDXdt=3ASoKds)fDsE z+cqy=IIlfW-rm+3+flxwVsZK6h0aLGc{}%;^b_yO)s1XP$I(EGe4d6Mg_`L9wl8+~ zx~b>(KJoUmv%hlh$*p2m|7#?xf2e-pvJjk8b8s7D;AvQM@!vBBzGe)3Gw=p}*<}e3 zx%5vN13zgDeAO8E>0{sp#;2KvW3gxnbp<;`IOuP04>gNOG#rR^37^j&i3Gz@UyHx3 zU9@z?qRpbExjhsKiVn%xvOU}u4T2PI>x{NQfHe9dQ9pz_{B51UZ0QJfDvVF8tgWf4 z_TBEh-MI)p<y(K5^*oF!jjNu2u^DX>h$9Rfm63T(3~4Ug=X04$;>QC|^12u{yjp5Z znrp*bOBxiH4X@V@2~^nd_WWYn@MK#Tj}5QaJkh*1JUV8T^)~!O3oAsE4NqgQi>LcS zu_rOE@m5249_@{eOCATs)BQ>@L0d^Jssc-D&T<?}uQySnb}MlV4x~`#+(~T;*<e4n zZ>KheYOt5vw^ExzG<cBPv#3p>8GM%8GpJ1=8SLTqRBF@E4DRLjL~2uL2D`YOPi+dx zU=z20e+$|aia{^8{}Sz%9<;g4|8-6L^!=XrIZyZbVQ)iCU+?gZrttI~+smMD+jvtX z?}gySmeT8&3vuX41gz0h{y2cAd!)n@e|Ouphe#ELY09RfL`V&Q`4QH?={QBD#i`pz zh~DUV_&2QJ*k=V$;E4}=jwSE*<h|-S{aN%XOWP!^t@L`a>A1ANcWE2^7qKag5KMN$ zu}!azTL)C$$871SffIzM`)&~%H}n+bEM*^(K&pS!-~*7MI!4%Wv}t~mNLIqrBZad~ zakL1B<a3{;Ql7Yb1jBy>iam+Ck;Bv%PyA<|cwcfRQl}>YGU_E@WeX>dE0u;PzAMS7 zWWgkoAwBM-C(#H22gx0o3L_-E;94Q#FB3KH#asjBT1A;|qfBPX97RdZNXtlV<%;sI zjWUg8mMF?kZIm*mtWuO0ZIqczxmQuXVWSvK2`b7i8)Y_ALW<ICqs(Q>4n^@^o%Xtw zDUT@1VjCsElpaNyX`{3=<y(r9Z=-Bv$^k`5UX`}f#FQT>%5658+nDkrMVV@&xR`Q8 zQATXq7Bb~!Mfs(TQo)pyit>t$au-v6rYO(bC?->0SCk$bWjRyMD#|t+#lw{Iin7s0 zsb$KLqEy)^UZ(s`QD$G0j?Q|f6wZ+|vBW0R07^39rD>N;bn$$t<oO&weVDQs&D@WX zP9z)keiWNrEPcsS7MoO>rHyhRY5ShVM!knNvOO}&=x&RR25=OcHhQncri^B4(?(qu z8!bI(o0ik)1dEMEa}=94dahUpL>bN0rj7pCVx!T7HnKgsr%zjKG$BW^X`>w$n=+cI zO&eWdvDHd#ywXR7_j-%X%*CdSj^Iqgbgwd+sZAR_ZLv{~Ko>Rwq<gBhJ#VoYlC3Ex zTernV^AXxwbFyu;*eLv9<BVeUR2yAnv61g!YtN~z#A2gm1U6nXqqP01NC$+R8pWoU zOs~a8PK{#IaeKyMBd12O(PaWHnXqQ_O!ge6ehJ|;A%JsC<G@Fy4)*|K<q7Mb^&AE> zSXxRy=;f6xsrzkI5_<NTXHMRosfwJF%v&wyGG%w<#WC$JvoVjhYuKo=3$BN=RHf~H ztS6_Z`11XI)y6#9?g1P1vi*I~VxD&S{;sw$kGAWwQ7_xy0*l$fc6(2qD$EKFjkz3@ zxAa8yIC6~dp&Zn7V83ZmXUYyXJw2l`bM(`OI&93NJGdqXHEn3VMcwE*{8IF(vch$5 z9UaS1VGic3IZ5kEcK>Z_Ei_$T^Yb~F$JD&bVs2HV|M=^@WBKgO!JIW@X`gSjm;;yB z{0T1pVKtfXq?yOme9~fWzr5ye<zOCDbI4+D@Em?{+CQ#*=YeQe=+aZA3e1@o#*U+O z%bC3GV|8)ey=z3o#xu`Q)lrjZ4yMr+G4hzaB=#iCV%%70#_2@sBQq3{kv_AK^DC;E z7vS;Oc_hN_T?5lfpZu9*PLirb<9Sc>&ppS^6?yXd)wTIZ!Zf-^@=6~)ptL4T*Q33q zk3M4=agmWe_b`rPXbHQQFe?&`!%|lPbR|UGeX)Dj#Z>f~gnMA0H!o3l5sXPWMg6$t z=ynh1DbeDDS+>MIyyu6y4cA<B`^4SjE)#-o84~q#J@L0w{lwX4x@bKO74{6}^^EE- zSxbl|?(=)bAA-5m(3(CsZ&D2zM3TL~l<qyWQGdGKm&h#^y|m}eMBRC6ae|V*e{a++ zj)_~GGx69P@y7mm-Kphq_X&ucA=_{4o}{a%_Dp0q1}7nSgp>}vk#+##A5IfaWf0JD zB4WTOQvJIfXah&>nM>R!wC;aG2NWlUqd#*vE_Cm@kcuuyo48<^peZIDssr+*=h!=# z4<~3IB=h1`6fc?-7)7eZy@VidGHkq@aG#3jk3l&RuPRJ5o&xnu{4F|RugM)nPdtWc z*m%Mduj>UfTqx@vnYMfSkCJmtad;iNcf^6(Q5O!$7eBz#;Yi16JP~rUaEUv)r$r($ ze<sRWUhmMjL!4~f7ZUCZp8cL<14W*=)oYLRiS^MSbnhA#F*RIYQNxvJyb$*ml0MAC zVYM7(%o>wcAoUso>`Q)~{9`NnRu`h^nqJ9`y{ONHO3Y*fU8A8xk7u%f*azrKmfAIV zY0zm<()160W3%8blk~DQ{k05wh0>3}T!HEcM$kd4%%$|&@MVP8`cS3oN8+!Lxrf(N zSD*Vlc|CN!CR*8qGC-dou5R~vnlx}5^Y;9nH&MsRkTdCwy#I&VV*D<%;IRnR5|8g1 ziN`L+8;3tCox<ZjLQC!9?i-XFNNN{t1Hy~Mp!A~hz{0Wk$}%z-T{R|QLZ<CaazDee zO*+1y*@@6JZs`>W)U99GGPZYk|KyLfhg>kcr-&|S$F}9j?xnWXeZiGZWZk>^uf(zw zH(}X5g+Z3fZY?dlJ1^*EhXhyp#O}|@XP7dSIr#LkLGn@7Mh&NrBu^gO=|e3eefp63 z3a5{LK7Cw(t}`+P*YU(k(!`=kS<I6wx#x#U=U@Vw6%8pWODz(YoXVLLvye|%!>Q<< zWQf)36B?f!u~@8$MJ{4g1)WFsV~!O5YcF>3hNg0x!f)Za-PvxIK1pXk?K<qtrM2eF zK*%#4)_WcL_ZMXn?!=kz^kFjed8a=b!z9w^K)ms6pL>L3O!*oK5`n@Q)H>Z;C%h2~ zB%km`_PnWOmQj@Ud-hFxlvIFWK%LbuY3572uTIo)%XW7B{vT+~kK{pmiTmtBhtua} zFC0Vii}l7EUxEtczGH_cL-i4w4M+csW|sGT4h)m9UKD8ykrsi}=RO0Z80^GZ9~w@` z9-T?|2xm}qlYW#cdym8*i8RXBRLLI<vT}>qV<-MKh<)y}q<+YhDkv$5MB`bho<<yM z6YjJ7x+q-m@pSy7BhT2C+yf=u?z0?C_KkAh**yof;*e5|Jd>dnhUD--2y-lhmbM7T zd8T7in9bK6qzrXX`f)({L9tApOlJFm^mlg8!&2_pVY+FSQ9lf^<iCSmxj6VKNXi?m z9GfR}JxAA%snSPYmpmtA_y;n=Pm7Bj%@U@?Mb}XvbFRlkRM(v{t{5fc2_0J~D3;7T zjFs`>BS-9U9{d&hx9cSlrQAU(5wr|-kfuvT8YC5^Bd^&5bN~t@`PHNJ>?66IG>#g% z(kDN}RZ6$}42|ds%JyeUpX|m2*Rs1vb_ry8hFPa4UVgZWIRo?k;5|dBf=*WC6YWNb zmQtsCWE-7?xoOcn-Mz)2(~tHgoX576C>|3yselrXdju`flRio4Dz@;k%y798LtN<R z9{CZR6o;FT$mxpW$xl)#%TdV}M}~~o4S*MCR0j<|ociOm_bTo4E$#7LmlER+I1F)z z`_irniE-aXHSPv(zr^hZZlA)rFUgLq#S;ihUjuL-vBULiyzT_t;Z#d79iENHRNEoL zWwpz6`=ip^dSyBwahgwB97D1GGUDrxNpU*od;#m0I%QppQ~bYx^=$Et%KAmDB@Ed= zU=qr6%B{Unc!CCppl9FuVqDFFBVpqJwLnpkJBC5+$W1LvxG#cA7vfqw$@buxp6k9p zVrK2VS<b9Q7i}|(6Fr9T5UoIVC+_Z7Cr0-fUBOc^K2>toKBPvM`gSNiic@HXV<o3o z#<&gGENCfhK$IL;)Ro}jU8(a#xD;I4f>}It4K=|)>t;QxKx+ymA2}i*(R8O!%VpII z3}(g#!cL*{f7+%^)dre4<f#MfP`!cW2NX9WZ4A_=rF#F%nlq_%u@#teP;yvL3vN9J z;UJ9L)-|zXadP6|eM;R2-LQDOFBtm7FZUJRIEOq%l4@UpF2;wjze|ZRMh-*o>BA=8 z=Ag8&<0Be8dNNsgZ{@nmc&f6ovY~e0oZS-*Je=HDPH=5a{F9pao3*#llfq)pu|E_f zfAtQGJo@XXG5;6(d1h_={o42^%b_7P?X0K!c%J8uq1gNMp!mK`l^ZKJRo-9eJKmFi z{`oPUAG1F7C^-+$-nWa+V03#Zyww>9MMZt6z1{HEEEnFkXmcyqHu$$QWKz998nn@^ zCNWu!^+s1HLR?Z_w?t)ov@IG71cle|-dkr>xBEM~M7^!P!B&?JC?4`kRvFE13fL5Z zhSp%zF9P1yHXI^tqQ2TtEY${iObB8GXlM<GqS5xCSlhOx)8B5?we1Lop@DL?EKcXV zNVs`kbEpHaMEIj^c)?*y*x%LaY?k!s&aPnjvQA%HC+HF5uBFDx`bw|IS68{-SF_sN z*sxa2H<m6nTq4lMg2qbY!HFX5@7x+_3oo5jTR&@}m^CLd>%K^<zbm*j9BdAS0~6c* zn}h93LAtBOwal0knJ6B*t7T4LnNeQ8aha`o-<-(OInD(wo1lb#P-K)ZGYH-Zeqr3F zG%3DWn^eEp7oR^6@O6d|eyd2l>~4^0KDeaGBYUbsvCcrm!0R5e7&!G%VSF$kDpb1; z9CiL3!lT-?3c3_D74#}dS5EY!9VIF+U1u_MVolgfb*K}soODJt?pY<D4G${(Aq9zF z+n{<->HS)kerrZ#%_@@Nf^<t|f`X+APE(L(u}jc#J|A!A;{ukUgQ@sdC|Ijty@G~< zO$t(ar&6eX+`!>?%J0W-Fg1!{bu5g<g*SA>+F(>x0#>lV(W~_RM8Ve;tPX`S&NRQJ zx)Fu{a+mmWoA`1-8*!-j&#qMPY6UfYK*<#=yrEzL7%2V(sT@^)7u{%bTOTM-qU_P_ zylV@V(6-@q___WA=?+SU0m}g2`(-NC1$f7QrcynC^|(nn2zVH<AMp91RB9M-ChnLW zm{^;Col3a?_hDPd3pimI@_;)5djQ`BJP7z4vT;9P750CJ0dK=)l>?6dEuahVIY2Mq zn}A(_mjHVJ$NvuUfC~Wo0k;4S1CETqUkqTuf2UFvfb#&?18)0$DzyXfJAnHEhXD@( zHhr2(>6aSuatD{Z2kJ%M4oBX#lgAhL<c)U_ekOkXXH%(LB?}*O^9wOs@elk0J`!h% zV?{~Xs?tf@i}#AVXDqpO!R%RtCY{Ui>qLy#5~8xi@mPNK6-D{0VOi1xK>r=+)A2%y zMK72(i5N)!5&XW1yP8%&i=N+X$$uB<bD;AEwxxf_qQ3(A_i;1F?|@nK4vT&s^g@jB z3XH9#zo0Tt+ow(VTQT;3g0V}}Z_3y7*`P1NTzCj%i=MyT(!U(^uY=x|LEmc81E9YH zdV2<ai$#9~^m1(dy#i?IFF0!X_g&ymV-C`ezD3V}+L9-^RhWzKXZZiF<^Ormr(tf6 z6`w-LwSZ2;W9eVP>Un%-gMJU_x7q2^eL4Q1Zvy>hJAHFnJ^*^)bM!v~`kK$t|6S1U z1AU=ge@N<|4csfBhd}?jJ$~-)f`YGb2uX_lya2v4xa=LPpOdlnj)Oi{KW_v5HPBbu z?G#j5<5Ua!C%+wAz8&;@to>EwkTp-;+>zx#eGPOM=s}`al{lWvuPP~fqQG5Z>?^D) znftYIo)Xt%MV^w1?(uacX1JuHvcy$cGPkP403Z0PN{act*f*eOJ@lZv|L?^+-ej9D z1+@bdGAbHQmQAsLoXIuXKcaH+Mw21Emr6yyUyV1)xFDr)nW11AUYDand4!6l|Ms&~ zh}!$}O#(VSiZcbWje8O<hw@E^6Zt5_ZUuRcpkAihc*7{8AjGm@e~*feHRmX_bzU9M zR3Y&05|;yoCPR(yQElzFwuiS1xac-+`?x<{iXZ1ZZtHkr`Ez@nqAT(LbD-a2&o=ay z8rSy}{6xW`B9mFKR`4bT7c00z!F39@D44DP*~jvPc}0OJubw${Zt;w}S5{ZwY0Pch z9P5n6j783cPFMNj7`Nu{p1;`XTIgJOi^LnZyXG%;Eq2|Jt#VYm0JF6s-^_u}x8B3I z6AN&)63xk9XwAb+{&C_^PW~cmo@Vlo7rDl_0JC1ti%k9rLeH;E{6wMWVJ3c(wH`C^ zlSQu@zfAlUqASPv6o?Y*`;SciQfqx@;vKl)FzqO=7YN*3tLs5Ku>fzx_uP_;|4J)g zWb#iFI!|QcuM+gSZFVUTSL1t)T=;9O_si`v1(YRJ9>~N`7p*z*GsLqw@jA<;wb1%5 z6d$J27+ItInI}g3PkA#R@jsX~E~J_8!&!Lxeu41W`Fc6)Py4C!%v#2ej^_hPkIw&S za(N8LJTZD)z6X4+ejOYG{|f7wA?SGum1p@V#2bL*|EeoZ#_0U}UufmwD*<{CO{J8N zxb_Alytv6^jLyqfp@X^nxe<8MukSDQcLs|UUf*x(^F=lAq+j2+>bzd7@TRh>@#_>` z-`B!3E}MbR<xd!R@<-o~-mLidD7?Nu&Gtv%?<#ho{n7Wm+5YJJV2yut41fL#_&hOP z>`>!Us0@5l;UCJve@FRwT-}fIH63JLP<VZx%GYwh(}NG{ufA{1?w4`1$rcSh3aejD zS$G}iy$Y|`#ZRC=SDfDjp8B;{`LE;fj`By}kMgx3lzpi1`u>!!A%WNPLEq=<^SO?{ zzVFrgwV(PvSo1@DPCq|oKc|WV<t8}NWdbfpa^(l&$kpGg_yXq2QF-zv)-yUE&QtvQ z`b=A{V*Kd5-N<@I=gF<WPsRAsR~uAV9PmMf|L7`{(1P#H0Kcm6FHAEDE%=@e@Na-O z2$5Cjn%clPX6NC5QF^{qX0im|+oAST;2q$n&pYhp=ge=%$a;+Nqt9#ajlrJ>f2hBA zsQItw$u$Z;VY<nR+m)%g3V)~Sug*UU6#l6jB)`_<VZ0Kyf%|};f}ZL5U!iDQ$Kd}e z@DzvaxP4;`{uh8ZZ1!~Z$G}g?pDwzx;(3Dbu%OTTI&Zwq`VpUNO;+)YQZ%IS^jQy; zARmSJl<}%z12^zE&Jg|cn`~Ho7pe6WnT*$aA*FC&Y6hol%m&^eW{jE-F6J*0^nDSP zwS2@r0r1o>+Nr0a<6N!y&rOy1R;J>6FUG5e4KxF9*xI_fo%PQU^x+ScE<OtJfYN`v ziq9&A->2|DSMlUM0?=sxC|7@9ApIDx?D<doOf+v}YJT!w1@ycIyrFE_!Jy(lsp7+X zKg2Lj>iI_2{J#o#id)l7CackLyNUT3m2tRJ@%Lu&uTuJ-QR`aA=lASSj_cdza5NH) zwX|S^-sf9YUGJ-{S=-?Ai9j$M+|m|_2E)E+hYw#ib_OHh2!woF+C!WD?Y=-X6pr}( zu^obTzuSY+V8HpOiz*i7X7aVPb+-BZ;jn+FFW4Ck?-VUze@D<4h;?-Agov$$X9I1~ z4Aw2d&R`giP2gj$2MfU+!DjhD!MDxd9>J%Ykzh2v7w_|V>)j0v8+<DoS64UGtXb{z zITy}f;DXg$gvBmFTl~JwymJqevf{H@Ru&{dv~~JA(Uph@#bA|dU4C><)md4y+J=WZ zaN*Gh)L~;@Dw6g(=vfNrUE4c+9e5hR5KjaMHuG~H=E&g(<E4_Wwg6PDsBQ4My=!Y~ z*Q^%6<PZTC-Ct2(S?Bh-S1-qS%fZ+6j3EH)@(rsi>uRdOWux%7tU%!#WS`rkw0V}- z3*XAxHC2_hzBMaWtaUf|8Y-)5-DH8kfNhS%cru8rM=G*OBNqw9!p%Y9t7)k7rKe#- zT{TU@2LEO}e@ZjUP-EPMFBtISL6-aq*EH?l(`J0Fn@P&_LXEo8zXi_7;j+!CEWa^U z^bCx@0M69R124yno_gv2r@sKsWXIZq`|@*O{nc<bN5%)k5Qv0)t^Upc0^+M#1JMBH zVk{C2C?D;QrD*Y5@uxvl-zjIBP+vJ`B7MHik%)4Pzg*^?(Zu3@HA5&Gl#lu3$I@Bi ztG4;-RW893NPIRO5nYk&Fw%?+?&u2P>u7q4D!-o2Qsl!NP}5Zoo4tel+>PgqPFxu? z2J0;v4z>II?OQ_lFuS#bXL7a|a#h;azwDy?=sVM!^tzTj(j%HO=_x6kk)0h;|7O5w zSi)9a!!xH~xJx)YLr83uRW;>N{}$ES(iwAZj<w;R10X0)YPI?!t-=}D*$I6TM#GY_ zEf|i_Qz&Lr4IgOXV7s3LRIRH$Dx5s*PE?&+5MpOExC2K@%wP)f;&BFBRVr=`K#6Wi zQJIsags%U2GuU9p-_h0#A3{-54-BnDC#H>XVvIVF@iWd||N92r$LHaP%Ns5g`KE#l ztbI_~lDxW3@J9T`<EP~t@=dhT|7XJBR{DU`W=5HhmR&xYZ!$fq6wc;W`j9QZ93*T_ zhqV3u`6e^(R|vh2i_<t4eP5)SVl^ss52)o2<(p{XV-1BcC^#rZ_)%5Mmk|<$-bu$L zpe3*OgU=8WMeqO0*68@%4+8DIYWsRWZk_6=wxj*md>U?rJniM`w%)hvQu2l}obA6t z3)*KPRxPjh_j<;#pWXjQlzf#^sP_R6DEVQ9C;zE0+44^SM{y<psObIs{i?$=B-%PE zwN^Whnq6M+EA}e+gBGW(I8<B1r?cd{icIF{QVwZ<m6+wfZhspUyZyaNey@@be@Syn zsO@U(-)G5RywPORMOs)Wdf#5Q<XGuC!RPQJ`+EHJ{g0SURNS9r1<YV<`tTyEc6q%& zs{h{$?QhvjmO611#0>dcOlI%7MM}-g63C9{NwAgRr<RMg->U!rOE!OY`%TEwUYwTK z`?6)U5s8w`pWS{3JmkNY*Za4|7nFYwvNY6MUhnhj|Ib730Z>uX!SYAXgZ-e{?d$(H zGBS_FEPmNa_eb~RgDiP#-`FK3TD72pT28}}EO~u@-m2t{G2}J+GgL^I?!VrLeq71B zRR1-<p(_d&fKDum-J)vwg%(Cuv^ou^0IhA?S+7$GX|iTi#H?n<+_lU1YKJCE>~#QM c{B+!OUZ(Y#%YN@&Qtp18xMh>=sVam20cNb;y#N3J diff --git a/quad/sw/modular_quad_pid/gen_diagram/generate.c b/quad/sw/modular_quad_pid/gen_diagram/generate.c index 3563ede33..d88d8598b 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/generate.c +++ b/quad/sw/modular_quad_pid/gen_diagram/generate.c @@ -5,49 +5,14 @@ #include "graph_blocks/node_bounds.h" #include "graph_blocks/node_constant.h" #include "graph_blocks/node_mixer.h" -#include "local_PID.h" +#include "PID.h" +#include "control_algorithm.h" #define ROLL_PITCH_MAX_ANGLE 0.3490 // 20 degrees - -typedef struct parameter_t { - struct computation_graph* graph; - // PID blocks - int roll_pid; - int pitch_pid; - int yaw_pid; - int roll_r_pid; - int pitch_r_pid; - int yaw_r_pid; - int x_pos_pid; - int y_pos_pid; - int alt_pid; - // Sensor blocks - int cur_pitch; - int cur_roll; - int cur_yaw; - int theta_dot; - int phi_dot; - int psi_dot; - // RC blocks - int rc_pitch; - int rc_roll; - int rc_yaw; - int rc_throttle; - // Loop time - int dt; - // Signal mixer - int mixer; - // Clamping blocks - int clamp_pitch; - int clamp_roll; - int clamp_d_pwmR; // Clamp the change in PWM values for roll - int clamp_d_pwmP; // ... pitch - int clamp_d_pwmY; // ... yaw -} parameter_t; - parameter_t ps; - int control_algorithm_init(parameter_t * ps); +//int control_algorithm_init(parameter_t * ps); +int freadflap(int i) {return i;} int main() { control_algorithm_init(&ps); @@ -56,134 +21,3 @@ int main() { export_dot(ps.graph, dot_fp, 0); fclose(dot_fp); } - -int control_algorithm_init(parameter_t * ps) -{ - struct computation_graph* graph = create_graph(); - ps->graph = graph; - - // Create all the PID blocks - ps->roll_pid = graph_add_node_pid(graph, "Roll PID"); - ps->pitch_pid = graph_add_node_pid(graph, "Pitch PID"); - ps->yaw_pid = graph_add_node_pid(graph, "Yaw PID"); - ps->roll_r_pid = graph_add_node_pid(graph, "Roll Rate PID"); - ps->pitch_r_pid = graph_add_node_pid(graph, "Pitch Rate PID"); - ps->yaw_r_pid = graph_add_node_pid(graph, "Yaw Rate PID"); - ps->x_pos_pid = graph_add_node_pid(graph, "X pos PID PID"); - ps->y_pos_pid = graph_add_node_pid(graph, "Y pos PID"); - ps->alt_pid = graph_add_node_pid(graph, "Altitude"); - - // Create blocks for bounds checking - ps->clamp_d_pwmP = graph_add_node_bounds(graph, "P PWM Clamp"); - ps->clamp_d_pwmR = graph_add_node_bounds(graph, "R PWM Clamp"); - ps->clamp_d_pwmY = graph_add_node_bounds(graph, "Y PWM Clamp"); - ps->clamp_pitch = graph_add_node_bounds(graph, "Pitch Clamp"); - ps->clamp_roll= graph_add_node_bounds(graph, "Roll Clamp"); - - // Create blocks for sensor inputs - ps->cur_pitch = graph_add_node_const(graph, "Pitch"); - ps->cur_roll = graph_add_node_const(graph, "Roll"); - ps->cur_yaw = graph_add_node_const(graph, "Yaw"); - // Yaw angular velocity PID - // theta_dot is the angular velocity about the y-axis - // phi_dot is the angular velocity about the x-axis - // psi_dot is the angular velocity about the z-axis - // These are calculated from using the gimbal equations - ps->theta_dot = graph_add_node_const(graph, "dTheta"); - ps->phi_dot = graph_add_node_const(graph, "dPhi"); - ps->psi_dot = graph_add_node_const(graph, "dPsi"); - - // Create blocks for RC controller - ps->rc_pitch = graph_add_node_const(graph, "RC Pitch"); - ps->rc_roll = graph_add_node_const(graph, "RC Roll"); - ps->rc_yaw = graph_add_node_const(graph, "RC Yaw"); - ps->rc_throttle = graph_add_node_const(graph, "RC Throttle"); - - ps->mixer = graph_add_node_mixer(graph, "Signal Mixer"); - - ps->dt = graph_add_node_const(graph, "dT"); - - // Connect pitch PID chain - graph_set_source(graph, ps->pitch_r_pid, PID_SETPOINT, ps->pitch_pid, PID_CORRECTION); - graph_set_source(graph, ps->pitch_r_pid, PID_CUR_POINT, ps->theta_dot, CONST_VAL); - graph_set_source(graph, ps->pitch_r_pid, PID_DT, ps->dt, CONST_VAL); - graph_set_source(graph, ps->pitch_pid, PID_SETPOINT, ps->rc_pitch, CONST_VAL); - graph_set_source(graph, ps->pitch_pid, PID_CUR_POINT, ps->cur_pitch, CONST_VAL); - graph_set_source(graph, ps->pitch_pid, PID_DT, ps->dt, CONST_VAL); - - // Connect roll PID chain - graph_set_source(graph, ps->roll_r_pid, PID_SETPOINT, ps->roll_pid, PID_CORRECTION); - graph_set_source(graph, ps->roll_r_pid, PID_CUR_POINT, ps->phi_dot, CONST_VAL); - graph_set_source(graph, ps->roll_r_pid, PID_DT, ps->dt, CONST_VAL); - graph_set_source(graph, ps->roll_pid, PID_SETPOINT, ps->rc_roll, CONST_VAL); - graph_set_source(graph, ps->roll_pid, PID_CUR_POINT, ps->cur_roll, CONST_VAL); - graph_set_source(graph, ps->roll_pid, PID_DT, ps->dt, CONST_VAL); - - // Connect yaw PID chain - graph_set_source(graph, ps->yaw_r_pid, PID_SETPOINT, ps->rc_yaw, PID_CORRECTION); - graph_set_source(graph, ps->yaw_r_pid, PID_CUR_POINT, ps->psi_dot, CONST_VAL); - graph_set_source(graph, ps->yaw_r_pid, PID_DT, ps->dt, CONST_VAL); - /* - graph_set_source(graph, ps->yaw_pid, PID_SETPOINT, ps->rc_yaw, CONST_VAL); - graph_set_source(graph, ps->yaw_pid, PID_CUR_POINT, ps->yaw, CONST_VAL); - graph_set_source(graph, ps->yaw_pid, PID_DT, ps->dt, CONST_VAL); - */ - - // Connect angle clamping blocks - graph_set_source(graph, ps->clamp_pitch, BOUNDS_IN, ps->y_pos_pid, PID_CORRECTION); - graph_set_source(graph, ps->clamp_roll, BOUNDS_IN, ps->x_pos_pid, PID_CORRECTION); - - // Connect PWM clamping blocks - graph_set_source(graph, ps->clamp_d_pwmP, BOUNDS_IN, ps->pitch_r_pid, PID_CORRECTION); - graph_set_source(graph, ps->clamp_d_pwmR, BOUNDS_IN, ps->roll_r_pid, PID_CORRECTION); - graph_set_source(graph, ps->clamp_d_pwmY, BOUNDS_IN, ps->yaw_r_pid, PID_CORRECTION); - - // Connect signal mixer - graph_set_source(graph, ps->mixer, MIXER_THROTTLE, ps->rc_throttle, CONST_VAL); - graph_set_source(graph, ps->mixer, MIXER_PITCH, ps->clamp_d_pwmP, BOUNDS_OUT); - graph_set_source(graph, ps->mixer, MIXER_ROLL, ps->clamp_d_pwmR, BOUNDS_OUT); - graph_set_source(graph, ps->mixer, MIXER_YAW, ps->clamp_d_pwmY, BOUNDS_OUT); - - // Set pitch PID constants - graph_set_param_val(graph, ps->pitch_pid, PID_KP, PITCH_ANGLE_KP); - graph_set_param_val(graph, ps->pitch_pid, PID_KI, PITCH_ANGLE_KI); - graph_set_param_val(graph, ps->pitch_pid, PID_KD, PITCH_ANGLE_KD); - graph_set_param_val(graph, ps->pitch_r_pid, PID_KP, PITCH_ANGULAR_VELOCITY_KP); - graph_set_param_val(graph, ps->pitch_r_pid, PID_KI, PITCH_ANGULAR_VELOCITY_KI); - graph_set_param_val(graph, ps->pitch_r_pid, PID_KD, PITCH_ANGULAR_VELOCITY_KD); - - // Set roll PID constants - graph_set_param_val(graph, ps->roll_pid, PID_KP, ROLL_ANGLE_KP); - graph_set_param_val(graph, ps->roll_pid, PID_KI, ROLL_ANGLE_KI); - graph_set_param_val(graph, ps->roll_pid, PID_KD, ROLL_ANGLE_KD); - graph_set_param_val(graph, ps->roll_r_pid, PID_KP, ROLL_ANGULAR_VELOCITY_KP); - graph_set_param_val(graph, ps->roll_r_pid, PID_KI, ROLL_ANGULAR_VELOCITY_KI); - graph_set_param_val(graph, ps->roll_r_pid, PID_KD, ROLL_ANGULAR_VELOCITY_KD); - - // Set yaw PID constants - graph_set_param_val(graph, ps->yaw_pid, PID_KP, YAW_ANGLE_KP); - graph_set_param_val(graph, ps->yaw_pid, PID_KI, YAW_ANGLE_KI); - graph_set_param_val(graph, ps->yaw_pid, PID_KD, YAW_ANGLE_KD); - graph_set_param_val(graph, ps->yaw_r_pid, PID_KP, YAW_ANGULAR_VELOCITY_KP); - graph_set_param_val(graph, ps->yaw_r_pid, PID_KI, YAW_ANGULAR_VELOCITY_KI); - graph_set_param_val(graph, ps->yaw_r_pid, PID_KD, YAW_ANGULAR_VELOCITY_KD); - - // Set angle clamping limits - graph_set_param_val(graph, ps->clamp_pitch, BOUNDS_MIN, -ROLL_PITCH_MAX_ANGLE); - graph_set_param_val(graph, ps->clamp_pitch, BOUNDS_MAX, ROLL_PITCH_MAX_ANGLE); - graph_set_param_val(graph, ps->clamp_roll, BOUNDS_MIN, -ROLL_PITCH_MAX_ANGLE); - graph_set_param_val(graph, ps->clamp_roll, BOUNDS_MAX, ROLL_PITCH_MAX_ANGLE); - - // Set PWM difference clamping limits - graph_set_param_val(graph, ps->clamp_d_pwmP, BOUNDS_MIN, -20000); - graph_set_param_val(graph, ps->clamp_d_pwmP, BOUNDS_MAX, 20000); - graph_set_param_val(graph, ps->clamp_d_pwmR, BOUNDS_MIN, -20000); - graph_set_param_val(graph, ps->clamp_d_pwmR, BOUNDS_MAX, 20000); - graph_set_param_val(graph, ps->clamp_d_pwmY, BOUNDS_MIN, -20000); - graph_set_param_val(graph, ps->clamp_d_pwmY, BOUNDS_MAX, 20000); - - // TODO: Change this to use LOOP_TIME - graph_set_param_val(graph, ps->dt, CONST_SET, 0.005); - - return 0; -} diff --git a/quad/sw/modular_quad_pid/gen_diagram/network.dot b/quad/sw/modular_quad_pid/gen_diagram/network.dot index 7e628deb2..7e8830be9 100644 --- a/quad/sw/modular_quad_pid/gen_diagram/network.dot +++ b/quad/sw/modular_quad_pid/gen_diagram/network.dot @@ -10,9 +10,9 @@ label=" |<f5> [Ki=0.000] |<f6> [Kd=0.200] "] -"Roll" -> "Roll PID":f1 -"RC Roll" -> "Roll PID":f2 -"dT" -> "Roll PID":f3 +"Roll" -> "Roll PID":f1 [label="Constant"] +"RC Roll" -> "Roll PID":f2 [label="Constant"] +"dT" -> "Roll PID":f3 [label="Constant"] "Pitch PID"[shape=record label=" <f0> Pitch PID @@ -23,9 +23,9 @@ label=" |<f5> [Ki=0.000] |<f6> [Kd=0.200] "] -"Pitch" -> "Pitch PID":f1 -"RC Pitch" -> "Pitch PID":f2 -"dT" -> "Pitch PID":f3 +"Pitch" -> "Pitch PID":f1 [label="Constant"] +"RC Pitch" -> "Pitch PID":f2 [label="Constant"] +"dT" -> "Pitch PID":f3 [label="Constant"] "Yaw PID"[shape=record label=" <f0> Yaw PID @@ -46,9 +46,9 @@ label=" |<f5> [Ki=0.000] |<f6> [Kd=550.000] "] -"dPhi" -> "Roll Rate PID":f1 -"Roll PID" -> "Roll Rate PID":f2 -"dT" -> "Roll Rate PID":f3 +"dPhi" -> "Roll Rate PID":f1 [label="Constant"] +"Roll PID" -> "Roll Rate PID":f2 [label="Correction"] +"dT" -> "Roll Rate PID":f3 [label="Constant"] "Pitch Rate PID"[shape=record label=" <f0> Pitch Rate PID @@ -59,9 +59,9 @@ label=" |<f5> [Ki=0.000] |<f6> [Kd=550.000] "] -"dTheta" -> "Pitch Rate PID":f1 -"Pitch PID" -> "Pitch Rate PID":f2 -"dT" -> "Pitch Rate PID":f3 +"dTheta" -> "Pitch Rate PID":f1 [label="Constant"] +"Pitch PID" -> "Pitch Rate PID":f2 [label="Correction"] +"dT" -> "Pitch Rate PID":f3 [label="Constant"] "Yaw Rate PID"[shape=record label=" <f0> Yaw Rate PID @@ -72,12 +72,12 @@ label=" |<f5> [Ki=0.000] |<f6> [Kd=0.000] "] -"dPsi" -> "Yaw Rate PID":f1 -"RC Yaw" -> "Yaw Rate PID":f2 -"dT" -> "Yaw Rate PID":f3 -"X pos PID PID"[shape=record +"dPsi" -> "Yaw Rate PID":f1 [label="Constant"] +"RC Yaw" -> "Yaw Rate PID":f2 [label="Constant"] +"dT" -> "Yaw Rate PID":f3 [label="Constant"] +"X pos PID"[shape=record label=" -<f0> X pos PID PID +<f0> X pos PID |<f1> --\>Cur point |<f2> --\>Setpoint |<f3> --\>dt @@ -112,7 +112,7 @@ label=" |<f2> [Min=-20000.000] |<f3> [Max=20000.000] "] -"Pitch Rate PID" -> "P PWM Clamp":f1 +"Pitch Rate PID" -> "P PWM Clamp":f1 [label="Correction"] "R PWM Clamp"[shape=record label=" <f0> R PWM Clamp @@ -120,7 +120,7 @@ label=" |<f2> [Min=-20000.000] |<f3> [Max=20000.000] "] -"Roll Rate PID" -> "R PWM Clamp":f1 +"Roll Rate PID" -> "R PWM Clamp":f1 [label="Correction"] "Y PWM Clamp"[shape=record label=" <f0> Y PWM Clamp @@ -128,7 +128,7 @@ label=" |<f2> [Min=-20000.000] |<f3> [Max=20000.000] "] -"Yaw Rate PID" -> "Y PWM Clamp":f1 +"Yaw Rate PID" -> "Y PWM Clamp":f1 [label="Correction"] "Pitch Clamp"[shape=record label=" <f0> Pitch Clamp @@ -136,7 +136,7 @@ label=" |<f2> [Min=-0.349] |<f3> [Max=0.349] "] -"Y pos PID" -> "Pitch Clamp":f1 +"Y pos PID" -> "Pitch Clamp":f1 [label="Correction"] "Roll Clamp"[shape=record label=" <f0> Roll Clamp @@ -144,7 +144,7 @@ label=" |<f2> [Min=-0.349] |<f3> [Max=0.349] "] -"X pos PID PID" -> "Roll Clamp":f1 +"X pos PID" -> "Roll Clamp":f1 [label="Correction"] "Pitch"[shape=record label=" <f0> Pitch @@ -203,10 +203,10 @@ label=" |<f3> --\>Roll |<f4> --\>Yaw "] -"RC Throttle" -> "Signal Mixer":f1 -"P PWM Clamp" -> "Signal Mixer":f2 -"R PWM Clamp" -> "Signal Mixer":f3 -"Y PWM Clamp" -> "Signal Mixer":f4 +"RC Throttle" -> "Signal Mixer":f1 [label="Constant"] +"P PWM Clamp" -> "Signal Mixer":f2 [label="Bounded"] +"R PWM Clamp" -> "Signal Mixer":f3 [label="Bounded"] +"Y PWM Clamp" -> "Signal Mixer":f4 [label="Bounded"] "dT"[shape=record label=" <f0> dT diff --git a/quad/sw/modular_quad_pid/src/PID.h b/quad/sw/modular_quad_pid/src/PID.h index d0e69ddcc..a7701ab2a 100644 --- a/quad/sw/modular_quad_pid/src/PID.h +++ b/quad/sw/modular_quad_pid/src/PID.h @@ -81,7 +81,4 @@ #define ALT_ZPOS_KI 817.0f #define ALT_ZPOS_KD 7353.0f -// Computes control error and correction -PID_values pid_computation(PID_t *pid); - #endif /* PID_H_ */ diff --git a/quad/sw/modular_quad_pid/src/actuator_command_processing.c b/quad/sw/modular_quad_pid/src/actuator_command_processing.c index 64fce135a..e27dbf434 100644 --- a/quad/sw/modular_quad_pid/src/actuator_command_processing.c +++ b/quad/sw/modular_quad_pid/src/actuator_command_processing.c @@ -7,6 +7,7 @@ #include "actuator_command_processing.h" #include "sensor_processing.h" +#include "controllers.h" int actuator_command_processing(log_t* log_struct, user_input_t * user_input_struct, raw_actuator_t* raw_actuator_struct, actuator_command_t* actuator_command_struct) { diff --git a/quad/sw/modular_quad_pid/src/control_algorithm.c b/quad/sw/modular_quad_pid/src/control_algorithm.c index d9d216b73..3623d4d6f 100644 --- a/quad/sw/modular_quad_pid/src/control_algorithm.c +++ b/quad/sw/modular_quad_pid/src/control_algorithm.c @@ -8,11 +8,12 @@ // This implemented modular quadrotor software implements a PID control algorithm #include "control_algorithm.h" -#include "communication.h" #include "graph_blocks/node_pid.h" #include "graph_blocks/node_bounds.h" #include "graph_blocks/node_constant.h" #include "graph_blocks/node_mixer.h" +#include "PID.h" +#include "util.h" #define ROLL_PITCH_MAX_ANGLE 0.3490 // 20 degrees @@ -28,7 +29,7 @@ ps->roll_r_pid = graph_add_node_pid(graph, "Roll Rate PID"); ps->pitch_r_pid = graph_add_node_pid(graph, "Pitch Rate PID"); ps->yaw_r_pid = graph_add_node_pid(graph, "Yaw Rate PID"); - ps->x_pos_pid = graph_add_node_pid(graph, "X pos PID PID"); + ps->x_pos_pid = graph_add_node_pid(graph, "X pos PID"); ps->y_pos_pid = graph_add_node_pid(graph, "Y pos PID"); ps->alt_pid = graph_add_node_pid(graph, "Altitude"); diff --git a/quad/sw/modular_quad_pid/src/initialize_components.c b/quad/sw/modular_quad_pid/src/initialize_components.c index c548d26d2..0009bac9b 100644 --- a/quad/sw/modular_quad_pid/src/initialize_components.c +++ b/quad/sw/modular_quad_pid/src/initialize_components.c @@ -7,6 +7,7 @@ #include "initialize_components.h" #include "communication.h" +#include "sensor.h" //#define BENCH_TEST diff --git a/quad/sw/modular_quad_pid/src/log_data.c b/quad/sw/modular_quad_pid/src/log_data.c index 2ab248cdd..8a91a40be 100644 --- a/quad/sw/modular_quad_pid/src/log_data.c +++ b/quad/sw/modular_quad_pid/src/log_data.c @@ -5,6 +5,13 @@ * Author: ucart */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "PID.h" +#include "type_def.h" +#include "uart.h" +#include "sleep.h" #include "log_data.h" #include "communication.h" diff --git a/quad/sw/modular_quad_pid/src/log_data.h b/quad/sw/modular_quad_pid/src/log_data.h index 994d043ba..14d06b3bb 100644 --- a/quad/sw/modular_quad_pid/src/log_data.h +++ b/quad/sw/modular_quad_pid/src/log_data.h @@ -7,14 +7,7 @@ #ifndef LOG_DATA_H_ #define LOG_DATA_H_ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "PID.h" #include "type_def.h" -#include "uart.h" -#include "sleep.h" #define LOG_STARTING_SIZE 4096 //262144 // 2^18 32768 2^15 diff --git a/quad/sw/modular_quad_pid/src/send_actuator_commands.c b/quad/sw/modular_quad_pid/src/send_actuator_commands.c index 717434892..85b1ca76b 100644 --- a/quad/sw/modular_quad_pid/src/send_actuator_commands.c +++ b/quad/sw/modular_quad_pid/src/send_actuator_commands.c @@ -6,6 +6,7 @@ */ #include "send_actuator_commands.h" +#include "util.h" int send_actuator_commands(log_t* log_struct, actuator_command_t* actuator_command_struct) { diff --git a/quad/sw/modular_quad_pid/src/sensor_processing.c b/quad/sw/modular_quad_pid/src/sensor_processing.c index 5fd682c3f..9465b0228 100644 --- a/quad/sw/modular_quad_pid/src/sensor_processing.c +++ b/quad/sw/modular_quad_pid/src/sensor_processing.c @@ -5,6 +5,11 @@ * Author: ucart */ +#include <stdio.h> +#include "log_data.h" +#include "sensor.h" +#include "conversion.h" +#include "quadposition.h" #include "sensor_processing.h" #include "timer.h" #include <math.h> diff --git a/quad/sw/modular_quad_pid/src/sensor_processing.h b/quad/sw/modular_quad_pid/src/sensor_processing.h index cf3fd122b..04b5efebe 100644 --- a/quad/sw/modular_quad_pid/src/sensor_processing.h +++ b/quad/sw/modular_quad_pid/src/sensor_processing.h @@ -7,12 +7,7 @@ #ifndef SENSOR_PROCESSING_H_ #define SENSOR_PROCESSING_H_ - -#include <stdio.h> -#include "log_data.h" -#include "sensor.h" -#include "conversion.h" -#include "quadposition.h" +#include "type_def.h" /* * Aero channel declaration */ diff --git a/quad/sw/modular_quad_pid/src/user_input.c b/quad/sw/modular_quad_pid/src/user_input.c index bc0c4c5b7..91fb830ac 100644 --- a/quad/sw/modular_quad_pid/src/user_input.c +++ b/quad/sw/modular_quad_pid/src/user_input.c @@ -7,6 +7,7 @@ #include "user_input.h" #include "uart.h" +#include "controllers.h" int get_user_input(log_t* log_struct, user_input_t* user_input_struct) { diff --git a/quad/sw/modular_quad_pid/src/util.c b/quad/sw/modular_quad_pid/src/util.c index c7dd33a1c..be07d3818 100644 --- a/quad/sw/modular_quad_pid/src/util.c +++ b/quad/sw/modular_quad_pid/src/util.c @@ -7,6 +7,18 @@ #include "util.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <math.h> +#include <xgpiops.h> +#include "PID.h" +#include "log_data.h" +#include <sleep.h> +#include "controllers.h" +#include "xparameters.h" +#include "uart.h" + extern int motor0_bias, motor1_bias, motor2_bias, motor3_bias; //Global variable representing the current pulseW int pulseW = pulse_throttle_low; diff --git a/quad/sw/modular_quad_pid/src/util.h b/quad/sw/modular_quad_pid/src/util.h index 285db6085..7c864f4d6 100644 --- a/quad/sw/modular_quad_pid/src/util.h +++ b/quad/sw/modular_quad_pid/src/util.h @@ -7,17 +7,7 @@ #ifndef _UTIL_H #define _UTIL_H -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> -#include <xgpiops.h> -#include "PID.h" -#include "log_data.h" -#include <sleep.h> -#include "controllers.h" -#include "xparameters.h" -#include "uart.h" +#include "type_def.h" #define clock_rate 100000000 -- GitLab