radio_tool 0.2.1
Loading...
Searching...
No Matches
tyt_radio.cpp
1
18#include <radio_tool/radio/tyt_radio.hpp>
19#include <radio_tool/dfu/dfu.hpp>
20#include <radio_tool/dfu/tyt_dfu.hpp>
21#include <radio_tool/fw/tyt_fw.hpp>
22#include <radio_tool/util/flash.hpp>
23
24#include <math.h>
25#include <iomanip>
26#include <iostream>
27#include <vector>
28
29using namespace radio_tool::radio;
30
31auto TYTRadio::ToString() const -> const std::string
32{
33 std::stringstream out;
34
35 auto model = dfu.IdentifyDevice();
36 auto time = dfu.GetTime();
37
38 out << "== TYT Radio Info ==" << std::endl
39 << "Radio: " << model << std::endl
40 << "RTC: " << (time == -1 ? "N/A" : ctime(&time));
41
42 return out.str();
43}
44
45auto TYTRadio::WriteFirmware(const std::string& file) -> void
46{
47 constexpr auto TransferSize = 1024u;
48
49 auto fw = fw::TYTFW();
50 fw.Read(file);
51
52 auto dfu = this->dfu;
53 dfu.SendTYTCommand(dfu::TYTCommand::FirmwareUpgrade);
54 for (auto& r : fw.GetDataSegments())
55 {
57 [&dfu](const uint32_t& addr, const uint32_t& size, const flash::FlashSector& sector) {
58 std::cerr << "Erasing: 0x" << std::setw(8) << std::setfill('0') << std::hex << addr
59 << " [Size=0x" << std::hex << size << "]" << std::endl
60 << "-- " << sector.ToString() << std::endl;
61
62 dfu.Erase(addr);
63 });
64
65 auto b_offset = 0u;
67 [&dfu, &r, &TransferSize, &b_offset](const uint32_t& addr, const uint32_t& size, const flash::FlashSector&) {
68 const auto& binary_data = r.data;
69 const auto blocks = (int)ceil(size / (double)TransferSize);
70
71 std::cerr << "Writing: 0x" << std::setw(8) << std::setfill('0') << std::hex << addr
72 << " [Size=0x" << std::hex << size << "]" << std::endl;
73 dfu.SetAddress(addr);
74 for (auto wValue = 0; wValue < blocks; wValue++)
75 {
76 auto block_offset = b_offset + (TransferSize * wValue);
77 auto to_write = std::vector<uint8_t>(
78 binary_data.begin() + block_offset,
79 binary_data.begin() + block_offset + std::min(TransferSize, r.size - block_offset)
80 );
81
82 /*std::cerr
83 << "-- wValue=0x" << std::setw(2) << std::setfill('0') << std::hex << (2 + wValue)
84 << ", Size=0x" << to_write.size()
85 << std::endl;*/
86 dfu.Download(to_write, 2 + wValue);
87 }
88 b_offset += size;
89 });
90 }
91}
auto GetTime() const -> time_t
Definition: tyt_dfu.cpp:43
auto IdentifyDevice() const -> std::string
Definition: tyt_dfu.cpp:26
static auto AlignedContiguousMemoryOp(const FlashMap &map, const uint32_t &start, const uint32_t &end, const std::function< void(const uint32_t &, const uint32_t &, const FlashSector &)> &fnOp) -> void
Definition: flash.hpp:119
auto ToString() const -> const std::string override
Definition: tyt_radio.cpp:31
auto WriteFirmware(const std::string &file) -> void override
Definition: tyt_radio.cpp:45
const FlashMap STM32F40X
Definition: flash.hpp:143