transfer_receiver.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_TRANSPORT_TRANSFER_RECEIVER_HPP_INCLUDED
6 #define UAVCAN_TRANSPORT_TRANSFER_RECEIVER_HPP_INCLUDED
7 
8 #include <cstdlib>
12 
13 namespace uavcan
14 {
15 
17 {
18 public:
19  enum ResultCode { ResultNotComplete, ResultComplete, ResultSingleFrame };
20 
21  static const uint16_t MinTransferIntervalMSec = 1;
22  static const uint16_t MaxTransferIntervalMSec = 0xFFFF;
23  static const uint16_t DefaultTransferIntervalMSec = 1000;
24  static const uint16_t DefaultTidTimeoutMSec = 1000;
25 
27  {
28  return MonotonicDuration::fromMSec(DefaultTransferIntervalMSec);
29  }
30  static MonotonicDuration getMinTransferInterval() { return MonotonicDuration::fromMSec(MinTransferIntervalMSec); }
31  static MonotonicDuration getMaxTransferInterval() { return MonotonicDuration::fromMSec(MaxTransferIntervalMSec); }
32 
33 private:
34  enum { IfaceIndexNotSet = MaxCanIfaces };
35 
36  enum { ErrorCntMask = 31 };
37  enum { IfaceIndexMask = MaxCanIfaces };
38 
44 
46 
47  TransferID tid_; // 1 byte field
48 
49  // 1 byte aligned bitfields:
52  mutable uint8_t error_cnt_ : 5;
53 
54  bool isInitialized() const { return iface_index_ != IfaceIndexNotSet; }
55 
56  bool isMidTransfer() const { return buffer_write_pos_ > 0; }
57 
58  MonotonicDuration getIfaceSwitchDelay() const;
59  MonotonicDuration getTidTimeout() const;
60 
61  void registerError() const;
62 
63  void updateTransferTimings();
64  void prepareForNextTransfer();
65 
66  bool validate(const RxFrame& frame) const;
67  bool writePayload(const RxFrame& frame, ITransferBuffer& buf);
68  ResultCode receive(const RxFrame& frame, TransferBufferAccessor& tba);
69 
70 public:
72  transfer_interval_msec_(DefaultTransferIntervalMSec),
73  this_transfer_crc_(0),
74  buffer_write_pos_(0),
75  next_toggle_(false),
76  iface_index_(IfaceIndexNotSet),
77  error_cnt_(0)
78  { }
79 
80  bool isTimedOut(MonotonicTime current_ts) const;
81 
82  ResultCode addFrame(const RxFrame& frame, TransferBufferAccessor& tba);
83 
84  uint8_t yieldErrorCount();
85 
86  MonotonicTime getLastTransferTimestampMonotonic() const { return prev_transfer_ts_; }
87  UtcTime getLastTransferTimestampUtc() const { return first_frame_ts_; }
88 
89  uint16_t getLastTransferCrc() const { return this_transfer_crc_; }
90 
91  MonotonicDuration getInterval() const { return MonotonicDuration::fromMSec(transfer_interval_msec_); }
92 };
93 
94 }
95 
96 #endif // UAVCAN_TRANSPORT_TRANSFER_RECEIVER_HPP_INCLUDED
std::uint8_t uint8_t
Definition: std.hpp:24
static MonotonicDuration getDefaultTransferInterval()
ROSCPP_DECL bool validate(const std::string &name, std::string &error)
static MonotonicDuration getMinTransferInterval()
Implicitly convertible to/from uavcan.Timestamp.
Definition: time.hpp:191
static MonotonicDuration getMaxTransferInterval()
UtcTime getLastTransferTimestampUtc() const
uavcan::CanFrame frame
Definition: can.cpp:78
uint16_t getLastTransferCrc() const
std::uint16_t uint16_t
Definition: std.hpp:25
static MonotonicDuration fromMSec(int64_t ms)
Definition: time.hpp:41
MonotonicTime getLastTransferTimestampMonotonic() const
MonotonicDuration getInterval() const


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:40