From a8aaabf92a9cdd9f294b3b167eeff1b0bd8b5525 Mon Sep 17 00:00:00 2001
From: Jake Drahos <j@kedrahos.com>
Date: Thu, 2 Feb 2017 01:10:30 -0600
Subject: [PATCH] Added missing files

---
 groundStation/src/backend/communication.c | 103 ------------------
 groundStation/src/backend/update.c        | 121 ++++++++++++++++++++++
 groundStation/src/backend/update.h        |  36 +++++++
 3 files changed, 157 insertions(+), 103 deletions(-)
 create mode 100644 groundStation/src/backend/update.c
 create mode 100644 groundStation/src/backend/update.h

diff --git a/groundStation/src/backend/communication.c b/groundStation/src/backend/communication.c
index 924f7d829..2a6a920e4 100644
--- a/groundStation/src/backend/communication.c
+++ b/groundStation/src/backend/communication.c
@@ -16,111 +16,8 @@ int formatCommand(char *command, unsigned char *formattedCommand) {
 
 	char * cmdText = strtok(cmd, " ");
 
-	metadata_t metadata;
-
-	// ----------------------------------------------
-	if(cmdText != NULL) {
-		for(int type = 0; type < MAX_TYPE_ID; type++)
-		{
-			if(strcmp(cmdText, MessageTypes[type].cmdText) == 0)
-			{
-				printf("Sending\n\ttype: %d, \n\tcommand: %s\n", type, MessageTypes[type].cmdText);
-				metadata.begin_char = (char) BEGIN_CHAR;
-				metadata.msg_type = type;
-				metadata.msg_id = msgNum++;
-				metadata.data_len = 0;
-
-
-				/* TODO: Format data correctly
-				 * - Implement a case for every type
-				 * 	- Format the tokens into data as appropriate for the type,
-				 *   	  based on the quad's callbacks.c.
-				 * - Pass the data and metadata into
-				 *   	  formatPacket
-				 * - Purge cmdDataType from existence
-				 */
-
-				/* Static data buffer */
-				char data[256];
-				switch (type) {
-					// In each case, us strtok(NULL, " ") to tokenize,
-					// format,
-					// and append to data buffer (increase
-					// metadat.data_len appropriately).
-					case DEBUG_ID:
-						break;
-					case PACKETLOG_ID:
-						break;
-					case GETPACKETLOGS_ID:
-						break;
-					case UPDATE_ID:
-						break;
-					case BEGINUPDATE_ID:
-						break;
-					case LOG_ID:
-						break;
-					case RESPONSE_ID:
-						break;
-					case SETCONTROL_ID:
-						break;
-					case GETCONTROL_ID:
-						break;
-					case RESPCONTROL_ID:
-						break;
-					default:
-						break;
-
-				}
-				return formatPacket(&metadata, data, formattedCommand);
-			}
-		}
-	}
-	// Only gets here if the command does not exist
 	return -1;	
 }
-// QUAD & Ground Station
-// Format the log data from log_message
-int formatPacket(metadata_t *metadata, void *data, unsigned char *formattedCommand)
-{
-	//----------------------------------------------------------------------------------------------
-	//	   index||	   0	|	  1	   |	  2		 |	3 & 4 |		 5 & 6		 |	7+	|	end	   |
-	//---------------------------------------------------------------------------------------------|
-	// msg param|| beg char |               msg type       | msg id | data len (bytes) | data | checksum |
-	//-------------------------------------------------------------------------------------------- |
-	//	   bytes||	   1	|	  1	   |	  1		 |	  2	  |		   2		 | var	|	 1	   |
-	//----------------------------------------------------------------------------------------------
-
-	// Begin Char:
-	formattedCommand[0] = metadata->begin_char;
-
-	// Msg type:
-	formattedCommand[1] = metadata->msg_type;
-	formattedCommand[2] = ((metadata->msg_type >> 8) & 0x000000ff);
-
-	//Msg id (msgNum is 2 bytes)
-	formattedCommand[3] = (metadata->msg_id & 0x000000ff);
-	formattedCommand[4] = ((metadata->msg_id >> 8) & 0x000000ff);
-
-	// Data length and data - bytes 5&6 for len, 7+ for data
-	formattedCommand[5] = metadata->data_len & 0x000000ff;
-	formattedCommand[6] = (metadata->data_len >> 8) & 0x000000ff;
-
-	memcpy(&(formattedCommand[7]), data, metadata->data_len);
-
-	// Checksum
-	// receive data and calculate checksum
-	int i;
-	char data_checksum = 0;
-	for(i = 0; i < 7 + metadata->data_len; i++)
-	{
-		data_checksum ^= formattedCommand[i];
-	}
-
-	formattedCommand[7 + metadata->data_len] = data_checksum;
-
-	/* Return data length */
-	return metadata->data_len + 7;
-}
 
 // returns the length of the data in bytes (datalen from packet) and fills data
 // and metadata with the packet information
diff --git a/groundStation/src/backend/update.c b/groundStation/src/backend/update.c
new file mode 100644
index 000000000..db546e05a
--- /dev/null
+++ b/groundStation/src/backend/update.c
@@ -0,0 +1,121 @@
+#include "update.h"
+#include "commands.h"
+#include "bitwise.h"
+
+#include <sys/types.h>
+
+enum UpdateData {
+	ID_1,
+	ID_2,
+	ID_3,
+	ID_4,
+	Y_1,
+	Y_2,
+	Y_3,
+	Y_4,
+	X_1,
+	X_2,
+	X_3,
+	X_4,
+	Z_1,
+	Z_2,
+	Z_3,
+	Z_4,
+	ROLL_1,
+	ROLL_2,
+	ROLL_3,
+	ROLL_4,
+	PITCH_1,
+	PITCH_2,
+	PITCH_3,
+	PITCH_4,
+	YAW_1,
+	YAW_2,
+	YAW_3,
+	YAW_4,
+	UPDATE_SIZE
+};
+
+/* Creates data and metadata for an update packet
+ * Returns data size.
+ */
+ssize_t EncodeUpdate(
+        struct metadata * m,        /* data_len and msg_type will be populated*/
+        uint8_t * data,             /* Output buffer */
+        size_t data_size,           /* Max buffer size */
+        const struct position_update * u)       /* Message to encode */
+{
+	m->msg_type = UPDATE_ID;
+	m->data_len = UPDATE_SIZE;
+
+	if (data_size < UPDATE_SIZE) {
+		return -1;
+	}
+
+	data[ID_1] = IntByte1(u->id);
+	data[ID_2] = IntByte2(u->id);
+	data[ID_3] = IntByte3(u->id);
+	data[ID_4] = IntByte4(u->id);
+
+	data[Y_1] = FloatByte1(u->y);
+	data[Y_2] = FloatByte2(u->y);
+	data[Y_3] = FloatByte3(u->y);
+	data[Y_4] = FloatByte4(u->y);
+
+	data[X_1] = FloatByte1(u->x);
+	data[X_2] = FloatByte2(u->x);
+	data[X_3] = FloatByte3(u->x);
+	data[X_4] = FloatByte4(u->x);
+
+	data[Z_1] = FloatByte1(u->z);
+	data[Z_2] = FloatByte2(u->z);
+	data[Z_3] = FloatByte3(u->z);
+	data[Z_4] = FloatByte4(u->z);
+
+	data[ROLL_1] = FloatByte1(u->roll);
+	data[ROLL_2] = FloatByte2(u->roll);
+	data[ROLL_3] = FloatByte3(u->roll);
+	data[ROLL_4] = FloatByte4(u->roll);
+
+	data[PITCH_1] = FloatByte1(u->pitch);
+	data[PITCH_2] = FloatByte2(u->pitch);
+	data[PITCH_3] = FloatByte3(u->pitch);
+	data[PITCH_4] = FloatByte4(u->pitch);
+
+	data[YAW_1] = FloatByte1(u->yaw);
+	data[YAW_2] = FloatByte2(u->yaw);
+	data[YAW_3] = FloatByte3(u->yaw);
+	data[YAW_4] = FloatByte4(u->yaw);
+
+	return UPDATE_SIZE;
+}
+
+/* Decode a metadata and data to populate an update.
+ * Returns 0 on success, -1 on failure.
+ */
+int DecodeUpdate(
+        struct position_update * u,     /* Decoded controller message */
+        const struct metadata * m,          /* Metadata to aid in decoding */
+        const uint8_t * data)               /* Data to decode */
+{
+	if (m->data_len < UPDATE_SIZE) {
+		return -1;
+	}
+	if (m->msg_type != UPDATE_ID) {
+		return -1;
+	}
+
+	u->id = BytesToInt(data[ID_1], data[ID_2], data[ID_3], data[ID_4]);
+	u->x = BytesToFloat(data[X_1], data[X_2], data[X_3], data[X_4]);
+	u->y = BytesToFloat(data[Y_1], data[Y_2], data[Y_3], data[Y_4]);
+	u->z = BytesToFloat(data[Z_1], data[Z_2], data[Z_3], data[Z_4]);
+
+	u->pitch = BytesToFloat(data[PITCH_1], data[PITCH_2], 
+			data[PITCH_3], data[PITCH_4]);
+	u->roll = BytesToFloat(data[ROLL_1], data[ROLL_2], 
+			data[ROLL_3], data[ROLL_4]);
+	u->yaw = BytesToFloat(data[YAW_1], data[YAW_2], 
+			data[YAW_3], data[YAW_4]);
+
+	return 0;
+}
diff --git a/groundStation/src/backend/update.h b/groundStation/src/backend/update.h
new file mode 100644
index 000000000..783a861ca
--- /dev/null
+++ b/groundStation/src/backend/update.h
@@ -0,0 +1,36 @@
+#ifndef _update_h
+#define _update_h
+
+#include "packet.h"
+
+#include <sys/types.h>
+
+struct position_update {
+	uint32_t id;
+	float x;
+	float y;
+	float z;
+	float pitch;
+	float roll;
+	float yaw;
+};
+
+/* Creates data and metadata for an update packet.
+ * Returns data size.
+ */
+ssize_t EncodeUpdate(
+		struct metadata *m, /* Out */
+		uint8_t *data,      /* Out */
+		size_t data_size,   /* Data buffer max size */
+		const struct position_update *u); /* In */
+
+/* Decode a metadata and data to populate an update
+ * Returns 0 on success, -1 on failure
+ */
+int DecodeUpdate(
+		struct position_update *u, /* Out */
+		const struct metadata *m,      /* In */
+		const uint8_t * data);         /* In */
+
+
+#endif
-- 
GitLab