radio_tool 0.2.1
Loading...
Searching...
No Matches
fw.hpp
1
18#pragma once
19
20#include <string>
21#include <vector>
22#include <iterator>
23
24namespace radio_tool::fw
25{
27 {
28 public:
29 FirmwareSegment(const uint16_t& idx, const uint32_t& addr, const uint32_t& size, const std::vector<uint8_t>::const_iterator& begin, const std::vector<uint8_t>::const_iterator& end)
30 : index(idx), address(addr), size(size), data(begin, end)
31 {
32 }
33
37 const uint16_t index;
38
42 const uint32_t address;
43
47 const uint32_t size;
48
52 const std::vector<uint8_t> data;
53 };
54
56 {
57 public:
58 virtual ~FirmwareSupport() = default;
59
63 virtual auto Read(const std::string& fw) -> void = 0;
64
68 virtual auto Write(const std::string& fw) -> void = 0;
69
73 virtual auto ToString() const->std::string = 0;
74
78 virtual auto GetRadioModel() const -> const std::string = 0;
79
83 virtual auto SetRadioModel(const std::string&) -> void = 0;
84
88 virtual auto Decrypt() -> void = 0;
89
93 virtual auto Encrypt() -> void = 0;
94
98 virtual auto IsCompatible(const FirmwareSupport* Other) const -> bool = 0;
99
103 auto GetData() const -> const std::vector<uint8_t>&
104 {
105 return data;
106 }
107
111 virtual auto GetDataSegments() const -> const std::vector<FirmwareSegment>
112 {
113 std::vector<FirmwareSegment> ret;
114
115 auto r_idx = 0u;
116 auto r_offset = 0u;
117 for (const auto& r : memory_ranges)
118 {
119 ret.push_back(FirmwareSegment(
120 r_idx++,
121 r.first,
122 r.second,
123 data.begin() + r_offset,
124 data.begin() + r_offset + r.second
125 ));
126 r_offset += r.second;
127 }
128
129 return ret;
130 }
131
137 virtual auto AppendSegment(const uint32_t& addr, const std::vector<uint8_t>& new_data) -> void
138 {
139 auto extra = align != 0 ? new_data.size() % align : 0;
140 auto new_size = new_data.size() + (extra > 0 ? align - extra : 0);
141 data.reserve(data.size() + new_size);
142 std::copy(new_data.begin(), new_data.end(), std::back_inserter(data));
143 if (extra > 0)
144 {
145 std::fill_n(std::back_inserter(data), align - extra, 0xff);
146 }
147 memory_ranges.push_back({ addr, new_size });
148 }
149
150 protected:
154 FirmwareSupport(const uint32_t& align = 0)
155 : align(align)
156 { }
157
161 const uint32_t align;
162
166 std::vector<uint8_t> data;
167
172 std::vector<std::pair<uint32_t, uint32_t>> memory_ranges;
173 };
174} // namespace radio_tool::fw
const uint32_t address
Definition: fw.hpp:42
const uint16_t index
Definition: fw.hpp:37
const uint32_t size
Definition: fw.hpp:47
const std::vector< uint8_t > data
Definition: fw.hpp:52
virtual auto IsCompatible(const FirmwareSupport *Other) const -> bool=0
FirmwareSupport(const uint32_t &align=0)
Definition: fw.hpp:154
virtual auto SetRadioModel(const std::string &) -> void=0
std::vector< uint8_t > data
Definition: fw.hpp:166
virtual auto Decrypt() -> void=0
virtual auto Encrypt() -> void=0
virtual auto AppendSegment(const uint32_t &addr, const std::vector< uint8_t > &new_data) -> void
Definition: fw.hpp:137
virtual auto GetRadioModel() const -> const std::string=0
auto GetData() const -> const std::vector< uint8_t > &
Definition: fw.hpp:103
std::vector< std::pair< uint32_t, uint32_t > > memory_ranges
Definition: fw.hpp:172
const uint32_t align
Definition: fw.hpp:161
virtual auto ToString() const -> std::string=0
virtual auto Write(const std::string &fw) -> void=0
virtual auto GetDataSegments() const -> const std::vector< FirmwareSegment >
Definition: fw.hpp:111
virtual auto Read(const std::string &fw) -> void=0