libstp
Robotics library for Botball
Loading...
Searching...
No Matches
TransportReader.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <raccoon/Channels.h>
6#include <raccoon/Options.h>
7#include <raccoon/vector3f_t.hpp>
8#include <raccoon/scalar_i8_t.hpp>
9#include <raccoon/scalar_i32_t.hpp>
10#include <raccoon/scalar_f_t.hpp>
11#include <raccoon/quaternion_t.hpp>
12#include <raccoon/string_t.hpp>
13#include <string>
14#include <unordered_map>
15#include <mutex>
16#include <atomic>
17#include <functional>
18#include <condition_variable>
19
20namespace platform::wombat::core {
28 public:
29 explicit TransportReader();
31
33 {
34 static TransportReader impl;
35 return impl;
36 }
37
38 raccoon::scalar_i8_t readServoMode(int port);
39 raccoon::scalar_f_t readServoValue(int port);
40
42 raccoon::vector3f_t readGyro();
43 raccoon::vector3f_t readAccel();
44 raccoon::vector3f_t readLinearAccel();
45 raccoon::vector3f_t readAccelVelocity();
48 raccoon::vector3f_t readMag();
49 raccoon::scalar_f_t readHeading();
53 raccoon::quaternion_t readQuaternion();
54 raccoon::scalar_i32_t readBemf(int idx);
55 int32_t readMotorPosition(int port);
56 bool readMotorDone(int port);
57
58 raccoon::scalar_i32_t readAnalog(int port);
59 raccoon::scalar_i32_t readDigital(int port);
60
61 raccoon::scalar_f_t readTemp();
62
65 float pos_x{0.0f};
66 float pos_y{0.0f};
67 float heading{0.0f};
68 float vx{0.0f};
69 float vy{0.0f};
70 float wz{0.0f};
71 };
73
76
83 float pos_x{0.0f};
84 float pos_y{0.0f};
85 float heading{0.0f};
86 bool connected{false};
87 };
89
93
96 bool waitForOdometryReset(int timeout_ms = 500);
97
99 bool waitForImuReady(int timeout_ms = 1000);
100
107 bool waitForBemfData(int timeout_ms = 500);
108
109 // Deprecated: callback mechanism removed, use getIntegratedVelocity via IIMU instead.
110 void setLinearAccelCallback(std::function<void(float, float, float)> /*callback*/) {}
111
112 private:
114
115 // Cached copies of the most recent transport data.
116 std::mutex cache_mutex_;
117 std::unordered_map<int, int8_t> servo_mode_cache_;
118 std::unordered_map<int, float> servo_value_cache_;
119 std::unordered_map<int, int32_t> bemf_cache_;
120 std::unordered_map<int, int32_t> motor_position_cache_;
121 std::unordered_map<int, int32_t> motor_done_cache_;
122 std::unordered_map<int, int32_t> analog_cache_;
123 std::unordered_map<int, int32_t> digital_cache_;
124
125 raccoon::vector3f_t gyro_cache_{};
126 raccoon::vector3f_t accel_cache_{};
127 raccoon::vector3f_t linear_accel_cache_{};
128 raccoon::vector3f_t accel_velocity_cache_{};
129 raccoon::vector3f_t accel_velocity_offset_{};
130 raccoon::vector3f_t mag_cache_{};
131 raccoon::scalar_f_t heading_cache_{};
132 raccoon::quaternion_t quaternion_cache_{};
133 raccoon::scalar_f_t temp_cache_{};
134
135 // STM32 odometry cache
136 OdometrySnapshot odom_cache_{};
137 std::condition_variable odom_cv_;
138
139 // External calibration-board odometry cache (raw board units: cm / deg).
140 float calib_pos_x_cm_{0.0f};
141 float calib_pos_y_cm_{0.0f};
142 float calib_heading_deg_{0.0f};
143 // Board attached per status/board channel.
144 std::atomic<bool> calib_board_attached_{false};
145 // At least one odometry sample has arrived since startup.
146 std::atomic<bool> calib_odom_received_{false};
147
148 // Track whether real IMU heading data has been received.
149 std::atomic<bool> imu_heading_received_{false};
150
151 // Track whether real BEMF telemetry has been received from the STM32.
152 std::atomic<bool> bemf_received_{false};
153
154 };
155
156 enum class MotorDir : uint8_t { Off = 0b00, CCW = 0b01, CW = 0b10, ServoLike = 0b11 };
157
158 enum class ServoMode : uint8_t { FullyDisabled = 0, Disabled = 1, Enabled = 2 };
159}
raccoon::scalar_i32_t readAnalog(int port)
bool waitForOdometryReset(int timeout_ms=500)
void resetAccelVelocity()
Snapshot the current integrated-velocity reading as the new zero point.
raccoon::scalar_i8_t readServoMode(int port)
bool waitForImuReady(int timeout_ms=1000)
Wait until heading data has been observed at least once.
raccoon::vector3f_t readAccelVelocity()
void setLinearAccelCallback(std::function< void(float, float, float)>)
raccoon::scalar_i32_t readBemf(int idx)
raccoon::scalar_i32_t readDigital(int port)
raccoon::quaternion_t readQuaternion()
bool waitForBemfData(int timeout_ms=500)
CalibOdometrySnapshot readCalibOdometry()
raccoon::scalar_f_t readServoValue(int port)
raccoon::vector3f_t readGyro()
Return the latest cached IMU vectors from raccoon subscriptions.
void resetOdometry()
Zero the local odometry cache (call alongside STM32 reset command).