/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2014-2016. All Rights Reserved. */ /* Open Source Software - may be modified and shared by FRC teams. The code */ /* must be accompanied by the FIRST BSD license file in the root directory of */ /* the project. */ /*----------------------------------------------------------------------------*/ #include #include "gtest/gtest.h" #include "TestBench.h" #include "PIDSource.h" #include "PIDController.h" #include "PIDOutput.h" class PIDToleranceTest : public testing::Test{ protected: const double setpoint = 50.0; const double range = 200; const double tolerance = 10.0; class fakeInput : public PIDSource{ public: double val = 0; void SetPIDSourceType(PIDSourceType pidSource){ } PIDSourceType GetPIDSourceType(){ return PIDSourceType::kDisplacement; } double PIDGet(){; return val; } }; class fakeOutput : public PIDOutput{ void PIDWrite(float output){ } }; fakeInput inp; fakeOutput out; PIDController *pid; virtual void SetUp() override { pid = new PIDController(0.5,0.0,0.0,&inp,&out); pid->SetInputRange(-range/2,range/2); } virtual void TearDown() override { delete pid; } virtual void reset(){ inp.val = 0; } }; TEST_F(PIDToleranceTest, Absolute){ reset(); pid->SetAbsoluteTolerance(tolerance); pid->SetSetpoint(setpoint); pid->Enable(); EXPECT_FALSE(pid->OnTarget())<<"Error was in tolerance when it should not have been. Error was " << pid->GetAvgError(); inp.val = setpoint+tolerance/2; Wait(1.0); EXPECT_TRUE(pid->OnTarget())<<"Error was not in tolerance when it should have been. Error was " << pid->GetAvgError(); inp.val = setpoint+10*tolerance; Wait(1.0); EXPECT_FALSE(pid->OnTarget())<<"Error was in tolerance when it should not have been. Error was " << pid->GetAvgError(); } TEST_F(PIDToleranceTest, Percent){ reset(); pid->SetPercentTolerance(tolerance); pid->SetSetpoint(setpoint); pid->Enable(); EXPECT_FALSE(pid->OnTarget())<<"Error was in tolerance when it should not have been. Error was " << pid->GetAvgError(); inp.val = setpoint+(tolerance)/200*range;//half of percent tolerance away from setpoint Wait(1.0); EXPECT_TRUE(pid->OnTarget())<<"Error was not in tolerance when it should have been. Error was " << pid->GetAvgError(); inp.val = setpoint+(tolerance)/50*range;//double percent tolerance away from setPoint Wait(1.0); EXPECT_FALSE(pid->OnTarget())<<"Error was in tolerance when it should not have been. Error was " << pid->GetAvgError(); }