libdrmconf
0.12.0
A library to program DMR radios.
|
Represents, encodes and decodes the device specific codeplug for a Baofeng/Radioddity RD-5R. More...
#include <rd5r_codeplug.hh>
Classes | |
class | ChannelElement |
Implements the specialization of the Radioddity channel for the RD5R radio. More... | |
class | EncryptionElement |
Implements the encoding/decoding of encryption keys for the RD-5R radio. More... | |
struct | Offset |
Internal offsets between codeplug elements. More... | |
class | TimestampElement |
Implements the timestamp for RD-5R codeplugs. More... | |
Public Member Functions | |
RD5RCodeplug (QObject *parent=0) | |
Empty constructor. | |
void | clear () |
Clears and resets the complete codeplug to some default values. | |
bool | encodeElements (const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes the given generic configuration as a binary codeplug using the given context. | |
bool | decodeElements (Context &ctx, const ErrorStack &err=ErrorStack()) |
Decodes the binary codeplug and stores its content in the given generic configuration using the given context. | |
virtual void | clearTimestamp () |
Clears the time-stamp in the codeplug. | |
virtual bool | encodeTimestamp (const ErrorStack &err=ErrorStack()) |
Sets the time-stamp. | |
void | clearGeneralSettings () |
Clears the general settings in the codeplug. | |
bool | encodeGeneralSettings (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Updates the general settings from the given configuration. | |
bool | decodeGeneralSettings (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Updates the given configuration from the general settings. | |
void | clearButtonSettings () |
Clears the button settings. | |
bool | encodeButtonSettings (Context &ctx, const Flags &flags, const ErrorStack &err=ErrorStack()) |
Encodes button settings. | |
bool | decodeButtonSettings (Context &ctx, const ErrorStack &err=ErrorStack()) |
Decodes the button settings. | |
void | clearMessages () |
Clears the messages. | |
bool | encodeMessages (Context &ctx, const Flags &flags, const ErrorStack &err=ErrorStack()) |
Encodes preset messages. | |
bool | decodeMessages (Context &ctx, const ErrorStack &err=ErrorStack()) |
Decodes preset messages. | |
void | clearContacts () |
Clears all contacts in the codeplug. | |
bool | encodeContacts (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes all digital contacts in the configuration into the codeplug. | |
bool | createContacts (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Adds a digital contact to the configuration for each one in the codeplug. | |
void | clearDTMFContacts () |
Clears all DTMF contacts in the codeplug. | |
bool | encodeDTMFContacts (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes all DTMF contacts. | |
bool | createDTMFContacts (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Adds all DTMF contacts to the configuration. | |
void | clearChannels () |
Clear all channels. | |
bool | encodeChannels (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encode all channels. | |
bool | createChannels (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Adds all defined channels to the configuration. | |
bool | linkChannels (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Links all channels. | |
void | clearBootSettings () |
Clear boot settings. | |
void | clearMenuSettings () |
Clears menu settings. | |
void | clearBootText () |
Clears boot text. | |
bool | encodeBootText (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes boot text. | |
bool | decodeBootText (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Updates the given configuration from the boot text settings. | |
void | clearVFOSettings () |
Clears the VFO settings. | |
void | clearZones () |
Clears all zones. | |
bool | encodeZones (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes zones. | |
bool | createZones (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Adds zones to the configuration. | |
bool | linkZones (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Links all zones within the configuration. | |
void | clearScanLists () |
Clears all scan lists. | |
bool | encodeScanLists (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes all scan lists. | |
bool | createScanLists (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Creates all scan lists. | |
bool | linkScanLists (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Links all scan lists. | |
void | clearGroupLists () |
Clears all group lists. | |
bool | encodeGroupLists (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err=ErrorStack()) |
Encodes all group lists. | |
bool | createGroupLists (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Creates all group lists. | |
bool | linkGroupLists (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) |
Links all group lists. | |
void | clearEncryption () |
Clears all encryption keys. | |
bool | encodeEncryption (Config *config, const Flags &flags, Context &ctx, const ErrorStack &err) |
Encodes all encryption keys defined. | |
bool | createEncryption (Config *config, Context &ctx, const ErrorStack &err) |
Creates all encryption keys. | |
bool | linkEncryption (Config *config, Context &ctx, const ErrorStack &err) |
Links all encryption keys. | |
Public Member Functions inherited from RadioddityCodeplug | |
virtual | ~RadioddityCodeplug () |
Destructor. | |
bool | index (Config *config, Context &ctx, const ErrorStack &err=ErrorStack()) const |
Indexes all elements of the codeplug. More... | |
bool | decode (Config *config, const ErrorStack &err=ErrorStack()) |
Decodes a binary codeplug to the given abstract configuration config . More... | |
bool | postprocess (Config *config, const ErrorStack &err) const |
Retruns a post-processed configuration of the decoded config. More... | |
Config * | preprocess (Config *config, const ErrorStack &err) const |
Retruns a prepared configuration for this particular radio. More... | |
bool | encode (Config *config, const Flags &flags=Flags(), const ErrorStack &err=ErrorStack()) |
Encodes a given abstract configuration (config ) to the device specific binary code-plug. More... | |
Public Member Functions inherited from Codeplug | |
virtual | ~Codeplug () |
Destructor. | |
Public Member Functions inherited from DFUFile | |
DFUFile (QObject *parent=nullptr) | |
Constructs an empty DFU file object. | |
uint32_t | size () const |
Returns the total size of the DFU file. | |
uint32_t | memSize () const |
Returns the total memory size stored in the DFU file. | |
int | numImages () const |
Returns the number of images within the DFU file. | |
const Image & | image (int i) const |
Returns a reference to the i-th image of the file. | |
Image & | image (int i) |
Returns a reference to the i-th image of the file. | |
void | addImage (const QString &name, uint8_t altSettings=1) |
Adds a new image to the file. | |
void | addImage (const Image &img) |
Adds an image to the file. | |
void | remImage (int i) |
Deletes the i-th image from the file. | |
bool | isAligned (unsigned blocksize) const |
Checks if all image addresses and sizes is aligned with the given block size. | |
bool | read (const QString &filename, const ErrorStack &err=ErrorStack()) |
Reads the specified DFU file. More... | |
bool | read (QFile &file, const ErrorStack &err=ErrorStack()) |
Reads the specified DFU file. More... | |
bool | write (const QString &filename, const ErrorStack &err=ErrorStack()) |
Writes to the specified file. More... | |
bool | write (QFile &file, const ErrorStack &err=ErrorStack()) |
Writes to the specified file. More... | |
void | dump (QTextStream &stream) const |
Dumps a text representation of the DFU file structure to the specified text stream. | |
virtual bool | isAllocated (uint32_t offset, uint32_t img=0) const |
Returns true if the specified address (and image) is allocated. | |
virtual unsigned char * | data (uint32_t offset, uint32_t img=0) |
Returns a pointer to the encoded raw data at the specified offset. | |
virtual const unsigned char * | data (uint32_t offset, uint32_t img=0) const |
Returns a const pointer to the encoded raw data at the specified offset. | |
Additional Inherited Members | |
Protected Member Functions inherited from RadioddityCodeplug | |
RadioddityCodeplug (QObject *parent=nullptr) | |
Hidden constructor, use a device specific class to instantiate. | |
Protected Member Functions inherited from Codeplug | |
Codeplug (QObject *parent=nullptr) | |
Hidden default constructor. | |
Protected Attributes inherited from DFUFile | |
QVector< Image > | _images |
The list of images. | |
Represents, encodes and decodes the device specific codeplug for a Baofeng/Radioddity RD-5R.
This codeplug format is quiet funny. It reveals some history of this device. First of all, the channels are organizes in two blocks. The first block contains only a single bank of 128 channels, while the second block contains 7 banks with a total of 896 channels. I would guess there was a previous firmware or even hardware version with only 128 channels.
Moreover, channels, zones, rx group lists and scan lists are organized in tables or banks, with some preceding bitfield indicating which channel is enabled/valid. Contacts, however, are just organized in a list, where each entry has a field, indicating whether that contact is valid.
This difference looks like, as if the firmware code for the contacts stems from a different device or was developed by a different engineer. Moreover, the message list again, uses yet another method. Here a simple counter precedes the messages, indicating how many valid messages there are. All in all, a rather inconsistent way of representing variable length lists in the codeplug. I would guess, that over time, different people/teams worked on different revisions of the firmware. It must have been a real nightmare to Serge Vakulenko reverse-engineering this codeplug.
This implementation targets firmware version 2.1.6.
The memory representation of the codeplug within the radio is divided into two segments. The first segment starts at the address 0x00080 and ends at 0x07c00 while the second section starts at 0x08000 and ends at 0x1e300.
Please note, that the codeplug is not yet fully understood and a full codeplug cannot be build from scratch. That is, it is necessary to update an existing codeplug on the radio.
Start | End | Size | Content |
---|---|---|---|
First segment 0x00080-0x07c00 | |||
0x00080 | 0x00088 | 0x0008 | ??? Unknown ??? |
0x00088 | 0x0008e | 0x0006 | Timestamp, see RadioddityCodeplug::TimestampElement . |
0x0008e | 0x000e0 | 0x0052 | CPS, firmware, DSP version numbers (not touched). |
0x000e0 | 0x00108 | 0x0028 | General settings, see RadioddityCodeplug::GeneralSettingsElement . |
0x00108 | 0x00128 | 0x0020 | Button settings, see RadioddityCodeplug::ButtonSettingsElement . |
0x00128 | 0x01370 | 0x1248 | 32 preset message texts, see RadioddityCodeplug::MessageBankElement . |
0x01370 | 0x01588 | 0x0218 | ??? Unknown ??? |
0x01588 | 0x01788 | 0x0200 | ??? 32 Emergency systems ??? |
0x01788 | 0x02f88 | 0x1800 | 256 contacts, see RadioddityCodeplug::ContactElement . |
0x02f88 | 0x03388 | 0x0400 | 32 DTMF contacts, see RadioddityCodeplug::DTMFContactElement . |
0x03388 | 0x03780 | 0x03f8 | ??? Unknown ??? |
0x03780 | 0x05390 | 0x1c10 | First 128 channels (bank 0), see RadioddityCodeplug::ChannelBankElement and RD5RCodeplug::ChannelElement . |
0x05390 | 0x07518 | 0x2188 | ??? Unknown ??? |
0x07518 | 0x07538 | 0x0020 | Boot settings, see RadioddityCodeplug::BootSettingsElement . |
0x07538 | 0x07540 | 0x0008 | Menu settings, see RadioddityCodeplug::MenuSettingsElement . |
0x07540 | 0x07560 | 0x0020 | 2 intro lines, RadioddityCodeplug::BootTextElement . |
0x07560 | 0x07590 | 0x0030 | ??? Unknown ??? |
0x07590 | 0x075c8 | 0x0038 | VFO A settings RadioddityCodeplug::ChannelElement |
0x075c8 | 0x07600 | 0x0038 | VFO B settings RadioddityCodeplug::ChannelElement |
0x07600 | 0x07c00 | 0x0600 | ??? Unknown ??? |
Second segment 0x08000-0x1e300 | |||
0x08000 | 0x08010 | 0x0010 | ??? Unknown ??? |
0x08010 | 0x0af10 | 0x2f00 | 250 zones, see RadioddityCodeplug::ZoneBankElement . |
0x0af10 | 0x0b1b0 | 0x02a0 | ??? Unknown ??? |
0x0b1b0 | 0x17620 | 0xc470 | Remaining 896 channels (bank 1-7), see RadioddityCodeplug::ChannelBankElement and RD5RCodeplug::ChannelElement . |
0x17620 | 0x1cd10 | 0x56f0 | 250 scan lists, see RadioddityCodeplug::ScanListBankElement |
0x1cd10 | 0x1d620 | 0x0910 | ??? Unknown ??? |
0x1d620 | 0x1e2a0 | 0x0c80 | 64 RX group lists, see RadioddityCodeplug::GroupListBankElement |
0x1e2a0 | 0x1e300 | 0x0060 | ??? Unknown ??? |