From 0008bdfc7ce333d858b667db9d36b7c3047b3c34 Mon Sep 17 00:00:00 2001
From: David Wehr <dawehr@iastate.edu>
Date: Fri, 17 Mar 2017 19:57:36 -0500
Subject: [PATCH] Updated quad logging to use standard format.

---
 quad/src/quad_app/log_data.c | 109 ++++++++++++++++++++++++-----------
 1 file changed, 75 insertions(+), 34 deletions(-)

diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c
index 2c789b1a9..6c0a1698b 100644
--- a/quad/src/quad_app/log_data.c
+++ b/quad/src/quad_app/log_data.c
@@ -27,6 +27,12 @@ struct graph_tuple { // Tuple for
     int sub_id;
 };
 
+struct str {
+	char* str;
+	int size;
+	size_t capacity;
+};
+
 struct graph_tuple log_outputs[MAX_LOG_NUM];
 struct graph_tuple log_params[MAX_LOG_NUM];
 size_t n_outputs;
@@ -35,46 +41,70 @@ size_t n_params;
 float* logArray;
 int row_size;
 
-void addOutputToLog(log_t* log_struct, int controller_id, int output_id) {
+static char units_output_str[512] = {};
+static char units_param_str[512] = {};
+static struct str units_output { .str = units_output_str, .size = 0, .capacity = sizeof(units_output_str)};
+static struct str units_param { .str = units_param_str, .size = 0 .capacity = sizeof(units_output_str)};
+
+void safe_strcat(struct str, char* to_add) {
+	size_t add_len = strlen(to_add);
+	if (add_len + str.size <= str.capacity) {
+		strcpy(&(str.str[str.size]), to_add);
+		str.size += to_add;
+	}
+}
+
+void addOutputToLog(log_t* log_struct, int controller_id, int output_id, char* units) {
+	static units_buf[64];
 	if (n_outputs < MAX_LOG_NUM) {
 		log_outputs[n_outputs].block_id = controller_id;
 		log_outputs[n_outputs].sub_id = output_id;
 		n_outputs++;
+		snprintf(units_buf, sizeof(units_buf) "\t%s", units);
+		safe_strcat(units_output, units_buf);
 	}
 }
-void addParamToLog(log_t* log_struct, int controller_id, int param_id) {
+void addParamToLog(log_t* log_struct, int controller_id, int param_id, char* units) {
+	static units_buf[64];
 	if (n_params < MAX_LOG_NUM) {
 		log_params[n_params].block_id = controller_id;
 		log_params[n_params].sub_id = param_id;
 		n_params++;
+		snprintf(units_buf, sizeof(units_buf) "\t%s", units);
+		safe_strcat(units_param, units_buf);
 	}
 }
 
 void initialize_logging(log_t* log_struct, parameter_t* ps) {
-	addOutputToLog(log_struct, ps->alt_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->x_pos_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->y_pos_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->pitch_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->roll_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->yaw_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->pitch_r_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->roll_r_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->yaw_r_pid, PID_CORRECTION);
-	addOutputToLog(log_struct, ps->cur_pitch, CONST_VAL);
-	addOutputToLog(log_struct, ps->cur_roll, CONST_VAL);
-	addOutputToLog(log_struct, ps->cur_yaw, CONST_VAL);
-	addOutputToLog(log_struct, ps->vrpn_x, CONST_VAL);
-	addOutputToLog(log_struct, ps->vrpn_y, CONST_VAL);
-	addOutputToLog(log_struct, ps->vrpn_alt, CONST_VAL);
-	addOutputToLog(log_struct, ps->vrpn_pitch, CONST_VAL);
-	addOutputToLog(log_struct, ps->vrpn_roll, CONST_VAL);
-	addOutputToLog(log_struct, ps->x_set, CONST_VAL);
-	addOutputToLog(log_struct, ps->y_set, CONST_VAL);
-	addOutputToLog(log_struct, ps->alt_set, CONST_VAL);
-	addOutputToLog(log_struct, ps->mixer, MIXER_PWM0);
-	addOutputToLog(log_struct, ps->mixer, MIXER_PWM1);
-	addOutputToLog(log_struct, ps->mixer, MIXER_PWM2);
-	addOutputToLog(log_struct, ps->mixer, MIXER_PWM3);
+	char* rad = "rad";
+	char* rad_s = "rad/s";
+	char* pwm_val = "10us_dutycycle";
+	char* m = "m";
+	addOutputToLog(log_struct, ps->alt_pid, PID_CORRECTION, pwm_val);
+	addOutputToLog(log_struct, ps->x_pos_pid, PID_CORRECTION, rad);
+	addOutputToLog(log_struct, ps->y_pos_pid, PID_CORRECTION, rad);
+	addOutputToLog(log_struct, ps->pitch_pid, PID_CORRECTION, rad_s);
+	addOutputToLog(log_struct, ps->roll_pid, PID_CORRECTION, rad_s);
+	addOutputToLog(log_struct, ps->yaw_pid, PID_CORRECTION, rad_s);
+	addOutputToLog(log_struct, ps->pitch_r_pid, PID_CORRECTION, pwm_val);
+	addOutputToLog(log_struct, ps->roll_r_pid, PID_CORRECTION, pwm_val);
+	addOutputToLog(log_struct, ps->yaw_r_pid, PID_CORRECTION, pwm_val);
+	addOutputToLog(log_struct, ps->cur_pitch, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->cur_roll, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->cur_yaw, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->vrpn_x, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->vrpn_y, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->vrpn_alt, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->vrpn_pitch, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->vrpn_roll, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->x_set, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->y_set, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->alt_set, CONST_VAL, m);
+	addOutputToLog(log_struct, ps->yaw_set, CONST_VAL, rad);
+	addOutputToLog(log_struct, ps->mixer, MIXER_PWM0, pwm_val);
+	addOutputToLog(log_struct, ps->mixer, MIXER_PWM1, pwm_val);
+	addOutputToLog(log_struct, ps->mixer, MIXER_PWM2, pwm_val);
+	addOutputToLog(log_struct, ps->mixer, MIXER_PWM3, pwm_val);
 
 	// TODO: Make this not stupid. Adding 6 for IMU and 1 for timestamp
 	row_size = n_outputs + n_params + 6 + 1;
@@ -127,8 +157,10 @@ void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* p
 		return;
 	}
 	int i;//, j;
-	char buf[2048] = {};
+	// TODO: Change these to struct str so we can use safe_strcat
+	char buf[2560] = {};
 	buf[0] = 0; // Mark buffer as size 0
+	char comments[256] = {};
 	char header1[256] = {};
 	char header2[1024] = {};
 
@@ -139,27 +171,36 @@ void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* p
 		return;
 	}
 
-	sprintf(header1, "time,accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z");
+	sprintf(comments, "# MicroCART On-board Quad Log\n# Sample size: %d\n", arrayIndex);
+	sprintf(header1, "time\taccel_x\taccel_y\taccel_z\tgyro_x\tgyro_y\tgyro_z");
 
 	int end = 0;
 	// Print all the recorded block parameters
 	for (i = 0; i < n_params; i++) {
 		const char* block_name = ps->graph->nodes[log_params[i].block_id].name;
 		const char* output_name = ps->graph->nodes[log_params[i].block_id].type->param_names[log_params[i].sub_id];
-		end += sprintf(&header2[end], ",%s-%s", block_name, output_name);
+		end += sprintf(&header2[end], "\t%s_%s", block_name, output_name);
 	}
 	// Print all the recorded block outputs
 	for (i = 0; i < n_outputs; i++) {
 		const char* block_name = ps->graph->nodes[log_outputs[i].block_id].name;
 		const char* param_name = ps->graph->nodes[log_outputs[i].block_id].type->output_names[log_outputs[i].sub_id];
-		end += sprintf(&header2[end], ",%s-%s", block_name, param_name);
+		end += sprintf(&header2[end], "\t%s_%s", block_name, param_name);
 	}
 	end += sprintf(&header2[end], "\n");
 
+	// Send header names
+	strcat(buf, comments);
+	strcat(buf, header1);
+	strcat(buf, header2);
+	send_data(&hardware_struct->uart, LOG_ID, 0, buf, strlen(buf));
 
-	strcat(buf,header1);
-	strcat(buf,header2);
-
+	// Send units header
+	buf[0] = 0;
+	strcat(buf, "s\tG\tG\tG\trad/s\trad/s\trad/s"); // The pre-defined ones
+	strcat(buf, units_output.str);
+	strcat(buf, units_param.str);
+	strcat(buf, "\n");
 	send_data(&hardware_struct->uart, LOG_ID, 0, buf, strlen(buf));
 
 	/*************************/
@@ -185,7 +226,7 @@ int format_log(int idx, log_t* log_struct, char* buf) {
 
 	end += sprintf(&buf[end], "%f", row[0]);
 	for (i = 1; i < row_size; i++) {
-		end += sprintf(&buf[end], ",%f", row[i]);
+		end += sprintf(&buf[end], "\t%f", row[i]);
 	}
 	end += sprintf(&buf[end], "\n");
 	return end;
-- 
GitLab