diff --git a/quad/src/commands/commands.c b/quad/src/commands/commands.c index 9942b62c9a1ac5dc783f5731bde8ec670546f733..6f99dd9f6a229dc42dbcbd058209017f2caec5ed 100644 --- a/quad/src/commands/commands.c +++ b/quad/src/commands/commands.c @@ -76,6 +76,8 @@ command_cb cb_addnode __attribute__((weak, alias("cb_default"))); command_cb cb_respaddnode __attribute__((weak, alias("cb_default"))); command_cb cb_overrideoutput __attribute__((weak, alias("cb_default"))); +command_cb cb_sendrtdata __attribute__((weak, alias("cb_default"))); + /* * Command structure. @@ -269,6 +271,15 @@ struct MessageType MessageTypes[MAX_TYPE_ID] = stringType, // Function pointer &cb_overrideoutput + }, + // SENDRTDATA + { + // Command text + "sendrtdata", + // Type of the command data + stringType, + // Function pointer + &cb_sendrtdata } diff --git a/quad/src/quad_app/callbacks.c b/quad/src/quad_app/callbacks.c index 13d3a72e10f2310943cd86ec222378f5feb7205c..005485bdb300fc47e43440d2b96fd18cdc4b32fc 100644 --- a/quad/src/quad_app/callbacks.c +++ b/quad/src/quad_app/callbacks.c @@ -411,6 +411,36 @@ int cb_addnode(struct modular_structs *structs, struct metadata *meta, unsigned } int cb_sendrtdata(struct modular_structs *structs, struct metadata *meta, unsigned char *data, unsigned short length) { - + //Check to ensure sufficient length for rt_data config packet + if (length < 4) + return -1; + int size = 0; + structs->flags.lidarflags.quadHeight = read_bit(configData, 31); size += read_bit(configData, 31); + /*BEGIN DOUBLE-TYPE FLAGS. If these are enabled, actual size of data sent is 2*read_bit due to + * length of data. This needs to be compensated for in methods where total length of payload packet + * needs to be known ahead of time. */ + structs->flags.optflowflags.x_flow = read_bit(configData, 30); size += read_bit(configData, 30); + structs->flags.optflowflags.y_flow = read_bit(configData, 29); size += read_bit(configData, 29); + structs->flags.optflowflags.x_filter = read_bit(configData, 28); size += read_bit(configData, 28); + structs->flags.optflowflags.y_filter = read_bit(configData, 27); size += read_bit(configData, 27); + structs->flags.optflowflags.x_velocity = read_bit(configData, 26); size += read_bit(configData, 26); + structs->flags.optflowflags.y_velocity = read_bit(configData, 25); size += read_bit(configData, 25); + //END DOUBLE TYPE FLAGS. + structs->flags.imuflags.gyro_x = read_bit(configData, 24); size += read_bit(configData, 24); + structs->flags.imuflags.gyro_y = read_bit(configData, 23); size += read_bit(configData, 23); + structs->flags.imuflags.gyro_z = read_bit(configData, 22); size += read_bit(configData, 22); + structs->flags.imuflags.acc_x = read_bit(configData, 21); size += read_bit(configData, 21); + structs->flags.imuflags.acc_y = read_bit(configData, 20); size += read_bit(configData, 20); + structs->flags.imuflags.acc_z = read_bit(configData, 19); size += read_bit(configData, 19); + structs->flags.imuflags.mag_x = read_bit(configData, 18); size += read_bit(configData, 18); + structs->flags.imuflags.mag_y = read_bit(configData, 17); size += read_bit(configData, 17); + structs->flags.imuflags.mag_z = read_bit(configData, 16); size += read_bit(configData, 16); + structs->flags.errorflags.lidar = read_bit(configData, 15); size += read_bit(configData, 15); + structs->flags.errorflags.consec_lidar = read_bit(configData, 14); size += read_bit(configData, 14); + structs->flags.errorflags.optFlow = read_bit(configData, 13); size += read_bit(configData, 13); + structs->flags.errorflags.consec_optFlow = read_bit(configData, 12); size += read_bit(configData, 12); + structs->flags.errorflags.imu = read_bit(configData, 11); size += read_bit(configData, 11); + structs->flags.errorflags.consec_imu = read_bit(configData, 10); size += read_bit(configData, 10); + structs->flags.flag_count = size; return 0; } diff --git a/quad/src/quad_app/debug_rt.c b/quad/src/quad_app/debug_rt.c index 4ccee0f6de67e1ccf794fe404963cf467a4d4f28..147a65e9999c4a26e01a927f32ead6701cba7c6c 100644 --- a/quad/src/quad_app/debug_rt.c +++ b/quad/src/quad_app/debug_rt.c @@ -5,27 +5,7 @@ #include "debug_rt.h" -/* - Initially sets it so that all debug values are zero -*/ -void initializeFlags(SensorRTFlags_t * flags) { - flags = calloc(1, sizeof(SensorRTFlags_t)); - flags -> imuflags = calloc(1, sizeof(IMUFlags_t)); - flags -> optflowflags = calloc(1, sizeof(OptFlowFlags_t)); - flags -> lidarflags = calloc(1, sizeof(lidarFlags_t)); - flags -> errorflags = calloc(1, sizeof(SensorErrorFlags_t)); - flags -> flag_count = 0; -} - -void freeFlags(SensorRTFlags_t * flags){ - free(flags -> imuflags); - free(flags -> optflowflags); - free(flags -> lidarflags); - free(flags -> errorflags); - free(flags -> flag_count); - free(flags); -} /* Helper to return single bit of u32 data. This returns the "position"'th bit of the given u32, @@ -45,7 +25,7 @@ u32 read_bit(u32 data, int position){ will be sent back during each control loop. Due to the limited bandwidth capacity of the UART, it is undesirable to have a large amount of these flags enabled when sending data. Returns: - int size: Total size of payload assuming all data enabled by flags are transmitted. + int size: Total number of data types desired to be displayed via flight data tool. */ int process_configuration_packet(u32 configData, SensorRTFlags_t * flags) { diff --git a/quad/src/quad_app/initialize_components.c b/quad/src/quad_app/initialize_components.c index edccbbbf88d06f4d48bc7bd24053eeb8d8dd43dc..232125ac34aaaac5497059ee9b5004f755254dd6 100644 --- a/quad/src/quad_app/initialize_components.c +++ b/quad/src/quad_app/initialize_components.c @@ -105,6 +105,7 @@ int init_structs(modular_structs_t *structs) { } sensor_processing_init(&structs->sensor_struct); + initializeFlags(&structs->flags); return 0; } diff --git a/quad/src/quad_app/log_data.h b/quad/src/quad_app/log_data.h index e7f29061cf97cf8fc5f2138dbed3ff542194f364..c4cfd903ec9a87571d2bde6483deafb6c17c2ded 100644 --- a/quad/src/quad_app/log_data.h +++ b/quad/src/quad_app/log_data.h @@ -45,9 +45,19 @@ void addParamToLog(log_t* log_struct, int controller_id, int param_id, char* uni void updateLog(log_t log_struct); /** - * Prints the latest log entry + * Prints the latest log entry. Used for Real-Time Data Transfer */ void RTprintLogging(struct CommDriver *comm, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors, SensorRTFlags_t * flags); +/** + * Prints the beginning header for a flight data file. Used for Real-Time Data Transfer + * */ +void RTprintheader(struct CommDriver *comm, log_t* log_struct, parameter_t* ps, raw_sensor_t* raw_sensors, SensorRTFlags_t * flags) + +/** + * Sends the required ending message to close a log file following the end of a flight. Used for + * Real-Time Data Transfer + * */ +void RTprintend() /** * Prints all the log information. diff --git a/quad/src/quad_app/quad_app.c b/quad/src/quad_app/quad_app.c index 636c683a4a4a2f68f4a7b6c03cc86e7f66696b4b..d9174003ae74df44b06525062481ae997ffad406 100644 --- a/quad/src/quad_app/quad_app.c +++ b/quad/src/quad_app/quad_app.c @@ -24,12 +24,6 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct)) // Structures to be used throughout modular_structs_t structs = { }; - //pointer to flags struct that indicate which rt data to send - SensorRTFlags_t * flags; - - // initialize internal flag data for RT data transfer - initializeFlags(&flags); - // Wire up hardware setup_hardware(&structs.hardware_struct); @@ -105,11 +99,11 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct)) if (init_cond == 0x0) { init_cond = 0x1; - initialize_logging(&(structs.log_struct), &(structs.parameter_struct), &flags); - RTprintheader(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct, &flags); + initialize_logging(&(structs.log_struct), &(structs.parameter_struct), &(structs.flags_struct)); + RTprintheader(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &(structs.raw_sensor_struct), &(structs.flags_struct)); } - log_data(&(structs.log_struct), &(structs.parameter_struct)); - RTprintLogging(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct, &flags); + log_data(&(structs.log_struct), &(structs.parameter_struct), &(structs.flags_struct)); + RTprintLogging(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct, &(structs.flags_struct)); if(structs.user_defined_struct.flight_mode == AUTO_FLIGHT_MODE) { static int loop_counter = 0; @@ -148,7 +142,10 @@ int quad_main(int (*setup_hardware)(hardware_t *hardware_struct)) kill_motors(&(structs.hardware_struct.motors)); char err_msg[] = "More than 10 IMU errors"; 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); + //Send end of log message. Uncomment printLogging below for post-flight log. + RTprintend(); + resetLogging(); + //printLogging(&structs.hardware_struct.comm, &(structs.log_struct), &(structs.parameter_struct), &structs.raw_sensor_struct); break; } } diff --git a/quad/src/quad_app/type_def.h b/quad/src/quad_app/type_def.h index d8ad249f27145c710e25398f4f428e751fdca753..8eb2565d3cba3410b7e2eebadd41f0be89d59765 100644 --- a/quad/src/quad_app/type_def.h +++ b/quad/src/quad_app/type_def.h @@ -492,6 +492,7 @@ typedef struct modular_structs { raw_actuator_t raw_actuator_struct; actuator_command_t actuator_command_struct; hardware_t hardware_struct; + SensorRTFlags_t flags_struct; } modular_structs_t; /* BEGIN FLAG STRUCTS CONTAINING ENABLED/DISABLED RT DATA TRANSFERS */ diff --git a/quad/src/quad_app/util.h b/quad/src/quad_app/util.h index d675428293bc3108673bf953f78e089f8877caea..f3e87401478dac45cef99f6373e24a00dddbc544 100644 --- a/quad/src/quad_app/util.h +++ b/quad/src/quad_app/util.h @@ -24,5 +24,6 @@ int16_t build_short(u8* buff); void pack_short(int16_t val, u8* buff); void pack_float(float val, u8* buff); +u32 read_bit(u32 data, int position); #endif //_UTIL_H