From 2cffb0a4019271a184dae82d3ee04b1e4b6592c2 Mon Sep 17 00:00:00 2001
From: Brendan Bartels <bbartels@iastate.edu>
Date: Sat, 22 Apr 2017 00:38:16 -0500
Subject: [PATCH] wip: more changes

---
 quad/src/quad_app/communication.c             | 61 ++++++++++---------
 quad/src/quad_app/hw_iface.h                  | 13 ++--
 quad/src/quad_app/log_data.c                  | 12 ++--
 quad/src/quad_app/log_data.h                  |  2 +-
 quad/src/quad_app/quad_app.c                  |  6 +-
 .../real_quad/src/hw_impl_zybo.c              | 30 +++------
 .../real_quad/src/hw_impl_zybo_i2c.c          | 16 ++---
 quad/xsdk_workspace/real_quad/src/main.c      | 17 ++++++
 8 files changed, 79 insertions(+), 78 deletions(-)

diff --git a/quad/src/quad_app/communication.c b/quad/src/quad_app/communication.c
index aa7561a20..210ae1c6b 100644
--- a/quad/src/quad_app/communication.c
+++ b/quad/src/quad_app/communication.c
@@ -96,7 +96,7 @@ int process_packet(modular_structs_t *structs) {
 
 void process_received(modular_structs_t *structs) {
   // Parse as many packets as possible
-  struct UARTDriver *uart = &structs->hardware_struct.uart;
+  struct UARTDriver *uart = &structs->hardware_struct.comm->uart;
   while (!try_receive_packet(uart)) {
     process_packet(structs);
   }
@@ -111,33 +111,34 @@ int send_data(struct UARTDriver *uart, u16 type_id, u16 msg_id, u8* data, size_t
 	//	   bytes||	   1	|	       2             |   2    |        2         | var	|	 1	   |
 	//----------------------------------------------------------------------------------------------
 
-	unsigned char formattedHeader[PACKET_HEADER_SIZE];
-
-	// Begin Char:
-	formattedHeader[0] = BEGIN_CHAR;
-	// Msg type 2 bytes:
-	formattedHeader[1] = type_id & 0x000000ff;
-	formattedHeader[2] = (type_id >> 8) & 0x000000ff;
-	// Msg id 2 bytes
-	formattedHeader[3] = msg_id & 0x000000ff;
-	formattedHeader[4] = (msg_id >> 8) & 0x000000ff;
-	// Data length and data - bytes 5&6 for len, 7+ for data
-	formattedHeader[5] = size & 0x000000ff;
-	formattedHeader[6] = (size >> 8) & 0x000000ff;
-
-	// Compute checksum
-	unsigned char packet_checksum = 0;
-	int i;
-	for(i = 0; i < PACKET_HEADER_SIZE; i++) {
-		packet_checksum ^= formattedHeader[i];
-		uart->write(uart, formattedHeader[i]);
-	}
-	for (i = 0; i < size; i++) {
-		packet_checksum ^= data[i];
-		uart->write(uart, data[i]);
-	}
-
-	uart->write(uart, packet_checksum);
-
-	return 0;
+  
+  unsigned char formattedHeader[PACKET_HEADER_SIZE];
+
+  // Begin Char:
+  formattedHeader[0] = BEGIN_CHAR;
+  // Msg type 2 bytes:
+  formattedHeader[1] = type_id & 0x000000ff;
+  formattedHeader[2] = (type_id >> 8) & 0x000000ff;
+  // Msg id 2 bytes
+  formattedHeader[3] = msg_id & 0x000000ff;
+  formattedHeader[4] = (msg_id >> 8) & 0x000000ff;
+  // Data length and data - bytes 5&6 for len, 7+ for data
+  formattedHeader[5] = size & 0x000000ff;
+  formattedHeader[6] = (size >> 8) & 0x000000ff;
+
+  // Compute checksum
+  unsigned char packet_checksum = 0;
+  int i;
+  for(i = 0; i < PACKET_HEADER_SIZE; i++) {
+    packet_checksum ^= formattedHeader[i];
+    uart->write(uart, formattedHeader[i]);
+  }
+  for (i = 0; i < size; i++) {
+    packet_checksum ^= data[i];
+    uart->write(uart, data[i]);
+  }
+
+  uart->write(uart, packet_checksum);
+
+  return 0;
 }
diff --git a/quad/src/quad_app/hw_iface.h b/quad/src/quad_app/hw_iface.h
index 38dbe6dad..66eac0541 100644
--- a/quad/src/quad_app/hw_iface.h
+++ b/quad/src/quad_app/hw_iface.h
@@ -37,7 +37,6 @@ struct MotorDriver {
 
 struct UARTDriver {
   void *state;
-  int devId;
   int (*reset)(struct UARTDriver *self);
   int (*write)(struct UARTDriver *self, unsigned char c);
   int (*read)(struct UARTDriver *self, unsigned char *c);
@@ -65,7 +64,6 @@ struct SystemDriver {
 
 struct I2CDriver {
   void *state;
-  int busId;
   int (*reset)(struct I2CDriver *self);
   int (*write)(struct I2CDriver *self,
                unsigned short device_addr,
@@ -96,16 +94,13 @@ struct OpticalFlowDriver {
 };
 
 struct GPSDriver {
-	struct UARTDriver * uart;
-	int (*reset)(struct GPSDriver *self, struct gps *gps);
-	int (*read)(struct GPSDriver *self, struct gps *gps);
+  struct UARTDriver *uart;
+  int (*reset)(struct GPSDriver *self, struct gps *gps);
+  int (*read)(struct GPSDriver *self, struct gps *gps);
 };
 
 struct CommDriver {
-	struct UARTDriver * uart;
-	int (*reset)(struct CommDriver *self);
-	int (*write)(struct CommDriver *self, unsigned char c);
-	int (*read)(struct CommDriver *self, unsigned char *c);
+  struct UARTDriver *uart;
 };
 
 #endif
diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c
index cd724d2b2..2a29ddb8f 100644
--- a/quad/src/quad_app/log_data.c
+++ b/quad/src/quad_app/log_data.c
@@ -186,7 +186,7 @@ int log_data(log_t* log_struct, parameter_t* ps)
  * TODO: This should probably be transmitting in binary instead of ascii
  */
 
-void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors){
+void printLogging(struct CommDriver *comm, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors){
 	if (arrayIndex == 0) {
 		// Don't send any logs if nothing was logged
 		return;
@@ -197,7 +197,7 @@ void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* p
 	// Let user know that allocation failed
 	if (arraySize != LOG_STARTING_SIZE) {
 		safe_sprintf_cat(&buf, "Failed to allocate enough log memory\n");
-		send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
+		send_data(comm->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
 		return;
 	}
 
@@ -240,7 +240,7 @@ void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* p
 	safe_sprintf_cat(&buf, "\n");
 
 	// Send header names
-	send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
+	send_data(comm->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
 
 	// Send units header
 	buf.size = 0;
@@ -248,17 +248,17 @@ void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* p
 	safe_sprintf_cat(&buf, units_output.str);
 	safe_sprintf_cat(&buf, units_param.str);
 	safe_sprintf_cat(&buf, "\n");
-	send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
+	send_data(comm->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
 
 	/*************************/
 	/* print & send log data */
 	for(i = 0; i < arrayIndex; i++){
 		format_log(i, log_struct, &buf);
-		send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
+		send_data(comm->uart, LOG_ID, 0, (u8*)buf.str, buf.size);
 	}
 
 	// Empty message of type LOG_END to indicate end of log
-	send_data(&hardware_struct->uart, LOG_END_ID, 0, (u8*)buf.str, 0);
+	send_data(comm->uart, LOG_END_ID, 0, (u8*)buf.str, 0);
 }
 
 void resetLogging() {
diff --git a/quad/src/quad_app/log_data.h b/quad/src/quad_app/log_data.h
index c3df9ec19..9c4b8b7d9 100644
--- a/quad/src/quad_app/log_data.h
+++ b/quad/src/quad_app/log_data.h
@@ -47,7 +47,7 @@ void addParamToLog(log_t* log_struct, int controller_id, int param_id, char* uni
  /**
   * Prints all the log information.
   */
- void printLogging(hardware_t *hardware_struct, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors);
+ void printLogging(struct CommDriver *comm, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors);
 
  /**
   * Resets and clears logged data
diff --git a/quad/src/quad_app/quad_app.c b/quad/src/quad_app/quad_app.c
index b6bde4fd0..106a3e038 100644
--- a/quad/src/quad_app/quad_app.c
+++ b/quad/src/quad_app/quad_app.c
@@ -103,7 +103,7 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct))
 
 		if (this_kill_condition == 1 && last_kill_condition == 0) {
 		  // Just disabled
-		  printLogging(&structs.hardware_struct, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct);
+		  printLogging(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct);
 		  resetLogging();
 		  MIO7_led_off();
 		}
@@ -116,8 +116,8 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct))
 		if (structs.raw_sensor_struct.gam.error.consErrorCount > 10) {
 			kill_motors(&(structs.hardware_struct.motors));
 			char err_msg[] = "More than 10 IMU errors";
-			send_data(&structs.hardware_struct.uart, DEBUG_ID, 0, (u8*)err_msg, sizeof(err_msg));
-			printLogging(&structs.hardware_struct, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct);
+			send_data(structs.hardware_struct.comm->uart, DEBUG_ID, 0, (u8*)err_msg, sizeof(err_msg));
+			printLogging(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct);
 			break;
 		}
 	}
diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
index 396c07c46..412478dcd 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo.c
@@ -2,7 +2,6 @@
 
 struct UARTDriver create_zybo_uart(int devId) {
   struct UARTDriver uart;
-  uart.devId = devId;
   uart.state = NULL;
   uart.reset = zybo_uart_reset;
   uart.write = zybo_uart_write;
@@ -11,31 +10,19 @@ struct UARTDriver create_zybo_uart(int devId) {
 }
 
 struct GPSDriver create_zybo_gps(struct UARTDriver *uart) {
-	struct GPSDriver gps;
-	gps.uart = uart;
-	gps.reset = zybo_gps_reset;
-	gps.read = zybo_gps_read;
-	return gps;
+  struct GPSDriver gps;
+  gps.uart = uart;
+  gps.reset = zybo_gps_reset;
+  gps.read = zybo_gps_read;
+  return gps;
 }
 
 struct CommDriver create_zybo_comm(struct UARTDriver *uart) {
-	struct CommDriver comm;
-	comm.uart = uart;
-	comm.reset = zybo_comm_reset;
-	comm.read = zybo_comm_read;
-	return comm;
+  struct CommDriver comm;
+  comm.uart = uart;
+  return comm;
 }
 
-/*
- * struct LidarDriver create_zybo_lidar(struct I2CDriver *i2c) {
-  struct LidarDriver lidar;
-  lidar.i2c = i2c;
-  lidar.reset = zybo_lidar_reset;
-  lidar.read = zybo_lidar_read;
-  return lidar;
-}
- */
-
 struct MotorDriver create_zybo_motors() {
   struct MotorDriver motors;
   motors.state = NULL;
@@ -54,7 +41,6 @@ struct RCReceiverDriver create_zybo_rc_receiver() {
 
 struct I2CDriver create_zybo_i2c(int busId) {
   struct I2CDriver i2c;
-  i2c.busId = busId;
   i2c.state = NULL;
   i2c.reset = zybo_i2c_reset;
   i2c.write = zybo_i2c_write;
diff --git a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_i2c.c b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_i2c.c
index 27f85b241..fd436bf80 100644
--- a/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_i2c.c
+++ b/quad/xsdk_workspace/real_quad/src/hw_impl_zybo_i2c.c
@@ -42,16 +42,18 @@ int XIicPs_MasterRecvPolled_ours(XIicPs *InstancePtr, u8 *MsgPtr,
 				int ByteCount, u16 SlaveAddr);
 int XIicPs_SetupMaster(XIicPs *InstancePtr, int Role);
 
-int zybo_i2c_reset(struct I2CDriver *self) {
-  int i2cID = self->busId;
-  if(i2cID > 1) {
-	  return -1;
-  }
+struct ZyboI2CState {
+  XIcPs *inst;
+  int busId;
+};
 
+int zybo_i2c_reset(struct I2CDriver *self) {
   if (self->state == NULL) {
-    self->state = malloc(sizeof(XIicPs));
+    self->state = malloc(sizeof(struct ZyboI2CState));
+    self->state->inst = malloc(sizeof(XIcPs));
   }
-  XIicPs *inst = self->state;
+  int i2cID = self->state.busId;
+  XIicPs *inst = self->state->inst;
 
   //Make sure CPU_1x clk is enabled fostatusr I2C controller
   u16 *aper_ctrl = (u16 *) IO_CLK_CONTROL_REG_ADDR;
diff --git a/quad/xsdk_workspace/real_quad/src/main.c b/quad/xsdk_workspace/real_quad/src/main.c
index d192b9c6c..599a602d3 100644
--- a/quad/xsdk_workspace/real_quad/src/main.c
+++ b/quad/xsdk_workspace/real_quad/src/main.c
@@ -6,11 +6,28 @@
 
 #define RUN_TESTS
 
+/**
+ * Create the hardware drivers, and place them on the hardware struct.
+ *
+ * Things to keep in mind:
+ * - The CommDriver requires a UART. Hence, make the a UARTDriver first
+ *   and then give that instance to the CommDriver.
+ * - Same for GPSDriver, except it needs a different hardware device.
+ * - The I2C devices (IMU, LIDAR, Optical Flow), need a I2C bus. Hence
+ *   make a I2CDriver first, then give the appropariate instance the
+ *   device drivers.
+ *   - Currently, we are putting the Lidar on its own bus. Apparently,
+ *     when looking at an OScope with the Lidar on a bus with other
+ *     devices, it does not look right. The SCL line would never
+ *     go all the way back down to 0 volts
+ */
 int setup_hardware(hardware_t *hardware) {
   hardware->rc_receiver = create_zybo_rc_receiver();
   hardware->motors = create_zybo_motors();
   hardware->uart_0 = create_zybo_uart(0);
   hardware->uart_1 = create_zybo_uart(1);
+  hardware->comm = create_zybo_comm(&hardware->uart_0);
+  hardware->gps = create_zybo_gps(&hardware->uart_1);
   hardware->global_timer = create_zybo_global_timer();
   hardware->axi_timer = create_zybo_axi_timer();
   hardware->mio7_led = create_zybo_mio7_led();
-- 
GitLab