#pragma once
#include <string>
#include <string_view>
#include <units/acceleration.h>
#include <units/angle.h>
#include <units/angular_acceleration.h>
#include <units/angular_velocity.h>
#include <units/current.h>
#include <units/length.h>
#include <units/velocity.h>
#include <units/voltage.h>
#include <wpi/DataLog.h>
namespace frc::sysid {
enum class State {
kQuasistaticForward,
kQuasistaticReverse,
kDynamicForward,
kDynamicReverse,
kNone
};
class SysIdRoutineLog {
using MotorEntries = wpi::StringMap<wpi::log::DoubleLogEntry>;
using LogEntries = wpi::StringMap<MotorEntries>;
public:
class MotorLog {
public:
MotorLog& value(std::string_view name, double value, std::string_view unit);
MotorLog& voltage(units::volt_t voltage) {
return value("voltage", voltage.value(), voltage.name());
}
MotorLog& position(units::meter_t position) {
return value("position", position.value(), position.name());
}
MotorLog& position(units::turn_t position) {
return value("position", position.value(), position.name());
}
MotorLog& velocity(units::meters_per_second_t velocity) {
return value("velocity", velocity.value(), velocity.name());
}
MotorLog& velocity(units::turns_per_second_t velocity) {
return value("velocity", velocity.value(), velocity.name());
}
MotorLog& acceleration(units::meters_per_second_squared_t acceleration) {
return value("acceleration", acceleration.value(), acceleration.name());
}
MotorLog& acceleration(units::turns_per_second_squared_t acceleration) {
return value("acceleration", acceleration.value(), acceleration.name());
}
MotorLog& current(units::ampere_t current) {
return value("current", current.value(), current.name());
}
private:
friend class SysIdRoutineLog;
MotorLog(std::string_view motorName, std::string_view logName,
LogEntries* logEntries);
std::string m_motorName;
std::string m_logName;
LogEntries* m_logEntries;
};
explicit SysIdRoutineLog(std::string_view logName);
void RecordState(State state);
MotorLog Motor(std::string_view motorName);
static std::string StateEnumToString(State state);
private:
LogEntries m_logEntries;
std::string m_logName;
bool m_stateInitialized = false;
wpi::log::StringLogEntry m_state;
};
}