Advertisement
Guest User

Untitled

a guest
Dec 26th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #ifndef __MILSTD1553B_BSRT_MESSAGE_H__
  2. #define __MILSTD1553B_BSRT_MESSAGE_H__
  3.  
  4. #include <vector>
  5. #include <cstring>
  6.  
  7. #include "MILSTD1553B/Limits.h"
  8. #include "MILSTD1553B/StatusWord.h"
  9. #include "MILSTD1553B/BusControllerCommandWord.h"
  10.  
  11. namespace MILSTD1553B {
  12.     class BSRTMessage {
  13.     public:
  14.         constexpr static const std::size_t MaxPayloadSize {
  15.             DataSizeLimits<WordType>::max() - (CommandWordSize + StatusWordSize)
  16.         };
  17.     private:
  18.         BusControllerCommandWord _commandWord;
  19.         std::vector<WordType> _payload;
  20.         StatusWord _statusWord;
  21.     public:
  22.         BSRTMessage();
  23.         BSRTMessage(const char *data, const std::size_t dataSize);
  24.         bool isNull() const;
  25.         BusControllerCommandWord getCommandWord() const;
  26.         const WordType *getPayload() const;
  27.         StatusWord getStatusWord() const;
  28.  
  29.         void setCommandWord(const BusControllerCommandWord &value);
  30.         template<class InputIterator>
  31.         void setPayload(InputIterator first, InputIterator last) {
  32.             typedef typename std::iterator_traits<InputIterator>::value_type ValueType;
  33.             static_assert(std::is_same<ValueType, std::uint16_t>::value,
  34.                           "InputIterator value_type is not support!");
  35.  
  36.             auto distance = std::distance(first, last);
  37.             if (static_cast<std::size_t>(distance) > MaxPayloadSize) {
  38.                 return;
  39.             }
  40.  
  41.             if (!_payload.empty()) {
  42.                 _payload.clear();
  43.             }
  44.             _payload.reserve(distance);
  45.  
  46.             std::copy(first, last, std::back_inserter(_payload));
  47.         }
  48.  
  49.         void setPayload(const char *data, const std::size_t dataSize);
  50.         void setPayload(const std::initializer_list<std::uint16_t> &value);
  51.         void setStatusWord(const StatusWord &value);
  52.         bool fromRawData(const char *data, const std::size_t dataSize);
  53.         void toRawData(char *data);
  54.         void zeroing();
  55.         std::size_t getSize() const;
  56.     private:
  57.         std::uint16_t readWord(const char *data);
  58.         void writeWord(const std::uint16_t value, char *data);
  59.     }; // BSRTMessage
  60. } // MILSTD1553B
  61.  
  62. #endif // __MILSTD1553B_BSRT_MESSAGE_H__
  63.  
  64. #include "BSRTMessage.h"
  65.  
  66. using namespace MILSTD1553B;
  67.  
  68. BSRTMessage::BSRTMessage() {
  69.     _commandWord.zeroing();
  70.     _payload.clear();
  71.     _statusWord.zeroing();
  72. }
  73.  
  74. BSRTMessage::BSRTMessage(const char *data, const std::size_t dataSize) {
  75.     if (!fromRawData(data, dataSize)) {
  76.         zeroing();
  77.     }
  78. }
  79.  
  80. bool BSRTMessage::isNull() const {
  81.     return (!_commandWord.isValid() &&
  82.             _payload.empty() &&
  83.             !_statusWord.isValid());
  84. }
  85.  
  86. BusControllerCommandWord BSRTMessage::getCommandWord() const { return _commandWord; }
  87. const WordType *BSRTMessage::getPayload() const { return _payload.data(); }
  88. StatusWord BSRTMessage::getStatusWord() const { return _statusWord; }
  89.  
  90. void BSRTMessage::setCommandWord(const BusControllerCommandWord &value) {
  91.     if (!value.isValid()) {
  92.         return;
  93.     }
  94.  
  95.     _commandWord = value;
  96. }
  97.  
  98. void BSRTMessage::setPayload(const char *data, const std::size_t dataSize) {
  99.     if (data == nullptr) {
  100.         return;
  101.     }
  102.     if (dataSize > MaxPayloadSize) {
  103.         return;
  104.     }
  105.     if ((dataSize % WordSize) != 0) {
  106.         return;
  107.     }
  108.  
  109.     if (!_payload.empty()) {
  110.         _payload.clear();
  111.     }
  112.     _payload.reserve(dataSize / WordSize);
  113.  
  114.     const char *first = data;
  115.     const char *last  = data + dataSize;
  116.     std::uint16_t temp { 0 };
  117.     for ( ; first != last; first += WordSize) {
  118.         std::memcpy(std::addressof(temp), data, WordSize);
  119.         _payload.push_back(temp);
  120.     }
  121. }
  122.  
  123. void BSRTMessage::setPayload(const std::initializer_list<uint16_t> &value) {
  124.     setPayload(value.begin(), value.end());
  125. }
  126.  
  127. void BSRTMessage::setStatusWord(const StatusWord &value) {
  128.     if (!value.isValid()) {
  129.         return;
  130.     }
  131.  
  132.     _statusWord = value;
  133. }
  134.  
  135. bool BSRTMessage::fromRawData(const char *data, const std::size_t dataSize) {
  136.     if (data == nullptr) {
  137.         return false;
  138.     }
  139.     if (dataSize > DataSizeLimits<char>::max()) {
  140.         return false;
  141.     }
  142.     if ((dataSize % WordSize) != 0) {
  143.         return false;
  144.     }
  145.  
  146.     const char *pointer = data;
  147.     _commandWord = readWord(pointer);
  148.     if (!_commandWord.isValid()) {
  149.         return false;
  150.     }
  151.  
  152.     pointer += WordSize;
  153.  
  154.     if (!_payload.empty()) {
  155.         _payload.clear();
  156.     }
  157.     _payload.reserve(_commandWord.getDataWordCount());
  158.  
  159.     for (std::size_t counter = 0; counter < _commandWord.getDataWordCount(); ++counter) {
  160.         _payload.push_back(readWord(pointer));
  161.         pointer += WordSize;
  162.     }
  163.  
  164.     _statusWord = readWord(pointer);
  165.     if (!_statusWord.isValid()) {
  166.         return false;
  167.     }
  168.  
  169.     return true;
  170. }
  171.  
  172. void BSRTMessage::toRawData(char *data) {
  173.     if (data == nullptr) {
  174.         return;
  175.     }
  176.  
  177.     char *pointer = data;
  178.     writeWord(_commandWord, data);
  179.     pointer += WordSize;
  180.  
  181.     for (auto value : _payload) {
  182.         writeWord(value, pointer);
  183.         pointer += WordSize;
  184.     }
  185.  
  186.     writeWord(_statusWord, pointer);
  187. }
  188.  
  189. void BSRTMessage::zeroing() {
  190.     _commandWord.zeroing();
  191.     _payload.clear();
  192.     _statusWord.zeroing();
  193. }
  194.  
  195. std::size_t BSRTMessage::getSize() const {
  196.     return (CommandWordSize + StatusWordSize + _payload.size());
  197. }
  198.  
  199. uint16_t BSRTMessage::readWord(const char *data) {
  200.     if (data == nullptr) {
  201.         return 0;
  202.     }
  203.  
  204.     std::uint16_t result { 0 };
  205.     std::memcpy(std::addressof(result), data, WordSize);
  206.     return result;
  207. }
  208.  
  209. void BSRTMessage::writeWord(const uint16_t value, char *data) {
  210.     if (data == nullptr) {
  211.         return;
  212.     }
  213.  
  214.     std::memcpy(data, std::addressof(value), WordSize);
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement