libdrmconf 0.14.1
A library to program DMR radios.
Loading...
Searching...
No Matches
dm32uv_interface.hh
1#ifndef DM32UVINTERFACE_HH
2#define DM32UVINTERFACE_HH
3
4#include "usbserial.hh"
5#include <QObject>
6#include "dm32uv.hh"
7
8
16{
17 Q_OBJECT
18
19protected:
21 struct Q_PACKED DeviceDetectionRequest {
23 const char payload[7] = {'P','S','E','A','R','C','H'};
24
26 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
27 };
28
30 struct Q_PACKED DeviceDetectionResponse {
32 uint8_t result;
34 char payload[7];
35
37 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
39 QString identifier() const;
40 };
41
42
44 struct Q_PACKED PasswordRequest {
46 const char payload[7] = {'P', 'A', 'S', 'S', 'S', 'T', 'A'};
47
49 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
50 };
51
53 struct Q_PACKED PasswordResponse {
55 uint8_t result;
57 uint16_t code;
58
60 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
61 };
62
63
65 struct Q_PACKED SysinfoRequest {
67 const char payload[7] = {'S','Y','S','I','N','F','O'};
68
70 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
71 };
72
74 struct Q_PACKED ACKResponse {
76 uint8_t result;
77
79 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
80 };
81
82
85 struct Q_PACKED ValueRequest {
87 enum class ValueId{
88 FirmwareVersion = 0x1, BuildDate = 0x3, MainConfigMemory = 0xa, CallSignDBMemory = 0xf
89 };
90
91 const char request_type = 'V';
93 const uint8_t unused[3] = {0x00, 0x00, 0x00};
95 uint8_t valueId;
96
100 explicit ValueRequest(uint8_t valueId);
101
103 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
104 };
105
107 struct Q_PACKED ValueResponse {
111 uint8_t valueId;
113 uint8_t length;
114 union {
116 struct {
118 uint32_t lower;
120 uint32_t upper;
121 } memory;
122 // Raw payload.
123 uint8_t payload[255];
124 };
125
127 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
129 QString string() const;
131 uint32_t lowerMemoryBound() const;
133 uint32_t upperMemoryBound() const;
134 };
135
136
138 struct Q_PACKED EnterProgramModeRequest {
140 const char payload[12] = {
141 '\xff', '\xff', '\xff', '\xff', '\x0c',
142 'P','R','O','G','R','A','M'
143 };
144
146 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
147 };
148
149
151 struct Q_PACKED Unknown02Request {
153 const char payload[1] {'\x02'};
154
156 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
157 };
158
160 struct Q_PACKED Unknown02Response {
162 char payload[8];
163
165 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
166 };
167
168
170 struct Q_PACKED PingRequest {
172 const char payload[1] = {'\x06'};
173
175 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
176 };
177
178
180 struct Q_PACKED ReadRequest {
182 const char request_type = 'R';
184 uint8_t address[3];
186 uint16_t length;
187
189 ReadRequest(uint32_t address, uint16_t length);
191 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
192 };
193
195 struct Q_PACKED ReadResponse {
197 const char response_type = 'W';
199 uint8_t _address[3];
201 uint16_t _length;
203 uint8_t _payload[4096];
204
206 uint32_t address() const;
208 uint16_t length() const;
210 QByteArray payload() const;
211
213 bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack());
214 };
215
216
218 struct Q_PACKED WriteRequest {
220 const char request_type = 'W';
222 uint8_t _address[3];
224 uint16_t _length;
226 uint8_t _payload[4096];
227
229 WriteRequest(uint32_t address, const QByteArray &payload);
231 bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const;
232 };
233
234
235protected:
237 enum class State {
238 Closed, Open, Connected, SystemInfo, Program, Error
239 };
240
241public:
244 explicit DM32UVInterface(const USBDeviceDescriptor &descr,
245 const ErrorStack &err=ErrorStack(), QObject *parent=nullptr);
246
248 RadioInfo identifier(const ErrorStack &err=ErrorStack()) override;
249
252 void (*progress)(unsigned int percent)=nullptr);
253
254 bool read_start(uint32_t bank, uint32_t address, const ErrorStack &err=ErrorStack()) override;
255 bool read(uint32_t bank, uint32_t address, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack()) override;
256 bool read_finish(const ErrorStack &err=ErrorStack()) override;
257
258 bool write_start(uint32_t bank, uint32_t address, const ErrorStack &err=ErrorStack()) override;
259 bool write(uint32_t bank, uint32_t address, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack()) override;
260 bool write_finish(const ErrorStack &err=ErrorStack()) override;
261
262public:
266 static QList<USBDeviceDescriptor> detect(bool saveOnly=true);
267
268protected:
269 /*** Identifies the radio. */
270 bool request_identifier(const ErrorStack &err = ErrorStack());
272 bool enter_program_mode(const ErrorStack &err = ErrorStack());
274 template<class Request, class Response>
275 bool sendReceive(const Request &req, Response &res, const ErrorStack &err=ErrorStack()) {
276 if (! req.send(this, err))
277 return false;
278 return res.receive(this, err);
279 }
280
281 bool send(const char *data, qint64 n, int timeout, const ErrorStack &err=ErrorStack());
283 bool receive(char *data, qint64 n, int timeout, const ErrorStack &err=ErrorStack());
284
285protected:
293 QPair<uint32_t, uint32_t> _codeplugMemory;
295 QPair<uint32_t, uint32_t> _callsignMemory;
296};
297
298#endif // DM32UVINTERFACE_HH
Interface to Baofeng Dm-32UV devices.
Definition dm32uv_interface.hh:16
State _state
Current state, the interface is in.
Definition dm32uv_interface.hh:287
bool getAddressMap(DM32UV::AddressMap &map, const ErrorStack &err=ErrorStack(), void(*progress)(unsigned int percent)=nullptr)
Reads the obfuscation address map from the device.
Definition dm32uv_interface.cc:302
bool receive(char *data, qint64 n, int timeout, const ErrorStack &err=ErrorStack())
Receives some data.
Definition dm32uv_interface.cc:610
static USBDeviceInfo interfaceInfo()
Returns some information about this interface.
Definition dm32uv_interface.cc:463
bool send(const char *data, qint64 n, int timeout, const ErrorStack &err=ErrorStack())
Send some data.
Definition dm32uv_interface.cc:591
RadioInfo identifier(const ErrorStack &err=ErrorStack()) override
Returns the radio info, after identifying the radio.
Definition dm32uv_interface.cc:289
QString _firmwareVersion
Firmware version string.
Definition dm32uv_interface.hh:291
QPair< uint32_t, uint32_t > _callsignMemory
Callsign memory range.
Definition dm32uv_interface.hh:295
bool read_start(uint32_t bank, uint32_t address, const ErrorStack &err=ErrorStack()) override
Starts the read process from the specified bank and at the given address.
Definition dm32uv_interface.cc:343
RadioInfo _info
Radio info, identifying the radio.
Definition dm32uv_interface.hh:289
bool read_finish(const ErrorStack &err=ErrorStack()) override
This function ends a series of read operations.
Definition dm32uv_interface.cc:396
DM32UVInterface(const USBDeviceDescriptor &descr, const ErrorStack &err=ErrorStack(), QObject *parent=nullptr)
Constructs a new DM32UV interface for the given USB descriptor.
Definition dm32uv_interface.cc:273
State
Possible states, the interface might be in.
Definition dm32uv_interface.hh:237
bool enter_program_mode(const ErrorStack &err=ErrorStack())
Enters program mode.
Definition dm32uv_interface.cc:559
bool write_finish(const ErrorStack &err=ErrorStack()) override
This function ends a series of write operations.
Definition dm32uv_interface.cc:455
bool write_start(uint32_t bank, uint32_t address, const ErrorStack &err=ErrorStack()) override
Starts the write process into the specified bank and at the given address.
Definition dm32uv_interface.cc:404
bool sendReceive(const Request &req, Response &res, const ErrorStack &err=ErrorStack())
Helper function to send a request and receives the associated response.
Definition dm32uv_interface.hh:275
bool write(uint32_t bank, uint32_t address, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack()) override
Writes a chunk of data at the address addr.
Definition dm32uv_interface.cc:420
QPair< uint32_t, uint32_t > _codeplugMemory
Codeplug memory range.
Definition dm32uv_interface.hh:293
bool read(uint32_t bank, uint32_t address, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack()) override
Reads a chunk of data from the block-address bno (block number).
Definition dm32uv_interface.cc:359
Implements a memory map between physical and virtual codeplug addresses.
Definition dm32uv.hh:26
Implements a stack of error messages to provide a pretty formatted error traceback.
Definition errorstack.hh:43
Provides some information about a radio model.
Definition radioinfo.hh:16
Base class for all radio interface descriptors representing a unique interface to a connected radio.
Definition usbdevice.hh:197
Generic information about a possible radio interface.
Definition usbdevice.hh:121
USBSerial(const USBDeviceDescriptor &descriptor, QSerialPort::BaudRate rate=QSerialPort::Baud115200, const ErrorStack &err=ErrorStack(), QObject *parent=nullptr)
Constructs an opens new serial interface to the devices identified by the given vendor and product ID...
Definition usbserial.cc:19
static QList< USBDeviceDescriptor > detect()
Searches for all USB serial ports.
Definition usbserial.cc:133
System info response.
Definition dm32uv_interface.hh:74
bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack())
Receive response though the given interface.
Definition dm32uv_interface.cc:85
uint8_t result
Response result code.
Definition dm32uv_interface.hh:76
Device detection request.
Definition dm32uv_interface.hh:21
const char payload[7]
Request content.
Definition dm32uv_interface.hh:23
Device detection response.
Definition dm32uv_interface.hh:30
uint8_t result
Result flag.
Definition dm32uv_interface.hh:32
char payload[7]
Response payload.
Definition dm32uv_interface.hh:34
bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack())
Receive response though the given interface.
Definition dm32uv_interface.cc:24
QString identifier() const
Extracts the identifier from the response payload.
Definition dm32uv_interface.cc:41
Enter program mode request.
Definition dm32uv_interface.hh:138
const char payload[12]
Request content.
Definition dm32uv_interface.hh:140
Password request.
Definition dm32uv_interface.hh:44
const char payload[7]
Request content.
Definition dm32uv_interface.hh:46
Passwort response.
Definition dm32uv_interface.hh:53
uint16_t code
Some unknown data.
Definition dm32uv_interface.hh:57
uint8_t result
Response result code.
Definition dm32uv_interface.hh:55
bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack())
Receive response though the given interface.
Definition dm32uv_interface.cc:58
Ping request.
Definition dm32uv_interface.hh:170
const char payload[1]
Request content.
Definition dm32uv_interface.hh:172
ReadRequest(uint32_t address, uint16_t length)
Constructs a read request for the given address and length.
Definition dm32uv_interface.cc:196
const char request_type
Static request type.
Definition dm32uv_interface.hh:182
bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const
Send request though the given interface.
Definition dm32uv_interface.cc:205
uint8_t address[3]
24bit little endian address.
Definition dm32uv_interface.hh:184
uint16_t length
16bit little endian length.
Definition dm32uv_interface.hh:186
Read response.
Definition dm32uv_interface.hh:195
uint32_t address() const
Unpacks the address.
Definition dm32uv_interface.cc:234
QByteArray payload() const
Returns the payload as byte array.
Definition dm32uv_interface.cc:246
uint16_t length() const
Unpacks the length.
Definition dm32uv_interface.cc:241
bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack())
Receive response though the given interface.
Definition dm32uv_interface.cc:213
uint8_t _payload[4096]
Payload of upto 4096 bytes.
Definition dm32uv_interface.hh:203
const char response_type
Static respone type field.
Definition dm32uv_interface.hh:197
uint8_t _address[3]
24bit little endian address.
Definition dm32uv_interface.hh:199
uint16_t _length
16bit payload length.
Definition dm32uv_interface.hh:201
System info request.
Definition dm32uv_interface.hh:65
const char payload[7]
Request content.
Definition dm32uv_interface.hh:67
Unkown 02h request.
Definition dm32uv_interface.hh:151
const char payload[1]
Request content.
Definition dm32uv_interface.hh:153
Unknown 02h response.
Definition dm32uv_interface.hh:160
char payload[8]
Some unknown response payload.
Definition dm32uv_interface.hh:162
bool receive(DM32UVInterface *dev, const ErrorStack &err=ErrorStack())
Receive response though the given interface.
Definition dm32uv_interface.cc:179
bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const
Send request though the given interface.
Definition dm32uv_interface.cc:114
uint8_t valueId
The value ID to read.
Definition dm32uv_interface.hh:95
ValueRequest(ValueId valueId)
Constructor from value ID.
Definition dm32uv_interface.cc:101
const char request_type
Static request type.
Definition dm32uv_interface.hh:91
ValueId
Some possible value IDs.
Definition dm32uv_interface.hh:87
const uint8_t unused[3]
Some unknown fields.
Definition dm32uv_interface.hh:93
Value response.
Definition dm32uv_interface.hh:107
uint8_t length
THe length of the payload.
Definition dm32uv_interface.hh:113
uint32_t lower
Lower bound in little endian.
Definition dm32uv_interface.hh:118
char response_type
The received response code, should be 'V'.
Definition dm32uv_interface.hh:109
uint8_t valueId
The value ID read.
Definition dm32uv_interface.hh:111
uint32_t upper
Upper bound (inclusive) in little endian.
Definition dm32uv_interface.hh:120
WriteRequest(uint32_t address, const QByteArray &payload)
Constructs a new write request to the given address with the given payload.
Definition dm32uv_interface.cc:254
uint8_t _address[3]
Encodes the 24bit address in little endian.
Definition dm32uv_interface.hh:222
bool send(DM32UVInterface *dev, const ErrorStack &err=ErrorStack()) const
Send request though the given interface.
Definition dm32uv_interface.cc:264
const char request_type
Static request type field.
Definition dm32uv_interface.hh:220
uint16_t _length
Encodes the 16bit length in little endian.
Definition dm32uv_interface.hh:224
uint8_t _payload[4096]
Holds the payload.
Definition dm32uv_interface.hh:226