blob: 14fdd6065f5cf9f822d579de0d8faa4c0b95648b [file] [log] [blame]
Brian Silverman65e49702014-04-30 17:36:40 -07001#ifndef AOS_COMMON_CONTROLS_CONTROL_LOOP_TEST_H_
2#define AOS_COMMON_CONTROLS_CONTROL_LOOP_TEST_H_
3
4#include "gtest/gtest.h"
5
Brian Silvermanf5f8d8e2015-12-06 18:39:12 -05006#include "aos/testing/test_shm.h"
Brian Silvermanbbc86782014-08-19 12:13:05 -04007#include "aos/common/time.h"
Brian Silverman65e49702014-04-30 17:36:40 -07008
9namespace aos {
10namespace testing {
11
12// Handles setting up the environment that all control loops need to actually
13// run.
14// This includes sending the queue messages and Clear()ing the queues when
15// appropriate.
16// It also includes dealing with ::aos::time.
17class ControlLoopTest : public ::testing::Test {
18 public:
19 ControlLoopTest();
Brian Silverman65e49702014-04-30 17:36:40 -070020 virtual ~ControlLoopTest();
21
Philipp Schraderf75a8bf2015-02-02 05:30:16 +000022 void set_team_id(uint16_t team_id) { team_id_ = team_id; }
23 uint16_t team_id() const { return team_id_; }
24
Brian Silvermane6f64ab2015-02-05 17:03:56 -050025 // Sends out all of the required queue messages.
26 void SendMessages(bool enabled);
27 // Ticks time for a single control loop cycle.
28 void TickTime() {
29 ::aos::time::Time::SetMockTime(current_time_ += kTimeTick);
30 }
31
32 // Simulates everything that happens during 1 loop time step.
33 void SimulateTimestep(bool enabled) {
34 SendMessages(enabled);
35 TickTime();
36 }
Brian Silverman65e49702014-04-30 17:36:40 -070037
Brian Silverman57cad222015-02-14 20:46:41 -050038 // Simulate a reset of the process reading sensors, which tells loops that all
39 // index counts etc will be reset.
40 void SimulateSensorReset() {
41 ++reader_pid_;
42 }
43
Austin Schuhe5f064d2016-03-05 17:43:51 -080044 // Sets the battery voltage in robot_state.
45 void set_battery_voltage(double battery_voltage) {
46 battery_voltage_ = battery_voltage;
47 }
48
Brian Silverman65e49702014-04-30 17:36:40 -070049 private:
Brian Silverman699f0cb2015-02-05 19:45:01 -050050 static constexpr ::aos::time::Time kTimeTick = ::aos::time::Time::InUS(5000);
Brian Silvermane6f64ab2015-02-05 17:03:56 -050051 static constexpr ::aos::time::Time kDSPacketTime =
52 ::aos::time::Time::InMS(20);
53
Philipp Schraderf75a8bf2015-02-02 05:30:16 +000054 uint16_t team_id_ = 971;
Brian Silverman57cad222015-02-14 20:46:41 -050055 int32_t reader_pid_ = 1;
Austin Schuhe5f064d2016-03-05 17:43:51 -080056 double battery_voltage_ = 12.4;
Philipp Schraderf75a8bf2015-02-02 05:30:16 +000057
Brian Silvermane6f64ab2015-02-05 17:03:56 -050058 ::aos::time::Time last_ds_time_ = ::aos::time::Time::InSeconds(0);
Brian Silvermanbbc86782014-08-19 12:13:05 -040059 ::aos::time::Time current_time_ = ::aos::time::Time::InSeconds(0);
Brian Silverman65e49702014-04-30 17:36:40 -070060
Brian Silvermanf5f8d8e2015-12-06 18:39:12 -050061 ::aos::testing::TestSharedMemory my_shm_;
Campbell Crowley152c7cf2016-02-14 21:20:50 -080062
63 bool last_enabled_ = false;
Brian Silverman65e49702014-04-30 17:36:40 -070064};
65
66} // namespace testing
67} // namespace aos
68
69#endif // AOS_COMMON_CONTROLS_CONTROL_LOOP_TEST_H_