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
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

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