kopia lustrzana https://github.com/open-ham/OpenGD77
292 wiersze
7.1 KiB
C
292 wiersze
7.1 KiB
C
![]() |
/*
|
|||
|
* Copyright (C)2019 Roger Clark. VK3KYY / G4KYF
|
|||
|
*
|
|||
|
* This program is free software; you can redistribute it and/or modify
|
|||
|
* it under the terms of the GNU General Public License as published by
|
|||
|
* the Free Software Foundation; either version 2 of the License, or
|
|||
|
* (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,
|
|||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
|
* GNU General Public License for more details.
|
|||
|
*
|
|||
|
* You should have received a copy of the GNU General Public License
|
|||
|
* along with this program; if not, write to the Free Software
|
|||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
|
*/
|
|||
|
#include "functions/settings.h"
|
|||
|
#include "user_interface/menuSystem.h"
|
|||
|
#include "user_interface/uiLocalisation.h"
|
|||
|
#include "user_interface/uiUtilities.h"
|
|||
|
|
|||
|
#define CHAR_CONSTANTS_ONLY // Needed to get FONT_CHAR_* glyph offsets
|
|||
|
#if defined(LANGUAGE_BUILD_JAPANESE)
|
|||
|
#include "hardware/UC1701_charset_JA.h"
|
|||
|
#else
|
|||
|
#include "hardware/UC1701_charset.h"
|
|||
|
#endif
|
|||
|
|
|||
|
static void updateScreen(void);
|
|||
|
static void handleEvent(uiEvent_t *ev);
|
|||
|
static menuStatus_t menuLanguageExitCode = MENU_STATUS_SUCCESS;
|
|||
|
|
|||
|
|
|||
|
static void clearNonLatinChar(uint8_t *str)
|
|||
|
{
|
|||
|
#if ! defined(LANGUAGE_BUILD_JAPANESE)
|
|||
|
uint8_t *p = str;
|
|||
|
|
|||
|
while (*p != '\0')
|
|||
|
{
|
|||
|
switch (*p)
|
|||
|
{
|
|||
|
case FONT_CHAR_CAPITAL_A_WITH_OGONEK: // Ą
|
|||
|
case FONT_CHAR_SMALL_A_WITH_OGONEK: // ą
|
|||
|
case 192: // À
|
|||
|
case 193: // Á
|
|||
|
case 194: // Â
|
|||
|
case 195: // Ã
|
|||
|
case 196: // Ä
|
|||
|
case 197: // Å
|
|||
|
case 224: // à
|
|||
|
case 225: // á
|
|||
|
case 226: // â
|
|||
|
case 227: // ã
|
|||
|
case 228: // ä
|
|||
|
case 229: // å
|
|||
|
*p = 'a';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_C_WITH_CARON: // Č
|
|||
|
case FONT_CHAR_SMALL_C_WITH_CARON: // č
|
|||
|
case FONT_CHAR_CAPITAL_C_WITH_ACUTE: // Ć
|
|||
|
case FONT_CHAR_SMALL_C_WITH_ACUTE: // ć
|
|||
|
case 199: // Ç
|
|||
|
case 231: // ç
|
|||
|
*p = 'c';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_E_WITH_OGONEK: // Ę
|
|||
|
case FONT_CHAR_SMALL_E_WITH_OGONEK: // ę
|
|||
|
case FONT_CHAR_CAPITAL_E_WITH_CARON: // Ě
|
|||
|
case FONT_CHAR_SMALL_E_WITH_CARON: // ě
|
|||
|
case 200: // È
|
|||
|
case 201: // É
|
|||
|
case 202: // Ê
|
|||
|
case 203: // Ë
|
|||
|
case 232: // è
|
|||
|
case 233: // é
|
|||
|
case 234: // ê
|
|||
|
case 235: // ë
|
|||
|
*p = 'e';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_G_CAPITAL_WITH_BREVE: // Ğ
|
|||
|
case FONT_CHAR_G_SMALL_WITH_BREVE: // ğ
|
|||
|
*p = 'g';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_SMALL_I_DOTLESS: // ı
|
|||
|
case FONT_CHAR_CAPITAL_I_WITH_DOT: // İ
|
|||
|
case 204: // Ì
|
|||
|
case 205: // Í
|
|||
|
case 206: // Î
|
|||
|
case 207: // Ï
|
|||
|
case 236: // ì
|
|||
|
case 237: // í
|
|||
|
case 238: // î
|
|||
|
case 239: // ï
|
|||
|
*p ='i';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_L_WITH_STROKE: // Ł
|
|||
|
case FONT_CHAR_SMALL_L_WITH_STROKE: // ł
|
|||
|
*p = 'l';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_N_WITH_ACUTE: // Ń
|
|||
|
case FONT_CHAR_SMALL_N_WITH_ACUTE: // ń
|
|||
|
case 209: // Ñ
|
|||
|
case 241: // ñ
|
|||
|
*p = 'n';
|
|||
|
break;
|
|||
|
|
|||
|
case 210: // Ò
|
|||
|
case 211: // Ó
|
|||
|
case 212: // Ô
|
|||
|
case 213: // Õ
|
|||
|
case 214: // Ö
|
|||
|
case 216: // Ø
|
|||
|
case 242: // ò
|
|||
|
case 243: // ó
|
|||
|
case 244: // ô
|
|||
|
case 245: // õ
|
|||
|
case 246: // ö
|
|||
|
case 248: // ø
|
|||
|
case 240: // ð
|
|||
|
*p = 'o';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_R_WITH_CARON: // Ř
|
|||
|
case FONT_CHAR_SMALL_R_WITH_CARON: // ř
|
|||
|
case 208: // Ð
|
|||
|
*p = 'r';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_S_WITH_ACUTE: // Ś
|
|||
|
case FONT_CHAR_SMALL_S_WITH_ACUTE: // ś
|
|||
|
case FONT_CHAR_CAPITAL_S_WITH_CARON: // Š
|
|||
|
case FONT_CHAR_SMALL_S_WITH_CARON: // š
|
|||
|
case FONT_CHAR_S_CAPITAL_WITH_CEDILLA: // Ş
|
|||
|
case FONT_CHAR_S_SMALL_WITH_CEDILLA: // ş
|
|||
|
case 223: // ß
|
|||
|
*p = 's';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_U_WITH_RING_ABOVE: // Ů
|
|||
|
case FONT_CHAR_SMALL_U_WITH_RING_ABOVE: // ů
|
|||
|
case 217: // Ù
|
|||
|
case 218: // Ú
|
|||
|
case 219: // Û
|
|||
|
case 220: // Ü
|
|||
|
case 249: // ù
|
|||
|
case 250: // ú
|
|||
|
case 251: // û
|
|||
|
case 252: // ü
|
|||
|
*p = 'u';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_CAPITAL_Y_WITH_DIAERESIS: // Ÿ
|
|||
|
case 221: // Ý
|
|||
|
case 253: // ý
|
|||
|
case 255: // ÿ
|
|||
|
*p = 'y';
|
|||
|
break;
|
|||
|
|
|||
|
case FONT_CHAR_SMALL_Z_WITH_CARON: // ž
|
|||
|
case FONT_CHAR_CAPITAL_Z_WITH_CARON: // Ž
|
|||
|
case FONT_CHAR_CAPITAL_Z_WITH_ACUTE: // Ź
|
|||
|
case FONT_CHAR_SMALL_Z_WITH_ACUTE: // ź
|
|||
|
case FONT_CHAR_CAPITAL_Z_WITH_DOT_ABOVE: // Ż
|
|||
|
case FONT_CHAR_SMALL_Z_WITH_DOT_ABOVE: // ż
|
|||
|
*p = 'z';
|
|||
|
break;
|
|||
|
}
|
|||
|
p++;
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
menuStatus_t menuLanguage(uiEvent_t *ev, bool isFirstRun)
|
|||
|
{
|
|||
|
if (isFirstRun)
|
|||
|
{
|
|||
|
menuDataGlobal.endIndex = NUM_LANGUAGES;
|
|||
|
updateScreen();
|
|||
|
return (MENU_STATUS_LIST_TYPE | MENU_STATUS_SUCCESS);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
menuLanguageExitCode = MENU_STATUS_SUCCESS;
|
|||
|
|
|||
|
if (ev->hasEvent)
|
|||
|
{
|
|||
|
handleEvent(ev);
|
|||
|
}
|
|||
|
}
|
|||
|
return menuLanguageExitCode;
|
|||
|
}
|
|||
|
|
|||
|
static void updateScreen(void)
|
|||
|
{
|
|||
|
int mNum = 0;
|
|||
|
|
|||
|
ucClearBuf();
|
|||
|
menuDisplayTitle(currentLanguage->language);
|
|||
|
|
|||
|
for(int i = -1; i <= 1; i++)
|
|||
|
{
|
|||
|
mNum = menuGetMenuOffset(NUM_LANGUAGES, i);
|
|||
|
|
|||
|
if (mNum < NUM_LANGUAGES)
|
|||
|
{
|
|||
|
menuDisplayEntry(i, mNum, (char *)languages[LANGUAGE_DISPLAY_ORDER[mNum]].LANGUAGE_NAME);
|
|||
|
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
if (nonVolatileSettings.audioPromptMode >= AUDIO_PROMPT_MODE_VOICE_LEVEL_1)
|
|||
|
{
|
|||
|
char buffer[17];
|
|||
|
|
|||
|
snprintf(buffer, 17, "%s", (char *)languages[LANGUAGE_DISPLAY_ORDER[mNum]].LANGUAGE_NAME);
|
|||
|
|
|||
|
clearNonLatinChar((uint8_t *)&buffer[0]);
|
|||
|
|
|||
|
voicePromptsInit();
|
|||
|
voicePromptsAppendString(buffer);
|
|||
|
promptsPlayNotAfterTx();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ucRender();
|
|||
|
}
|
|||
|
|
|||
|
static void handleEvent(uiEvent_t *ev)
|
|||
|
{
|
|||
|
if (ev->events & BUTTON_EVENT)
|
|||
|
{
|
|||
|
if (repeatVoicePromptOnSK1(ev))
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if (ev->events & FUNCTION_EVENT)
|
|||
|
{
|
|||
|
if ((QUICKKEY_TYPE(ev->function) == QUICKKEY_MENU) && (QUICKKEY_ENTRYID(ev->function) < NUM_LANGUAGES))
|
|||
|
{
|
|||
|
menuDataGlobal.currentItemIndex = QUICKKEY_ENTRYID(ev->function);
|
|||
|
settingsSet(nonVolatileSettings.languageIndex, menuDataGlobal.currentItemIndex);
|
|||
|
currentLanguage = &languages[menuDataGlobal.currentItemIndex];
|
|||
|
settingsSaveIfNeeded(true);
|
|||
|
menuSystemLanguageHasChanged();
|
|||
|
menuSystemPopAllAndDisplayRootMenu();
|
|||
|
}
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (KEYCHECK_PRESS(ev->keys, KEY_DOWN) && (menuDataGlobal.endIndex != 0))
|
|||
|
{
|
|||
|
menuSystemMenuIncrement(&menuDataGlobal.currentItemIndex, NUM_LANGUAGES);
|
|||
|
updateScreen();
|
|||
|
menuLanguageExitCode |= MENU_STATUS_LIST_TYPE;
|
|||
|
}
|
|||
|
else if (KEYCHECK_PRESS(ev->keys, KEY_UP))
|
|||
|
{
|
|||
|
menuSystemMenuDecrement(&menuDataGlobal.currentItemIndex, NUM_LANGUAGES);
|
|||
|
updateScreen();
|
|||
|
menuLanguageExitCode |= MENU_STATUS_LIST_TYPE;
|
|||
|
}
|
|||
|
else if (KEYCHECK_SHORTUP(ev->keys, KEY_GREEN))
|
|||
|
{
|
|||
|
settingsSet(nonVolatileSettings.languageIndex, (uint8_t) LANGUAGE_DISPLAY_ORDER[menuDataGlobal.currentItemIndex]);
|
|||
|
currentLanguage = &languages[LANGUAGE_DISPLAY_ORDER[menuDataGlobal.currentItemIndex]];
|
|||
|
settingsSaveIfNeeded(true);
|
|||
|
menuSystemLanguageHasChanged();
|
|||
|
menuSystemPopAllAndDisplayRootMenu();
|
|||
|
return;
|
|||
|
}
|
|||
|
else if (KEYCHECK_SHORTUP(ev->keys, KEY_RED))
|
|||
|
{
|
|||
|
menuSystemPopPreviousMenu();
|
|||
|
return;
|
|||
|
}
|
|||
|
else if (KEYCHECK_SHORTUP_NUMBER(ev->keys) && BUTTONCHECK_DOWN(ev, BUTTON_SK2))
|
|||
|
{
|
|||
|
saveQuickkeyMenuIndex(ev->keys.key, menuSystemGetCurrentMenuNumber(), menuDataGlobal.currentItemIndex, 0);
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|