Implemented better control with gametrak

This commit is contained in:
2020-06-01 03:41:18 +02:00
parent 8f96a32b57
commit bb289f6e73

View File

@@ -1,5 +1,14 @@
#pragma once #pragma once
namespace {
template<class T>
constexpr const T& clamp( const T& v, const T& lo, const T& hi )
{
assert( !(hi < lo) );
return (v < lo) ? lo : (hi < v) ? hi : v;
}
}
#include "modeinterface.h" #include "modeinterface.h"
#include "globals.h" #include "globals.h"
#include "utils.h" #include "utils.h"
@@ -12,15 +21,24 @@ namespace {
class GametrakMode : public ModeInterface class GametrakMode : public ModeInterface
{ {
public: public:
void start() override;
void update() override; void update() override;
const char *displayName() const override { return "Gametrak"; } const char *displayName() const override { return "Gametrak"; }
private:
bool m_flag;
}; };
namespace modes { namespace modes {
GametrakMode gametrakMode; GametrakMode gametrakMode;
} }
void GametrakMode::start()
{
m_flag = false;
}
void GametrakMode::update() void GametrakMode::update()
{ {
if (gas > 500. || brems > 500.) if (gas > 500. || brems > 500.)
@@ -31,11 +49,28 @@ void GametrakMode::update()
return; return;
} }
int16_t pwm;
if (gametrakDist < 150)
{
pwm = 0;
m_flag = false;
}
else
{
if (m_flag || gametrakDist >= 400)
{
m_flag = true;
pwm = clamp<int>((gametrakDist - 400) / 2, -200, 200);
}
else
pwm = 0;
}
for (MotorState &motor : motors()) for (MotorState &motor : motors())
{ {
motor.ctrlTyp = ControlType::FieldOrientedControl; motor.ctrlTyp = ControlType::FieldOrientedControl;
motor.ctrlMod = ControlMode::Speed; motor.ctrlMod = ControlMode::Speed;
motor.pwm = gametrakDist > 200 ? 20 : 0; motor.pwm = pwm;
} }
fixCommonParams(); fixCommonParams();