Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 /*
RuslanUrya 0:dfe6edabb8ec 2 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
RuslanUrya 0:dfe6edabb8ec 3 */
RuslanUrya 0:dfe6edabb8ec 4
RuslanUrya 0:dfe6edabb8ec 5 #ifndef UAVCAN_TRANSPORT_TRANSFER_HPP_INCLUDED
RuslanUrya 0:dfe6edabb8ec 6 #define UAVCAN_TRANSPORT_TRANSFER_HPP_INCLUDED
RuslanUrya 0:dfe6edabb8ec 7
RuslanUrya 0:dfe6edabb8ec 8 #include <cassert>
RuslanUrya 0:dfe6edabb8ec 9 #include <uavcan/build_config.hpp>
RuslanUrya 0:dfe6edabb8ec 10 #include <uavcan/util/templates.hpp>
RuslanUrya 0:dfe6edabb8ec 11 #include <uavcan/std.hpp>
RuslanUrya 0:dfe6edabb8ec 12
RuslanUrya 0:dfe6edabb8ec 13 namespace uavcan
RuslanUrya 0:dfe6edabb8ec 14 {
RuslanUrya 0:dfe6edabb8ec 15
RuslanUrya 0:dfe6edabb8ec 16 static const unsigned GuaranteedPayloadLenPerFrame = 7; ///< Guaranteed for all transfers, all CAN standards
RuslanUrya 0:dfe6edabb8ec 17
RuslanUrya 0:dfe6edabb8ec 18 enum TransferType
RuslanUrya 0:dfe6edabb8ec 19 {
RuslanUrya 0:dfe6edabb8ec 20 TransferTypeServiceResponse = 0,
RuslanUrya 0:dfe6edabb8ec 21 TransferTypeServiceRequest = 1,
RuslanUrya 0:dfe6edabb8ec 22 TransferTypeMessageBroadcast = 2
RuslanUrya 0:dfe6edabb8ec 23 };
RuslanUrya 0:dfe6edabb8ec 24
RuslanUrya 0:dfe6edabb8ec 25 static const uint8_t NumTransferTypes = 3;
RuslanUrya 0:dfe6edabb8ec 26
RuslanUrya 0:dfe6edabb8ec 27
RuslanUrya 0:dfe6edabb8ec 28 class UAVCAN_EXPORT TransferPriority
RuslanUrya 0:dfe6edabb8ec 29 {
RuslanUrya 0:dfe6edabb8ec 30 uint8_t value_;
RuslanUrya 0:dfe6edabb8ec 31
RuslanUrya 0:dfe6edabb8ec 32 public:
RuslanUrya 0:dfe6edabb8ec 33 static const uint8_t BitLen = 5U;
RuslanUrya 0:dfe6edabb8ec 34 static const uint8_t NumericallyMax = (1U << BitLen) - 1;
RuslanUrya 0:dfe6edabb8ec 35 static const uint8_t NumericallyMin = 0;
RuslanUrya 0:dfe6edabb8ec 36
RuslanUrya 0:dfe6edabb8ec 37 /// This priority is used by default
RuslanUrya 0:dfe6edabb8ec 38 static const TransferPriority Default;
RuslanUrya 0:dfe6edabb8ec 39 static const TransferPriority MiddleLower;
RuslanUrya 0:dfe6edabb8ec 40 static const TransferPriority OneHigherThanLowest;
RuslanUrya 0:dfe6edabb8ec 41 static const TransferPriority OneLowerThanHighest;
RuslanUrya 0:dfe6edabb8ec 42 static const TransferPriority Lowest;
RuslanUrya 0:dfe6edabb8ec 43
RuslanUrya 0:dfe6edabb8ec 44 TransferPriority() : value_(0xFF) { }
RuslanUrya 0:dfe6edabb8ec 45
RuslanUrya 0:dfe6edabb8ec 46 TransferPriority(uint8_t value) // Implicit
RuslanUrya 0:dfe6edabb8ec 47 : value_(value)
RuslanUrya 0:dfe6edabb8ec 48 {
RuslanUrya 0:dfe6edabb8ec 49 UAVCAN_ASSERT(isValid());
RuslanUrya 0:dfe6edabb8ec 50 }
RuslanUrya 0:dfe6edabb8ec 51
RuslanUrya 0:dfe6edabb8ec 52 template <uint8_t Percent>
RuslanUrya 0:dfe6edabb8ec 53 static TransferPriority fromPercent()
RuslanUrya 0:dfe6edabb8ec 54 {
RuslanUrya 0:dfe6edabb8ec 55 StaticAssert<(Percent <= 100)>::check();
RuslanUrya 0:dfe6edabb8ec 56 enum { Result = ((100U - Percent) * NumericallyMax) / 100U };
RuslanUrya 0:dfe6edabb8ec 57 StaticAssert<(Result <= NumericallyMax)>::check();
RuslanUrya 0:dfe6edabb8ec 58 StaticAssert<(Result >= NumericallyMin)>::check();
RuslanUrya 0:dfe6edabb8ec 59 return TransferPriority(Result);
RuslanUrya 0:dfe6edabb8ec 60 }
RuslanUrya 0:dfe6edabb8ec 61
RuslanUrya 0:dfe6edabb8ec 62 uint8_t get() const { return value_; }
RuslanUrya 0:dfe6edabb8ec 63
RuslanUrya 0:dfe6edabb8ec 64 bool isValid() const { return value_ < (1U << BitLen); }
RuslanUrya 0:dfe6edabb8ec 65
RuslanUrya 0:dfe6edabb8ec 66 bool operator!=(TransferPriority rhs) const { return value_ != rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 67 bool operator==(TransferPriority rhs) const { return value_ == rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 68 };
RuslanUrya 0:dfe6edabb8ec 69
RuslanUrya 0:dfe6edabb8ec 70
RuslanUrya 0:dfe6edabb8ec 71 class UAVCAN_EXPORT TransferID
RuslanUrya 0:dfe6edabb8ec 72 {
RuslanUrya 0:dfe6edabb8ec 73 uint8_t value_;
RuslanUrya 0:dfe6edabb8ec 74
RuslanUrya 0:dfe6edabb8ec 75 public:
RuslanUrya 0:dfe6edabb8ec 76 static const uint8_t BitLen = 5U;
RuslanUrya 0:dfe6edabb8ec 77 static const uint8_t Max = (1U << BitLen) - 1U;
RuslanUrya 0:dfe6edabb8ec 78 static const uint8_t Half = (1U << BitLen) / 2U;
RuslanUrya 0:dfe6edabb8ec 79
RuslanUrya 0:dfe6edabb8ec 80 TransferID()
RuslanUrya 0:dfe6edabb8ec 81 : value_(0)
RuslanUrya 0:dfe6edabb8ec 82 { }
RuslanUrya 0:dfe6edabb8ec 83
RuslanUrya 0:dfe6edabb8ec 84 TransferID(uint8_t value) // implicit
RuslanUrya 0:dfe6edabb8ec 85 : value_(value)
RuslanUrya 0:dfe6edabb8ec 86 {
RuslanUrya 0:dfe6edabb8ec 87 value_ &= Max;
RuslanUrya 0:dfe6edabb8ec 88 UAVCAN_ASSERT(value == value_);
RuslanUrya 0:dfe6edabb8ec 89 }
RuslanUrya 0:dfe6edabb8ec 90
RuslanUrya 0:dfe6edabb8ec 91 bool operator!=(TransferID rhs) const { return !operator==(rhs); }
RuslanUrya 0:dfe6edabb8ec 92 bool operator==(TransferID rhs) const { return get() == rhs.get(); }
RuslanUrya 0:dfe6edabb8ec 93
RuslanUrya 0:dfe6edabb8ec 94 void increment()
RuslanUrya 0:dfe6edabb8ec 95 {
RuslanUrya 0:dfe6edabb8ec 96 value_ = (value_ + 1) & Max;
RuslanUrya 0:dfe6edabb8ec 97 }
RuslanUrya 0:dfe6edabb8ec 98
RuslanUrya 0:dfe6edabb8ec 99 uint8_t get() const
RuslanUrya 0:dfe6edabb8ec 100 {
RuslanUrya 0:dfe6edabb8ec 101 UAVCAN_ASSERT(value_ <= Max);
RuslanUrya 0:dfe6edabb8ec 102 return value_;
RuslanUrya 0:dfe6edabb8ec 103 }
RuslanUrya 0:dfe6edabb8ec 104
RuslanUrya 0:dfe6edabb8ec 105 /**
RuslanUrya 0:dfe6edabb8ec 106 * Amount of increment() calls to reach rhs value.
RuslanUrya 0:dfe6edabb8ec 107 */
RuslanUrya 0:dfe6edabb8ec 108 int computeForwardDistance(TransferID rhs) const;
RuslanUrya 0:dfe6edabb8ec 109 };
RuslanUrya 0:dfe6edabb8ec 110
RuslanUrya 0:dfe6edabb8ec 111
RuslanUrya 0:dfe6edabb8ec 112 class UAVCAN_EXPORT NodeID
RuslanUrya 0:dfe6edabb8ec 113 {
RuslanUrya 0:dfe6edabb8ec 114 static const uint8_t ValueBroadcast = 0;
RuslanUrya 0:dfe6edabb8ec 115 static const uint8_t ValueInvalid = 0xFF;
RuslanUrya 0:dfe6edabb8ec 116 uint8_t value_;
RuslanUrya 0:dfe6edabb8ec 117
RuslanUrya 0:dfe6edabb8ec 118 public:
RuslanUrya 0:dfe6edabb8ec 119 static const uint8_t BitLen = 7U;
RuslanUrya 0:dfe6edabb8ec 120 static const uint8_t Max = (1U << BitLen) - 1U;
RuslanUrya 0:dfe6edabb8ec 121 static const uint8_t MaxRecommendedForRegularNodes = Max - 2;
RuslanUrya 0:dfe6edabb8ec 122 static const NodeID Broadcast;
RuslanUrya 0:dfe6edabb8ec 123
RuslanUrya 0:dfe6edabb8ec 124 NodeID() : value_(ValueInvalid) { }
RuslanUrya 0:dfe6edabb8ec 125
RuslanUrya 0:dfe6edabb8ec 126 NodeID(uint8_t value) // Implicit
RuslanUrya 0:dfe6edabb8ec 127 : value_(value)
RuslanUrya 0:dfe6edabb8ec 128 {
RuslanUrya 0:dfe6edabb8ec 129 UAVCAN_ASSERT(isValid());
RuslanUrya 0:dfe6edabb8ec 130 }
RuslanUrya 0:dfe6edabb8ec 131
RuslanUrya 0:dfe6edabb8ec 132 uint8_t get() const { return value_; }
RuslanUrya 0:dfe6edabb8ec 133
RuslanUrya 0:dfe6edabb8ec 134 bool isValid() const { return value_ <= Max; }
RuslanUrya 0:dfe6edabb8ec 135 bool isBroadcast() const { return value_ == ValueBroadcast; }
RuslanUrya 0:dfe6edabb8ec 136 bool isUnicast() const { return (value_ <= Max) && (value_ != ValueBroadcast); }
RuslanUrya 0:dfe6edabb8ec 137
RuslanUrya 0:dfe6edabb8ec 138 bool operator!=(NodeID rhs) const { return !operator==(rhs); }
RuslanUrya 0:dfe6edabb8ec 139 bool operator==(NodeID rhs) const { return value_ == rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 140
RuslanUrya 0:dfe6edabb8ec 141 bool operator<(NodeID rhs) const { return value_ < rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 142 bool operator>(NodeID rhs) const { return value_ > rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 143 bool operator<=(NodeID rhs) const { return value_ <= rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 144 bool operator>=(NodeID rhs) const { return value_ >= rhs.value_; }
RuslanUrya 0:dfe6edabb8ec 145 };
RuslanUrya 0:dfe6edabb8ec 146
RuslanUrya 0:dfe6edabb8ec 147 }
RuslanUrya 0:dfe6edabb8ec 148
RuslanUrya 0:dfe6edabb8ec 149 #endif // UAVCAN_TRANSPORT_TRANSFER_HPP_INCLUDED