/* TUYA MODULE Copyright (C) 2019 by Maxim Prokhorov */ #pragma once #include #include #include "tuya_types.h" #include "tuya_transport.h" namespace Tuya { class DataFrame { public: using container = std::vector; using const_iterator = container::const_iterator; DataFrame(DataFrame& rhs) = delete; ~DataFrame() = default; DataFrame(DataFrame&& rhs) = default; DataFrame(uint8_t command) : command(command), length(0) {} DataFrame(Command command) : DataFrame(static_cast(command)) {} DataFrame(Command command, uint16_t length, const const_iterator begin, const const_iterator end) : command(static_cast(command)), length(length), _begin(begin), _end(end) {} DataFrame(uint8_t version, uint8_t command, uint16_t length, const const_iterator begin, const const_iterator end) : version(version), command(command), length(length), _begin(begin), _end(end) {} DataFrame(Command command, std::initializer_list data) : command(static_cast(command)), length(data.size()), _data(data), _begin(_data.cbegin()), _end(_data.cend()) {} DataFrame(Command command, std::vector&& data) : command(static_cast(command)), length(data.size()), _data(std::move(data)), _begin(_data.cbegin()), _end(_data.cend()) {} DataFrame(const_iterator iter) : version(iter[2]), command(iter[3]), length((iter[4] << 8) + iter[5]), _begin(iter + 6), _end(iter + 6 + length) {} DataFrame(const Transport& input) : DataFrame(input.cbegin()) {} bool commandEquals(Command command) const { return (static_cast(command) == this->command); } const_iterator cbegin() const { return _begin; }; const_iterator cend() const { return _end; }; uint8_t operator[](size_t i) const { if (!length) return 0; return _begin[i]; } container serialize() const { container result; result.reserve(6 + length); result.assign({ version, command, uint8_t(length >> 8), uint8_t(length & 0xff) }); if (length && (_begin != _end)) { result.insert(result.end(), _begin, _end); } return result; } uint8_t version = 0; uint8_t command = 0; uint16_t length = 0; protected: container _data; const_iterator _begin; const_iterator _end; }; }