Skip to content

File twai_transmitter.h

File List > espos_n2k > include > espos_n2k > twai_transmitter.h

Go to the documentation of this file

/* SPDX-FileCopyrightText: 2026 Dirk Wahrheit */
/* SPDX-License-Identifier: Apache-2.0 */
#ifndef COCKPIT_N2K_TWAI_TRANSMITTER_H_
#define COCKPIT_N2K_TWAI_TRANSMITTER_H_

#include <atomic>
#include <cstdint>

#include "esp_timer.h"

#include "espos_n2k/can_frame.h"

namespace espos_n2k {

class TwaiTransmitter {
 public:
  explicit TwaiTransmitter(size_t tx_queue_depth = 32);
  ~TwaiTransmitter();

  void start();
  void stop();

  void set(const CanMessage& msg);

  bool ever_transmitted() const {
    return last_tx_us_.load(std::memory_order_relaxed) != 0;
  }

  int64_t seconds_since_last_tx() const {
    int64_t last = last_tx_us_.load(std::memory_order_relaxed);
    if (last == 0) return INT64_MAX;
    return (esp_timer_get_time() - last) / 1000000;
  }

  uint32_t tx_fail_count() const { return tx_fail_count_; }

 private:
  size_t tx_queue_depth_;
  std::atomic<bool> running_{false};
  // Microseconds-since-boot of last successful TX; 0 = nothing yet.
  std::atomic<int64_t> last_tx_us_{0};
  std::atomic<uint32_t> tx_fail_count_{0};
};

}  // namespace espos_n2k

#endif  // COCKPIT_N2K_TWAI_TRANSMITTER_H_