diff --git a/protocol/esta/rdm/message.cpp b/protocol/esta/rdm/message.cpp index e128a41..37b04bc 100644 --- a/protocol/esta/rdm/message.cpp +++ b/protocol/esta/rdm/message.cpp @@ -233,8 +233,8 @@ void Message::writeDiscBranch(std::vector &data) const data.push_back(0xaa); //!< Preamble separator byte uint16_t sum = 0; - for ( const uint8_t& v : data_) - sum = addSum_(sum, v); + for (const auto &v : data_) + addSum_(sum, v); std::vector d = data_; writeType(d, sum); @@ -288,22 +288,22 @@ uint16_t Message::checksum() const { uint16_t sum = 0; - sum = addSum_(sum, SC_RDM); - sum = addSum_(sum, SC_SUB_MESSAGE); - sum = addSum_(sum, 24 + length()); - sum = addSum_(sum, source.manufacturer); - sum = addSum_(sum, source.device); - sum = addSum_(sum, destination.manufacturer); - sum = addSum_(sum, destination.device); - sum = addSum_(sum, transaction); - sum = addSum_(sum, portID); - sum = addSum_(sum, messageCount); - sum = addSum_(sum, subDevice); - sum = addSum_(sum, commandClass); - sum = addSum_(sum, parameterId); - sum = addSum_(sum, length()); - for (uint8_t val : data_) - sum = addSum_(sum, val); + addSum_(sum, SC_RDM); + addSum_(sum, SC_SUB_MESSAGE); + addSum_(sum, 24 + length()); + addSum_(sum, source.manufacturer); + addSum_(sum, source.device); + addSum_(sum, destination.manufacturer); + addSum_(sum, destination.device); + addSum_(sum, transaction); + addSum_(sum, portID); + addSum_(sum, messageCount); + addSum_(sum, subDevice); + addSum_(sum, commandClass); + addSum_(sum, parameterId); + addSum_(sum, length()); + for (const auto &val : data_) + addSum_(sum, val); return sum; } diff --git a/protocol/esta/rdm/message.h b/protocol/esta/rdm/message.h index 4cb286c..41bed83 100644 --- a/protocol/esta/rdm/message.h +++ b/protocol/esta/rdm/message.h @@ -124,23 +124,29 @@ public: // templates data.push_back(raw[i]); } +private: // templates + /** + * @brief addSum_ + * @param sum + * @param val + */ template - uint16_t addSum_(uint16_t sum, const T val) const + static void addSum_(uint16_t &sum, const T &val) { uint16_t carry; - auto raw = reinterpret_cast(&val); + auto raw = reinterpret_cast(val); for (int i = sizeof(T); --i >= 0; ) + { + auto num = raw[i]; + while (num != 0) { - uint8_t num = raw[i]; - while (num != 0) - { - carry = sum & num; - sum = sum ^ num; - num = carry << 1; - } + carry = sum & num; + sum = sum ^ num; + num = carry << 1; } - return sum; + } } + }; // struct Message