123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- // SPDX-License-Identifier: MIT
- // SPDX-FileCopyrightText: 2022 Ivan Baidakou
- #include "board.h"
- #include "rotor-light.hpp"
- namespace rl = rotor_light;
- namespace message {
- struct Ping : rl::Message {
- using Message::Message;
- static constexpr auto type_id = __LINE__;
- };
- struct Pong : rl::Message {
- using Message::Message;
- static constexpr auto type_id = __LINE__;
- };
- } // namespace message
- struct Pinger : rl::Actor<2> {
- using Parent = Actor<2>;
- void initialize() override {
- subscribe(&Pinger::on_pong);
- Parent::initialize();
- }
- void advance_start() override {
- Parent::advance_start();
- ping();
- }
- void ping() {
- --left;
- send<rl::ctx::thread, message::Ping>(0, ponger_id);
- }
- void on_pong(message::Pong &) {
- if (left > 0) {
- ping();
- }
- }
- uint32_t left;
- rl::ActorId ponger_id;
- };
- struct Ponger : rl::Actor<2> {
- using Parent = Actor<2>;
- void initialize() override {
- subscribe(&Ponger::on_ping);
- Parent::initialize();
- }
- void on_ping(message::Ping &) {
- send<rl::ctx::thread, message::Pong>(0, pinger_id);
- }
- rl::ActorId pinger_id;
- };
- using Supervisor =
- rl::Supervisor<rl::SupervisorBase::min_handlers_amount, Pinger, Ponger>;
- using Storage = rl::traits::MessageStorage<rl::message::ChangeState,
- rl::message::ChangeStateAck,
- message::Ping, message::Pong>;
- using Queue = rl::Queue<Storage, 5>; /* upto 5 messages in 1 queue */
- Supervisor sup;
- int main(int, char **) {
- Board::init_start();
- Board::enable_timer();
- ROTOR_LIGHT_ENABLE_INTERRUPTS();
- while (true) {
- Queue queue;
- rl::Context context{&queue, nullptr, nullptr};
- /* setup */
- sup.bind(context);
- auto pinger = sup.get_child<0>();
- auto ponger = sup.get_child<1>();
- pinger->left = Board::samples;
- pinger->ponger_id = ponger->get_id();
- ponger->pinger_id = pinger->get_id();
- /* disable polling timer timer */
- sup.start(false);
- Board::toggle_led();
- sup.process();
- Board::toggle_led();
- sup.stop();
- sup.process();
- Board::delay();
- }
- }
|