radio_tool 0.2.1
Loading...
Searching...
No Matches
rdt_header.hpp
1
18#pragma once
19
20#include <vector>
21#include <fstream>
22#include <string>
23#include <tuple>
24
25#include <cstring>
26#include <stdint.h>
27
28using namespace std::literals::string_literals;
29
31{
32 const std::vector<std::tuple<std::string, uint32_t, uint32_t>> RadioConfigs = {
33 /* Radio, Timestamp, General */
34 { "DM-1701"s, 0x2001u, 0x2040u },
35 { "2017"s, 0x2001u, 0x2040u },
36 { "DR780"s, 0x2001u, 0x2040u }
37 };
38
39 enum class RDTType : uint8_t
40 {
41 Unknown = 0,
42 TYT = 1,
43 Anytone = 2
44 };
45
46 class RDTHeader
47 {
48 public:
49 auto Read(std::ifstream& i) -> void
50 {
51 magic.resize(0x05);
52 i.read((char*)magic.data(), 0x05);
53 i.read((char*)&n0, sizeof(uint8_t));
54 i.read((char*)&channel_offset, sizeof(uint32_t));
55 i.read((char*)&n1, sizeof(uint8_t));
56 target.resize(0x06);
57 i.read((char*)target.data(), 0x06);
58 i.read((char*)&n2, sizeof(uint8_t));
59 i.read((char*)&n3, sizeof(uint32_t));
60
61 target_name.resize(0xff);
62 i.read((char*)target_name.data(), 0xff);
63 target_name.resize(strlen(target_name.c_str()));
64
65 i.read((char*)&n4, sizeof(uint32_t));
66 i.read((char*)&n5, sizeof(uint32_t));
67 i.read((char*)&n6, sizeof(uint32_t));
68 i.read((char*)&n7, sizeof(uint32_t));
69
70 radio.resize(0x10);
71 i.read((char*)radio.data(), 0x10);
72 radio.resize(strlen(radio.c_str()));
73
74 i.read((char*)nz, sizeof(uint32_t) * 0x3c);
75 type = RDTType::TYT;
76 }
77
78 auto Validate() const -> bool
79 {
80 if("DfuSe"s != magic)
81 {
82 return false;
83 }
84 else if("Target"s != target)
85 {
86 return false;
87 }
88 return true;
89 }
90
91 auto GetTimestampOffset() const -> uint32_t
92 {
93 for(const auto& rx : RadioConfigs)
94 {
95 auto r = std::get<0>(rx);
96 auto o = std::get<1>(rx);
97
98 if(r == radio)
99 {
100 return o;
101 }
102 }
103 return 0x2001u; //default
104 }
105
106 auto GetGeneralOffset() const -> uint32_t
107 {
108 for(const auto& rx : RadioConfigs)
109 {
110 auto r = std::get<0>(rx);
111 auto o = std::get<2>(rx);
112
113 if(r == radio)
114 {
115 return o;
116 }
117 }
118 return 0x2040u; //default
119 }
120
121 RDTType type;
122 std::string magic; //0x05
123 uint8_t n0;
124 uint32_t channel_offset; // +0x100
125 uint8_t n1;
126 std::string target; //0x06
127 uint8_t n2;
128 uint32_t n3;
129 std::string target_name; // 0xff
130 uint32_t n4;
131 uint32_t n5;
132 uint32_t n6;
133 uint32_t n7;
134 std::string radio; //0x10
135 uint32_t nz[0x3c];
136 };
137}