Skip to content
Snippets Groups Projects
frontend_getpid.c 2.14 KiB
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <err.h>

#include "frontend_getpid.h"
#include "pid_common.h"

/* Get a specified PID.
 *
 * Example:
 *
 * struct frontend_pid_data pid_data;
 * pid_data.pid = PID_PITCH;
 * if (frontend_getpid(conn, &pid_data)) {
 * 		error
 * } else {
 * 		pid_data.p, pid_data.i, and pid_data.d are filled
 * }
 *
 * Returns 0 on success, 1 on error
 */
int frontend_getpid(
		struct backend_conn * conn, struct frontend_pid_data * pid_data) {
	
	char line[100] = "";
	switch (pid_data->controller) {
		case PID_PITCH :
			strncpy(line, "getpitchp\ngetpitchi\ngetpitchd\n", 30);
			break;
		case PID_ROLL :
			strncpy(line, "getrollp\ngetrolli\ngetrolld\n", 27);
			break;
		case PID_YAW :
			strncpy(line, "getyawp\ngetyawi\ngetyawd\n", 24);
			break;
		case PID_PITCH_RATE :
			strncpy(line, "getpitchratep\ngetpitchratei\ngetpitchrated\n", 42);
			break;
		case PID_ROLL_RATE :
			strncpy(line, "getrollratep\ngetrollratei\ngetrollrated\n", 39);
			break;
		case PID_YAW_RATE :
			strncpy(line, "getyawratep\ngetyawratei\ngetyawrated\n", 36);
			break;
		case PID_HEIGHT :
			strncpy(line, "getheightp\ngetheighti\ngetheightd\n", 33);
			break;
		case PID_LAT :
			strncpy(line, "getlatp\ngetlati\ngetlatd\n", 24);
			break;
		case PID_LONG :
			strncpy(line, "getlongp\ngetlongi\ngetlongd\n", 27);
			break;
		default :
			return 1;
	}

	int size;
	if((size = ucart_backendWrite(conn, line)) < 0 ) {
		return 1;
	}

	char * response;
	char tmpresponse[64];
	char * cmdString;
	size_t pendingResponses = 3;
	float value;
	while (pendingResponses) {
		response = ucart_backendGetline(conn);
		if (response == NULL) {
			warnx("Line not returned from backend");
			return 1;
		}
		strncpy(tmpresponse, response, 64);
		if (strncmp(tmpresponse, "get", 3) == 0) {
			cmdString = strtok(tmpresponse, " ");
			value = strtof(&response[strlen(cmdString)],NULL);
			
			if(cmdString[strlen(cmdString)-1] == 'p') {
				pid_data->p = value;
			} else if(cmdString[strlen(cmdString)-1] == 'i') {
				pid_data->i = value;
			} else if(cmdString[strlen(cmdString)-1] == 'd') {
				pid_data->d = value;
			}
			pendingResponses--;
		}
	}
	return 0;
}