diff --git a/quad/src/quad_app/log_data.c b/quad/src/quad_app/log_data.c index 7158c14fac93fbb57b551fc6e88eddefb2e6ce1b..cd724d2b2ba0681c3b36ba53932b0c8c78a26af5 100644 --- a/quad/src/quad_app/log_data.c +++ b/quad/src/quad_app/log_data.c @@ -126,6 +126,7 @@ void initialize_logging(log_t* log_struct, parameter_t* ps) { addParamToLog(log_struct, ps->x_set, CONST_VAL, m); addParamToLog(log_struct, ps->y_set, CONST_VAL, m); addParamToLog(log_struct, ps->alt_set, CONST_VAL, m); + addParamToLog(log_struct, ps->yaw_set, CONST_VAL, m); addParamToLog(log_struct, ps->lidar, CONST_VAL, m); addParamToLog(log_struct, ps->vrpn_x, CONST_VAL, m); addParamToLog(log_struct, ps->vrpn_y, CONST_VAL, m); @@ -185,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){ +void printLogging(hardware_t *hardware_struct, 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; @@ -196,14 +197,16 @@ 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, buf.str, buf.size); + send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size); return; } int i; // Comment header safe_sprintf_cat(&buf, "# MicroCART On-board Quad Log\n# Sample size: %d\n", arrayIndex); - safe_sprintf_cat(&buf, "# IIC failures: I'm not implemented yet\n"); + safe_sprintf_cat(&buf, "# IMU IIC failures: %d\n", raw_sensors->gam.error.consErrorCount); + safe_sprintf_cat(&buf, "# LiDAR IIC failures: %d\n", raw_sensors->lidar.error.consErrorCount); + safe_sprintf_cat(&buf, "# Optical Flow IIC failures: %d\n", raw_sensors->optical_flow.error.consErrorCount); // List Pid Constants for (i = 0; i < ps->graph->n_nodes; ++i) { @@ -237,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, buf.str, buf.size); + send_data(&hardware_struct->uart, LOG_ID, 0, (u8*)buf.str, buf.size); // Send units header buf.size = 0; @@ -245,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, buf.str, buf.size); + send_data(&hardware_struct->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, buf.str, buf.size); + send_data(&hardware_struct->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, buf.str, 0); + send_data(&hardware_struct->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 becc2c2e188a819e1e9735cc625e93dd514f52c7..c3df9ec19c0e9b6cc41517bc4990b22db44add5c 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); + void printLogging(hardware_t *hardware_struct, 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 587cd930e24772244ed38ee9752a73e158dc0942..b6bde4fd02ea9ca30556da45e8a6e27fa59cfcb2 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)); + printLogging(&structs.hardware_struct, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct); resetLogging(); MIO7_led_off(); } @@ -115,7 +115,9 @@ 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)); - printLogging(&structs.hardware_struct, &(structs.log_struct), &(structs.parameter_struct)); + 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); break; } } diff --git a/quad/src/quad_app/sensor.c b/quad/src/quad_app/sensor.c index 6ae875ce931c2ac931de5c18f427acdf85d0fa1a..6fcf5277a2fdbc81d5e8fa8eda1b2ee0b0c1fdb4 100644 --- a/quad/src/quad_app/sensor.c +++ b/quad/src/quad_app/sensor.c @@ -22,9 +22,9 @@ int sensor_init(hardware_t *hardware_struct, raw_sensor_t * raw_sensor_struct, s if (imu->reset(imu, &raw_sensor_struct->gam)) { return -1; } - if (lidar->reset(lidar, &raw_sensor_struct->lidar)) { - return -1; - } + //if (lidar->reset(lidar, &raw_sensor_struct->lidar)) { + // return -1; + //} if (of->reset(of, &raw_sensor_struct->optical_flow)) { return -1; } @@ -49,11 +49,11 @@ int get_sensors(hardware_t *hardware_struct, log_t* log_struct, user_input_t* us status = imu->read(imu, &raw_sensor_struct->gam); updateError(&(raw_sensor_struct->gam.error), status); - status = lidar->read(lidar, &lidar_val); - updateError(&(raw_sensor_struct->lidar.error), status); - if (status == 0) { - raw_sensor_struct->lidar_distance_m = lidar_val.distance_m; - } + //status = lidar->read(lidar, &lidar_val); + //updateError(&(raw_sensor_struct->lidar.error), status); + //if (status == 0) { + // raw_sensor_struct->lidar_distance_m = lidar_val.distance_m; + //} status = of->read(of, &raw_sensor_struct->optical_flow); updateError(&(raw_sensor_struct->optical_flow.error), status); diff --git a/quad/src/quad_app/sensor_processing.c b/quad/src/quad_app/sensor_processing.c index d6e7fa082f846df662ea564bf90cbc84b0f0560a..43dd611461f69efa4a3c182b349b935a8e24b4cd 100644 --- a/quad/src/quad_app/sensor_processing.c +++ b/quad/src/quad_app/sensor_processing.c @@ -109,8 +109,10 @@ int sensor_processing(log_t* log_struct, user_input_t *user_input_struct, raw_se // Simply copy optical flow data sensor_struct->optical_flow = raw_sensor_struct->optical_flow; - sensor_struct->optical_flow.xVel = biquad_execute(&sensor_struct->flow_x_filt, -sensor_struct->optical_flow.xVel); - sensor_struct->optical_flow.yVel = biquad_execute(&sensor_struct->flow_y_filt, -sensor_struct->optical_flow.yVel); + //sensor_struct->optical_flow.xVel = biquad_execute(&sensor_struct->flow_x_filt, -sensor_struct->optical_flow.xVel); + //sensor_struct->optical_flow.yVel = biquad_execute(&sensor_struct->flow_y_filt, -sensor_struct->optical_flow.yVel); + sensor_struct->optical_flow.xVel = -sensor_struct->optical_flow.xVel; + sensor_struct->optical_flow.yVel = -sensor_struct->optical_flow.yVel; return 0; } 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 e2e3568e0b581caed47c00accac275d552433fa6..cd55299cafea88ea7adb51e55053ba2ccc1189ca 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 @@ -1,7 +1,5 @@ #include "hw_impl_zybo.h" #include "xiicps.h" -#include "timer.h" - // System configuration registers // (Please see Appendix B: System Level Control Registers in the Zybo TRM) #define IIC_SYSTEM_CONTROLLER_RESET_REG_ADDR (0xF8000224) @@ -225,6 +223,13 @@ int XIicPs_MasterSendPolled_ours(XIicPs *InstancePtr, u8 *MsgPtr, return XST_SUCCESS; } +static XTime get_time() { + XTime time; + XTime_GetTime(&time); + u64 us = (u64)time * (1000000 / COUNTS_PER_SECOND); // (ticks)(1000000us/s)(s/ticks) + return us; +} + /*****************************************************************************/ /** * This function initiates a polled mode receive in master mode. @@ -303,7 +308,7 @@ int XIicPs_MasterRecvPolled_ours(XIicPs *InstancePtr, u8 *MsgPtr, // (1000000 * 9 / iic_freq) is the number of microseconds required to send 1 byte of data // Using 5 times as an upper bound u32 max_usec_per_byte = 5 * 1000000 * 9 / iic_freq; - u64 start_time = timer_get_count(); + u64 start_time = get_time(); /* <--- End hack ---> */ /* @@ -313,7 +318,7 @@ int XIicPs_MasterRecvPolled_ours(XIicPs *InstancePtr, u8 *MsgPtr, while ((InstancePtr->RecvByteCount > 0) && ((IntrStatusReg & Intrs) == 0) && !(IntrStatusReg & XIICPS_IXR_COMP_MASK)) { /* <--- MicroCART additions (iic watchdog timer hack) ---> */ - u64 usec_passed = timer_get_count() - start_time; + u64 usec_passed = get_time() - start_time; // Add 1 so it has a chance to read if (usec_passed > max_usec_per_byte * (1 + ByteCount - InstancePtr->RecvByteCount)) { return IIC_RX_TIMEOUT_FAILURE; diff --git a/quad/xsdk_workspace/real_quad/src/main.c b/quad/xsdk_workspace/real_quad/src/main.c index 8ab3861beb7dd193fdc44845092854e3f19de0d8..feb4bbffa8b5d35f7aaadaaec4c850e0b00deded 100644 --- a/quad/xsdk_workspace/real_quad/src/main.c +++ b/quad/xsdk_workspace/real_quad/src/main.c @@ -29,9 +29,9 @@ int main() #ifdef RUN_TESTS //test_zybo_mio7_led_and_system(); //test_zybo_i2c(); - test_zybo_i2c_imu(); + //test_zybo_i2c_imu(); //test_zybo_i2c_px4flow(); - //test_zybo_i2c_all(); + test_zybo_i2c_all(); //test_zybo_rc_receiver(); //test_zybo_motors(); //test_zybo_uart();