Something went wrong on our end
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;
}