Skip to content

Commit

Permalink
Implemented SMS templates for TyT/Retevis devices. Addresses 413.
Browse files Browse the repository at this point in the history
  • Loading branch information
hmatuschek committed May 17, 2024
1 parent f7c010c commit ca1ad78
Show file tree
Hide file tree
Showing 19 changed files with 590 additions and 29 deletions.
15 changes: 15 additions & 0 deletions doc/manual/codeplug/smsextension.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>

<section xml:id="extMessages"
xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude">

<info>
<title></title>
</info>

<para>
</para>

</section>
17 changes: 12 additions & 5 deletions lib/dm1701_codeplug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,6 @@
#define ADDR_GPSSYSTEMS 0x03ec40
#define GPSSYSTEM_SIZE 0x000010

#define NUM_TEXTMESSAGES 50
#define ADDR_TEXTMESSAGES 0x002180
#define TEXTMESSAGE_SIZE 0x000120

#define ADDR_EMERGENCY_SETTINGS 0x005a50
#define NUM_EMERGENCY_SYSTEMS 32
#define ADDR_EMERGENCY_SYSTEMS 0x005a60
Expand Down Expand Up @@ -878,9 +874,20 @@ DM1701Codeplug::decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack

void
DM1701Codeplug::clearTextMessages() {
memset(data(ADDR_TEXTMESSAGES), 0, NUM_TEXTMESSAGES*TEXTMESSAGE_SIZE);
MessageBankElement(data(Offset::messages())).clear();
}

bool
DM1701Codeplug::encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).encode(ctx, flags, err);
}

bool
DM1701Codeplug::decodeTextMessages(Context &ctx, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).decode(ctx, err);
}


void
DM1701Codeplug::clearEmergencySystems() {
EmergencySettingsElement(data(ADDR_EMERGENCY_SETTINGS)).clear();
Expand Down
12 changes: 11 additions & 1 deletion lib/dm1701_codeplug.hh
Original file line number Diff line number Diff line change
Expand Up @@ -305,12 +305,22 @@ public:
bool encodePrivacyKeys(Config *config, const Flags &flags, Context &ctx, const ErrorStack &err);
bool decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack &err);

void clearMenuSettings();
void clearTextMessages();
bool encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err);
bool decodeTextMessages(Context &ctx, const ErrorStack &err);

void clearMenuSettings();
void clearEmergencySystems();
/** Resets VFO settings. */
virtual void clearVFOSettings();

protected:
/** Some internal offsets within the codeplug. */
struct Offset {
/// @cond DO_NOT_DOCUMENT
static constexpr unsigned int messages() { return 0x002180; }
/// @endcond
};
};

#endif // DM1701_CODEPLUG_HH
81 changes: 81 additions & 0 deletions lib/dr1801uv_codeplug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1969,6 +1969,43 @@ DR1801UVCodeplug::MessageBankElement::message(unsigned int n) const {
return MessageElement(_data + Offset::messages() + n*MessageElement::size());
}

bool
DR1801UVCodeplug::MessageBankElement::decode(Context &ctx, const ErrorStack &err) const {
Q_UNUSED(err);

ctx.config()->smsExtension()->smsTemplates()->clear();

for (unsigned int i=0; i<messageCount(); i++) {
MessageElement msg = message(i);
if (! msg.isValid())
continue;
SMSTemplate *sms = new SMSTemplate();
sms->setName(QString("Message %1").arg(msg.index()));
sms->setMessage(msg.text());
ctx.config()->smsExtension()->smsTemplates()->add(sms);
}

return true;
}

bool
DR1801UVCodeplug::MessageBankElement::encode(Context &ctx, const ErrorStack &err) {
Q_UNUSED(err);

setMessageCount(0);

SMSExtension *smsExt = ctx.config()->smsExtension();
unsigned int count = std::min(Limit::messageCount(), (unsigned int)smsExt->smsTemplates()->count());
for (unsigned int i=0; i<count; i++) {
MessageElement msg = message(i);
msg.setText(smsExt->smsTemplates()->message(i)->message());
msg.setIndex(i+1);
}

setMessageCount(count);
return true;
}


/* ******************************************************************************************** *
* Implementation of DR1801UVCodeplug::MessageElement
Expand Down Expand Up @@ -3028,6 +3065,30 @@ DR1801UVCodeplug::DMRSettingsElement::enableRemoteMonitorDec(bool enable) {
setBit(Offset::remoteMonitorDec(), enable);
}

bool
DR1801UVCodeplug::DMRSettingsElement::decode(Context &ctx, const ErrorStack &err) const {
Q_UNUSED(err);

switch(smsFormat()) {
case SMSFormat::IPData: ctx.config()->smsExtension()->setFormat(SMSExtension::Format::Motorola); break;
case SMSFormat::CompressedIP: ctx.config()->smsExtension()->setFormat(SMSExtension::Format::Hytera); break;
case SMSFormat::DefinedData: ctx.config()->smsExtension()->setFormat(SMSExtension::Format::DMR); break;
}

return true;
}

bool
DR1801UVCodeplug::DMRSettingsElement::encode(Context &ctx, const ErrorStack &err) {
Q_UNUSED(err);

switch(ctx.config()->smsExtension()->format()) {
case SMSExtension::Format::Motorola: setSMSFormat(SMSFormat::IPData); break;
case SMSExtension::Format::Hytera: setSMSFormat(SMSFormat::CompressedIP); break;
case SMSExtension::Format::DMR: setSMSFormat(SMSFormat::DefinedData); break;
}
}


/* ******************************************************************************************** *
* Implementation of DR1801UVCodeplug::OneTouchSettingsElement
Expand Down Expand Up @@ -3293,11 +3354,21 @@ DR1801UVCodeplug::decodeElements(Context &ctx, const ErrorStack &err) {
return false;
}

if (! MessageBankElement(data(Offset::messageBank())).decode(ctx, err)) {
errMsg(err) << "Cannot decode preset messages.";
return false;
}

if (! SettingsElement(data(Offset::settings())).updateConfig(ctx.config(), err)) {
errMsg(err) << "Cannot decode settings element.";
return false;
}

if (! DMRSettingsElement(data(Offset::dmrSettings())).decode(ctx, err)) {
errMsg(err) << "Cannot decode DMR settings element.";
return false;
}

if (! ScanListBankElement(data(Offset::scanListBank())).decode(ctx, err)) {
errMsg(err) << "Cannot decode scan list elements.";
return false;
Expand Down Expand Up @@ -3349,11 +3420,21 @@ DR1801UVCodeplug::encodeElements(Context &ctx, const ErrorStack &err) {
return false;
}

if (! DMRSettingsElement(data(Offset::dmrSettings())).encode(ctx, err)) {
errMsg(err) << "Cannot encode DMR settings element.";
return false;
}

if (! ZoneBankElement(data(Offset::zoneBank())).encode(ctx, err)) {
errMsg(err) << "Cannot encode zones.";
return false;
}

if (! MessageBankElement(data(Offset::messageBank())).encode(ctx, err)) {
errMsg(err) << "Cannot encode messages.";
return false;
}

if (! ContactBankElement(data(Offset::contactBank())).encode(ctx, err)) {
errMsg(err) << "Cannot encode contacts.";
return false;
Expand Down
18 changes: 18 additions & 0 deletions lib/dr1801uv_codeplug.hh
Original file line number Diff line number Diff line change
Expand Up @@ -1306,6 +1306,17 @@ public:
/** Returns a reference to the n-th message. */
virtual MessageElement message(unsigned int n) const;

/** Decodes all scan lists. */
virtual bool decode(Context &ctx, const ErrorStack &err=ErrorStack()) const;
/** Encodes all scan lists. */
virtual bool encode(Context &ctx, const ErrorStack &err=ErrorStack());

public:
/** Some limits. */
struct Limit {
static constexpr unsigned int messageCount() { return 8; } ///< Maximum number of messages.
};

protected:
/** Offsets within the element. */
struct Offset {
Expand Down Expand Up @@ -2195,6 +2206,12 @@ public:
/** Enables remote monitor decoding. */
virtual void enableRemoteMonitorDec(bool enable);

/** Decodes the DMR settings. */
virtual bool decode(Context &ctx, const ErrorStack &err=ErrorStack()) const;
/** Encodes all keys. */
virtual bool encode(Context &ctx, const ErrorStack &err=ErrorStack());


public:
/** Some limits. */
struct Limit: public Element::Limit {
Expand Down Expand Up @@ -2399,6 +2416,7 @@ protected:
static constexpr unsigned int encryptionKeyBank() { return 0x1d7e0; }
static constexpr unsigned int dtmfSettings() { return 0x1d858; }
static constexpr unsigned int alarmSettings() { return 0x1daf4; }
static constexpr unsigned int dmrSettings() { return 0x1dbb8; }
static constexpr unsigned int vfoBank() { return 0x1dd00; }
/// @endcond
};
Expand Down
17 changes: 12 additions & 5 deletions lib/md2017_codeplug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@
#define ADDR_GPSSYSTEMS 0x03ec40
#define GPSSYSTEM_SIZE 0x000010

#define NUM_TEXTMESSAGES 50
#define ADDR_TEXTMESSAGES 0x002180
#define TEXTMESSAGE_SIZE 0x000120

#define ADDR_EMERGENCY_SETTINGS 0x005a50
#define NUM_EMERGENCY_SYSTEMS 32
#define ADDR_EMERGENCY_SYSTEMS 0x005a60
Expand Down Expand Up @@ -493,9 +489,20 @@ MD2017Codeplug::decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack

void
MD2017Codeplug::clearTextMessages() {
memset(data(ADDR_TEXTMESSAGES), 0, NUM_TEXTMESSAGES*TEXTMESSAGE_SIZE);
MessageBankElement(data(Offset::messages())).clear();
}

bool
MD2017Codeplug::encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).encode(ctx, flags, err);
}

bool
MD2017Codeplug::decodeTextMessages(Context &ctx, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).decode(ctx, err);
}


void
MD2017Codeplug::clearEmergencySystems() {
EmergencySettingsElement(data(ADDR_EMERGENCY_SETTINGS)).clear();
Expand Down
12 changes: 11 additions & 1 deletion lib/md2017_codeplug.hh
Original file line number Diff line number Diff line change
Expand Up @@ -139,14 +139,24 @@ public:
bool encodePrivacyKeys(Config *config, const Flags &flags, Context &ctx, const ErrorStack &err);
bool decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack &err=ErrorStack());

void clearTextMessages();
bool encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err);
bool decodeTextMessages(Context &ctx, const ErrorStack &err);

/** Resets/clears the boot settings. */
virtual void clearBootSettings();
void clearMenuSettings();
void clearTextMessages();
void clearEmergencySystems();
/** Resets VFO settings. */
virtual void clearVFOSettings();

protected:
/** Some internal offsets within the codeplug. */
struct Offset {
/// @cond DO_NOT_DOCUMENT
static constexpr unsigned int messages() { return 0x002180; }
/// @endcond
};
};

#endif // MD2017_CODEPLUG_HH
23 changes: 15 additions & 8 deletions lib/md390_codeplug.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,6 @@
#define ADDR_GPSSYSTEMS 0x03ec40
#define GPSSYSTEM_SIZE 0x000010

#define NUM_TEXTMESSAGES 50
#define ADDR_TEXTMESSAGES 0x002180
#define TEXTMESSAGE_SIZE 0x000120

#define ADDR_EMERGENCY_SETTINGS 0x005a50
#define NUM_EMERGENCY_SYSTEMS 32
#define ADDR_EMERGENCY_SYSTEMS 0x005a60
Expand Down Expand Up @@ -605,13 +601,24 @@ MD390Codeplug::decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack


void
MD390Codeplug::clearMenuSettings() {
MenuSettingsElement(data(ADDR_MENUSETTINGS)).clear();
MD390Codeplug::clearTextMessages() {
MessageBankElement(data(Offset::messages())).clear();
}

bool
MD390Codeplug::encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).encode(ctx, flags, err);
}

bool
MD390Codeplug::decodeTextMessages(Context &ctx, const ErrorStack &err) {
return MessageBankElement(data(Offset::messages())).decode(ctx, err);
}


void
MD390Codeplug::clearTextMessages() {
memset(data(ADDR_TEXTMESSAGES), 0, NUM_TEXTMESSAGES*TEXTMESSAGE_SIZE);
MD390Codeplug::clearMenuSettings() {
MenuSettingsElement(data(ADDR_MENUSETTINGS)).clear();
}

void
Expand Down
15 changes: 13 additions & 2 deletions lib/md390_codeplug.hh
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
* <tr><td>0x002100</td> <td>0x002140</td> <td>0x00040</td> <td>Button config, see @c TyTCodeplug::ButtonSettingsElement.</td></tr>
* <tr><td>0x002140</td> <td>0x002180</td> <td>0x00040</td> <td>Reserved, filled with 0xff.</td></tr>
* <tr><td>0x002040</td> <td>0x0020f0</td> <td>0x000b0</td> <td>General settings see @c TyTCodeplug::GeneralSettingsElement.</td></tr>
* <tr><td>0x002180</td> <td>0x0059c0</td> <td>0x03840</td> <td>50 Text messages @ 0x120 bytes each.</td></tr>
* <tr><td>0x002180</td> <td>0x0059c0</td> <td>0x03840</td> <td>50 Text messages @ 0x120 bytes each, see @c TyTCodeplug::MessageElement.</td></tr>
* <tr><td>0x0059c0</td> <td>0x005a70</td> <td>0x000b0</td> <td>??? Privacy keys, see @c TyTCodeplug::EncryptionElement.</td></tr>
* <tr><td>0x005a70</td> <td>0x005a80</td> <td>0x00010</td> <td>Emergency system settings, see @c TyTCodeplug::EmergencySettingsElement.</td></td>
* <tr><td>0x005a80</td> <td>0x005f80</td> <td>0x00500</td> <td>Emergency systems, see @c TyTCodeplug::EmergencySystemElement.</td></td>
Expand Down Expand Up @@ -143,9 +143,20 @@ public:
bool encodePrivacyKeys(Config *config, const Flags &flags, Context &ctx, const ErrorStack &err);
bool decodePrivacyKeys(Config *config, Context &ctx, const ErrorStack &err);

void clearMenuSettings();
void clearTextMessages();
bool encodeTextMessages(Context &ctx, const Flags &flags, const ErrorStack &err);
bool decodeTextMessages(Context &ctx, const ErrorStack &err);

void clearMenuSettings();
void clearEmergencySystems();

protected:
/** Some internal offsets within the codeplug. */
struct Offset {
/// @cond DO_NOT_DOCUMENT
static constexpr unsigned int messages() { return 0x002180; }
/// @endcond
};
};

#endif // MD390CODEPLUG_HH
Loading

0 comments on commit ca1ad78

Please sign in to comment.