blob: 88ccfa56c3d169d2f58a264eac19e266003dd738 [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.
Austin Schuh6a6f90c2016-11-25 21:36:42 -080028 void TickTime() { ::aos::time::SetMockTime(current_time_ += kTimeTick); }
Brian Silvermane6f64ab2015-02-05 17:03:56 -050029
30 // Simulates everything that happens during 1 loop time step.
31 void SimulateTimestep(bool enabled) {
32 SendMessages(enabled);
33 TickTime();
34 }
Brian Silverman65e49702014-04-30 17:36:40 -070035
Brian Silverman57cad222015-02-14 20:46:41 -050036 // Simulate a reset of the process reading sensors, which tells loops that all
37 // index counts etc will be reset.
38 void SimulateSensorReset() {
39 ++reader_pid_;
40 }
41
Austin Schuhe5f064d2016-03-05 17:43:51 -080042 // Sets the battery voltage in robot_state.
43 void set_battery_voltage(double battery_voltage) {
44 battery_voltage_ = battery_voltage;
45 }
46
Brian Silverman65e49702014-04-30 17:36:40 -070047 private:
Austin Schuh6a6f90c2016-11-25 21:36:42 -080048 static constexpr ::std::chrono::milliseconds kTimeTick{5};
49 static constexpr ::std::chrono::milliseconds kDSPacketTime{20};
Brian Silvermane6f64ab2015-02-05 17:03:56 -050050
Philipp Schraderf75a8bf2015-02-02 05:30:16 +000051 uint16_t team_id_ = 971;
Brian Silverman57cad222015-02-14 20:46:41 -050052 int32_t reader_pid_ = 1;
Austin Schuhe5f064d2016-03-05 17:43:51 -080053 double battery_voltage_ = 12.4;
Philipp Schraderf75a8bf2015-02-02 05:30:16 +000054
Austin Schuh6a6f90c2016-11-25 21:36:42 -080055 ::aos::monotonic_clock::time_point last_ds_time_ =
56 ::aos::monotonic_clock::epoch();
57 ::aos::monotonic_clock::time_point current_time_ =
58 ::aos::monotonic_clock::epoch();
Brian Silverman65e49702014-04-30 17:36:40 -070059
Brian Silvermanf5f8d8e2015-12-06 18:39:12 -050060 ::aos::testing::TestSharedMemory my_shm_;
Campbell Crowley152c7cf2016-02-14 21:20:50 -080061
62 bool last_enabled_ = false;
Brian Silverman65e49702014-04-30 17:36:40 -070063};
64
65} // namespace testing
66} // namespace aos
67
68#endif // AOS_COMMON_CONTROLS_CONTROL_LOOP_TEST_H_