From 003e10b683977b99ae717158cabd31083d36503c Mon Sep 17 00:00:00 2001
From: burneykb <burneykb@iastate.edu>
Date: Wed, 1 Feb 2017 18:48:23 -0600
Subject: [PATCH] changes to quad_recv

---
 groundStation/src/backend/backend.c | 194 +++++++++-------------------
 groundStation/src/backend/packet.c  |   5 +
 2 files changed, 67 insertions(+), 132 deletions(-)

diff --git a/groundStation/src/backend/backend.c b/groundStation/src/backend/backend.c
index 9bf8aa57b..a0ea26cfb 100644
--- a/groundStation/src/backend/backend.c
+++ b/groundStation/src/backend/backend.c
@@ -34,6 +34,8 @@
 #include "vrpn_tracker.hpp"
 #include "type_def.h"
 #include "logger.h"
+#include "packet.h"
+#include "respcontrol.h"
 #include "config.h"
 
 #define QUAD_BT_ADDR  "00:06:66:64:61:D6"
@@ -272,80 +274,40 @@ int main(int argc, char **argv)
 }
 
 void sendStartPacket() {
-	unsigned char packet[8] = {0};
-	currMessageID++;
-	metadata_t metadata = 
-	{
-		(char) BEGIN_CHAR,
-		BEGINUPDATE_ID,
-		1,
-		0
-	};
+	uint8_t packet[64];
+	struct metadata m;
+	m.msg_type = BEGINUPDATE_ID;
+	m.data_len = 0;
+	m.msg_id = currMessageID++;
 
-	packet[0] = metadata.begin_char; // BEGIN					//PACKET_START_BYTE;
-	packet[1] = metadata.msg_type & 0xff;	// UPDATE				//'U'; // U for vrpn camera update, C for command
-	packet[2] = (metadata.msg_type >> 8) & 0xff; // BEGIN UPDATE
-	packet[3] = (currMessageID & 0x000000ff); 			// MSG ID(1)
-	packet[4] =	((currMessageID >> 8) & 0x000000ff); // MSG ID(2)
-	packet[5] = 0; 			// DATALEN(1)
-	packet[6] = 0; 	// DATALEN(2)
-	
-	char checksum = 0;
-	int i;
-	for(i=0; i < metadata.data_len + 7; i++)
-		checksum ^= packet[i];
-
-	packet[metadata.data_len + 7] = checksum; //PACKET_END_BYTE;
-	int status = writeQuad((char * ) packet, metadata.data_len + 8);
-	if (status != 8)
-	{
-		perror("Error sending start packet...\n");
-		keepRunning = 0;
-	}else
-	{
-		printf("Start packet successfuly sent...\n");
-	}	
+	size_t psize;
+
+	if ((psize = EncodePacket(packet, 64, &m, NULL)) < 0) {
+		warnx("Big problems");
+		return;
+	}
+
+	writeQuad(packet, psize);
 }
 
 void sendVrpnPacket(struct ucart_vrpn_TrackerData *info) {
-	int pSize = 36;//sizeof(struct ucart_vrpn_TrackerData) + 8;
-	int n;
-	unsigned char packet[pSize];
-	currMessageID++;
-	packet[0] = 0xBE; // BEGIN					//PACKET_START_BYTE;
-	packet[1] = 0x04; // UPDATE				//'U'; // U for vrpn camera update, C for command
-	packet[2] = 0x00; // N/A
-	//TODO Figure out Packet ID with this new ucar_vrpn_TrackerData struct
-	packet[3] = (currMessageID & 0x000000ff); 			// MSG ID(1)
-	packet[4] =	((currMessageID >> 8) & 0x000000ff); // MSG ID(2)
-	packet[5] = (28 & 0x000000ff); 			// DATALEN(1)
-	packet[6] = ((28) >> 8 & 0x00000ff); 	// DATALEN(2)
-	//memcpy(&packet[7], &info, sizeof(struct ucart_vrpn_TrackerData));
-
-	memset(&packet[7], 0, 4);
-	memcpy(&packet[11], &(info->y), 4);
-	memcpy(&packet[15], &(info->x), 4);
-	memcpy(&packet[19], &(info->z), 4);
-	memcpy(&packet[23], &(info->roll), 4);
-	memcpy(&packet[27], &(info->pitch), 4);
-	memcpy(&packet[31], &(info->yaw), 4);
-
-	char checksum = 0;
-	int i;
-	for(i=0; i < pSize - 1; i++) 
-		checksum ^= packet[i];
-
-	packet[pSize - 1] = checksum; //PACKET_END_BYTE;
-
-	n = writeQuad((char *) packet, pSize);
-	if(n < 0) {	
-		perror("vrpnhandler: ERROR writing to socket");
-		keepRunning = 0;
+	uint8_t packet[64];
+	struct metadata m;
+	uint8_t data[128];
+
+	if (EncodeUpdate(&m, data, 128, info)) {
+		warnx("Big problems");
+		return;
 	}
+	m.msg_id = currMessageID++;
 
-	struct timeval tstart;
-	gettimeofday(&tstart, NULL);
-	timeArr[currMessageID%MAX_HASH_SIZE] = tstart;
+	size_t psize;
+	if ((psize = EncodePacket(packet, 64, &m, data)) < 0) {
+		warnx("Big problems");
+		return;
+	}
+
+	writeQuad(packet, psize);
 }
 
 void getVRPNPacket(struct ucart_vrpn_TrackerData *td) {
@@ -681,91 +643,59 @@ static void quad_recv() {
 		onto  the clients, do so.
 	 */
 	
-	int validPacket;
-	unsigned char data[256];
-	metadata_t metadata;
 	static unsigned char respBuf[2048];
 	static size_t respBufLen;
 
-	/**
-	 * Read the response from the control loop
-	 */
-	int respLen = readQuad((char *) respBuf + respBufLen,
-			CMD_MAX_LENGTH);
-	if(respLen <= 0) {
+	struct metadata m;
+	uint8_t data[256];
+	size_t respLen;
+
+	respLen = readQuad((char *) respBuf + respBufLen, 
+			CMD_MAX_LENGTH- respBufLen);
+	if (respLen <= 0) {
 		perror("ERROR reading from quad...\n");
 		return;
 	}
 	respBufLen += respLen;
 
-	if (respBufLen < 8) {
-		/* not long enough yet */
-		printf("too short!!\n");
-		return;
-	}
-
-	// Validate the message is correctly formatted
-	validPacket = parse_packet((unsigned char *) respBuf, data, &metadata);
-	if (validPacket == -1) {
-		warnx("Doesn't have start byte.");
-		/* nuke packet */
+	if (DecodePacket(&m, data, 256, respBuf, respBufLen) < 0) {
+		warnx("Packet format error");
 		respBufLen = 0;
 		return;
 	}
-	
-	/* Get datalen */
-	size_t datalen = metadata.data_len;
-	if (respBufLen < datalen + 8) {
-		/* Packet not yet fully read */
-		return;
-	}
+	memmove(respBuf, respBuf + datalen + 8, respBufLen - (datalen + 8));
+	respBufLen -= PacketSize(&m);
 
-	if (datalen > CMD_MAX_LENGTH - 8) {
-		/* Very invalid packet. Nuke that shit */
-		warnx("data len is over the maximum packet length. Try reducing the data in the packet sent to the groundstation.\n");
-		respBufLen = 0;
-		return;
+	switch (m.msg_type) {
+		case RESPCONTROL_ID:
+			handleRespcontrol;
+			break;
+		case LOG_ID:
+			/* something like this */
+			log_write((char *) data, m.data_len);
+			break;
 	}
+}
 
-	if(validPacket == -2) {
-		fprintf(stderr, "Checksums did not match (Parse Packet)\n");
+static void handleRespcontrol(struct metadata *m, uint8_t * data)
+{
+	struct controller_message cm;
+	if (DecodeRespcontrol(&cm, m, data) < 0) {
+		warnx("Respcontrol error")
 		return;
 	}
 
-	if (validPacket == 0) {
-		/* At least enough data read to check checksum, and it was good!*/
-		char * cmdText = MessageTypes[(int)metadata.msg_type].cmdText;
-
-		/* TODO: Parse data correctly
-		 *  - Switch on msg_type
-		 *     - Parse data appropriately and format into a string
-		 *  - Send append data string to cmdText and send to clients
-		 */
-		float value = getFloat((unsigned char *)respBuf, 7);
-		//printf("Quad : %s, %lf\n", cmdText, value);
-
-		/* 
-		   Assuming the quad sends the correct info.. This hasn't been tested yet due to a lack of
-		   quad software. We can check how to format by the cmdText and pass to every client.
-		   */
-		if(strncmp(cmdText, "log", strlen(cmdText)) == 0) {
-			char log_text[datalen+1];
-			strncpy(log_text, (char *) data, datalen);
-			log_text[datalen] = '\0';
-			printf("log='%s'\n", log_text);
-		}
+	char buffer[128];
 
-		char buffer[1048];
-		sprintf(buffer, "%s %lf\n", cmdText, value);
+	char * message = cmToString(RESPCONTROL_ID, cm.id, cm.value_id);
 
-		for(int fd = 0; fd <= max_fd; ++fd) {
-			if (get_client_index(fd) > -1) {
-				write(fd, buffer, datalen + 8);
-			}
+	size_t len = snprintf(buffer, 128, "%s %f\n", message, cm.value);
+
+	for(int fd = 0; fd <= max_fd; ++fd) {
+		if (get_client_index(fd) > -1) {
+			write(fd, buffer, len);
 		}
 	}
-	memmove(respBuf, respBuf + datalen + 8, respBufLen - (datalen + 8));
-	respBufLen -= datalen + 8;
 }
 
 static int wasDisconnected(int fd) {
diff --git a/groundStation/src/backend/packet.c b/groundStation/src/backend/packet.c
index 50432eab7..2830f5902 100644
--- a/groundStation/src/backend/packet.c
+++ b/groundStation/src/backend/packet.c
@@ -93,3 +93,8 @@ uint8_t PacketChecksum(const uint8_t * packet, size_t packet_size)
 	/* TODO implement */
 	return 42;
 }
+
+size_t PacketSize(const struct metadata *m)
+{
+	return m.data_len + HDR_SIZE + CSUM_SIZE;
+}
\ No newline at end of file
-- 
GitLab