libdrmconf 0.14.1
A library to program DMR radios.
Loading...
Searching...
No Matches
anytone_interface.hh
1#ifndef ANYTONEINTERFACE_HH
2#define ANYTONEINTERFACE_HH
3
4#include "usbserial.hh"
5
15{
16 Q_OBJECT
17
18public:
20 struct RadioVariant {
22 QString name;
24 char bands;
26 QString version;
27
31 bool isValid() const;
32 };
33
34public:
37 explicit AnytoneInterface(const USBDeviceDescriptor &descriptor,
38 const ErrorStack &err=ErrorStack(), QObject *parent=nullptr);
40 virtual ~AnytoneInterface();
41
43 void close();
44
47 bool getInfo(RadioVariant &info);
48
49 bool read_start(uint32_t bank, uint32_t addr, const ErrorStack &err=ErrorStack());
50 bool read(uint32_t bank, uint32_t addr, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack());
51 bool read_finish(const ErrorStack &err=ErrorStack());
52
53 bool write_start(uint32_t bank, uint32_t addr, const ErrorStack &err=ErrorStack());
54 bool write(uint32_t bank, uint32_t addr, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack());
55 bool write_finish(const ErrorStack &err=ErrorStack());
56
57 bool reboot(const ErrorStack &err=ErrorStack());
58
59protected:
61 bool enter_program_mode(const ErrorStack &err=ErrorStack());
63 bool request_identifier(RadioVariant &info, const ErrorStack &err=ErrorStack());
65 bool leave_program_mode(const ErrorStack &err=ErrorStack());
67 bool send_receive(const char *cmd, int clen, char *resp, int rlen, const ErrorStack &err=ErrorStack());
68
69protected:
71 struct __attribute__((packed)) ReadRequest {
72 char cmd;
73 uint32_t addr;
74 uint8_t size;
76 ReadRequest(uint32_t addr);
77 };
78
80 struct __attribute__((packed)) ReadResponse {
81 char cmd;
82 uint32_t addr;
83 uint8_t size;
84 char data[16];
85 uint8_t sum;
86 uint8_t ack;
90 bool check(uint32_t addr, QString &msg) const;
91 };
92
94 struct __attribute__((packed)) WriteRequest {
95 char cmd;
96 uint32_t addr;
97 uint8_t size;
98 char data[16];
99 uint8_t sum;
100 uint8_t ack;
101
105 WriteRequest(uint32_t addr, const char *data);
106 };
107
109 struct __attribute__((packed)) RadioInfoResponse {
110 char prefix;
111 char model[7];
112 uint8_t bands;
113 char version[6];
114 uint8_t eot;
115 };
116
126
131};
132
133
134
142{
143 Q_OBJECT
144
145public:
148 explicit AnytoneGD32Interface(const USBDeviceDescriptor &descriptor,
149 const ErrorStack &err=ErrorStack(), QObject *parent=nullptr);
150
153
154public:
158 static QList<USBDeviceDescriptor> detect(bool saveOnly=true);
159};
160
161
162
170{
171 Q_OBJECT
172
173public:
176 explicit AnytoneSTM32Interface(const USBDeviceDescriptor &descriptor,
177 const ErrorStack &err=ErrorStack(), QObject *parent=nullptr);
178
181
182public:
186 static QList<USBDeviceDescriptor> detect(bool saveOnly=true);
187};
188
189#endif // ANYTONEINTERFACE_HH
AnytoneGD32Interface(const USBDeviceDescriptor &descriptor, const ErrorStack &err=ErrorStack(), QObject *parent=nullptr)
Constructs a new interface to Anytone radios.
Definition anytone_interface.cc:373
static USBDeviceInfo interfaceInfo()
Returns some information about this interface.
Definition anytone_interface.cc:407
RadioInfo identifier(const ErrorStack &err=ErrorStack())
Returns an identifier of the radio.
Definition anytone_interface.cc:381
bool leave_program_mode(const ErrorStack &err=ErrorStack())
Sends a command message to radio to leave program state and reboot.
Definition anytone_interface.cc:312
void close()
Closes the interface to the device.
Definition anytone_interface.cc:117
bool read(uint32_t bank, uint32_t addr, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack())
Reads a chunk of data from the block-address bno (block number).
Definition anytone_interface.cc:200
bool write_start(uint32_t bank, uint32_t addr, const ErrorStack &err=ErrorStack())
Starts the write process into the specified bank and at the given address.
Definition anytone_interface.cc:142
bool write(uint32_t bank, uint32_t addr, uint8_t *data, int nbytes, const ErrorStack &err=ErrorStack())
Writes a chunk of data at the address addr.
Definition anytone_interface.cc:152
State _state
Holds the state of the interface.
Definition anytone_interface.hh:128
bool read_finish(const ErrorStack &err=ErrorStack())
This function ends a series of read operations.
Definition anytone_interface.cc:233
bool enter_program_mode(const ErrorStack &err=ErrorStack())
Send command message to radio to ender program state.
Definition anytone_interface.cc:253
State
Possible states of the radio interface.
Definition anytone_interface.hh:118
@ STATE_CLOSED
Interface to radio is closed (captive final state).
Definition anytone_interface.hh:122
@ STATE_ERROR
An error occurred (captive final state), use errorMessage() to get an error message.
Definition anytone_interface.hh:123
@ STATE_OPEN
Interface to radio is open.
Definition anytone_interface.hh:120
@ STATE_PROGRAM
Radio is in program mode.
Definition anytone_interface.hh:121
@ STATE_INITIALIZED
Initial state.
Definition anytone_interface.hh:119
AnytoneInterface(const USBDeviceDescriptor &descriptor, const ErrorStack &err=ErrorStack(), QObject *parent=nullptr)
Constructs a new interface to Anytone radios.
Definition anytone_interface.cc:90
bool reboot(const ErrorStack &err=ErrorStack())
Some radios need to be rebooted after being read or programmed.
Definition anytone_interface.cc:239
virtual ~AnytoneInterface()
Destructor.
Definition anytone_interface.cc:110
bool read_start(uint32_t bank, uint32_t addr, const ErrorStack &err=ErrorStack())
Starts the read process from the specified bank and at the given address.
Definition anytone_interface.cc:190
bool send_receive(const char *cmd, int clen, char *resp, int rlen, const ErrorStack &err=ErrorStack())
Internal used method to send messages to and receive responses from radio.
Definition anytone_interface.cc:333
RadioVariant _info
Holds the radio info.
Definition anytone_interface.hh:130
bool getInfo(RadioVariant &info)
Reads the radio info from the device and returns it.
Definition anytone_interface.cc:133
bool request_identifier(RadioVariant &info, const ErrorStack &err=ErrorStack())
Sends a request to radio to identify itself.
Definition anytone_interface.cc:284
bool write_finish(const ErrorStack &err=ErrorStack())
This function ends a series of write operations.
Definition anytone_interface.cc:184
RadioInfo identifier(const ErrorStack &err=ErrorStack())
Returns an identifier of the radio.
Definition anytone_interface.cc:429
static USBDeviceInfo interfaceInfo()
Returns some information about this interface.
Definition anytone_interface.cc:445
AnytoneSTM32Interface(const USBDeviceDescriptor &descriptor, const ErrorStack &err=ErrorStack(), QObject *parent=nullptr)
Constructs a new interface to Anytone radios.
Definition anytone_interface.cc:422
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
Structure of radio information response.
Definition anytone_interface.hh:109
char version[6]
Version number. Either hardware or 'radio' version.
Definition anytone_interface.hh:113
uint8_t eot
Fixed 0x06 on success.
Definition anytone_interface.hh:114
char model[7]
Model name.
Definition anytone_interface.hh:111
uint8_t bands
Frequency bands supported by radio.
Definition anytone_interface.hh:112
char prefix
Fixed prefix. Set to 'I' on success.
Definition anytone_interface.hh:110
Collects information about the particular radio being accessed.
Definition anytone_interface.hh:20
char bands
A code for which bands are supported.
Definition anytone_interface.hh:24
RadioVariant()
Empty constructor.
Definition anytone_interface.cc:75
bool isValid() const
Returns true if the radio info is valid.
Definition anytone_interface.cc:82
QString version
The (firmware/hardware) version.
Definition anytone_interface.hh:26
QString name
The name of the radio.
Definition anytone_interface.hh:22
ReadRequest(uint32_t addr)
Constructs a read request for the specified address.
Definition anytone_interface.cc:13
uint8_t size
Fixed to 16.
Definition anytone_interface.hh:74
char cmd
Fixed to 'R'.
Definition anytone_interface.hh:72
uint32_t addr
Memory address in little-endian.
Definition anytone_interface.hh:73
Binary representation of a read response from the radio.
Definition anytone_interface.hh:80
bool check(uint32_t addr, QString &msg) const
Check the response, returns true if read request was successful.
Definition anytone_interface.cc:23
char cmd
Fixed to 'W'.
Definition anytone_interface.hh:81
uint8_t ack
Fixed to 0x06.
Definition anytone_interface.hh:86
uint8_t sum
Sum over address, size and data.
Definition anytone_interface.hh:85
char data[16]
The actual data.
Definition anytone_interface.hh:84
uint8_t size
Fixed to 16.
Definition anytone_interface.hh:83
uint32_t addr
Memory address in big-endian.
Definition anytone_interface.hh:82
uint8_t size
Fixed to 16.
Definition anytone_interface.hh:97
char data[16]
The actual data.
Definition anytone_interface.hh:98
uint32_t addr
Memory address in big-endian.
Definition anytone_interface.hh:96
uint8_t ack
Fixed to 0x06;.
Definition anytone_interface.hh:100
uint8_t sum
Sum over addr, size and data.
Definition anytone_interface.hh:99
char cmd
Fixed to 'W'.
Definition anytone_interface.hh:95
WriteRequest(uint32_t addr, const char *data)
Assembles a write request message to the given address with the given data.
Definition anytone_interface.cc:59