blob: 8898ca13cffb7ffb5b09352c9607f0f054485b3e [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/input/driver_station_data.h"
Brian Silvermanba3de7e2013-05-08 16:18:15 -07002
3namespace aos {
4namespace input {
5namespace driver_station {
6
7Data::Data() : current_values_(), old_values_() {}
8
Brian Silverman699f0cb2015-02-05 19:45:01 -05009void Data::Update(const JoystickState &new_values) {
Brian Silvermanba3de7e2013-05-08 16:18:15 -070010 old_values_ = current_values_;
11 current_values_ = new_values;
12}
13
14namespace {
15
16bool GetButton(const ButtonLocation location,
Brian Silverman699f0cb2015-02-05 19:45:01 -050017 const JoystickState &values) {
Austin Schuhbfb04122019-05-22 21:16:51 -070018 if (location.joystick() < 0 ||
19 location.joystick() > static_cast<int>(values.joysticks.size())) {
20 return false;
21 }
Tyler Chatow78ffe032019-09-29 11:06:06 -070022 if (location.number() <= 0 || location.number() > 16) {
Austin Schuhbfb04122019-05-22 21:16:51 -070023 return false;
24 }
Brian Silvermanba3de7e2013-05-08 16:18:15 -070025 return values.joysticks[location.joystick() - 1].buttons &
26 (1 << (location.number() - 1));
27}
28
Brian Silverman7b9ab672015-03-14 23:41:41 -070029bool DoGetPOV(const POVLocation location, const JoystickState &values) {
Austin Schuhfee2e602015-03-08 18:26:05 -070030 return values.joysticks[location.joystick() - 1].pov == location.number();
31}
32
Brian Silvermanba3de7e2013-05-08 16:18:15 -070033bool GetControlBitValue(const ControlBit bit,
Brian Silverman699f0cb2015-02-05 19:45:01 -050034 const JoystickState &values) {
Brian Silvermanba3de7e2013-05-08 16:18:15 -070035 switch (bit) {
36 case ControlBit::kTestMode:
Austin Schuh374fd172014-10-25 17:57:54 -070037 return values.test_mode;
Brian Silvermanba3de7e2013-05-08 16:18:15 -070038 case ControlBit::kFmsAttached:
Austin Schuh374fd172014-10-25 17:57:54 -070039 return values.fms_attached;
Brian Silvermanba3de7e2013-05-08 16:18:15 -070040 case ControlBit::kAutonomous:
Austin Schuh374fd172014-10-25 17:57:54 -070041 return values.autonomous;
Brian Silvermanba3de7e2013-05-08 16:18:15 -070042 case ControlBit::kEnabled:
Austin Schuh374fd172014-10-25 17:57:54 -070043 return values.enabled;
Brian Silverman8efe23e2013-07-07 23:31:37 -070044 default:
45 __builtin_unreachable();
Brian Silvermanba3de7e2013-05-08 16:18:15 -070046 }
47}
48
49} // namespace
50
51bool Data::IsPressed(const ButtonLocation location) const {
52 return GetButton(location, current_values_);
53}
54
55bool Data::PosEdge(const ButtonLocation location) const {
56 return !GetButton(location, old_values_) &&
57 GetButton(location, current_values_);
58}
59
60bool Data::NegEdge(const ButtonLocation location) const {
61 return GetButton(location, old_values_) &&
62 !GetButton(location, current_values_);
63}
64
Austin Schuhfee2e602015-03-08 18:26:05 -070065bool Data::IsPressed(const POVLocation location) const {
Brian Silverman7b9ab672015-03-14 23:41:41 -070066 return DoGetPOV(location, current_values_);
Austin Schuhfee2e602015-03-08 18:26:05 -070067}
68
69bool Data::PosEdge(const POVLocation location) const {
Brian Silverman7b9ab672015-03-14 23:41:41 -070070 return !DoGetPOV(location, old_values_) &&
71 DoGetPOV(location, current_values_);
Austin Schuhfee2e602015-03-08 18:26:05 -070072}
73
74bool Data::NegEdge(const POVLocation location) const {
Brian Silverman7b9ab672015-03-14 23:41:41 -070075 return DoGetPOV(location, old_values_) &&
76 !DoGetPOV(location, current_values_);
77}
78
79int32_t Data::GetPOV(int joystick) const {
80 return current_values_.joysticks[joystick - 1].pov;
81}
82
83int32_t Data::GetOldPOV(int joystick) const {
84 return old_values_.joysticks[joystick - 1].pov;
Austin Schuhfee2e602015-03-08 18:26:05 -070085}
86
Brian Silvermanba3de7e2013-05-08 16:18:15 -070087bool Data::GetControlBit(const ControlBit bit) const {
88 return GetControlBitValue(bit, current_values_);
89}
90
91bool Data::PosEdge(const ControlBit bit) const {
92 return !GetControlBitValue(bit, old_values_) &&
93 GetControlBitValue(bit, current_values_);
94}
95
96bool Data::NegEdge(const ControlBit bit) const {
97 return GetControlBitValue(bit, old_values_) &&
98 !GetControlBitValue(bit, current_values_);
99}
100
101float Data::GetAxis(JoystickAxis axis) const {
Austin Schuh374fd172014-10-25 17:57:54 -0700102 return current_values_.joysticks[axis.joystick() - 1].axis[axis.number() - 1];
Brian Silvermanba3de7e2013-05-08 16:18:15 -0700103}
104
105} // namespace driver_station
106} // namespace input
107} // namespace aos