Improve power settings

This commit is contained in:
Armel FAUVEAU
2024-07-16 03:20:51 +02:00
parent 88ef0d9925
commit 697bcb4a2e
12 changed files with 150 additions and 155 deletions

View File

@@ -41,7 +41,6 @@ ENABLE_BYP_RAW_DEMODULATORS ?= 0
ENABLE_BLMIN_TMP_OFF ?= 0 ENABLE_BLMIN_TMP_OFF ?= 0
ENABLE_SCAN_RANGES ?= 1 ENABLE_SCAN_RANGES ?= 1
ENABLE_FEAT_F4HWN ?= 1 ENABLE_FEAT_F4HWN ?= 1
ENABLE_FEAT_F4HWN_FIXED_PWR ?= 0
ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0 ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0
ENABLE_FEAT_F4HWN_PMR ?= 1 ENABLE_FEAT_F4HWN_PMR ?= 1
@@ -402,9 +401,6 @@ ifeq ($(ENABLE_FEAT_F4HWN),1)
CFLAGS += -DAUTHOR_STRING_1=\"$(AUTHOR_STRING_1)\" -DVERSION_STRING_1=\"$(VERSION_STRING_1)\" CFLAGS += -DAUTHOR_STRING_1=\"$(AUTHOR_STRING_1)\" -DVERSION_STRING_1=\"$(VERSION_STRING_1)\"
CFLAGS += -DAUTHOR_STRING_2=\"$(AUTHOR_STRING_2)\" -DVERSION_STRING_2=\"$(VERSION_STRING_2)\" CFLAGS += -DAUTHOR_STRING_2=\"$(AUTHOR_STRING_2)\" -DVERSION_STRING_2=\"$(VERSION_STRING_2)\"
endif endif
ifeq ($(ENABLE_FEAT_F4HWN_FIXED_PWR),1)
CFLAGS += -DENABLE_FEAT_F4HWN_FIXED_PWR
endif
ifeq ($(ENABLE_FEAT_F4HWN_SCREENSHOT),1) ifeq ($(ENABLE_FEAT_F4HWN_SCREENSHOT),1)
CFLAGS += -DENABLE_FEAT_F4HWN_SCREENSHOT CFLAGS += -DENABLE_FEAT_F4HWN_SCREENSHOT
endif endif

View File

@@ -121,7 +121,7 @@ static_assert(ARRAY_SIZE(action_opt_table) == ACTION_OPT_LEN);
void ACTION_Power(void) void ACTION_Power(void)
{ {
if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH) if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH)
gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;

View File

@@ -374,9 +374,8 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
//*pMin = 0; *pMax = ARRAY_SIZE(gSubMenu_SET_PWR) - 1;
*pMax = ARRAY_SIZE(gSubMenu_SET_LOW) - 1;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
//*pMin = 0; //*pMin = 0;
@@ -866,8 +865,8 @@ void MENU_AcceptSetting(void)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
gSetting_set_low = gSubMenuSelection; gSetting_set_pwr = gSubMenuSelection;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
@@ -1285,8 +1284,8 @@ void MENU_ShowCurrentSetting(void)
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
gSubMenuSelection = gSetting_set_low; gSubMenuSelection = gSetting_set_pwr;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
gSubMenuSelection = gSetting_set_ptt_session; gSubMenuSelection = gSetting_set_ptt_session;

4
main.c
View File

@@ -128,9 +128,9 @@ void Main(void)
gEeprom.KEY_LOCK = 0; gEeprom.KEY_LOCK = 0;
SETTINGS_SaveSettings(); SETTINGS_SaveSettings();
#ifndef ENABLE_VOX #ifndef ENABLE_VOX
gMenuCursor = 63; // move to hidden section, fix me if change... !!! gMenuCursor = 62; // move to hidden section, fix me if change... !!!
#else #else
gMenuCursor = 64; // move to hidden section, fix me if change... !!! gMenuCursor = 63; // move to hidden section, fix me if change... !!!
#endif #endif
#endif #endif
} }

2
misc.c
View File

@@ -105,7 +105,7 @@ enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
uint8_t gSetting_set_low = 1; uint8_t gSetting_set_pwr = 1;
bool gSetting_set_ptt = 0; bool gSetting_set_ptt = 0;
uint8_t gSetting_set_tot = 0; uint8_t gSetting_set_tot = 0;
uint8_t gSetting_set_ctr = 11; uint8_t gSetting_set_ctr = 11;

2
misc.h
View File

@@ -157,7 +157,7 @@ extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
extern uint8_t gSetting_set_low; extern uint8_t gSetting_set_pwr;
extern bool gSetting_set_ptt; extern bool gSetting_set_ptt;
extern uint8_t gSetting_set_tot; extern uint8_t gSetting_set_tot;
extern uint8_t gSetting_set_ctr; extern uint8_t gSetting_set_ctr;

116
radio.c
View File

@@ -140,7 +140,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t
pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING]; pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING];
pInfo->CHANNEL_SAVE = ChannelSave; pInfo->CHANNEL_SAVE = ChannelSave;
pInfo->FrequencyReverse = false; pInfo->FrequencyReverse = false;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pInfo->freq_config_RX.Frequency = Frequency; pInfo->freq_config_RX.Frequency = Frequency;
pInfo->freq_config_TX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency;
pInfo->pRX = &pInfo->freq_config_RX; pInfo->pRX = &pInfo->freq_config_RX;
@@ -329,7 +329,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
{ {
pVfo->FrequencyReverse = false; pVfo->FrequencyReverse = false;
pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE; pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE;
pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pVfo->BUSY_CHANNEL_LOCK = false; pVfo->BUSY_CHANNEL_LOCK = false;
} }
else else
@@ -337,8 +337,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
const uint8_t d4 = data[4]; const uint8_t d4 = data[4];
pVfo->FrequencyReverse = !!((d4 >> 0) & 1u); pVfo->FrequencyReverse = !!((d4 >> 0) & 1u);
pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u); pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u);
pVfo->OUTPUT_POWER = ((d4 >> 2) & 3u); pVfo->OUTPUT_POWER = ((d4 >> 2) & 7u);
pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 4) & 1u); pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 5) & 1u);
} }
if (data[5] == 0xFF) if (data[5] == 0xFF)
@@ -508,67 +508,31 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
// 1F30 32 32 32 64 64 64 8c 8c 8c ff ff ff ff ff ff ff 470 MHz // 1F30 32 32 32 64 64 64 8c 8c 8c ff ff ff ff ff ff ff 470 MHz
uint8_t Txp[3]; uint8_t Txp[3];
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3); uint8_t Op = 0;
if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID)
Op = 1;
else if(pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH)
Op = 2;
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (Op * 3), Txp, 3);
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
#ifdef ENABLE_FEAT_F4HWN_FIXED_PWR
// make low and mid even lower
// and fix values
// because of toxic fucking closed firmwares
uint8_t shift[] = {0, 0, 0, 0, 0, 0, 0};
if(Band == 5)
{
shift[0] = 2;
shift[1] = 1;
shift[2] = 2;
shift[3] = 2;
shift[4] = 2;
shift[5] = 2;
shift[6] = 2;
}
if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) {
for(uint8_t p = 0; p < 3; p++ )
{
switch (gSetting_set_low) {
case 0:
Txp[p] = 16 - shift[gSetting_set_low];
break;
case 1:
Txp[p] = 21 + shift[gSetting_set_low];
break;
case 2:
Txp[p] = 29 + shift[gSetting_set_low];
break;
case 3:
Txp[p] = 37 + shift[gSetting_set_low];
break;
case 4:
Txp[p] = 50 + shift[gSetting_set_low];
break;
}
}
}
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID){
Txp[0] = 77 + shift[5];
Txp[1] = 77 + shift[5];
Txp[2] = 77 + shift[5];
}
// increase high
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH){
Txp[0] = 165 + shift[6];
Txp[1] = 165 + shift[6];
Txp[2] = 165 + shift[6];
}
#else
// make low and mid even lower // make low and mid even lower
// and use calibration values // and use calibration values
// be aware with toxic fucking closed firmwares // be aware with toxic fucking closed firmwares
uint8_t shift[] = {0, 0, 0, 0, 0}; uint8_t shift[] = {0, 0, 0, 0, 0};
uint8_t currentPower = pInfo->OUTPUT_POWER;
if(currentPower == OUTPUT_POWER_USER)
{
currentPower = gSetting_set_pwr;
}
else
{
currentPower--;
}
/* /*
if(Band == 5) // UHF if(Band == 5) // UHF
@@ -581,6 +545,40 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
} }
*/ */
for(uint8_t p = 0; p < 3; p++)
{
switch (currentPower)
{
case 0:
Txp[p] = (Txp[p] * 4) / 25 + shift[pInfo->OUTPUT_POWER];
break;
case 1:
Txp[p] = (Txp[p] * 4) / 19 + shift[pInfo->OUTPUT_POWER];
break;
case 2:
Txp[p] = (Txp[p] * 4) / 13 + shift[pInfo->OUTPUT_POWER];
break;
case 3:
Txp[p] = (Txp[p] * 4) / 10 + shift[pInfo->OUTPUT_POWER];
break;
case 4:
Txp[p] = (Txp[p] * 4) / 7 + shift[pInfo->OUTPUT_POWER];
break;
case 5:
Txp[p] = (Txp[p] * 3) / 4;
break;
case 6:
Txp[p] = Txp[p] + 30;
break;
}
}
/*
// make low and mid even lower
// and use calibration values
// be aware with toxic fucking closed firmwares
uint8_t shift[] = {0, 0, 0, 0, 0};
if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) { if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) {
for(uint8_t p = 0; p < 3; p++ ) for(uint8_t p = 0; p < 3; p++ )
{ {
@@ -615,7 +613,7 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
Txp[1] = Txp[1] + 30; Txp[1] = Txp[1] + 30;
Txp[2] = Txp[2] + 30; Txp[2] = Txp[2] + 30;
} }
#endif */
#else #else
#ifdef ENABLE_REDUCE_LOW_MID_TX_POWER #ifdef ENABLE_REDUCE_LOW_MID_TX_POWER
// make low and mid even lower // make low and mid even lower

View File

@@ -317,7 +317,7 @@ void SETTINGS_InitEEPROM(void)
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
// 1FF0..0x1FF7 // 1FF0..0x1FF7
EEPROM_ReadBuffer(0x1FF0, Data, 8); EEPROM_ReadBuffer(0x1FF0, Data, 8);
gSetting_set_low = (((Data[7] & 0xF0) >> 4) < 5) ? ((Data[7] & 0xF0) >> 4) : 0; gSetting_set_pwr = (((Data[7] & 0xF0) >> 4) < 7) ? ((Data[7] & 0xF0) >> 4) : 0;
gSetting_set_ptt = (((Data[7] & 0x0F)) < 2) ? ((Data[7] & 0x0F)) : 0; gSetting_set_ptt = (((Data[7] & 0x0F)) < 2) ? ((Data[7] & 0x0F)) : 0;
gSetting_set_tot = (((Data[6] & 0xF0) >> 4) < 4) ? ((Data[6] & 0xF0) >> 4) : 0; gSetting_set_tot = (((Data[6] & 0xF0) >> 4) < 4) ? ((Data[6] & 0xF0) >> 4) : 0;
@@ -707,7 +707,7 @@ void SETTINGS_SaveSettings(void)
State[5] = ((tmp << 4) | (gSetting_set_ctr & 0x0F)); State[5] = ((tmp << 4) | (gSetting_set_ctr & 0x0F));
State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 0x0F)); State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 0x0F));
State[7] = ((gSetting_set_low << 4) | (gSetting_set_ptt & 0x0F)); State[7] = ((gSetting_set_pwr << 4) | (gSetting_set_ptt & 0x0F));
gEeprom.KEY_LOCK_PTT = gSetting_set_lck; gEeprom.KEY_LOCK_PTT = gSetting_set_lck;
@@ -744,7 +744,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
State._8[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType; State._8[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType;
State._8[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION; State._8[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION;
State._8[4] = 0 State._8[4] = 0
| (pVFO->BUSY_CHANNEL_LOCK << 4) | (pVFO->BUSY_CHANNEL_LOCK << 5)
| (pVFO->OUTPUT_POWER << 2) | (pVFO->OUTPUT_POWER << 2)
| (pVFO->CHANNEL_BANDWIDTH << 1) | (pVFO->CHANNEL_BANDWIDTH << 1)
| (pVFO->FrequencyReverse << 0); | (pVFO->FrequencyReverse << 0);

View File

@@ -82,7 +82,12 @@ enum {
}; };
enum { enum {
OUTPUT_POWER_LOW = 0, OUTPUT_POWER_USER = 0,
OUTPUT_POWER_LOW1,
OUTPUT_POWER_LOW2,
OUTPUT_POWER_LOW3,
OUTPUT_POWER_LOW4,
OUTPUT_POWER_LOW5,
OUTPUT_POWER_MID, OUTPUT_POWER_MID,
OUTPUT_POWER_HIGH OUTPUT_POWER_HIGH
}; };

View File

@@ -1072,7 +1072,11 @@ void UI_DisplayMain(void)
{ // TX power level { // TX power level
switch (gRxVfo->OUTPUT_POWER) switch (gRxVfo->OUTPUT_POWER)
{ {
case OUTPUT_POWER_LOW: Level = 2; break; case OUTPUT_POWER_LOW1: Level = 2; break;
case OUTPUT_POWER_LOW2: Level = 2; break;
case OUTPUT_POWER_LOW3: Level = 2; break;
case OUTPUT_POWER_LOW4: Level = 2; break;
case OUTPUT_POWER_LOW5: Level = 2; break;
case OUTPUT_POWER_MID: Level = 4; break; case OUTPUT_POWER_MID: Level = 4; break;
case OUTPUT_POWER_HIGH: Level = 6; break; case OUTPUT_POWER_HIGH: Level = 6; break;
} }
@@ -1190,36 +1194,22 @@ void UI_DisplayMain(void)
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
{ // show the TX power { // show the TX power
int i = vfoInfo->OUTPUT_POWER % 3; int i = vfoInfo->OUTPUT_POWER % 8;
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
if (isMainOnly(true)) if (isMainOnly(true))
{ {
const char pwr_short[][2] = {"L","M","H"}; const char pwr_short[][3] = {"U", "L1", "L2", "L3", "L4", "L5", "M", "H"};
if(i == 0)
{
sprintf(String, "%s%d", pwr_short[i], gSetting_set_low + 1);
}
else
{
sprintf(String, "%s", pwr_short[i]); sprintf(String, "%s", pwr_short[i]);
}
UI_PrintStringSmallNormal(String, LCD_WIDTH + 44, 0, line + 1); UI_PrintStringSmallNormal(String, LCD_WIDTH + 44, 0, line + 1);
} }
else else
{ {
const char pwr_long[][5] = {"LOW", "MID", "HIGH"}; const char pwr_long[][5] = {"USER", "LOW1", "LOW2", "LOW3", "LOW4", "LOW5", "MID", "HIGH"};
if(i == 0)
{
sprintf(String, "%s%d", pwr_long[i], gSetting_set_low + 1);
}
else
{
sprintf(String, "%s", pwr_long[i]); sprintf(String, "%s", pwr_long[i]);
}
GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true); GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true);
} }
#else #else
const char pwr_list[][2] = {"L","M","H"}; const char pwr_list[][2] = {"U", "L","M","H"};
UI_PrintStringSmallNormal(pwr_list[i], LCD_WIDTH + 46, 0, line + 1); UI_PrintStringSmallNormal(pwr_list[i], LCD_WIDTH + 46, 0, line + 1);
#endif #endif
} }

View File

@@ -134,7 +134,7 @@ const t_menu_item MenuList[] =
{"RxMode", MENU_TDR }, {"RxMode", MENU_TDR },
{"Sql", MENU_SQL }, {"Sql", MENU_SQL },
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"SetLow", MENU_SET_LOW }, {"SetPwr", MENU_SET_PWR },
{"SetPtt", MENU_SET_PTT }, {"SetPtt", MENU_SET_PTT },
{"SetTot", MENU_SET_TOT }, {"SetTot", MENU_SET_TOT },
{"SetEot", MENU_SET_EOT }, {"SetEot", MENU_SET_EOT },
@@ -166,9 +166,14 @@ const t_menu_item MenuList[] =
const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK; const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK;
const char gSubMenu_TXP[][5] = const char gSubMenu_TXP[][6] =
{ {
"LOW", "USER",
"LOW 1",
"LOW 2",
"LOW 3",
"LOW 4",
"LOW 5",
"MID", "MID",
"HIGH" "HIGH"
}; };
@@ -344,13 +349,15 @@ const char gSubMenu_SCRAMBLER[][7] =
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const char gSubMenu_SET_LOW[][7] = const char gSubMenu_SET_PWR[][7] =
{ {
"< 20mW", "< 20mW",
"125mW", "125mW",
"250mW", "250mW",
"500mW", "500mW",
"1W" "1W",
"2W",
"5W"
}; };
const char gSubMenu_SET_PTT[][8] = const char gSubMenu_SET_PTT[][8] =
@@ -944,8 +951,8 @@ void UI_DisplayMenu(void)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
strcpy(String, gSubMenu_SET_LOW[gSubMenuSelection]); strcpy(String, gSubMenu_SET_PWR[gSubMenuSelection]);
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:

View File

@@ -123,7 +123,7 @@ enum
MENU_F_CALI, // reference xtal calibration MENU_F_CALI, // reference xtal calibration
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
MENU_SET_LOW, MENU_SET_PWR,
MENU_SET_PTT, MENU_SET_PTT,
MENU_SET_TOT, MENU_SET_TOT,
MENU_SET_EOT, MENU_SET_EOT,
@@ -145,7 +145,7 @@ enum
extern const uint8_t FIRST_HIDDEN_MENU_ITEM; extern const uint8_t FIRST_HIDDEN_MENU_ITEM;
extern const t_menu_item MenuList[]; extern const t_menu_item MenuList[];
extern const char gSubMenu_TXP[3][5]; extern const char gSubMenu_TXP[8][6];
extern const char gSubMenu_SFT_D[3][4]; extern const char gSubMenu_SFT_D[3][4];
extern const char gSubMenu_W_N[2][7]; extern const char gSubMenu_W_N[2][7];
extern const char gSubMenu_OFF_ON[2][4]; extern const char gSubMenu_OFF_ON[2][4];
@@ -166,7 +166,7 @@ extern const char gSubMenu_D_RSP[4][11];
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SET_LOW[5][7]; extern const char gSubMenu_SET_PWR[7][7];
extern const char gSubMenu_SET_PTT[2][8]; extern const char gSubMenu_SET_PTT[2][8];
extern const char gSubMenu_SET_TOT[4][7]; extern const char gSubMenu_SET_TOT[4][7];
extern const char gSubMenu_SET_LCK[2][9]; extern const char gSubMenu_SET_LCK[2][9];