Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: UAVCAN UAVCAN_Subscriber
libuavcan/include/uavcan/transport/transfer.hpp@0:dfe6edabb8ec, 2018-04-14 (annotated)
- Committer:
- RuslanUrya
- Date:
- Sat Apr 14 10:25:32 2018 +0000
- Revision:
- 0:dfe6edabb8ec
Initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 |