通信クラスの API は統一されており、通信方式によらず同じようなプログラムを書くことが可能です。
共通内容
- メッセージ型(単なる構造体)のオブジェクトを用いて通信を行います。メッセージ型を参照してください。
- 通信を管理するバスクラス、バスクラスとデータの受け渡しを行う送受信クラスから構成されています。
- 送受信クラスはテンプレート引数を持っており、通信するオブジェクトの型を指定します。
- 送信クラスの
setMessage(T)
を用いて送信し、受信クラスの Optional<T> getMessage()
を用いて受信します。
送信者イメージ
バスクラス bus;
送信クラス<int> writer{ bus, 0x01 };
void setup()
{
bus.begin();
}
void loop()
{
bus.update();
writer.setMessage(1000);
}
受信者イメージ
バスクラス bus;
受信クラス<int> reader{ bus, 0x01 };
void setup()
{
bus.begin();
}
void loop()
{
bus.update();
if (const Optional<int> message = reader.getMessage())
{
Serial.println(*message);
}
else
{
Serial.println("receive failed");
}
}
複数の通信バスや送受信者が存在する場合
バスクラスと送信者クラスに分けたことで、通信クラスを柔軟に組み合わせられます。
通信によっては複数のバスや送受信者を立てることができない場合があります。
複数送信者
flowchart LR
subgraph ファームウエア
subgraph writer1
送信オブジェクト1[オブジェクト] --int--> setMessage1[setMessage]
end
subgraph writer2
送信オブジェクト2[オブジェクト] --int--> setMessage2[setMessage]
end
setMessage1[setMessage] --byte string--> bus
setMessage2[setMessage] --byte string--> bus
end
bus -.byte string.-> 通信バス
バスクラス bus;
送信クラス<int> writer1{ bus, 0x01 };
送信クラス<int> writer2{ bus, 0x02 };
void setup()
{
bus.begin();
}
void loop()
{
bus.update();
writer1.setMessage(1000);
writer2.setMessage(2000);
}
送受信者
flowchart LR
subgraph ファームウエア
subgraph writer1
送信オブジェクト[オブジェクト] --int--> setMessage
end
subgraph writer2
getMessage --int--> 受信オブジェクト[オブジェクト]
end
setMessage --byte string--> bus
direction RL
bus --byte string--> getMessage
end
bus <-.byte string.-> 通信バス
バスクラス bus;
送信クラス<int> writer{ bus, 0x01 };
受信クラス<int> reader{ bus, 0x02 };
void setup()
{
bus.begin();
}
void loop()
{
bus.update();
writer.setMessage(1000);
if (const auto message = reader.getMessage())
{
Serial.println(*message);
}
else
{
Serial.println("receive failed");
}
}
複数バス、複数送受信
flowchart LR
subgraph ファームウエア1
subgraph writer2
送信オブジェクト1[オブジェクト] --int--> setMessage1[setMessage]
end
subgraph writer3
送信オブジェクト2[オブジェクト] --int--> setMessage2[setMessage]
end
subgraph writer1
送信オブジェクト3[オブジェクト] --int--> setMessage3[setMessage]
end
setMessage3 --byte string--> ファームウエア1bus1
setMessage1 --byte string--> ファームウエア1bus2
setMessage2 --byte string--> ファームウエア1bus2
end
ファームウエア1bus1[bus1] -.byte string.-> 通信バス1[通信バス]
ファームウエア1bus2[bus2] -.byte string.-> 通信バス2[通信バス]
通信バス1[通信バス] -.byte string.-> ファームウエア2bus1[bus1]
通信バス2[通信バス] -.byte string.-> ファームウエア2bus2[bus2]
subgraph ファームウエア2
subgraph reader1
getMessage1 --int--> 受信オブジェクト1[オブジェクト]
end
subgraph reader2
getMessage2 --int--> 受信オブジェクト2[オブジェクト]
end
subgraph reader3
getMessage3 --int--> 受信オブジェクト3[オブジェクト]
end
ファームウエア2bus1 --byte string--> getMessage1
ファームウエア2bus2 --byte string--> getMessage2
ファームウエア2bus2 --byte string--> getMessage3
end
バスクラス bus1;
バスクラス bus2;
送信クラス<int> writer1{ bus1, 0x01 };
送信クラス<int> writer2{ bus2, 0x01 };
送信クラス<int> writer3{ bus2, 0x02 };
void setup()
{
bus1.begin();
bus2.begin();
}
void loop()
{
bus1.update();
bus2.update();
writer1.setMessage(1000);
writer2.setMessage(2000);
writer3.setMessage(3000);
}
バスクラス bus1;
バスクラス bus2;
受信クラス<int> reader1{ bus1, 0x01 };
受信クラス<int> reader2{ bus2, 0x01 };
受信クラス<int> reader3{ bus2, 0x02 };
void setup()
{
bus1.begin();
bus2.begin();
}
void loop()
{
bus1.update();
bus2.update();
if (const auto message = reader1.getMessage())
{
Serial.println(*message);
}
else
{
Serial.println("receive failed");
}
if (const auto message = reader2.getMessage())
{
Serial.println(*message);
}
else
{
Serial.println("receive failed");
}
if (const auto message = reader3.getMessage())
{
Serial.println(*message);
}
else
{
Serial.println("receive failed");
}
}