Compare commits
3 commits
e145a1188d
...
d5ddc4748b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d5ddc4748b | ||
|
|
73d40374e7 | ||
|
|
a8c2038552 |
26 changed files with 84 additions and 13 deletions
|
|
@ -7,6 +7,10 @@ single running list until the first versioned release.
|
|||
|
||||
## Unreleased
|
||||
|
||||
_Nothing yet._
|
||||
|
||||
## 0.4.0
|
||||
|
||||
- **On-radio channel add/delete.** The Channel quick menu (top button) has two new
|
||||
entries:
|
||||
- **new channel** — creates a blank 145.500 MHz FM channel in the first free
|
||||
|
|
@ -15,6 +19,11 @@ single running list until the first versioned release.
|
|||
- **Delete Channel** — deletes the selected channel after a confirmation, and
|
||||
scrubs it out of every zone that referenced it. Refuses to delete the last
|
||||
remaining channel, and respects the read-only/APRS channel lock.
|
||||
- The new menu strings are **translated** (German, French, Italian, Spanish,
|
||||
Portuguese, Dutch, Danish, Swedish, Catalan, Finnish, Czech; English fallback
|
||||
for the rest).
|
||||
- **`flash.sh`** now always rebuilds the language (`.gla`) packs, so edits to the
|
||||
language files are picked up instead of a stale pack being re-flashed.
|
||||
- **Release script** now flags every release before v1.0.0 as a **pre-release**
|
||||
(and corrects the flag on re-runs).
|
||||
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@
|
|||
#define _FREETRX_VERSION_H_
|
||||
|
||||
#define FREETRX_VERSION_MAJOR 0
|
||||
#define FREETRX_VERSION_MINOR 3
|
||||
#define FREETRX_VERSION_MINOR 4
|
||||
#define FREETRX_VERSION_PATCH 0
|
||||
|
||||
#define FREETRX_VERSION "0.3.0"
|
||||
#define FREETRX_VERSION "0.4.0"
|
||||
|
||||
#endif // _FREETRX_VERSION_H_
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t catalanLanguage=
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Esborra canal", // MaxLen: 16
|
||||
.keep_one_channel = "Deixa 1 canal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t croatianLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t czechLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Smazat kanál", // MaxLen: 16
|
||||
.keep_one_channel = "Nech 1 kanál", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t danishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Slet kanal", // MaxLen: 16
|
||||
.keep_one_channel = "Behold 1 kanal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t dutchLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Kanaal wissen", // MaxLen: 16
|
||||
.keep_one_channel = "Hou 1 kanaal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t englishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t finnishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Poista kanava", // MaxLen: 16
|
||||
.keep_one_channel = "Pidä 1 kanava", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t frenchLanguage =
|
|||
.text_size = "Taille texte",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Der. locut.", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Sourdine", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Effacer canal", // MaxLen: 16
|
||||
.keep_one_channel = "Garder 1 canal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t germanLanguage =
|
|||
.text_size = "Text Grösse",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Kanal löschen", // MaxLen: 16
|
||||
.keep_one_channel = "1 Kanal behalten", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t hungarianLanguage=
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t italianLanguage =
|
|||
.text_size = "Formato font",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Ultimo OM RX", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Muto", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Elimina canale", // MaxLen: 16
|
||||
.keep_one_channel = "Tieni 1 canale", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t japaneseLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t polishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t portuguesBrazilLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Apagar canal", // MaxLen: 16
|
||||
.keep_one_channel = "Manter 1 canal", // MaxLen: 16
|
||||
};
|
||||
/*********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t portuguesLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Apagar canal", // MaxLen: 16
|
||||
.keep_one_channel = "Manter 1 canal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t romanianLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t slovenianLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t spanishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Borrar canal", // MaxLen: 16
|
||||
.keep_one_channel = "Dejar 1 canal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t swedishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Radera kanal", // MaxLen: 16
|
||||
.keep_one_channel = "Behåll 1 kanal", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -327,6 +327,8 @@ const stringsTable_t turkishLanguage =
|
|||
.text_size = "Text size",//MaxLen: 16 (with ':' + 1 digit)
|
||||
.last_talker = "Last talker", // MaxLen: 16 (with ':' + .off or 2 digits value + 's')
|
||||
.mute = "Mute", // MaxLen: 16 (with ':' + .on or .off)
|
||||
.delete_channel = "Delete Channel", // MaxLen: 16
|
||||
.keep_one_channel = "Keep 1 channel", // MaxLen: 16
|
||||
};
|
||||
/********************************************************************
|
||||
*
|
||||
|
|
|
|||
|
|
@ -335,6 +335,8 @@ typedef struct
|
|||
const char text_size[LANGUAGE_TEXTS_LENGTH];
|
||||
const char last_talker[LANGUAGE_TEXTS_LENGTH];
|
||||
const char mute[LANGUAGE_TEXTS_LENGTH];
|
||||
const char delete_channel[LANGUAGE_TEXTS_LENGTH];
|
||||
const char keep_one_channel[LANGUAGE_TEXTS_LENGTH];
|
||||
} stringsTable_t;
|
||||
|
||||
#endif // _OPENGD77_UILANGUAGE_H_
|
||||
|
|
|
|||
|
|
@ -2416,7 +2416,7 @@ static void updateQuickMenuScreen(bool isFirstRun)
|
|||
rightSideConst = currentLanguage->new_channel;
|
||||
break;
|
||||
case CH_SCREEN_QUICK_MENU_DELETE_CHANNEL:
|
||||
rightSideConst = "Delete Channel";
|
||||
rightSideConst = currentLanguage->delete_channel;
|
||||
break;
|
||||
default:
|
||||
buf[0] = 0;
|
||||
|
|
@ -2683,7 +2683,7 @@ static void handleQuickMenuEvent(uiEvent_t *ev)
|
|||
|
||||
if (inUseCount < 2)
|
||||
{
|
||||
snprintf(uiDataGlobal.MessageBox.message, MESSAGEBOX_MESSAGE_LEN_MAX, "Cannot delete\nlast channel");
|
||||
snprintf(uiDataGlobal.MessageBox.message, MESSAGEBOX_MESSAGE_LEN_MAX, "%s", currentLanguage->keep_one_channel);
|
||||
uiDataGlobal.MessageBox.buttons =
|
||||
#if defined(PLATFORM_MD9600)
|
||||
MESSAGEBOX_BUTTONS_ENT;
|
||||
|
|
@ -2695,12 +2695,13 @@ static void handleQuickMenuEvent(uiEvent_t *ev)
|
|||
return;
|
||||
}
|
||||
|
||||
snprintf(uiDataGlobal.MessageBox.message, MESSAGEBOX_MESSAGE_LEN_MAX, "Delete channel?\n%s", currentLanguage->please_confirm);
|
||||
snprintf(uiDataGlobal.MessageBox.message, MESSAGEBOX_MESSAGE_LEN_MAX, "%s\n%s", currentLanguage->delete_channel, currentLanguage->please_confirm);
|
||||
uiDataGlobal.MessageBox.buttons = MESSAGEBOX_BUTTONS_YESNO;
|
||||
uiDataGlobal.MessageBox.validatorCallback = validateDeleteChannel;
|
||||
menuSystemPushNewMenu(UI_MESSAGE_BOX);
|
||||
|
||||
voicePromptsInit();
|
||||
voicePromptsAppendLanguageString(currentLanguage->delete_channel);
|
||||
voicePromptsAppendLanguageString(currentLanguage->please_confirm);
|
||||
voicePromptsPlay();
|
||||
return;
|
||||
|
|
|
|||
25
README.md
25
README.md
|
|
@ -28,16 +28,35 @@ FreeTRX keeps OpenGD77's core (DMR/FM, hotspot, CPS compatibility) and adds:
|
|||
TX talkgroup to the incoming one.
|
||||
- **Segmented block S-meter** with one block per S-level (S1–S9 green, S9+ red)
|
||||
and a scale label row (S1 S3 S5 S7 S9 / +20 +40 +60).
|
||||
- **7-segment "LED" frequency font** with faintly-lit inactive segments, on the
|
||||
VFO and the SK1-held frequency view.
|
||||
- **Screen dimming** — optionally dim the backlight to 100 / 50 / 30 % after
|
||||
- **7-segment "LED" frequency font** on the VFO and the SK1-held frequency view.
|
||||
- **Screen dimming** — optionally dim the backlight to 100 / 50 / 30 / 15 % after
|
||||
inactivity (Auto backlight mode); new setting in Display Options.
|
||||
- **On-radio channel management** — create and delete channels directly from the
|
||||
Channel quick menu, no PC/CPS required (see [Managing channels](#managing-channels-on-the-radio)).
|
||||
- **Main-menu icons** next to each top-level entry.
|
||||
- **DMR reliability fix** — resolves a hard-fault (freeze needing a battery pull)
|
||||
on the DMR path that affected recent self-built OpenGD77 revisions.
|
||||
|
||||
See [`CHANGELOG.md`](CHANGELOG.md) for the complete list.
|
||||
|
||||
## Managing channels on the radio
|
||||
|
||||
FreeTRX can create and delete channels without a PC. Both actions live in the
|
||||
**Channel quick menu** — from the Channel screen, press the **top (orange)
|
||||
button** to open it, then scroll to the bottom:
|
||||
|
||||
- **New channel** — creates a blank **145.500 MHz FM** channel in the first free
|
||||
slot, adds it to the current zone, and opens **Channel Details** so you can set
|
||||
the name, frequency, tones, and so on. Press the **green** key to save. The new
|
||||
channel is immediately selectable in the zone (no need to re-enter it).
|
||||
- **Delete Channel** — deletes the currently-selected channel after a
|
||||
confirmation (**green** confirms, **red** cancels). It is also scrubbed from
|
||||
every zone that referenced it. The last remaining channel cannot be deleted,
|
||||
and channels locked read-only (e.g. APRS) are protected.
|
||||
|
||||
> **Back up your codeplug** (via the CPS) before making bulk edits — these changes
|
||||
> are written straight to the radio and there is no on-device undo.
|
||||
|
||||
## Supported radios
|
||||
|
||||
This first iteration is developed for and **tested only on the TYT MD-UV380 and
|
||||
|
|
|
|||
10
flash.sh
10
flash.sh
|
|
@ -58,11 +58,11 @@ done
|
|||
# ---- resolve / build the language file ------------------------------------
|
||||
LANG_ARGS=()
|
||||
if [[ -n "$LANGUAGE" && "$(lc "$LANGUAGE")" != "none" ]]; then
|
||||
# Build the .gla files once if they're missing.
|
||||
if ! ls "$LANG_SRC"/*.gla >/dev/null 2>&1; then
|
||||
echo "==> Building language (.gla) files..."
|
||||
( cd "$LANG_SRC" && gcc -w -I../ -o languages_builder languages_builder.c && ./languages_builder >/dev/null )
|
||||
fi
|
||||
# Always (re)build the .gla language packs so edits to the *.h language files
|
||||
# are picked up. (They're built from the .h sources by languages_builder; a
|
||||
# stale pack would otherwise show blank/old strings on the radio.)
|
||||
echo "==> Building language (.gla) files..."
|
||||
( cd "$LANG_SRC" && gcc -w -I../ -o languages_builder languages_builder.c && ./languages_builder >/dev/null )
|
||||
# Case-insensitive match of the requested name to an actual <Name>.gla file.
|
||||
GLA=""
|
||||
for f in "$LANG_SRC"/*.gla; do
|
||||
|
|
|
|||
Loading…
Reference in a new issue