10 template <CAN_DEV_TABLE Bus>
18 template <CAN_DEV_TABLE Bus>
20 : config(other.config)
22 , txNodes(other.txNodes)
23 , rxNodes(other.rxNodes)
29 template <CAN_DEV_TABLE Bus>
36 template <CAN_DEV_TABLE Bus>
41 bus.setBaudRate(config.canBaudrate);
47 if (rxNodes.size() <= 8)
49 bus.setFIFOFilter(REJECT_ALL);
50 for (
size_t i = 0; i < rxNodes.size(); ++i)
52 bus.setFIFOUserFilter(
63 bus.setFIFOFilter(ACCEPT_ALL);
68 bus.enableFIFOInterrupt();
72 [](
const CAN_message_t& msg)
74 self->rxBuffer.push_back(msg);
80 template <CAN_DEV_TABLE Bus>
83 bus.disableFIFOInterrupt();
88 template <CAN_DEV_TABLE Bus>
92 if (txNodes.size() && millis() - transmitMs >= config.transmitInterval)
95 transmitMs = millis();
99 template <CAN_DEV_TABLE Bus>
102 return not(txTimeout() or rxTimeout());
105 template <CAN_DEV_TABLE Bus>
106 bool CanBusTeensy<Bus>::txTimeout()
const
109 return millis() - transmitMs >= config.transmitTimeout;
114 template <CAN_DEV_TABLE Bus>
115 bool CanBusTeensy<Bus>::rxTimeout()
const
118 return millis() - receiveMs >= config.receiveTimeout;
124 template <CAN_DEV_TABLE Bus>
127 Serial.print(
"CanBusTeensy\n");
129 for (
auto&& node : txNodes)
131 Serial.print(
"\tTX ");
133 Serial.printf(
"0x%03x ",
static_cast<int>(node.id));
135 Serial.printf(
"%2zu byte ", node.data.size());
137 Serial.print(node.data.size() > SingleFrameSize ?
"(multi frame) " :
"(single frame) ");
141 for (
const auto& data : node.data)
143 Serial.printf(
"%4d", data);
151 for (
auto&& rxNode : rxNodes)
153 Serial.print(
"\tRX ");
155 Serial.printf(
"0x%03x ",
static_cast<int>(rxNode.id));
157 Serial.printf(
"%2zu byte ", rxNode.data.size());
159 Serial.print(rxNode.data.size() > SingleFrameSize ?
"(multi frame) " :
"(single frame) ");
163 for (
const auto& data : rxNode.data)
165 Serial.printf(
"%4d", data);
176 template <CAN_DEV_TABLE Bus>
179 auto it = std::find_if(txNodes.begin(), txNodes.end(), [
id](
const CanTxNode& tx)
180 { return tx.id == id; });
181 if (it == txNodes.end())
183 txNodes.push_back({ id, std::vector<uint8_t>(length), 0 });
184 return &txNodes.back();
191 template <CAN_DEV_TABLE Bus>
196 std::vector<uint8_t>(length),
201 return &rxNodes.back();
205 template <CAN_DEV_TABLE Bus>
206 void CanBusTeensy<Bus>::onReceive()
208 const auto ms = millis();
210 for (
auto&& msg : rxBuffer)
213 auto rxNode = std::find_if(rxNodes.begin(), rxNodes.end(), [&msg](
const CanRxNode& rx)
214 { return rx.id == msg.id; });
215 if (rxNode == rxNodes.end())
229 if (rxNode->data.size() > SingleFrameSize)
232 const auto frameCount = std::ceil(
static_cast<double>(rxNode->data.size()) /( SingleFrameSize - 1 ) )- 1;
234 if (msg.buf[0] == frameCount)
245 receiveMs = rxNode->transmitMs = ms;
251 template <CAN_DEV_TABLE Bus>
252 void CanBusTeensy<Bus>::onTransmit()
254 const auto ms = millis();
256 for (
auto&& node : txNodes)
260 msg.len = SingleFrameSize;
267 delayMicroseconds(200);
270 node.transmitMs = ms;
274 template <CAN_DEV_TABLE Bus>
Teensy用 CANバスクラス
Definition CanBusTeensy.hpp:31
CanRxNode * createRx(uint32_t id, size_t length) override
受信ノードをバスに参加させる
Definition CanBusTeensy.hpp:192
void show() const
バス情報を表示する
Definition CanBusTeensy.hpp:125
void update()
バス更新
Definition CanBusTeensy.hpp:89
CanTxNode * createTx(uint32_t id, size_t length) override
送信ノードをバスに参加させる
Definition CanBusTeensy.hpp:177
void begin()
通信開始
Definition CanBusTeensy.hpp:37
CanBusTeensy(const Config &config={})
コンストラクタ
Definition CanBusTeensy.hpp:11
void end()
通信終了
Definition CanBusTeensy.hpp:81
~CanBusTeensy()
デストラクタ
Definition CanBusTeensy.hpp:30
void Packetize(Udon::ArrayView< const uint8_t > &&input, Udon::ArrayView< uint8_t > &&output, size_t singlePacketSize, Function func)
バイト列を複数のパケット、単一のパケットにパケット化する
Definition CanUtility.hpp:24
void Unpacketize(Udon::ArrayView< const uint8_t > &&input, Udon::ArrayView< uint8_t > &&output, size_t singlePacketSize)
複数のパケット、単一のパケットからバイト列にアンパケット化する
Definition CanUtility.hpp:83
Definition CanBusTeensy.hpp:34
CAN受信ノード
Definition ICanBus.hpp:28
CAN送信ノード
Definition ICanBus.hpp:17