123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- #include "Sub.h"
- #if LOGGING_ENABLED == ENABLED
- // Code to Write and Read packets from AP_Logger log memory
- // Code to interact with the user to dump or erase logs
- struct PACKED log_Control_Tuning {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- float throttle_in;
- float angle_boost;
- float throttle_out;
- float throttle_hover;
- float desired_alt;
- float inav_alt;
- float baro_alt;
- int16_t desired_rangefinder_alt;
- int16_t rangefinder_alt;
- float terr_alt;
- int16_t target_climb_rate;
- int16_t climb_rate;
- };
- // Write a control tuning packet
- void Sub::Log_Write_Control_Tuning()
- {
- // get terrain altitude
- float terr_alt = 0.0f;
- #if AP_TERRAIN_AVAILABLE && AC_TERRAIN
- terrain.height_above_terrain(terr_alt, true);
- #endif
- struct log_Control_Tuning pkt = {
- LOG_PACKET_HEADER_INIT(LOG_CONTROL_TUNING_MSG),
- time_us : AP_HAL::micros64(),
- throttle_in : attitude_control.get_throttle_in(),
- angle_boost : attitude_control.angle_boost(),
- throttle_out : motors.get_throttle(),
- throttle_hover : motors.get_throttle_hover(),
- desired_alt : pos_control.get_alt_target() / 100.0f,
- inav_alt : inertial_nav.get_altitude() / 100.0f,
- baro_alt : barometer.get_altitude(),
- desired_rangefinder_alt : (int16_t)target_rangefinder_alt,
- rangefinder_alt : rangefinder_state.alt_cm,
- terr_alt : terr_alt,
- target_climb_rate : (int16_t)pos_control.get_vel_target_z(),
- climb_rate : climb_rate
- };
- logger.WriteBlock(&pkt, sizeof(pkt));
- }
- // Write an attitude packet
- void Sub::Log_Write_Attitude()
- {
- Vector3f targets = attitude_control.get_att_target_euler_cd();
- targets.z = wrap_360_cd(targets.z);
- logger.Write_Attitude(ahrs, targets);
- AP::ahrs_navekf().Log_Write();
- logger.Write_AHRS2(ahrs);
- #if CONFIG_HAL_BOARD == HAL_BOARD_SITL
- sitl.Log_Write_SIMSTATE();
- #endif
- logger.Write_POS(ahrs);
- }
- struct PACKED log_MotBatt {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- float lift_max;
- float bat_volt;
- float bat_res;
- float th_limit;
- };
- // Write an rate packet
- void Sub::Log_Write_MotBatt()
- {
- struct log_MotBatt pkt_mot = {
- LOG_PACKET_HEADER_INIT(LOG_MOTBATT_MSG),
- time_us : AP_HAL::micros64(),
- lift_max : (float)(motors.get_lift_max()),
- bat_volt : (float)(motors.get_batt_voltage_filt()),
- bat_res : (float)(battery.get_resistance()),
- th_limit : (float)(motors.get_throttle_limit())
- };
- logger.WriteBlock(&pkt_mot, sizeof(pkt_mot));
- }
- // Wrote an event packet
- void Sub::Log_Write_Event(Log_Event id)
- {
- logger.Write_Event(id);
- }
- struct PACKED log_Data_Int16t {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t id;
- int16_t data_value;
- };
- // Write an int16_t data packet
- UNUSED_FUNCTION
- void Sub::Log_Write_Data(uint8_t id, int16_t value)
- {
- if (should_log(MASK_LOG_ANY)) {
- struct log_Data_Int16t pkt = {
- LOG_PACKET_HEADER_INIT(LOG_DATA_INT16_MSG),
- time_us : AP_HAL::micros64(),
- id : id,
- data_value : value
- };
- logger.WriteCriticalBlock(&pkt, sizeof(pkt));
- }
- }
- struct PACKED log_Data_UInt16t {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t id;
- uint16_t data_value;
- };
- // Write an uint16_t data packet
- UNUSED_FUNCTION
- void Sub::Log_Write_Data(uint8_t id, uint16_t value)
- {
- if (should_log(MASK_LOG_ANY)) {
- struct log_Data_UInt16t pkt = {
- LOG_PACKET_HEADER_INIT(LOG_DATA_UINT16_MSG),
- time_us : AP_HAL::micros64(),
- id : id,
- data_value : value
- };
- logger.WriteCriticalBlock(&pkt, sizeof(pkt));
- }
- }
- struct PACKED log_Data_Int32t {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t id;
- int32_t data_value;
- };
- // Write an int32_t data packet
- void Sub::Log_Write_Data(uint8_t id, int32_t value)
- {
- if (should_log(MASK_LOG_ANY)) {
- struct log_Data_Int32t pkt = {
- LOG_PACKET_HEADER_INIT(LOG_DATA_INT32_MSG),
- time_us : AP_HAL::micros64(),
- id : id,
- data_value : value
- };
- logger.WriteCriticalBlock(&pkt, sizeof(pkt));
- }
- }
- struct PACKED log_Data_UInt32t {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t id;
- uint32_t data_value;
- };
- // Write a uint32_t data packet
- void Sub::Log_Write_Data(uint8_t id, uint32_t value)
- {
- if (should_log(MASK_LOG_ANY)) {
- struct log_Data_UInt32t pkt = {
- LOG_PACKET_HEADER_INIT(LOG_DATA_UINT32_MSG),
- time_us : AP_HAL::micros64(),
- id : id,
- data_value : value
- };
- logger.WriteCriticalBlock(&pkt, sizeof(pkt));
- }
- }
- struct PACKED log_Data_Float {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t id;
- float data_value;
- };
- // Write a float data packet
- UNUSED_FUNCTION
- void Sub::Log_Write_Data(uint8_t id, float value)
- {
- if (should_log(MASK_LOG_ANY)) {
- struct log_Data_Float pkt = {
- LOG_PACKET_HEADER_INIT(LOG_DATA_FLOAT_MSG),
- time_us : AP_HAL::micros64(),
- id : id,
- data_value : value
- };
- logger.WriteCriticalBlock(&pkt, sizeof(pkt));
- }
- }
- // logs when baro or compass becomes unhealthy
- void Sub::Log_Sensor_Health()
- {
- // check baro
- if (sensor_health.baro != barometer.healthy()) {
- sensor_health.baro = barometer.healthy();
- AP::logger().Write_Error(LogErrorSubsystem::BARO, (sensor_health.baro ? LogErrorCode::ERROR_RESOLVED : LogErrorCode::UNHEALTHY));
- }
- // check compass
- if (sensor_health.compass != compass.healthy()) {
- sensor_health.compass = compass.healthy();
- AP::logger().Write_Error(LogErrorSubsystem::COMPASS, (sensor_health.compass ? LogErrorCode::ERROR_RESOLVED : LogErrorCode::UNHEALTHY));
- }
- }
- struct PACKED log_GuidedTarget {
- LOG_PACKET_HEADER;
- uint64_t time_us;
- uint8_t type;
- float pos_target_x;
- float pos_target_y;
- float pos_target_z;
- float vel_target_x;
- float vel_target_y;
- float vel_target_z;
- };
- // Write a Guided mode target
- void Sub::Log_Write_GuidedTarget(uint8_t target_type, const Vector3f& pos_target, const Vector3f& vel_target)
- {
- struct log_GuidedTarget pkt = {
- LOG_PACKET_HEADER_INIT(LOG_GUIDEDTARGET_MSG),
- time_us : AP_HAL::micros64(),
- type : target_type,
- pos_target_x : pos_target.x,
- pos_target_y : pos_target.y,
- pos_target_z : pos_target.z,
- vel_target_x : vel_target.x,
- vel_target_y : vel_target.y,
- vel_target_z : vel_target.z
- };
- logger.WriteBlock(&pkt, sizeof(pkt));
- }
- // type and unit information can be found in
- // libraries/AP_Logger/Logstructure.h; search for "log_Units" for
- // units and "Format characters" for field type information
- const struct LogStructure Sub::log_structure[] = {
- LOG_COMMON_STRUCTURES,
- { LOG_CONTROL_TUNING_MSG, sizeof(log_Control_Tuning),
- "CTUN", "Qfffffffccfhh", "TimeUS,ThI,ABst,ThO,ThH,DAlt,Alt,BAlt,DSAlt,SAlt,TAlt,DCRt,CRt", "s----mmmmmmnn", "F----00BBBBBB" },
- { LOG_MOTBATT_MSG, sizeof(log_MotBatt),
- "MOTB", "Qffff", "TimeUS,LiftMax,BatVolt,BatRes,ThLimit", "s-vw-", "F-00-" },
- { LOG_DATA_INT16_MSG, sizeof(log_Data_Int16t),
- "D16", "QBh", "TimeUS,Id,Value", "s--", "F--" },
- { LOG_DATA_UINT16_MSG, sizeof(log_Data_UInt16t),
- "DU16", "QBH", "TimeUS,Id,Value", "s--", "F--" },
- { LOG_DATA_INT32_MSG, sizeof(log_Data_Int32t),
- "D32", "QBi", "TimeUS,Id,Value", "s--", "F--" },
- { LOG_DATA_UINT32_MSG, sizeof(log_Data_UInt32t),
- "DU32", "QBI", "TimeUS,Id,Value", "s--", "F--" },
- { LOG_DATA_FLOAT_MSG, sizeof(log_Data_Float),
- "DFLT", "QBf", "TimeUS,Id,Value", "s--", "F--" },
- { LOG_GUIDEDTARGET_MSG, sizeof(log_GuidedTarget),
- "GUID", "QBffffff", "TimeUS,Type,pX,pY,pZ,vX,vY,vZ", "s-mmmnnn", "F-000000" },
- };
- void Sub::Log_Write_Vehicle_Startup_Messages()
- {
- // only 200(?) bytes are guaranteed by AP_Logger
- logger.Write_Mode(control_mode, control_mode_reason);
- ahrs.Log_Write_Home_And_Origin();
- gps.Write_AP_Logger_Log_Startup_messages();
- }
- void Sub::log_init()
- {
- logger.Init(log_structure, ARRAY_SIZE(log_structure));
- }
- #else // LOGGING_ENABLED
- void Sub::Log_Write_Control_Tuning() {}
- void Sub::Log_Write_Performance() {}
- void Sub::Log_Write_Attitude(void) {}
- void Sub::Log_Write_MotBatt() {}
- void Sub::Log_Write_Event(Log_Event id) {}
- void Sub::Log_Write_Data(uint8_t id, int32_t value) {}
- void Sub::Log_Write_Data(uint8_t id, uint32_t value) {}
- void Sub::Log_Write_Data(uint8_t id, int16_t value) {}
- void Sub::Log_Write_Data(uint8_t id, uint16_t value) {}
- void Sub::Log_Write_Data(uint8_t id, float value) {}
- void Sub::Log_Sensor_Health() {}
- void Sub::Log_Write_GuidedTarget(uint8_t target_type, const Vector3f& pos_target, const Vector3f& vel_target) {}
- void Sub::Log_Write_Vehicle_Startup_Messages() {}
- void Sub::log_init(void) {}
- #endif // LOGGING_ENABLED
|