12 bool output_allowed,
float dt_seconds) {
14 auto& cap = roboctrl::get<device::super_cap>();
15 if (cap.configured() && !cap.offline() && cap.error_code() == 0) {
16 feedback.cap_online =
true;
17 feedback.cap_power_limit = cap.chassis_power_limit();
18 feedback.cap_energy = cap.energy();
19 feedback.measured_power = cap.chassis_power();
20 feedback.measurement_sequence = cap.sample_sequence();
22 auto& referee = roboctrl::get<device::referee>();
23 if (referee.configured() && !referee.offline()) {
24 const auto now = device::referee_protocol::clock::now();
25 const auto& data = referee.data();
26 feedback.referee_online = data.robot.fresh(now, referee.timeout());
27 if (feedback.referee_online) {
28 feedback.referee_power_limit = data.robot.value.chassis_power_limit;
29 output_allowed = output_allowed && data.robot.value.chassis_power;
31 feedback.buffer_online = data.power.fresh(now, referee.timeout());
32 if (feedback.buffer_online) feedback.buffer_energy = data.power.value.buffer_energy;
34 update(chassis, feedback, output_allowed, dt_seconds);
35 if (cap.configured()) {
38 const float source_limit = feedback.referee_online && feedback.referee_power_limit >= 0.0f
39 ? feedback.referee_power_limit : info_.offline_power_limit;
40 const auto limit =
static_cast<std::uint16_t
>(std::clamp(source_limit, 0.0f, 65535.0f));
41 co_await cap.set(enabled() && output_allowed && !status_.motor_fault, limit);