1#include "device/super_cap.h"
2#include "device/super_cap_protocol.hpp"
5using namespace roboctrl;
8bool super_cap::init(
const info_type& info) {
9 if (!valid_configuration(info))
throw std::invalid_argument(
"invalid super capacitor configuration");
10 if (configured_)
throw std::logic_error(
"super capacitor already configured");
16void super_cap::connect() {
17 if (!configured_)
throw std::logic_error(
"super capacitor must initialize before connect");
18 if (connected_)
return;
19 get<io::can>(info_.can_name).on_data(info_.receive_id, [
this](
io::byte_span data) {
20 const auto feedback = super_cap_protocol::decode(data);
21 if (!feedback) return;
22 chassis_power_ = feedback->chassis_power;
23 chassis_power_limit_ = feedback->power_limit;
24 energy_ = feedback->energy;
25 error_code_ = feedback->error;
32void super_cap::start() {
33 if (!connected_)
throw std::logic_error(
"super capacitor must connect before start");
40 if (!configured_)
throw std::logic_error(
"super capacitor is not configured");
43 last_command_ = std::chrono::steady_clock::now();
49 const bool fresh = std::chrono::steady_clock::now() - last_command_ <= info_.command_timeout;
50 const bool enabled = super_cap_protocol::output_enabled(requested_enabled_, fresh, !
offline(), error_code_);
51 const auto data = super_cap_protocol::encode(enabled,
52 fresh ? requested_power_limit_ : 0, info_.buffer_target);
53 co_await get<io::can>(info_.can_name).send(info_.command_id, data);
54 co_await wait_for(info_.resend_time);
59 if (!connected_)
co_return;
60 co_await set(
false, 0);
61 const auto zero = super_cap_protocol::encode(
false, 0, info_.buffer_target);
62 co_await get<io::can>(info_.can_name).send(info_.command_id, zero);
基于 Linux SocketCAN 的 CAN 总线封装。
std::span< const std::byte > byte_span
只读 byte span。
awaitable< void > wait_for(const duration &duration)
协程任务等待。
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
asio::awaitable< T > awaitable
协程任务类型。
bool shutdown_requested()
查询全局任务上下文是否已经进入停机流程。
bool offline() const
判断设备是否离线