UHSDR/UHSDR-active-devel/mchf-eclipse/drivers/ui/menu/ui_menu.c

6089 lines
205 KiB
C
Raw Permalink Normal View History

2022-08-24 08:41:00 +02:00
/* -*- mode: c; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4; coding: utf-8 -*- */
/************************************************************************************
** **
** mcHF QRP Transceiver **
** K Atanassov - M0NKA 2014 **
** C Turner - KA7OEI 2014 **
** **
**---------------------------------------------------------------------------------**
** **
** File name: ui_menu.c **
** Description: main user interface configuration/adjustment menu system **
** Last Modified: **
** Licence: GNU GPLv3 **
************************************************************************************/
// Common
//
#include <src/uhsdr_version.h>
#include "uhsdr_board.h"
#include "ui_menu.h"
#include "ui_menu_internal.h"
#include "ui_configuration.h"
#include "config_storage.h"
#include "serial_eeprom.h"
#include "ui_spectrum.h"
#include "rtc.h"
#include "uhsdr_hmc1023.h"
#include <stdio.h>
#include <stdlib.h>
#include "arm_math.h"
#include "math.h"
#include "codec.h"
#include "radio_management.h"
#include "soft_tcxo.h"
#include "cw_decoder.h"
#include "osc_si5351a.h"
#include "osc_si570.h"
#include "audio_nr.h"
#include "audio_agc.h"
#include "fm_subaudible_tone_table.h"
#include "tx_processor.h"
#include "audio_reverb.h"
#define CLR_OR_SET_BITMASK(cond,value,mask) ((value) = (((cond))? ((value) | (mask)): ((value) & ~(mask))))
void float2fixedstr(char* buf, int maxchar, float32_t f, uint16_t digitsBefore, uint16_t digitsAfter)
{
char formatstr[16],numberstr[32];
int32_t mult_digits = pow10(digitsAfter);
snprintf(formatstr,16,(digitsBefore + digitsBefore > 0)?"%%%dd":"%%d",digitsBefore + digitsAfter);
snprintf(numberstr, 31, formatstr, (int32_t)(f * mult_digits));
int32_t num_len = strnlen(numberstr,32);
int idx = 0;
for (idx= 0; idx < num_len - digitsAfter && idx < maxchar; idx++)
{
buf[idx] = numberstr[idx];
}
if (idx == 0 || buf[idx-1] == '-')
{
buf[idx++] = '0';
}
else if (buf[idx-1] == ' ')
{
buf[idx-1] = '0';
}
buf[idx++] = '.';
for (int i= num_len - digitsAfter; i < num_len && i < maxchar; i++)
{
char c = numberstr[i];
if (c == ' ')
{
c = '0';
}
buf[idx++] = c;
}
buf[idx] = '\0';
}
// LCD
#include "ui_lcd_hy28.h" // for colors!
#include "uhsdr_hw_i2c.h"
#include "uhsdr_rtc.h"
// Codec control
#include "codec.h"
#include "softdds.h"
#include "audio_driver.h"
#include "audio_filter.h"
#include "audio_management.h"
#include "ui_driver.h"
#include "cat_driver.h"
// CW generation
#include "cw_gen.h"
// returns true if the value was changed in its value!
bool __attribute__ ((noinline)) UiDriverMenuItemChangeUInt8(int var, MenuProcessingMode_t mode, volatile uint8_t* val_ptr,uint8_t val_min,uint8_t val_max, uint8_t val_default, uint8_t increment)
{
uint8_t old_val = *val_ptr;
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if (*val_ptr < val_max)
{
(*val_ptr)+= increment;
}
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1;
if (*val_ptr > val_min)
{
(*val_ptr)-= increment;
}
}
if(*val_ptr < val_min)
{
ts.menu_var_changed = 1;
*val_ptr = val_min;
}
if(*val_ptr > val_max)
{
ts.menu_var_changed = 1;
*val_ptr = val_max;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1;
*val_ptr = val_default;
}
return old_val != *val_ptr;
}
bool __attribute__ ((noinline)) UiDriverMenuItemChangeUInt32(int var, MenuProcessingMode_t mode, volatile uint32_t* val_ptr,uint32_t val_min,uint32_t val_max, uint32_t val_default, uint32_t increment)
{
uint32_t old_val = *val_ptr;
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if (*val_ptr < val_max)
{
(*val_ptr)+= increment;
}
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1;
if (*val_ptr > val_min)
{
(*val_ptr)-= increment;
}
}
if(*val_ptr < val_min)
{
ts.menu_var_changed = 1;
*val_ptr = val_min;
}
if(*val_ptr > val_max)
{
ts.menu_var_changed = 1;
*val_ptr = val_max;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1;
*val_ptr = val_default;
}
return old_val != *val_ptr;
}
bool __attribute__ ((noinline)) UiDriverMenuItemChangeInt(int var, MenuProcessingMode_t mode, volatile int* val_ptr,int val_min,int val_max, int val_default, uint32_t increment)
{
uint32_t old_val = *val_ptr;
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if (*val_ptr < val_max)
{
(*val_ptr)+= increment;
}
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1;
if (*val_ptr > val_min)
{
(*val_ptr)-= increment;
}
}
if(*val_ptr < val_min)
{
ts.menu_var_changed = 1;
*val_ptr = val_min;
}
if(*val_ptr > val_max)
{
ts.menu_var_changed = 1;
*val_ptr = val_max;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1;
*val_ptr = val_default;
}
return old_val != *val_ptr;
}
inline bool UiDriverMenuItemChangeInt32(int var, MenuProcessingMode_t mode, volatile int32_t* val_ptr,int val_min,int val_max, int val_default, uint32_t increment)
{
return UiDriverMenuItemChangeInt(var, mode, (int*)val_ptr,val_min,val_max, val_default, increment);
}
bool __attribute__ ((noinline)) UiDriverMenuItemChangeInt16(int var, MenuProcessingMode_t mode, volatile int16_t* val_ptr,int16_t val_min,int16_t val_max, int16_t val_default, uint16_t increment)
{
uint32_t old_val = *val_ptr;
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if (*val_ptr < val_max)
{
(*val_ptr)+= increment;
}
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1;
if (*val_ptr > val_min)
{
(*val_ptr)-= increment;
}
}
if(*val_ptr < val_min)
{
ts.menu_var_changed = 1;
*val_ptr = val_min;
}
if(*val_ptr > val_max)
{
ts.menu_var_changed = 1;
*val_ptr = val_max;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1;
*val_ptr = val_default;
}
return old_val != *val_ptr;
}
bool __attribute__ ((noinline)) UiDriverMenuItemChangeOnOff(int var, MenuProcessingMode_t mode, volatile uint8_t* val_ptr, uint8_t val_default)
{
// we have to align the values to true and false, since sometimes other values are passed for true (use of temp_var)
// but this does not work properly.
*val_ptr = (*val_ptr)?1:0;
return UiDriverMenuItemChangeUInt8(var, mode, val_ptr,
0,
1,
val_default,
1
);
}
// always sets 1 or 0 as result, no matter what is passed as "true" value. Only 0 is recognized as false/
bool __attribute__ ((noinline)) UiDriverMenuItemChangeDisableOnOff(int var, MenuProcessingMode_t mode, volatile uint8_t* val_ptr, uint8_t val_default, char* options, uint32_t* clr_ptr)
{
bool res = UiDriverMenuItemChangeOnOff(var, mode, val_ptr, val_default);
strcpy(options, *val_ptr?"OFF":" ON");
if (*val_ptr)
{
*clr_ptr = Orange;
}
return res;
}
bool __attribute__ ((noinline)) UiDriverMenuItemChangeEnableOnOff(int var, MenuProcessingMode_t mode, volatile uint8_t* val_ptr, uint8_t val_default, char* options, uint32_t* clr_ptr)
{
bool res = UiDriverMenuItemChangeOnOff(var, mode, val_ptr, val_default);
strcpy(options, *val_ptr?" ON":"OFF");
if (!*val_ptr)
{
*clr_ptr = Orange;
}
return res;
}
bool UiDriverMenuItemChangeEnableOnOffBool(int var, MenuProcessingMode_t mode, volatile bool* val_ptr, uint8_t val_default, char* options, uint32_t* clr_ptr)
{
uint8_t temp = *val_ptr;
bool res = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp, val_default, options, clr_ptr);
*val_ptr = temp;
return res;
}
bool UiDriverMenuItemChangeEnableOnOffFlag(int var, MenuProcessingMode_t mode, volatile uint16_t* val_ptr, uint8_t val_default, char* options, uint32_t* clr_ptr, uint16_t mask)
{
uint8_t temp = (*val_ptr & mask)?1:0;
bool res = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp, val_default, options, clr_ptr);
CLR_OR_SET_BITMASK(temp,*val_ptr,mask);
return res;
}
bool __attribute__ ((noinline)) UiMenu_ChangeFilterPathMemory(int var, MenuProcessingMode_t mode, char* options, uint32_t* clr_ptr, uint16_t filter_mode,uint8_t memory_idx)
{
uint32_t temp_var = ts.filter_path_mem[filter_mode][memory_idx];
uint16_t old_fp = temp_var;
// for now just a single location CW for testing
bool tchange = UiDriverMenuItemChangeUInt32(var, mode, &temp_var,
0,
AUDIO_FILTER_PATH_NUM,
0,
1);
if(tchange) // did something change?
{
uint16_t fp = AudioFilter_NextApplicableFilterPath(PATH_ALL_APPLICABLE|PATH_DONT_STORE | (temp_var< old_fp?PATH_DOWN:PATH_UP),filter_mode,old_fp);
if (fp >= old_fp && temp_var < old_fp)
{
// wrap around -> we need to insert "0"
fp = 0;
}
ts.filter_path_mem[filter_mode][memory_idx] = fp;
}
if (ts.filter_path_mem[filter_mode][memory_idx] > 0)
{
const char *filter_names[2];
AudioFilter_GetNamesOfFilterPath(ts.filter_path_mem[filter_mode][memory_idx],filter_names);
sprintf(options, " %s/%s", filter_names[0],filter_names[1]);
}
else
{
sprintf(options, " UNUSED");
}
return tchange;
}
void UiMenu_HandleDemodModeDisable(int var, MenuProcessingMode_t mode, char* options, uint32_t* clr_ptr, uint16_t demod_mode_disable)
{
uint8_t var_change;
uint8_t mode_disable = 1;
if (ts.demod_mode_disable & demod_mode_disable)
{
mode_disable = 0;
}
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &mode_disable,0,options,clr_ptr);
if (var_change)
{
if(mode_disable == false)
{
ts.demod_mode_disable |= demod_mode_disable;
}
else
{
ts.demod_mode_disable &= ~demod_mode_disable;
}
}
}
void UiMenu_HandleIQAdjust(int var, MenuProcessingMode_t mode, char* options, uint32_t* clr_ptr, volatile int32_t* val_ptr, const uint16_t txrx_mode, int32_t min, int32_t max, iq_trans_idx_t valid_for)
{
bool tchange = false;
// used to decide whether the current transceiver state enables us to change the value
// later also mode is used but this is for the menu internal operation
// txrx_mode valid_t Cond
// RX IQ_TRANS_OFF RadioManagement_GetRealFreqTranslationMode(txrx_mode, ts.dmod_mode, ts.iq_freq_mode) == FREQ_IQ_CONV_MODE_OFF && (is_ssb(ts.dmod_mode) || ts.dmod_mode == DEMOD_CW) // if freq translate is off, ssb and cw are fine
// TX IQ_TRANS_OFF RadioManagement_GetRealFreqTranslationMode(txrx_mode, ts.dmod_mode, ts.iq_freq_mode) == FREQ_IQ_CONV_MODE_OFF && (is_ssb(ts.dmod_mode) || ts.dmod_mode == DEMOD_CW) // we transmit in CW always in non-translated mode
// RX IQ_TRANS_ON RadioManagement_GetRealFreqTranslationMode(txrx_mode, ts.dmod_mode, ts.iq_freq_mode) != FREQ_IQ_CONV_MODE_OFF && (is_ssb(ts.dmod_mode) || ts.dmod_mode == DEMOD_CW)
// TX IQ_TRANS_ON RadioManagement_GetRealFreqTranslationMode(txrx_mode, ts.dmod_mode, ts.iq_freq_mode) != FREQ_IQ_CONV_MODE_OFF && (is_ssb(ts.dmod_mode) || ts.dmod_mode == DEMOD_CW)
iq_trans_idx_t current_trans_idx = RadioManagement_GetRealFreqTranslationMode(ts.txrx_mode, ts.dmod_mode, ts.iq_freq_mode) == FREQ_IQ_CONV_MODE_OFF? IQ_TRANS_OFF : IQ_TRANS_ON;
bool trans_mode_match = current_trans_idx == valid_for && (is_ssb(ts.dmod_mode) || ts.dmod_mode == DEMOD_CW);
if(trans_mode_match && (ts.txrx_mode == txrx_mode)) // only allow adjustment if in right mode
{
tchange = UiDriverMenuItemChangeInt32(var, mode, val_ptr,
min,
max,
min,
1);
if(tchange)
{
AudioManagement_CalcIqPhaseGainAdjust(ts.tune_freq);
}
}
else // Orange if not in correct mode
{
*clr_ptr = Orange;
}
if (*val_ptr == IQ_BALANCE_OFF)
{
snprintf(options,32, " OFF");
}
else
{
snprintf(options,32, "%4d", (int)*val_ptr);
}
}
void UiMenu_HandleIQAdjustGain(int var, MenuProcessingMode_t mode, char* options, uint32_t* clr_ptr, volatile int32_t* val_ptr, const uint16_t txrx_mode, iq_trans_idx_t valid_for)
{
UiMenu_HandleIQAdjust(var, mode, options, clr_ptr, val_ptr, txrx_mode, MIN_IQ_GAIN_BALANCE, MAX_IQ_GAIN_BALANCE, valid_for);
}
void UiMenu_HandleIQAdjustPhase(int var, MenuProcessingMode_t mode, char* options, uint32_t* clr_ptr, volatile int32_t* val_ptr, const uint16_t txrx_mode, iq_trans_idx_t valid_for)
{
UiMenu_HandleIQAdjust(var, mode, options, clr_ptr, val_ptr, txrx_mode, MIN_IQ_PHASE_BALANCE, MAX_IQ_PHASE_BALANCE, valid_for);
}
const ColorNameValue MchfColor_Id2ValueName[SPEC_MAX_COLOUR] =
{
{ White, "Whit"},
{ Grey, "Grey"},
{ Blue, "Blue"},
{ Red, "Red1"},
{ Red2, "Red2"},
{ Red3, "Red3"},
{ Magenta, "Mgnt"},
{ Green, "Gren"},
{ Cyan, "Cyan"},
{ Yellow, "Yelw"},
{ Orange, "Oran"},
{ Cream, "Crea"},
{ Black, "Blck"},
{ Grey1, "Gry1"},
{ Grey2, "Gry2"},
{ Grey3, "Gry3"},
{ Grey4, "Gry4"},
{ Grey5, "Gry5"},
{ Grey6, "Gry6"},
{ Grey7, "Gry7"},
{ Red4, "Red4"},
{ Green2, "Gre2"},
{ Blue3, "Blu3"},
{ Brown, "Brow"},
};
void __attribute__ ((noinline)) UiMenu_MapColors(uint32_t color ,char* options,volatile uint32_t* clr_ptr)
{
const ColorNameValue* cnv;
if (color < SPEC_MAX_COLOUR)
{
cnv = &MchfColor_Id2ValueName[color];
}
else
{
cnv = &MchfColor_Id2ValueName[SPEC_GREY];
}
if (options != NULL)
{
strcpy(options,cnv->name);
}
*clr_ptr = cnv->value;
}
void __attribute__ ((noinline)) UiDriverMenuMapStrings(char* output, uint32_t value ,const uint32_t string_max, const char** strings)
{
strcpy(output,(value <= string_max)?strings[value]:"UNDEFINED");
}
/**
* @returns: information for requested item as string. Do not write to this string.
*/
const char* UiMenu_GetSystemInfo(uint32_t* m_clr_ptr, int info_item)
{
static char out[48];
const char* outs = NULL;
*m_clr_ptr = White;
out[0] = 0;
switch (info_item)
{
case INFO_DISPLAY:
{
outs = UiLcdHy28_DisplayInfoGet(ts.display->display_type)->name;
break;
}
case INFO_DISPLAY_CTRL:
{
// const char* disp_com = ts.display_type==3?"parallel":"SPI";
// snprintf(out,32,"ILI%04x %s",ts.DeviceCode,disp_com);
if(ts.display->DeviceCode==0x8875)
{
snprintf(out,32,"RA%04x",ts.display->DeviceCode);
}
else if(ts.display->DeviceCode==0x7796)
{
snprintf(out,32,"ST%04x",ts.display->DeviceCode);
}
else
{
snprintf(out,32,"ILI%04x",ts.display->DeviceCode);
}
break;
}
#ifdef USE_OSC_SI570
case INFO_SI570:
{
if (osc->type == OSC_SI570) {
float suf = Si570_GetStartupFrequency();
int vorkomma = (int)(suf);
int nachkomma = (int) roundf((suf-vorkomma)*10000);
snprintf(out,32,"%xh / %u.%04u MHz",(Si570_GetI2CAddress() >> 1),vorkomma,nachkomma);
}
else
{
outs = "Not applicable";
if (osc == NULL)
{
*m_clr_ptr = Red;
}
}
}
break;
#endif
case INFO_OSC_NAME:
{
if (osc->isPresent) {
outs = osc->name;
}
else
{
outs = "Not present";
*m_clr_ptr = Red;
}
}
break;
case INFO_TP:
outs = (ts.tp->present == 0)?"n/a":"XPT2046";
break;
case INFO_RFBOARD:
switch(ts.rf_board)
{
case FOUND_RF_BOARD_OVI40:
outs = "OVI40 RF Board";
break;
default:
outs = "mcHF RF Board";
break;
}
break;
case INFO_FLASH:
snprintf(out,32,"%d",(STM32_GetFlashSize()));
break;
case INFO_CPU:
snprintf(out,32,"%3lx:%04lxh",HAL_GetDEVID(),HAL_GetREVID());
break;
case INFO_RAM:
snprintf(out,32,"%d",(ts.ramsize));
break;
case INFO_EEPROM:
{
const char* label = "";
switch(ts.configstore_in_use)
{
case CONFIGSTORE_IN_USE_I2C:
label = " [used]";
*m_clr_ptr = Green;
break; // in use & ok
case CONFIGSTORE_IN_USE_ERROR: // not ok
label = " [error]";
*m_clr_ptr = Red;
break;
default:
label = " [not used]";
if (ts.ser_eeprom_type >= SERIAL_EEPROM_DESC_REAL &&
SerialEEPROM_eepromTypeDescs[ts.ser_eeprom_type].size < SERIAL_EEPROM_MIN_USEABLE_SIZE)
{
label = " [too small]";
}
*m_clr_ptr = Red;
}
const char* i2c_size_unit = "K";
uint i2c_size = 0;
if(ts.ser_eeprom_type < SERIAL_EEPROM_DESC_NUM)
{
i2c_size = SerialEEPROM_eepromTypeDescs[ts.ser_eeprom_type].size / 1024;
}
// in case we have no or very small eeprom (less than 1K)
if (i2c_size == 0)
{
i2c_size = SerialEEPROM_eepromTypeDescs[ts.ser_eeprom_type].size;
i2c_size_unit = "B";
}
snprintf(out,48,"%s/%u%s%s",SerialEEPROM_eepromTypeDescs[ts.ser_eeprom_type].name, i2c_size, i2c_size_unit, label);
}
break;
case INFO_BL_VERSION:
{
outs = Board_BootloaderVersion();
}
break;
case INFO_FW_VERSION:
{
#ifdef OFFICIAL_BUILD
#ifdef IS_SMALL_BUILD
snprintf(out,32, "S%s", UHSDR_VERSION+4);
#else
snprintf(out,32, "D%s", UHSDR_VERSION+4);
#endif
#else
snprintf(out,32, "%s", UHSDR_VERSION+4);
#endif
}
break;
case INFO_BUILD:
{
snprintf(out,32, "%s", UHSDR_BUILD_DAT+4);
}
break;
case INFO_RTC:
{
snprintf(out,32, "%s", ts.rtc_present?"Yes":"N/A");
}
break;
case INFO_VBAT:
{
snprintf(out,32, "%s", ts.vbat_present?"Yes":"N/A");
}
break;
case INFO_CODEC:
{
#ifdef UI_BRD_MCHF
snprintf(out,32, "%s", ts.codec_present?"Yes":"N/A");
#else // OVI40 or Amber-UI
if(ts.codec_present)
{
snprintf(out,32, "%s", " 2xWM8731");
}
else if(ts.codecWM8731_Audio_present)
{
snprintf(out,32, "%s", ts.codecCS4270_present?" WM8731+CS4270":" IQ N/A");
}
else
{
snprintf(out,32, "%s", "N/A");
}
#endif
}
break;
case INFO_CODEC_TWINPEAKS:
{
if (ts.iq_auto_correction == 1)
{
switch (ts.twinpeaks_tested)
{
case TWINPEAKS_UNCORRECTABLE:
outs = " Failed";
break;
case TWINPEAKS_DONE:
outs = " Done";
break;
default:
outs = " Not done";
}
}
else
{
outs = "Deactivated"; // IQ correction is off, Twinpeaks auto correction cannot be done.
}
}
break;
case INFO_LO_TX_SUPR_DACs:
{
snprintf(out,32, "%s", ts.lotx_dacs_present ? "Yes" : "N/A");
}
break;
#ifdef SDR_AMBER
case INFO_AMBER_IO8:
{
snprintf(out,32, "%s", ts.amber_io8_present ? "Yes" : "N/A");
}
break;
case INFO_AMBER_IO4:
{
snprintf(out,32, "%s", ts.amber_io4_present ? "Yes" : "N/A");
}
break;
case INFO_AMBER_DAC_PWR_TX:
{
snprintf(out,32, "%s", ts.amber_dac_pwr_tx_present ? "Yes" : "N/A");
}
break;
#endif
case INFO_LICENCE:
{
snprintf(out,32, "%s", UHSDR_LICENCE);
}
break;
#ifdef TRX_HW_LIC
case INFO_HWLICENCE:
{
snprintf(out,32, "%s", TRX_HW_LIC);
}
break;
#endif
default:
outs = "NO INFO";
}
if (outs == NULL) {
outs = out;
}
return outs;
}
bool __attribute__ ((noinline)) UiDriverMenuBandPowerAdjust(int var, MenuProcessingMode_t mode, uint8_t band_mode, uint8_t pa_level, char* options, uint32_t* clr_ptr)
{
volatile uint8_t* adj_ptr = &ts.pwr_adj[pa_level == PA_LEVEL_FULL?ADJ_FULL_POWER:ADJ_REF_PWR][band_mode];
bool tchange = false;
const BandInfo* band = RadioManagement_GetBand(df.tune_old);
if((band_mode == band->band_mode) && (ts.power_level == pa_level))
{
tchange = UiDriverMenuItemChangeUInt8(var, mode, adj_ptr,
TX_POWER_FACTOR_MIN,
RadioManagement_IsPowerFactorReduce(df.tune_old)?TX_POWER_FACTOR_MAX:TX_POWER_FACTOR_MAX/4,
TX_POWER_FACTOR_MIN,
1
);
if(tchange) // did something change?
{
RadioManagement_SetPowerLevel(band, pa_level); // yes, update the power factor
}
}
else
{
// not enabled
*clr_ptr = Orange;
}
sprintf(options, " %u", *adj_ptr);
return tchange;
}
bool __attribute__ ((noinline)) UiDriverMenuBandRevCouplingAdjust(int var, MenuProcessingMode_t mode, uint8_t coupling_band, char* options, uint32_t* clr_ptr)
{
bool tchange = false;
volatile uint8_t *adj_ptr = &swrm.coupling_calc[coupling_band];
if(ts.coupling_band == coupling_band) // is this band selected?
{
tchange = UiDriverMenuItemChangeUInt8(var, mode, adj_ptr,
SWR_COUPLING_MIN,
SWR_COUPLING_MAX,
SWR_COUPLING_DEFAULT,
1
);
}
if((ts.txrx_mode != TRX_MODE_TX) || (ts.coupling_band != coupling_band)) // Orange if not in TX mode or NOT on this band
*clr_ptr = Orange;
sprintf(options, " %u", *adj_ptr);
return tchange;
}
/**
*
* @param select
* @param mode selects if the entry is just to be displayed or can be changed.
* @param pos which line the menu item is being displayed on, used for positioning value display in some cases.
* @param var the actual menu item to change / display
* @param options the to be displayed value is returned as a string in this array. Shown unless txt_ptr_ptr does not point to a NULL ptr
* @param txt_ptr_ptr this is a return value. if the address in the referenced pointer is not NULL, this is displayed, not options.
* @param clr_ptr pointer to the value display color
*/
void UiMenu_UpdateItem(uint16_t select, MenuProcessingMode_t mode, int pos, int var, char* options, const char** txt_ptr_ptr, uint32_t* clr_ptr)
{
const char* txt_ptr = NULL;
uint32_t clr = *clr_ptr;
uint8_t nr_step;
// case statement local variables defined for convenience here
bool var_change = false;
uint8_t temp_var_u8; // used to temporarily represent some configuration values as uint8_t value
bool temp_var_bool;
#ifdef HELP_MENU
ts.menu_selected_item = select;
#endif
if(mode == MENU_PROCESS_VALUE_CHANGE)
{
if(select == CONFIG_XVTR_FREQUENCY_OFFSET) // signal if we are in XVTR FREQUENCY OFFSET adjust mode for alternate frequency steps
ts.xvtr_adjust_flag = 1;
else // NOT in transverter mode
{
if(ts.xvtr_adjust_flag) // had transverter frequency mode been active?
{
ts.xvtr_adjust_flag = 0; // yes - disable flag
UiDriver_ChangeTuningStep(0); // force to valid frequency step size for normal tuning
UiDriver_ChangeTuningStep(1);
}
}
}
// switch(select) // DSP_NR_STRENGTH_MAX
// {
// case MENU_DSP_NR_STRENGTH: // DSP Noise reduction strength
if(select==MENU_DSP_NR_STRENGTH)
{
nr_step = DSP_NR_STRENGTH_STEP;
if(ts.dsp.nr_strength >= 190 || ts.dsp.nr_strength <= 10)
{
nr_step = 1;
}
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.nr_strength,
DSP_NR_STRENGTH_MIN,
DSP_NR_STRENGTH_MAX,
DSP_NR_STRENGTH_DEFAULT,
nr_step
);
if(var_change)
{
if(ts.dsp.nr_strength == 189)
{
ts.dsp.nr_strength = 185;
}
if(ts.dsp.nr_strength == 11)
{
ts.dsp.nr_strength = 15;
}
// did it change?
if(ts.dsp.active & DSP_NR_ENABLE) // only change if DSP active
{
// this causes considerable noise
//AudioDriver_SetRxAudioProcessing(ts.dmod_mode, false);
// we do this instead
nr_params.alpha = 0.799 + ((float32_t)ts.dsp.nr_strength / 1000.0);
}
}
#ifdef OBSOLETE_NR
if(!(ts.dsp.active & DSP_NR_ENABLE)) // make red if DSP not active
{
clr = Orange;
}
else
{
if(ts.dsp.nr_strength >= DSP_STRENGTH_RED)
clr = Red;
else if(ts.dsp.nr_strength >= DSP_STRENGTH_ORANGE)
clr = Orange;
else if(ts.dsp.nr_strength >= DSP_STRENGTH_YELLOW)
clr = Yellow;
}
#endif
//
snprintf(options,32, " %u", ts.dsp.nr_strength);
// break;
}
// case MENU_AM_DISABLE: // AM mode enable/disable
else if(select==MENU_AM_DISABLE)
{
UiMenu_HandleDemodModeDisable(var, mode, options, &clr, DEMOD_AM_DISABLE);
// break;
}
// case MENU_DIGI_DISABLE: // AM mode enable/disable
else if(select==MENU_DIGI_DISABLE)
{
UiMenu_HandleDemodModeDisable(var, mode, options, &clr, DEMOD_DIGI_DISABLE);
// break;
}
// case MENU_CW_DISABLE: // AM mode enable/disable
else if(select==MENU_CW_DISABLE)
{
UiMenu_HandleDemodModeDisable(var, mode, options, &clr, DEMOD_CW_DISABLE);
// break;
}
// case MENU_DEMOD_SAM: // Enable demodulation mode SAM
else if(select==MENU_DEMOD_SAM)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_SAM_ENABLE);
// break;
}
// case MENU_SSB_AUTO_MODE_SELECT: // Enable/Disable auto LSB/USB select
else if(select==MENU_SSB_AUTO_MODE_SELECT)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.lsb_usb_auto_select,
0,
AUTO_LSB_USB_MAX,
AUTO_LSB_USB_OFF,
1
);
switch(ts.lsb_usb_auto_select)
{
case AUTO_LSB_USB_ON: // LSB on bands < 10 MHz
txt_ptr = " ON"; // yes
break;
case AUTO_LSB_USB_60M: // USB on 60 meters?
txt_ptr = "USB 60M"; // yes
break;
default:
txt_ptr = " OFF"; // no (obviously!)
}
// break;
}
// case MENU_FM_MODE_ENABLE: // Enable/Disable FM
else if(select==MENU_FM_MODE_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags2,0,options,&clr, FLAGS2_FM_MODE_ENABLE);
// break;
}
// case MENU_FM_GEN_SUBAUDIBLE_TONE: // Selection of subaudible tone for FM transmission
else if(select==MENU_FM_GEN_SUBAUDIBLE_TONE)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.fm_subaudible_tone_gen_select,
0,
NUM_SUBAUDIBLE_TONES,
FM_SUBAUDIBLE_TONE_OFF,
1
);
if (var_change)
{
AudioManagement_CalcSubaudibleGenFreq(fm_subaudible_tone_table[ts.fm_subaudible_tone_gen_select]);
}
if(ts.fm_subaudible_tone_gen_select != FM_SUBAUDIBLE_TONE_OFF) // tone select not zero (tone activated
{
int a = (int)(ads.fm_conf.subaudible_tone_gen_freq * 10); // convert to integer, Hz*10
snprintf(options,32, "%d.%01dHz", a/10, a%10);
}
else // tone is off
{
snprintf(options,32, " OFF"); // make it dislay "off"
}
if(ts.dmod_mode != DEMOD_FM) // make orange if we are NOT in FM mode
{
clr = Orange;
}
else if(ads.fm_conf.subaudible_tone_det_freq > 200) // yellow for tones above 200 Hz as they are more audible
{
clr = Yellow;
}
// break;
}
// case MENU_FM_DET_SUBAUDIBLE_TONE: // Selection of subaudible tone for FM reception
else if(select==MENU_FM_DET_SUBAUDIBLE_TONE)
{
UiDriverMenuItemChangeUInt32(var, mode, &ts.fm_subaudible_tone_det_select,
0,
NUM_SUBAUDIBLE_TONES,
FM_SUBAUDIBLE_TONE_OFF,
1
);
AudioManagement_CalcSubaudibleDetFreq(fm_subaudible_tone_table[ts.fm_subaudible_tone_det_select]);
if(ts.fm_subaudible_tone_det_select) // tone select not zero (tone activated
{
// calculate frequency word
int a = (int)(ads.fm_conf.subaudible_tone_det_freq * 10); // convert to integer, Hz*10
snprintf(options,32, "%d.%01dHz", a/10, a%10);
}
else // tone is off
{
snprintf(options,32, " OFF"); // make it dislay "off"
}
if(ts.dmod_mode != DEMOD_FM) // make orange if we are NOT in FM
{
clr = Orange;
}
else if(ads.fm_conf.subaudible_tone_det_freq > 200) // yellow for tones above 200 Hz as they are more audible
{
clr = Yellow;
}
// break;
}
// case MENU_FM_TONE_BURST_MODE:
else if(select==MENU_FM_TONE_BURST_MODE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.fm_tone_burst_mode,
0,
FM_TONE_BURST_MAX,
FM_TONE_BURST_OFF,
1
);
ads.fm_conf.tone_burst_active = 0; // make sure it is turned off
AudioManagement_LoadToneBurstMode(); // activate setting
if (ts.fm_tone_burst_mode != FM_TONE_BURST_OFF)
{
snprintf(options, 32, " %lu Hz", fm_tone_burst_freq[ts.fm_tone_burst_mode]);
}
else
{
txt_ptr = " OFF";
}
if(ts.dmod_mode != DEMOD_FM) // make orange if we are NOT in FM
{
clr = Orange;
}
// break;
}
// case MENU_FM_DEV_MODE: // Select +/- 2.5 or 5 kHz deviation on RX and TX
else if(select==MENU_FM_DEV_MODE)
{
if(ts.iq_freq_mode)
{
temp_var_u8 = RadioManagement_FmDevIs5khz();
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp_var_u8,0,options,&clr);
if(var_change)
{
RadioManagement_FmDevSet5khz(temp_var_u8 != 0); // band up/down swap is to be enabled
}
if(RadioManagement_FmDevIs5khz()) // Check state of bit indication 2.5/5 kHz
{
txt_ptr = "+-5k (Wide)"; // Bit is set - 5 kHz
}
else
{
txt_ptr = "+-2k5 (Nar)"; // Not set - 2.5 kHz
}
}
else // translate mode is off - NO FM!!!
{
txt_ptr = " OFF"; // Say that it is OFF!
clr = Red;
}
// break;
}
#if 0
// case MENU_AGC_MODE: // AGC mode
else if(select==MENU_AGC_MODE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.agc_mode,
0,
AGC_MAX_MODE,
AGC_DEFAULT,
1
);
switch(ts.agc_mode) {
case AGC_SLOW:
txt_ptr = " SLOW";
break;
case AGC_MED:
txt_ptr = " MED";
break;
case AGC_FAST:
txt_ptr = " FAST";
break;
case AGC_OFF:
txt_ptr = "MANUAL";
clr = Red;
break;
case AGC_CUSTOM:
txt_ptr = "CUSTOM";
break;
}
if(var_change)
{
// now set the AGC
AudioManagement_CalcAGCDecay(); // initialize AGC decay ("hang time") values
}
if(ts.txrx_mode == TRX_MODE_TX) // Orange if in TX mode
{
clr = Orange;
}
// break;
}
// case MENU_RF_GAIN_ADJ: // RF gain control adjust
else if(select==MENU_RF_GAIN_ADJ)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &ts.rf_gain,
0,
MAX_RF_GAIN,
DEFAULT_RF_GAIN,
1
);
if(var_change)
{
AudioManagement_CalcRFGain();
}
if(ts.rf_gain < 20)
{
clr = Red;
}
else if(ts.rf_gain < 30)
{
clr = Orange;
}
else if(ts.rf_gain < 40)
{
clr = Yellow;
}
else
{
clr = White;
}
if(var_change) // did RFGain get changed?
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
snprintf(options, 32, " %d", ts.rf_gain);
// break;
}
#endif
// case MENU_AGC_WDSP_MODE: // AGC mode
else if(select==MENU_AGC_WDSP_MODE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &agc_wdsp_conf.mode,
0, //
5,
2,
1
);
switch(agc_wdsp_conf.mode) {
case 0:
txt_ptr = "very LONG";
break;
case 1:
txt_ptr = " LONG";
break;
case 2:
txt_ptr = " SLOW";
break;
case 3:
txt_ptr = " MED";
break;
case 4:
txt_ptr = " FAST";
break;
case 5:
txt_ptr = " OFF ";
clr = Red;
break;
}
if(var_change)
{
// now set the AGC parameters
agc_wdsp_conf.switch_mode = 1; // set flag to 1 for parameter change
AudioDriver_AgcWdsp_Set();
UiMenu_RenderMenu(MENU_RENDER_ONLY);
}
if(ts.txrx_mode == TRX_MODE_TX) // Orange if in TX mode
{
clr = Orange;
}
// break;
}
// case MENU_AGC_WDSP_SLOPE: //
else if(select==MENU_AGC_WDSP_SLOPE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &agc_wdsp_conf.slope,
0,
200,
40,
10
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %ddB", agc_wdsp_conf.slope / 10);
// break;
}
// case MENU_AGC_WDSP_THRESH: //
else if(select==MENU_AGC_WDSP_THRESH)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &agc_wdsp_conf.thresh,
-20,
120,
40,
1
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %ddB", agc_wdsp_conf.thresh);
// break;
}
// case MENU_AGC_WDSP_HANG_THRESH: //
else if(select==MENU_AGC_WDSP_HANG_THRESH)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &agc_wdsp_conf.hang_thresh,
-20,
120,
40,
1
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %ddB", agc_wdsp_conf.hang_thresh);
// break;
}
// case MENU_AGC_WDSP_TAU_DECAY: //
else if(select==MENU_AGC_WDSP_TAU_DECAY)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &agc_wdsp_conf.tau_decay[agc_wdsp_conf.mode],
100,
5000,
1000,
100
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %ums", agc_wdsp_conf.tau_decay[agc_wdsp_conf.mode]);
// break;
}
// case MENU_AGC_WDSP_TAU_HANG_DECAY: //
else if(select==MENU_AGC_WDSP_TAU_HANG_DECAY)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &agc_wdsp_conf.tau_hang_decay,
100,
5000,
1000,
100
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %ums", agc_wdsp_conf.tau_hang_decay);
// break;
}
// case MENU_DBM_CALIBRATE: //
else if(select==MENU_DBM_CALIBRATE)
{
var_change = UiDriverMenuItemChangeInt32(var, mode, &ts.dbm_constant,
-100,
100,
0,
1
);
snprintf(options, 32, " %lddB", ts.dbm_constant);
// break;
}
// case MENU_UI_INVERSE_SCROLLING: //
else if(select==MENU_UI_INVERSE_SCROLLING)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags2,0,options,&clr,FLAGS2_UI_INVERSE_SCROLLING);
if(var_change)
{
UiMenu_RenderMenu(MENU_RENDER_ONLY);
}
// break;
}
// case MENU_AGC_WDSP_HANG_TIME: //
else if(select==MENU_AGC_WDSP_HANG_TIME)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &agc_wdsp_conf.hang_time,
10,
5000,
250,
10
);
if(var_change)
{
AudioDriver_AgcWdsp_Set();
}
snprintf(options, 32, " %dms", agc_wdsp_conf.hang_time);
// break;
}
#if 0
// case MENU_AGC_WDSP_SWITCH: // Enable/Disable wdsp AGC
else if(select==MENU_AGC_WDSP_SWITCH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &agc_wdsp_conf,
0,
1,
0,
1
);
switch(agc_wdsp_conf)
{
case 1: //
txt_ptr = " WDSP AGC"; //
break;
default:
txt_ptr = "Standard AGC"; //
}
// break;
}
#endif
// case MENU_AGC_WDSP_HANG_ENABLE: //
else if(select==MENU_AGC_WDSP_HANG_ENABLE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &agc_wdsp_conf.hang_enable,
0,
1,
0,
1
);
switch(agc_wdsp_conf.hang_enable)
{
case 1: //
txt_ptr = " ON"; //
break;
case 0:
txt_ptr = " OFF"; //
}
// break;
}
// case MENU_SAM_PLL_LOCKING_RANGE: //
else if(select==MENU_SAM_PLL_LOCKING_RANGE)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &ads.pll_fmax_int,
50,
8000,
500,
10
);
if(var_change)
{
AudioDriver_SetSamPllParameters();
}
snprintf(options, 32, " %d", ads.pll_fmax_int);
// break;
}
// case MENU_SAM_PLL_STEP_RESPONSE: //
else if(select==MENU_SAM_PLL_STEP_RESPONSE)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &ads.zeta_int,
1,
100,
65,
1
);
if(var_change)
{
AudioDriver_SetSamPllParameters();
}
snprintf(options, 32, " %d", ads.zeta_int);
// break;
}
// case MENU_SAM_PLL_BANDWIDTH: //
else if(select==MENU_SAM_PLL_BANDWIDTH)
{
var_change = UiDriverMenuItemChangeInt(var, mode, &ads.omegaN_int,
25,
1000,
250,
5
);
if(var_change)
{
AudioDriver_SetSamPllParameters();
}
snprintf(options, 32, " %d", ads.omegaN_int);
// break;
}
// case MENU_SAM_FADE_LEVELER: // Enable/Disable fade leveler for SAM
else if(select==MENU_SAM_FADE_LEVELER)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ads.fade_leveler,
0,
1,
0,
1
);
switch(ads.fade_leveler)
{
case 1: //
txt_ptr = " ON"; //
break;
default:
txt_ptr = " OFF"; //
}
// break;
}
/* case MENU_SAM_SIDEBAND: //
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ads.sam_sideband,
0,
2,
0,
1
);
if(var_change)
{
UiDriver_ShowMode();
}
//
if(ads.sam_sideband == 1 || ads.sam_sideband == 2)
{
clr = Red;
}
switch(ads.sam_sideband)
{
case 0:
txt_ptr = "BOTH";
break;
case 1:
txt_ptr = " LSB";
break;
case 2:
txt_ptr = " USB";
break;
}
break;
case CONFIG_SAM_PLL_TAUR: //
var_change = UiDriverMenuItemChangeInt(var, mode, &ads.tauR_int,
1,
1000,
20,
1
);
if(var_change)
{
set_SAM_PLL_parameters();
}
snprintf(options, 32, " %d", ads.tauR_int);
break;
case CONFIG_SAM_PLL_TAUI: //
var_change = UiDriverMenuItemChangeInt(var, mode, &ads.tauI_int,
1,
1000,
140,
1
);
if(var_change)
{
}
snprintf(options, 32, " %d", ads.tauI_int);
break;
*/
// RX Codec gain adjust
#if 0
// case MENU_CUSTOM_AGC: // Custom AGC adjust
else if(select==MENU_CUSTOM_AGC)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.agc_custom_decay,
0,
AGC_CUSTOM_MAX,
AGC_CUSTOM_DEFAULT,
1
);
if(var_change)
{
if(ts.agc_custom_decay > AGC_CUSTOM_MAX)
ts.agc_custom_decay = AGC_CUSTOM_MAX;
// now set the custom AGC - if in custom mode
if(ts.agc_mode == AGC_CUSTOM)
{
float tcalc;
tcalc = (float)ts.agc_custom_decay; // use temp var "tcalc" as audio function
tcalc += 30; // can be called mid-calculation!
tcalc /= 10;
tcalc *= -1;
tcalc = powf(10, tcalc);
ads.agc_decay = tcalc;
}
}
if((ts.txrx_mode == TRX_MODE_TX) || (ts.agc_mode != AGC_CUSTOM)) // Orange if in TX mode
{
clr = Orange;
}
else if(ts.agc_custom_decay <= AGC_CUSTOM_FAST_WARNING) // Display in red if setting may be too fast
{
clr = Red;
}
snprintf(options,32, " %d", ts.agc_custom_decay);
// break;
}
#endif
// A/D Codec Gain/Mode setting/adjust
// case MENU_CODEC_GAIN_MODE:
else if(select==MENU_CODEC_GAIN_MODE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.rf_codec_gain,
0,
MAX_RF_CODEC_GAIN_VAL,
DEFAULT_RF_CODEC_GAIN_VAL,
1
);
if(ts.rf_codec_gain == 9)
strcpy(options, " AUTO");
else // if anything other than "Auto" give a warning in RED
{
snprintf(options,32,"> %u <", ts.rf_codec_gain);
clr = Red;
}
// break;
}
// case MENU_NOISE_BLANKER_SETTING:
else if(select==MENU_NOISE_BLANKER_SETTING)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.nb_setting,
0,
MAX_NB_SETTING,
10,
1
);
clr = UiDriver_GetNBColor();
snprintf(options,32," %u", ts.dsp.nb_setting);
// break;
}
// case MENU_RX_FREQ_CONV: // Enable/Disable receive frequency conversion
else if(select==MENU_RX_FREQ_CONV)
{
;
uchar firstmode = FREQ_IQ_CONV_MODE_OFF;
if(ts.dmod_mode == DEMOD_AM || ts.dmod_mode == DEMOD_SAM || ts.dmod_mode == DEMOD_FM)
{
firstmode = FREQ_IQ_CONV_P6KHZ;
}
var_change = UiDriverMenuItemChangeInt32(var, mode, &ts.iq_freq_mode,
firstmode,
FREQ_IQ_CONV_MODE_MAX,
FREQ_IQ_CONV_MODE_DEFAULT,
1
);
switch(ts.iq_freq_mode)
{
case FREQ_IQ_CONV_MODE_OFF:
txt_ptr = ">> OFF! <<";
clr = Red3;
break;
case FREQ_IQ_CONV_P6KHZ:
txt_ptr ="RX +6kHz";
break;
case FREQ_IQ_CONV_M6KHZ:
txt_ptr = "RX -6kHz";
break;
case FREQ_IQ_CONV_P12KHZ:
txt_ptr = "RX +12kHz";
break;
case FREQ_IQ_CONV_M12KHZ:
txt_ptr = "RX -12kHz";
break;
case FREQ_IQ_CONV_SLIDE:
txt_ptr = "RX Slide";
break;
}
if(var_change) // update parameters if changed
{
UiDriver_FrequencyUpdateLOandDisplay(true); // update frequency display without checking encoder, unconditionally updating synthesizer
}
// break;
}
// case MENU_MIC_LINE_MODE: // Mic/Line mode
else if(select==MENU_MIC_LINE_MODE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.tx_audio_source,
0,
TX_AUDIO_MAX_ITEMS,
TX_AUDIO_MIC,
1
);
switch(ts.tx_audio_source)
{
case TX_AUDIO_MIC:
txt_ptr = " MIC";
break;
case TX_AUDIO_LINEIN_L:
txt_ptr = " LINE-L";
break;
case TX_AUDIO_LINEIN_R:
txt_ptr = " LINE-R";
break;
case TX_AUDIO_DIG:
txt_ptr = " DIGITAL";
break;
case TX_AUDIO_DIGIQ:
txt_ptr = " DIG I/Q";
break;
}
if(var_change) // if there was a change, do update of on-screen information
{
if(ts.dmod_mode != DEMOD_CW)
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
}
// break;
}
// case MENU_MIC_TYPE: // selecting a mic type determines a mic boost level (for now, one of two boost gains)
else if(select==MENU_MIC_TYPE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.tx_mic_boost,
0,
MIC_BOOST_DYNAMIC, // 14 dB (Dynamic)
MIC_BOOST_DEFAULT, // 0 dB (Electret)
1
);
//
if(ts.tx_mic_boost > 0)
{
txt_ptr = " Dynamic";
}
else
{
txt_ptr = "Electret";
}
#ifndef UI_BRD_MCHF
// if(var_change)
// {
MIC_bias_set();
// }
#endif
// break;
}
// case MENU_MIC_GAIN: // Mic Gain setting
else if(select==MENU_MIC_GAIN)
{
if(ts.tx_audio_source == TX_AUDIO_MIC) // Allow adjustment only if in MIC mode
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.tx_gain[TX_AUDIO_MIC],
MIC_GAIN_MIN,
MIC_GAIN_MAX,
MIC_GAIN_DEFAULT,
1
);
}
if(var_change)
{
Codec_SwitchMicTxRxMode(ts.txrx_mode);
if(ts.dmod_mode != DEMOD_CW)
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
}
if(ts.tx_audio_source != TX_AUDIO_MIC) // Orange if not in MIC-IN mode
{
clr = Orange;
}
snprintf(options,32, " %u", ts.tx_gain[TX_AUDIO_MIC]);
// break;
}
// case MENU_LINE_GAIN: // Line Gain setting
else if(select==MENU_LINE_GAIN)
{
// TODO: Revise, since it now changes the currently selected tx source setting
if(ts.tx_audio_source != TX_AUDIO_MIC) // Allow adjustment only if in line-in mode
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.tx_gain[ts.tx_audio_source],
LINE_GAIN_MIN,
LINE_GAIN_MAX,
LINE_GAIN_DEFAULT,
1
);
}
if(var_change) // update on-screen info and codec if there was a change
{
if(ts.dmod_mode != DEMOD_CW)
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
if(ts.txrx_mode == TRX_MODE_TX) // in transmit mode?
{
// TODO: Think about this, this is a hack
Codec_LineInGainAdj(ts.tx_gain[TX_AUDIO_LINEIN_L]); // change codec gain
}
}
}
if(ts.tx_audio_source == TX_AUDIO_MIC) // Orange if in MIC mode
{
clr = Orange;
snprintf(options,32, " %u", ts.tx_gain[TX_AUDIO_LINEIN_L]);
}
else
{
snprintf(options,32, " %u", ts.tx_gain[ts.tx_audio_source]);
}
// break;
}
// case MENU_ALC_RELEASE: // ALC Release adjust
else if(select==MENU_ALC_RELEASE)
{
if(ts.tx_comp_level == TX_AUDIO_COMPRESSION_MAX)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.alc_decay_var,
0,
ALC_DECAY_MAX,
ALC_DECAY_DEFAULT,
1
);
if(var_change) // value changed? Recalculate
{
AudioManagement_CalcALCDecay();
}
}
else // indicate RED if "Compression Level" below was nonzero
{
clr = Red;
ts.alc_decay_var = 10;
}
if(ts.tx_comp_level == TX_AUDIO_COMPRESSION_SV) // in "selectable value" mode?
{
ts.alc_decay = ts.alc_decay_var; // yes, save new value
}
snprintf(options,32, " %d", (int)ts.alc_decay_var);
// break;
}
// case MENU_ALC_POSTFILT_GAIN: // ALC TX Post-filter gain (Compressor level)
else if(select==MENU_ALC_POSTFILT_GAIN)
{
if(ts.tx_comp_level == TX_AUDIO_COMPRESSION_MAX)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.alc_tx_postfilt_gain_var,
ALC_POSTFILT_GAIN_MIN,
ALC_POSTFILT_GAIN_MAX,
ALC_POSTFILT_GAIN_DEFAULT,
1
);
if(var_change)
{
if(ts.dmod_mode != DEMOD_CW) // In voice mode?
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
}
}
else // indicate RED if "Compression Level" below was nonzero
{
clr = Red;
}
if(ts.tx_comp_level == TX_AUDIO_COMPRESSION_SV) // in "selectable value" mode?
{
ts.alc_tx_postfilt_gain = ts.alc_tx_postfilt_gain_var; // yes, save new value
}
snprintf(options,32, " %d", (int)ts.alc_tx_postfilt_gain_var);
// break;
}
// case MENU_TX_COMPRESSION_LEVEL: // ALC TX Post-filter gain (Compressor level)
else if(select==MENU_TX_COMPRESSION_LEVEL)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.tx_comp_level,
-1,
TX_AUDIO_COMPRESSION_MAX,
TX_AUDIO_COMPRESSION_DEFAULT,
1
);
if(var_change)
{
AudioManagement_CalcTxCompLevel(); // calculate parameters for selected amount of compression
if(ts.dmod_mode != DEMOD_CW) // In voice mode?
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
}
if(ts.tx_comp_level < TX_AUDIO_COMPRESSION_SV && 0 <= ts.tx_comp_level) // display numbers for all but the highest value
{
snprintf(options,32," %d",ts.tx_comp_level);
}
else // show "CUSTOM" (Stored Value) for highest value
{
if (ts.tx_comp_level == TX_AUDIO_COMPRESSION_MIN)
{
txt_ptr = "OFF";
}
else
{
txt_ptr = "CUS";
}
}
// break;
}
// case MENU_KEYER_MODE: // Keyer mode
else if(select==MENU_KEYER_MODE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_keyer_mode,
0,
CW_KEYER_MODE_ULTIMATE,
CW_KEYER_MODE_IAM_B,
1
);
switch(ts.cw_keyer_mode)
{
case CW_KEYER_MODE_IAM_B:
txt_ptr = "IAM_B";
break;
case CW_KEYER_MODE_IAM_A:
txt_ptr = "IAM_A";
break;
case CW_KEYER_MODE_STRAIGHT:
txt_ptr = "STR_K";
break;
case CW_KEYER_MODE_ULTIMATE:
txt_ptr = "ULTIM";
break;
}
// break;
}
// case MENU_KEYER_SPEED: // keyer speed
else if(select==MENU_KEYER_SPEED)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_keyer_speed,
CW_KEYER_SPEED_MIN,
CW_KEYER_SPEED_MAX,
CW_KEYER_SPEED_DEFAULT,
1
);
if(var_change && ts.dmod_mode == DEMOD_CW) // did it change?
{
CwGen_SetSpeed(); // make sure keyerspeed is being used
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
ts.cw_keyer_speed_bak = ts.cw_keyer_speed;
}
snprintf(options,32, " %u", ts.cw_keyer_speed);
// break;
}
// case MENU_KEYER_WEIGHT: // keyer weight
else if(select==MENU_KEYER_WEIGHT)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_keyer_weight,
CW_KEYER_WEIGHT_MIN,
CW_KEYER_WEIGHT_MAX,
CW_KEYER_WEIGHT_DEFAULT,
1
);
if(var_change && ts.dmod_mode == DEMOD_CW) // did it change?
{
CwGen_SetSpeed(); // make sure keyerspeed is being used
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
snprintf(options,32, " %u.%02u", ts.cw_keyer_weight/100,ts.cw_keyer_weight%100);
// break;
}
// case MENU_SIDETONE_GAIN: // sidetone gain
else if(select==MENU_SIDETONE_GAIN)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_sidetone_gain,
0,
SIDETONE_MAX_GAIN,
DEFAULT_SIDETONE_GAIN,
1
);
if(var_change && ts.dmod_mode == DEMOD_CW) // did it change?
{
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
snprintf(options,32, " %u", ts.cw_sidetone_gain);
// break;
}
// case MENU_SIDETONE_FREQUENCY: // sidetone frequency
else if(select==MENU_SIDETONE_FREQUENCY)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.cw_sidetone_freq,
CW_SIDETONE_FREQ_MIN,
CW_SIDETONE_FREQ_MAX*10,
CW_SIDETONE_FREQ_DEFAULT,
10
);
if(var_change && ts.dmod_mode == DEMOD_CW) // did it change?
{
float freq[2] = { ts.cw_sidetone_freq, 0.0 };
softdds_configRunIQ(freq,ts.samp_rate,0);
UiDriver_FrequencyUpdateLOandDisplay(false);
CwDecode_Filter_Set();
}
snprintf(options,32, " %uHz", (uint)ts.cw_sidetone_freq);
// break;
}
// case MENU_PADDLE_REVERSE: // CW Paddle reverse
else if(select==MENU_PADDLE_REVERSE)
{
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &ts.cw_paddle_reverse,0,options,&clr);
// break;
}
// case MENU_CW_TX_RX_DELAY: // CW TX->RX delay
else if(select==MENU_CW_TX_RX_DELAY)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_rx_delay,
0,
CW_RX_DELAY_MAX,
CW_TX2RX_DELAY_DEFAULT,
1
);
snprintf(options,32, "%3ums", ts.cw_rx_delay*10);
// break;
}
// case MENU_CW_AUTO_MODE_SELECT: // Enable/Disable auto LSB/USB select
else if(select==MENU_CW_AUTO_MODE_SELECT)
{
const cw_mode_map_entry_t* curr_mode = RadioManagement_CWConfigValueToModeEntry(ts.cw_offset_mode);
temp_var_u8 = curr_mode->sideband_mode;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
2,
2,
1
);
if(var_change) // update parameters if changed
{
cw_mode_map_entry_t new_mode;
new_mode.dial_mode = curr_mode->dial_mode;
new_mode.sideband_mode = temp_var_u8;
ts.cw_offset_mode = RadioManagement_CWModeEntryToConfigValue(&new_mode);
ts.cw_lsb = RadioManagement_CalculateCWSidebandMode();
UiDriver_DisplayDemodMode();
UiDriver_FrequencyUpdateLOandDisplay(true); // update frequency display and local oscillator
}
switch(temp_var_u8)
{
case CW_SB_LSB:
txt_ptr = " LSB";
break;
case CW_SB_USB:
txt_ptr = " USB";
break;
case CW_SB_AUTO:
txt_ptr = "AUTO";
break;
}
// break;
}
// case MENU_CW_OFFSET_MODE: // CW offset mode (e.g. USB, LSB, etc.)
else if(select==MENU_CW_OFFSET_MODE)
{
const cw_mode_map_entry_t* curr_mode = RadioManagement_CWConfigValueToModeEntry(ts.cw_offset_mode);
temp_var_u8 = curr_mode->dial_mode;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
2,
2,
1
);
if(var_change) // update parameters if changed
{
cw_mode_map_entry_t new_mode;
new_mode.sideband_mode = curr_mode->sideband_mode;
new_mode.dial_mode = temp_var_u8;
ts.cw_offset_mode = RadioManagement_CWModeEntryToConfigValue(&new_mode);
ts.cw_lsb = RadioManagement_CalculateCWSidebandMode();
UiDriver_DisplayDemodMode();
UiDriver_FrequencyUpdateLOandDisplay(true); // update frequency display and local oscillator
}
switch(temp_var_u8)
{
case CW_OFFSET_RX:
txt_ptr = " RX";
break;
case CW_OFFSET_TX:
txt_ptr = " TX";
break;
case CW_OFFSET_SHIFT:
txt_ptr = "SHIFT";
break;
}
// break;
}
// case MENU_CW_DECODER_THRESH: //
else if(select==MENU_CW_DECODER_THRESH)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &cw_decoder_config.thresh,
CW_DECODER_THRESH_MIN,
CW_DECODER_THRESH_MAX,
CW_DECODER_THRESH_DEFAULT,
500
);
snprintf(options,32, " %u", (unsigned int)cw_decoder_config.thresh);
// break;
}
//ts.cw_decode_average - wieviele Goertzel-Sch<63>tzwerte werden in einem
//moving window zusammengefasst [uint8_t 1 - 20]
#if 0
// case MENU_CW_DECODER_AVERAGE: // averager for CW decode [1 - 20]
else if(select==MENU_CW_DECODER_AVERAGE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &cw_decoder_config.average,
2,
20,
2,
1
);
if(cw_decoder_config.average !=1)
{
snprintf(options,32, " %u", cw_decoder_config.average);
}
else
{
txt_ptr = "OFF";
}
// break;
}
#endif
// case MENU_CW_DECODER_BLOCKSIZE: // processing block size for cw decoder
else if(select==MENU_CW_DECODER_BLOCKSIZE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &cw_decoder_config.blocksize,
CW_DECODER_BLOCKSIZE_MIN,
CW_DECODER_BLOCKSIZE_MAX,
CW_DECODER_BLOCKSIZE_DEFAULT,
8
);
snprintf(options,32, " %u", cw_decoder_config.blocksize);
CwDecode_Filter_Set();
// break;
}
#if 0
// case MENU_CW_DECODER_AGC: // On/Off
else if(select==MENU_CW_DECODER_AGC)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &cw_decoder_config.AGC_enable,
0,
1,
0,
1
);
switch(cw_decoder_config.AGC_enable) {
case 0:
txt_ptr = " OFF";
break;
case 1:
txt_ptr = " ON";
break;
}
// break;
}
#endif
// case MENU_CW_DECODER_NOISECANCEL: // On/Off
else if(select==MENU_CW_DECODER_NOISECANCEL)
{
// var_change = UiDriverMenuItemChangeUInt8(var, mode, &cw_decoder_config.noisecancel_enable,
// 0,
// 1,
// 1,
// 1
// );
temp_var_bool = cw_decoder_config.noisecancel_enable;
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &temp_var_bool, 0, options, &clr);
cw_decoder_config.noisecancel_enable = temp_var_bool;
// switch(cw_decoder_config.noisecancel_enable) {
// case 0:
// txt_ptr = " OFF";
// break;
// case 1:
// txt_ptr = " ON";
// break;
// }
// break;
}
// case MENU_CW_DECODER_SPIKECANCEL: // On/Off
else if(select==MENU_CW_DECODER_SPIKECANCEL)
{
// var_change = UiDriverMenuItemChangeUInt8(var, mode, &cw_decoder_config.spikecancel,
temp_var_u8 = cw_decoder_config.spikecancel;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
2,
0,
1
);
cw_decoder_config.spikecancel = temp_var_u8;
switch(cw_decoder_config.spikecancel)
{
case 0:
txt_ptr = " OFF";
break;
case 1:
txt_ptr = "SPIKE";
break;
case 2:
txt_ptr = "SHORT";
break;
}
// break;
}
// case MENU_TCXO_MODE: // TCXO On/Off
else if(select==MENU_TCXO_MODE)
{
temp_var_u8 = RadioManagement_TcxoGetMode(); // get current setting without upper nibble
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
TCXO_STATE_NUMBER-1,
TCXO_ON,
1
);
if(lo.sensor_present == false) // no sensor present
{
temp_var_u8 = TCXO_OFF; // force TCXO disabled
var_change = true;
}
RadioManagement_TcxoSetMode(temp_var_u8); // overlay new temperature setting with old status of upper nibble
if(var_change)
{
UiDriver_CreateTemperatureDisplay();
}
switch(temp_var_u8)
{
case TCXO_OFF:
txt_ptr = " OFF";
break;
case TCXO_ON:
txt_ptr = " ON";
break;
case TCXO_STOP:
txt_ptr = "STOP";
break;
}
// break;
}
// case CONFIG_IQ_AUTO_CORRECTION: // On/Off
else if(select==CONFIG_IQ_AUTO_CORRECTION)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.iq_auto_correction,
0,
1,
0,
1
);
switch(ts.iq_auto_correction)
{
case 0:
txt_ptr = " OFF";
ts.display_rx_iq = true;
break;
case 1:
txt_ptr = " ON";
ts.display_rx_iq = false;
break;
}
// if(var_change) temporarily disabled because function does not provide dynamical hiding recently
// {
// UiMenu_RenderMenu(MENU_RENDER_ONLY);
// }
// break;
}
// case MENU_TCXO_C_F: // TCXO display C/F mode
else if(select==MENU_TCXO_C_F)
{
temp_var_u8 = (RadioManagement_TcxoIsFahrenheit() == true) ? 1 : 0; // Yes - Is Fahrenheit mode enabled?
if(RadioManagement_TcxoIsEnabled()) // is temperature display enabled at all?
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
1,
0,
1
);
RadioManagement_TcxoSetUnit(temp_var_u8 != 0? TCXO_UNIT_F: TCXO_UNIT_C);
}
else
{
clr = Orange;
}
if(var_change) // update screen if a change was made
{
UiDriver_CreateTemperatureDisplay();
}
txt_ptr =temp_var_u8?"F":"C";
// break;
}
// case MENU_SCOPE_SPEED: // spectrum scope speed
else if(select==MENU_SCOPE_SPEED)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.scope_speed,
SPECTRUM_SCOPE_SPEED_MIN,
SPECTRUM_SCOPE_SPEED_MAX,
SPECTRUM_SCOPE_SPEED_DEFAULT,
1
);
if(ts.scope_speed)
{
snprintf(options,32, " %u", ts.scope_speed);
}
else
{
txt_ptr = "OFF";
}
// break;
}
// case MENU_SPECTRUM_FILTER_STRENGTH: // spectrum filter strength
else if(select==MENU_SPECTRUM_FILTER_STRENGTH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_filter,
SPECTRUM_FILTER_MIN,
SPECTRUM_FILTER_MAX,
SPECTRUM_FILTER_DEFAULT,
1
);
snprintf(options,32, " %u", ts.spectrum_filter);
// break;
}
// case MENU_SCOPE_TRACE_COLOUR: // spectrum scope trace colour
else if(select==MENU_SCOPE_TRACE_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.scope_trace_colour,
0,
SPEC_MAX_COLOUR,
SPEC_COLOUR_TRACE_DEFAULT,
1
);
UiMenu_MapColors(ts.scope_trace_colour,options,&clr);
// break;
}
// case MENU_SCOPE_TRACE_HL_COLOUR: //spectrum highlighted bandwidth colour
else if(select==MENU_SCOPE_TRACE_HL_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.scope_trace_BW_colour,
0,
SPEC_MAX_COLOUR,
SPEC_COLOUR_TRACEBW_DEFAULT,
1
);
UiMenu_MapColors(ts.scope_trace_BW_colour,options,&clr);
// break;
}
// case MENU_SCOPE_BACKGROUND_HL_COLOUR: // set step size of of waterfall display?
else if(select==MENU_SCOPE_BACKGROUND_HL_COLOUR)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.scope_backgr_BW_colour,
0,
100,
SPEC_COLOUR_BACKGRBW_DEFAULT,
10
);
snprintf(options,32, " %u%%", ts.scope_backgr_BW_colour);
// break;
}
// case MENU_SCOPE_GRID_COLOUR: // spectrum scope grid colour
else if(select==MENU_SCOPE_GRID_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.scope_grid_colour,
0,
SPEC_MAX_COLOUR,
SPEC_COLOUR_GRID_DEFAULT,
1
);
UiMenu_MapColors(ts.scope_grid_colour,options,&clr);
// break;
}
// case MENU_SPECTRUM_FREQSCALE_COLOUR: // spectrum scope/waterfall scale colour
else if(select==MENU_SPECTRUM_FREQSCALE_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_freqscale_colour,
0,
SPEC_MAX_COLOUR,
SPEC_COLOUR_SCALE_DEFAULT,
1
);
UiMenu_MapColors(ts.spectrum_freqscale_colour,options,&clr);
// break;
}
// case MENU_SPECTRUM_MAGNIFY: // WF/Spectrum magnifying
else if(select==MENU_SPECTRUM_MAGNIFY)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &sd.magnify,
MAGNIFY_MIN,
MAGNIFY_MAX,
MAGNIFY_DEFAULT,
1
);
switch(sd.magnify)
{
case 1:
txt_ptr = " x2";
break;
case 2:
txt_ptr = " x4";
break;
case 3:
txt_ptr = " x8";
break;
case 4:
txt_ptr = "x16";
break;
case 5:
txt_ptr = "x32";
break;
case 0:
default:
txt_ptr = " x1";
break;
}
UiDriver_SpectrumChangeLayoutParameters();
// break;
}
// case MENU_SCOPE_AGC_ADJUST: // Spectrum scope AGC adjust
else if(select==MENU_SCOPE_AGC_ADJUST)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_agc_rate,
SPECTRUM_SCOPE_AGC_MIN,
SPECTRUM_SCOPE_AGC_MAX,
SPECTRUM_SCOPE_AGC_DEFAULT,
1
);
if(var_change) // update system variable if rate changed
{
sd.agc_rate = (float)ts.spectrum_agc_rate; // calculate agc rate
sd.agc_rate = sd.agc_rate/SPECTRUM_AGC_SCALING;
}
snprintf(options,32, " %u", ts.spectrum_agc_rate);
// break;
}
// case MENU_SCOPE_DB_DIVISION: // Adjustment of dB/division of spectrum scope
else if(select==MENU_SCOPE_DB_DIVISION)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_db_scale,
DB_DIV_ADJUST_MIN,
DB_DIV_ADJUST_MAX,
DB_DIV_ADJUST_DEFAULT,
1
);
switch(ts.spectrum_db_scale) // convert variable to setting
{
case DB_DIV_5:
txt_ptr = " 5dB";
break;
case DB_DIV_7:
txt_ptr = " 7.5dB";
break;
case DB_DIV_15:
txt_ptr = " 15dB";
break;
case DB_DIV_20:
txt_ptr = " 20dB";
break;
case S_1_DIV:
txt_ptr = "1S-Unit";
break;
case S_2_DIV:
txt_ptr = "2S-Unit";
break;
case S_3_DIV:
txt_ptr = "3S-Unit";
break;
case DB_DIV_10:
default:
txt_ptr = " 10dB";
break;
}
// break;
}
// case MENU_SPECTRUM_CENTER_LINE_COLOUR: // spectrum scope grid center line colour
else if(select==MENU_SPECTRUM_CENTER_LINE_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_centre_line_colour,
0,
SPEC_GREY2,
SPEC_COLOUR_GRID_DEFAULT,
1
);
UiMenu_MapColors(ts.spectrum_centre_line_colour,options,&clr);
// break;
}
// case MENU_SCOPE_LIGHT_ENABLE: // Spectrum light: no grid, larger, only points, no bars
else if(select==MENU_SCOPE_LIGHT_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr,FLAGS1_SCOPE_LIGHT_ENABLE);
// break;
}
// case MENU_SPECTRUM_MODE:
else if(select==MENU_SPECTRUM_MODE)
{
temp_var_u8 = UiDriver_GetSpectrumMode();
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
SPECTRUM_WATERFALL,
SPECTRUM_DUAL,
SPECTRUM_DUAL,
1
);
switch(temp_var_u8)
{
case SPECTRUM_DUAL:
txt_ptr = " DUAL";
break;
case SPECTRUM_SCOPE:
txt_ptr = "SCOPE";
break;
case SPECTRUM_WATERFALL:
txt_ptr = "WFALL";
break;
case SPECTRUM_BLANK:
txt_ptr = " OFF";
break;
}
UiDriver_SetSpectrumMode(temp_var_u8);
UiSpectrum_ResetSpectrum();
// break;
}
// case MENU_WFALL_COLOR_SCHEME: // Adjustment of dB/division of spectrum scope
else if(select==MENU_WFALL_COLOR_SCHEME)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.waterfall.color_scheme,
WATERFALL_COLOR_MIN,
WATERFALL_COLOR_MAX ,
WATERFALL_COLOR_DEFAULT,
1
);
switch(ts.waterfall.color_scheme) // convert variable to setting
{
case WFALL_HOT_COLD:
txt_ptr = "HotCold";
break;
case WFALL_FLAME:
txt_ptr = " Flame";
break;
case WFALL_SUNSET:
txt_ptr = " Sunset";
break;
case WFALL_MATRIX:
txt_ptr = " Matrix";
break;
case WFALL_RAINBOW:
txt_ptr = "Rainbow";
break;
case WFALL_BLUE:
txt_ptr = " Blue";
break;
case WFALL_GRAY_INVERSE:
txt_ptr = "INVGrey";
break;
case WFALL_GRAY:
default:
txt_ptr = " Grey" ;
break;
}
// break;
}
// case MENU_DBM_DISPLAY:
else if(select==MENU_DBM_DISPLAY)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.display_dbm,
0,
2,
0,
1
);
switch(ts.display_dbm)
{
case 1: //
txt_ptr = " dBm"; // dbm display
break;
case 2: //
txt_ptr = " dBm/Hz"; // dbm/Hz display
break;
default:
txt_ptr = " OFF"; // dbm display off
break;
}
// break;
}
#ifdef USE_8bit_FONT
// case MENU_FREQ_FONT:
else if(select==MENU_FREQ_FONT)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.FreqDisplayFont,
0,
1,
0,
1
);
switch(ts.FreqDisplayFont)
{
case 0:
txt_ptr = " old"; //old font
break;
case 1:
txt_ptr = " modern"; //old font
break;
}
UiDriver_FrequencyUpdateLOandDisplay(true);
// break;
}
#endif
// case MENU_METER_COLOUR_UP: // upper meter colour
else if(select==MENU_METER_COLOUR_UP)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.meter_colour_up,
0,
SPEC_MAX_COLOUR,
SPEC_BLUE,
1
);
UiMenu_MapColors(ts.meter_colour_up,options,&clr);
// break;
}
// case MENU_METER_COLOUR_DOWN: // lower meter colour
else if(select==MENU_METER_COLOUR_DOWN)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.meter_colour_down,
0,
SPEC_MAX_COLOUR,
SPEC_CYAN,
1
);
UiMenu_MapColors(ts.meter_colour_down,options,&clr);
// break;
}
// case MENU_WFALL_STEP_SIZE: // set step size of of waterfall display?
else if(select==MENU_WFALL_STEP_SIZE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.waterfall.vert_step_size,
WATERFALL_STEP_SIZE_MIN,
WATERFALL_STEP_SIZE_MAX,
WATERFALL_STEP_SIZE_DEFAULT,
1
);
snprintf(options,32, " %u", ts.waterfall.vert_step_size);
// break;
}
#if 0
// case MENU_WFALL_OFFSET: // set step size of of waterfall display?
else if(select==MENU_WFALL_OFFSET)
{
UiDriverMenuItemChangeInt32(var, mode, &ts.waterfall.offset,
WATERFALL_OFFSET_MIN,
WATERFALL_OFFSET_MAX,
WATERFALL_OFFSET_DEFAULT,
1
);
snprintf(options,32, " %u", (unsigned int)ts.waterfall.offset);
// break;
}
#endif
// case MENU_WFALL_CONTRAST: // set step size of of waterfall display?
else if(select==MENU_WFALL_CONTRAST)
{
UiDriverMenuItemChangeUInt32(var, mode, &ts.waterfall.contrast,
WATERFALL_CONTRAST_MIN,
WATERFALL_CONTRAST_MAX,
WATERFALL_CONTRAST_DEFAULT,
2
);
snprintf(options,32, " %u", (unsigned int)ts.waterfall.contrast);
// break;
}
// case MENU_WFALL_SPEED: // set step size of of waterfall display?
else if(select==MENU_WFALL_SPEED)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.waterfall.speed,
WATERFALL_SPEED_MIN,
WATERFALL_SPEED_MAX,
WATERFALL_SPEED_DEFAULT,
1
);
if(ts.waterfall.speed <= WATERFALL_SPEED_WARN)
{
clr = Red;
}
else if(ts.waterfall.speed <= WATERFALL_SPEED_WARN1)
{
clr = Yellow;
}
if (ts.waterfall.speed > 0)
{
snprintf(options,32, " %u", ts.waterfall.speed);
}
else
{
txt_ptr = "OFF";
}
// break;
}
#if 0
// case MENU_SCOPE_NOSIG_ADJUST: // set step size of of waterfall display?
else if(select==MENU_SCOPE_NOSIG_ADJUST)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_scope_nosig_adjust,
SPECTRUM_SCOPE_NOSIG_ADJUST_MIN,
SPECTRUM_SCOPE_NOSIG_ADJUST_MAX,
SPECTRUM_SCOPE_NOSIG_ADJUST_DEFAULT,
1
);
snprintf(options,32, " %u", ts.spectrum_scope_nosig_adjust);
// break;
}
// case MENU_WFALL_NOSIG_ADJUST: // set step size of of waterfall display?
else if(select==MENU_WFALL_NOSIG_ADJUST)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.waterfall.nosig_adjust,
WATERFALL_NOSIG_ADJUST_MIN,
WATERFALL_NOSIG_ADJUST_MAX,
WATERFALL_NOSIG_ADJUST_DEFAULT,
1
);
snprintf(options,32, " %u", ts.waterfall.nosig_adjust);
// break;
}
#endif
// case MENU_SPECTRUM_SIZE: // set view size of of spectrum display (big disables title bar)?
else if(select==MENU_SPECTRUM_SIZE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.spectrum_size,
0,
SPECTRUM_BIG,
SPECTRUM_SIZE_DEFAULT,
1
);
//
switch(ts.spectrum_size)
{
case SPECTRUM_BIG:
txt_ptr = " Big";
break;
case SPECTRUM_NORMAL:
default:
txt_ptr = "Normal";
break;
}
// break;
}
#ifdef USE_CONFIGSTORAGE_FLASH
// case MENU_BACKUP_CONFIG:
else if(select==MENU_BACKUP_CONFIG)
{
txt_ptr = "n/a";
if(ts.configstore_in_use == CONFIGSTORE_IN_USE_I2C)
{
uint8_t test = 0;
clr = White;
UiDriverMenuItemChangeUInt8(var, mode, &test,
0,
0,
10,
1
);
switch(test)
{
case 0:
txt_ptr = "press DEFLT";
break;
case 10:
UiMenu_DisplayValue(" Working",Red,pos);
ConfigStorage_CopySerial2Flash();
clr = Green;
txt_ptr = " Done...";
break;
}
}
// break;
}
// case MENU_RESTORE_CONFIG:
else if(select==MENU_RESTORE_CONFIG)
{
txt_ptr = "n/a";
if(ts.configstore_in_use == CONFIGSTORE_IN_USE_I2C)
{
uint8_t test = 0;
clr = White;
UiDriverMenuItemChangeUInt8(var, mode, &test,
0,
0,
10,
1
);
switch(test)
{
case 0:
txt_ptr = "press DEFLT";
break;
case 10:
UiMenu_DisplayValue(" Working",Red,pos);
ConfigStorage_CopyFlash2Serial();
Board_Reboot();
break;
}
}
// break;
}
#endif
// case MENU_RESTART_CODEC:
else if(select==MENU_RESTART_CODEC)
{
txt_ptr = " Do it!";
clr = White;
if(var>=1)
{
UiMenu_DisplayValue("Restart",Red,pos);
Codec_RestartI2S();
var = 0;
}
// break;
}
// case MENU_DEBUG_TWINPEAKS_CORR_RUN:
else if(select==MENU_DEBUG_TWINPEAKS_CORR_RUN)
{
if (ts.iq_auto_correction == 0)
{
txt_ptr = "Not possible";
clr = Red;
}
else
{
txt_ptr = " Do it!";
clr = White;
}
if(var>=1)
{
UiMenu_DisplayValue(" Started",Green, pos);
ts.twinpeaks_tested = TWINPEAKS_WAIT;
while(ts.twinpeaks_tested != TWINPEAKS_DONE && ts.twinpeaks_tested != TWINPEAKS_UNCORRECTABLE ) { asm("nop");}
UiMenu_DisplayValue("Finished",Green, pos);
var = 0;
}
// break;
}
// case CONFIG_FREQ_STEP_MARKER_LINE: // Frequency step marker line on/off
else if(select==CONFIG_FREQ_STEP_MARKER_LINE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.freq_step_config,0,options,&clr, FREQ_STEP_SHOW_MARKER);
if(var_change) // something changed?
{
UiDriver_DisplayFreqStepSize(); // update screen
}
// break;
}
// case CONFIG_STEP_SIZE_BUTTON_SWAP: // Step size button swap on/off
else if(select==CONFIG_STEP_SIZE_BUTTON_SWAP)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.freq_step_config,0,options,&clr, FREQ_STEP_SWAP_BTN);
// break;
}
// case MENU_DYNAMICTUNE: // Dynamic Tune on/off
else if(select==MENU_DYNAMICTUNE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_DYN_TUNE_ENABLE);
if(var_change)
{
UiDriver_DisplayFreqStepSize();
}
// break;
}
// case CONFIG_BAND_BUTTON_SWAP: // Swap position of Band+ and Band- buttons
else if(select==CONFIG_BAND_BUTTON_SWAP)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_SWAP_BAND_BTN);
// break;
}
// case CONFIG_TX_DISABLE: // Step size button swap on/off
else if(select==CONFIG_TX_DISABLE)
{
uint16_t flag = ts.tx_disable;
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &flag,0,options,&clr, TX_DISABLE_ALWAYS);
ts.tx_disable = flag;
if(var_change)
{
// FIXME: Call "abstract" function to update status of tune,
// do not redraw menu button here directly
UiDriver_DrawFButtonLabel(5,"TUNE",ts.tx_disable?Grey1:White);
}
}
// break;
// case CONFIG_TX_OUT_ENABLE: // Enable transmitting outside HAM bands
else if(select==CONFIG_TX_OUT_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_TX_OUTSIDE_BANDS);
// break;
}
// case CONFIG_AUDIO_MAIN_SCREEN_MENU_SWITCH: // AFG/(STG/CMP) and RIT/(WPM/MIC/LIN) are to change automatically with TX/RX
else if(select==CONFIG_AUDIO_MAIN_SCREEN_MENU_SWITCH)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_TX_AUTOSWITCH_UI_DISABLE);
// break;
}
// case CONFIG_MUTE_LINE_OUT_TX: // Enable/disable MUTE of TX audio on LINE OUT
else if(select==CONFIG_MUTE_LINE_OUT_TX)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_MUTE_LINEOUT_TX);
if(ts.iq_freq_mode) // Mark RED if translate mode is active
{
clr = Red;
}
// break;
}
// case CONFIG_TXRX_SWITCH_AUDIO_MUTE: // maximum RX gain setting
else if(select==CONFIG_TXRX_SWITCH_AUDIO_MUTE)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.txrx_switch_audio_muting_timing,
0,
TXRX_SWITCH_AUDIO_MUTE_DELAY_MAX,
0,
1
);
snprintf(options,32, "%3ums", ts.txrx_switch_audio_muting_timing*10);
// break;
}
// case CONFIG_LCD_AUTO_OFF_MODE: // LCD auto-off mode control
else if(select==CONFIG_LCD_AUTO_OFF_MODE)
{
temp_var_u8 = ts.lcd_backlight_blanking; // get control variable
temp_var_u8 &= LCD_BLANKING_TIMEMASK; // mask off upper nybble
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
LCD_BLANKING_TIMEMASK,
BACKLIGHT_BLANK_TIMING_DEFAULT,
1
);
if(var_change) // timing has been changed manually
{
if(temp_var_u8) // is the time non-zero?
{
ts.lcd_backlight_blanking = temp_var_u8; // yes, copy current value into variable
ts.lcd_backlight_blanking |= LCD_BLANKING_ENABLE; // set MSB to enable auto-blanking
}
else
{
ts.lcd_backlight_blanking = 0; // zero out variable
}
UiDriver_LcdBlankingStartTimer(); // update the LCD timing parameters
}
//
if(ts.lcd_backlight_blanking & LCD_BLANKING_ENABLE) // timed auto-blanking enabled?
snprintf(options,32,"%02d sec",ts.lcd_backlight_blanking & LCD_BLANKING_TIMEMASK); // yes - Update screen indicator with number of seconds
else
snprintf(options,32," OFF"); // Or if turned off
// break;
}
// case CONFIG_VOLTMETER_CALIBRATION: // Voltmeter calibration
else if(select==CONFIG_VOLTMETER_CALIBRATION)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.voltmeter_calibrate,
POWER_VOLTMETER_CALIBRATE_MIN,
POWER_VOLTMETER_CALIBRATE_MAX,
POWER_VOLTMETER_CALIBRATE_DEFAULT,
1
);
snprintf(options,32, " %u", (unsigned int)ts.voltmeter_calibrate);
// break;
}
// case MENU_LOW_POWER_SHUTDOWN: // Auto shutdown when below low voltage threshold
else if(select==MENU_LOW_POWER_SHUTDOWN)
{
temp_var_u8 = (ts.low_power_config & LOW_POWER_ENABLE_MASK) == LOW_POWER_ENABLE? 1 : 0 ; // get control variable
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp_var_u8, 0,options,&clr);
if (var_change)
{
CLR_OR_SET_BITMASK(temp_var_u8, ts.low_power_config, LOW_POWER_ENABLE);
}
// break;
}
// case CONFIG_LOW_POWER_THRESHOLD: // Configure low voltage threshold
else if(select==CONFIG_LOW_POWER_THRESHOLD)
{
temp_var_u8 = ts.low_power_config & LOW_POWER_THRESHOLD_MASK; // get control variable
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
LOW_POWER_THRESHOLD_MIN,
LOW_POWER_THRESHOLD_MAX,
LOW_POWER_THRESHOLD_DEFAULT,
1
);
if(var_change)
{
ts.low_power_config = (ts.low_power_config & ~LOW_POWER_THRESHOLD_MASK) | (temp_var_u8 & LOW_POWER_THRESHOLD_MASK);
}
snprintf(options,32,"%2d.%dV",(temp_var_u8 + LOW_POWER_THRESHOLD_OFFSET) / 10, (temp_var_u8 + LOW_POWER_THRESHOLD_OFFSET) % 10);
// break;
}
// case CONFIG_DISP_FILTER_BANDWIDTH: // Display filter bandwidth
else if(select==CONFIG_DISP_FILTER_BANDWIDTH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.filter_disp_colour,
0,
SPEC_BLACK,
SPEC_COLOUR_GRID_DEFAULT,
1
);
UiMenu_MapColors(ts.filter_disp_colour,options,&clr);
// break;
}
// case CONFIG_MAX_VOLUME: // maximum audio volume
else if(select==CONFIG_MAX_VOLUME)
{
UiDriverMenuItemChangeUInt8(var, mode, &ts.rx_gain[RX_AUDIO_SPKR].max,
MAX_VOLUME_MIN,
MAX_VOLUME_MAX,
MAX_VOLUME_DEFAULT,
1
);
if(ts.rx_gain[RX_AUDIO_SPKR].value > ts.rx_gain[RX_AUDIO_SPKR].max) // is the volume currently higher than the new setting?
{
ts.rx_gain[RX_AUDIO_SPKR].value = ts.rx_gain[RX_AUDIO_SPKR].max; // yes - force the volume to the new value
UiDriver_RefreshEncoderDisplay(); // maybe shown on encoder boxes
}
snprintf(options,32, " %u", ts.rx_gain[RX_AUDIO_SPKR].max);
//
if(ts.rx_gain[RX_AUDIO_SPKR].max <= MAX_VOLUME_RED_THRESH) // Indicate that gain has been reduced by changing color
clr = Red;
else if(ts.rx_gain[RX_AUDIO_SPKR].max <= MAX_VOLUME_YELLOW_THRESH)
clr = Orange;
// break;
}
#if 0
// case CONFIG_MAX_RX_GAIN: // maximum RX gain setting
else if(select==CONFIG_MAX_RX_GAIN)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.max_rf_gain,
0,
MAX_RF_GAIN_MAX,
MAX_RF_GAIN_DEFAULT,
1
);
if(var_change)
{
AudioManagement_CalcAGCVals(); // calculate new internal AGC values from user settings
}
snprintf(options,32, " %u", ts.max_rf_gain);
// break;
}
#endif
// case CONFIG_LINEOUT_GAIN:
else if(select==CONFIG_LINEOUT_GAIN)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.lineout_gain,
LINEOUT_GAIN_MIN,
LINEOUT_GAIN_MAX,
LINEOUT_GAIN_DEFAULT,
1
);
if(var_change)
{
Codec_VolumeLineOut(ts.txrx_mode);
}
snprintf(options,32, "%3u", ts.lineout_gain);
// break;
}
// case CONFIG_BEEP_FREQ: // Beep frequency
else if(select==CONFIG_BEEP_FREQ)
{
if(ts.flags2 & FLAGS2_KEY_BEEP_ENABLE) // is beep enabled?
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.beep_frequency,
MIN_BEEP_FREQUENCY,
MAX_BEEP_FREQUENCY,
DEFAULT_BEEP_FREQUENCY,
25);
if(var_change)
{
AudioManagement_KeyBeepPrepare();
AudioManagement_KeyBeep(); // make beep to demonstrate frequency
}
}
else // beep not enabled - display frequency in red
clr = Orange;
snprintf(options,32, " %uHz", (uint)ts.beep_frequency); // casted to int because display errors if uint32_t
// break;
}
// case CONFIG_BEEP_VOLUME: // beep loudness
else if(select==CONFIG_BEEP_VOLUME)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.beep_loudness,
0,
MAX_BEEP_LOUDNESS,
DEFAULT_BEEP_LOUDNESS,
1);
if(var_change)
{
if(ts.beep_loudness)
{
ts.flags2 |= FLAGS2_KEY_BEEP_ENABLE;
AudioManagement_KeyBeepPrepare();
AudioManagement_KeyBeep(); // make beep to demonstrate loudness
}
else
{
ts.flags2 &= ~FLAGS2_KEY_BEEP_ENABLE;
}
}
if(ts.beep_loudness)
{
snprintf(options,32, " %u", ts.beep_loudness);
}
else
{
snprintf(options,32, "%s", "OFF");
}
// break;
}
// case CONFIG_FREQUENCY_CALIBRATE: // Frequency Calibration
else if(select==CONFIG_FREQUENCY_CALIBRATE)
{
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.freq_cal += 1; // df.tuning_step;
var_change = 1;
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.freq_cal -= 1 ; // df.tuning_step;
var_change = 1;
}
if(ts.freq_cal < MIN_FREQ_CAL)
{
ts.freq_cal = MIN_FREQ_CAL;
}
else if(ts.freq_cal > MAX_FREQ_CAL)
{
ts.freq_cal = MAX_FREQ_CAL;
}
//
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.freq_cal = 0;
var_change = 1;
}
if(var_change)
{
osc->setPPM(((float32_t)ts.freq_cal)/10.0);
// Update LO PPM (will automatically adjust frequency)
// this is a little trick
// FIXME: Use a better approach to trigger retuning
df.temp_factor_changed = true;
}
{
char numstr[16];
float2fixedstr(numstr, 16, ((float32_t)ts.freq_cal)/10.0, 4, 1);
snprintf(options,32, "%sppm", numstr );
}
// break;
}
// case CONFIG_FREQ_LIMIT_RELAX: // Enable/disable Frequency tuning limits
else if(select==CONFIG_FREQ_LIMIT_RELAX)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_FREQ_LIMIT_RELAX);
if(ts.flags1 & FLAGS1_FREQ_LIMIT_RELAX) // tuning limit is disabled
{
clr = Orange; // warn user!
}
// break;
}
// case CONFIG_FREQ_MEM_LIMIT_RELAX: // Enable/disable Frequency memory limits
else if(select==CONFIG_FREQ_MEM_LIMIT_RELAX)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags2,0,options,&clr, FLAGS2_FREQ_MEM_LIMIT_RELAX);
if(ts.flags2 & FLAGS2_FREQ_MEM_LIMIT_RELAX) // frequency/memory limit is disabled
{
clr = Orange; // warn user!
}
// break;
}
/*
#define UI_MENU_CONFIG_IQ_RX_ADJ(bandName) \
case CONFIG_##bandName##_RX_IQ_GAIN_BAL: \
UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.rx.gain, TRX_MODE_RX, IQ_TRANS_ON); \
break; \
case CONFIG_##bandName##_RX_IQ_PHASE_BAL: \
UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.rx.phase, TRX_MODE_RX, IQ_TRANS_ON); \
break;
*/
#define UI_MENU_CONFIG_IQ_RX_ADJ(bandName) \
else if(select==CONFIG_##bandName##_RX_IQ_GAIN_BAL) \
{UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.rx.gain, TRX_MODE_RX, IQ_TRANS_ON);} \
else if(select==CONFIG_##bandName##_RX_IQ_PHASE_BAL) \
{UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.rx.phase, TRX_MODE_RX, IQ_TRANS_ON);}
UI_MENU_CONFIG_IQ_RX_ADJ(80M)
UI_MENU_CONFIG_IQ_RX_ADJ(10M)
/*
#define UI_MENU_CONFIG_IQ_TX_ADJ(bandName) \
case CONFIG_##bandName##_TX_IQ_GAIN_BAL: \
UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_ON].gain, TRX_MODE_TX, IQ_TRANS_ON); \
break; \
case CONFIG_##bandName##_TX_IQ_PHASE_BAL: \
UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_ON].phase, TRX_MODE_TX, IQ_TRANS_ON); \
break; \
case CONFIG_##bandName##_TX_IQ_GAIN_BAL_TRANS_OFF: \
UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_OFF].gain, TRX_MODE_TX, IQ_TRANS_OFF); \
break; \
case CONFIG_##bandName##_TX_IQ_PHASE_BAL_TRANS_OFF: \
UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_OFF].phase, TRX_MODE_TX, IQ_TRANS_OFF); \
break;
*/
#define UI_MENU_CONFIG_IQ_TX_ADJ(bandName) \
else if(select==CONFIG_##bandName##_TX_IQ_GAIN_BAL) \
{UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_ON].gain, TRX_MODE_TX, IQ_TRANS_ON);} \
else if(select==CONFIG_##bandName##_TX_IQ_PHASE_BAL) \
{UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_ON].phase, TRX_MODE_TX, IQ_TRANS_ON);} \
else if(select==CONFIG_##bandName##_TX_IQ_GAIN_BAL_TRANS_OFF) \
{UiMenu_HandleIQAdjustGain(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_OFF].gain, TRX_MODE_TX, IQ_TRANS_OFF);} \
else if(select==CONFIG_##bandName##_TX_IQ_PHASE_BAL_TRANS_OFF) \
{UiMenu_HandleIQAdjustPhase(var, mode, options, &clr, &iq_adjust[IQ_##bandName].adj.tx[IQ_TRANS_OFF].phase, TRX_MODE_TX, IQ_TRANS_OFF);}
UI_MENU_CONFIG_IQ_TX_ADJ(160M)
UI_MENU_CONFIG_IQ_TX_ADJ(80M)
UI_MENU_CONFIG_IQ_TX_ADJ(40M)
UI_MENU_CONFIG_IQ_TX_ADJ(30M)
UI_MENU_CONFIG_IQ_TX_ADJ(20M)
UI_MENU_CONFIG_IQ_TX_ADJ(17M)
UI_MENU_CONFIG_IQ_TX_ADJ(15M)
UI_MENU_CONFIG_IQ_TX_ADJ(12M)
UI_MENU_CONFIG_IQ_TX_ADJ(10M)
UI_MENU_CONFIG_IQ_TX_ADJ(10M_UP)
UI_MENU_CONFIG_IQ_TX_ADJ(6M)
// case CONFIG_CW_PA_BIAS: // CW PA Bias adjust
else if(select==CONFIG_CW_PA_BIAS)
{
if((ts.tune) || (ts.txrx_mode == TRX_MODE_TX)) // enable only in TUNE mode
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.pa_cw_bias,
0,
PA_BIAS_MAX,
0,
1);
if(var_change)
{
RadioManagement_SetPaBias();
}
if(ts.pa_cw_bias < PA_BIAS_LOW_LIMIT)
{
clr = Yellow;
}
}
else // Orange if not in TUNE or TX mode
{
clr = Orange;
}
snprintf(options,32, " %u", ts.pa_cw_bias);
// break;
}
// case CONFIG_PA_BIAS: // PA Bias adjust (Including CW if CW bias == 0)
else if(select==CONFIG_PA_BIAS)
{
if((ts.tune) || (ts.txrx_mode == TRX_MODE_TX)) // enable only in TUNE mode
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.pa_bias,
0,
PA_BIAS_MAX,
0,
1);
if(var_change)
{
RadioManagement_SetPaBias();
}
if(ts.pa_bias < PA_BIAS_LOW_LIMIT)
{
clr = Yellow;
}
}
else // Orange if not in TUNE or TX mode
{
clr = Orange;
}
snprintf(options,32, " %u", ts.pa_bias);
// break;
}
// case CONFIG_FWD_REV_PWR_DISP: // Enable/disable display of FWD/REV A/D inputs on power sensor
else if(select==CONFIG_FWD_REV_PWR_DISP)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &swrm.pwr_meter_disp,0,options,&clr);
// break;
}
// case CONFIG_RF_FWD_PWR_NULL: // RF power FWD power meter calibrate
else if(select==CONFIG_RF_FWD_PWR_NULL)
{
if(swrm.pwr_meter_disp)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &swrm.sensor_null,
SWR_CAL_MIN,
SWR_CAL_MAX,
SWR_CAL_DEFAULT,
1);
if(ts.txrx_mode != TRX_MODE_TX) // Orange if not in TX mode
{
clr = Orange;
}
}
else // numerical display NOT active
{
clr = Orange; // make it red to indicate that adjustment is NOT available
}
snprintf(options,32, " %u", swrm.sensor_null);
// break;
}
// case CONFIG_FWD_REV_COUPLING_2200M_ADJ: // RF power sensor coupling adjust (2200m)
else if(select==CONFIG_FWD_REV_COUPLING_2200M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_2200M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_630M_ADJ: // RF power sensor coupling adjust (630m)
else if(select==CONFIG_FWD_REV_COUPLING_630M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_630M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_160M_ADJ: // RF power sensor coupling adjust (160m)
else if(select==CONFIG_FWD_REV_COUPLING_160M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_160M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_80M_ADJ: // RF power sensor coupling adjust (80m)
else if(select==CONFIG_FWD_REV_COUPLING_80M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_80M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_40M_ADJ: // RF power sensor coupling adjust (40m)
else if(select==CONFIG_FWD_REV_COUPLING_40M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_40M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_20M_ADJ: // RF power sensor coupling adjust (20m)
else if(select==CONFIG_FWD_REV_COUPLING_20M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_20M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_15M_ADJ: // RF power sensor coupling adjust (15m)
else if(select==CONFIG_FWD_REV_COUPLING_15M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_15M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_10M_ADJ: // RF power sensor coupling adjust (15m)
else if(select==CONFIG_FWD_REV_COUPLING_10M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_10M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_6M_ADJ: // RF power sensor coupling adjust (6m)
else if(select==CONFIG_FWD_REV_COUPLING_6M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_6M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_2M_ADJ: // RF power sensor coupling adjust (2m)
else if(select==CONFIG_FWD_REV_COUPLING_2M_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_2M, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_70CM_ADJ: // RF power sensor coupling adjust (70cm)
else if(select==CONFIG_FWD_REV_COUPLING_70CM_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_70CM, options, &clr);
// break;
}
// case CONFIG_FWD_REV_COUPLING_23CM_ADJ: // RF power sensor coupling adjust (23cm)
else if(select==CONFIG_FWD_REV_COUPLING_23CM_ADJ)
{
UiDriverMenuBandRevCouplingAdjust(var, mode, COUPLING_23CM, options, &clr);
// break;
}
// case CONFIG_FWD_REV_SENSE_SWAP: // Enable/disable swap of FWD/REV A/D inputs on power sensor
else if(select==CONFIG_FWD_REV_SENSE_SWAP)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_SWAP_FWDREV_SENSE);
if(ts.flags1 & FLAGS1_SWAP_FWDREV_SENSE) // Display status FWD/REV swapping
{
clr = Orange; // warn user swapping is on!
}
// break;
}
// case CONFIG_XVTR_OFFSET_MULT: // Transverter Frequency Display Offset/Multiplier Mode On/Off
else if(select==CONFIG_XVTR_OFFSET_MULT)
{
// var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.xverter_mode,
temp_var_u8 = ts.xverter_mode & 0xf;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
XVERTER_MULT_MAX,
0,
1);
ts.xverter_mode = (ts.xverter_mode & 0xfffffff0) | temp_var_u8;
if(var_change) // change?
{
#ifdef SDR_AMBER
if(temp_var_u8 & ts.show_wide_spectrum)
{
//Don't show BndMem
ts.expflags1 = ts.expflags1 | EXPFLAGS1_NO_SHOW_BNDMEM;
UiDriver_ClearMemoryLabel();
}
if (ts.expflags2 & EXPFLAGS2_XVTR_OFF_PA)
{
if(temp_var_u8)
{
ts.amber_io8_state = ts.amber_io8_state & ~128; // reset bit
}
else
{
ts.amber_io8_state = ts.amber_io8_state | 128; // set bit
}
Board_AmberIOx8_Write(ts.amber_io8_state);
}
#endif
UiDriver_CreateMainFreqDisplay(true);
UiDriver_FrequencyUpdateLOandDisplay(true);
}
// if(ts.xverter_mode)
if(temp_var_u8)
{
// snprintf(options,32, " ON x%u", ts.xverter_mode); // Display on/multiplication factor
// clr = Red;
snprintf(options,32, " ON x%u", (uint)ts.xverter_mode); // Display on/multiplication factor
}
else
{
// txt_ptr = " OFF";
txt_ptr = " OFF";
clr = Orange;
}
// break;
}
// case CONFIG_XVTR_FREQUENCY_OFFSET: // Adjust transverter Frequency offset
else if(select==CONFIG_XVTR_FREQUENCY_OFFSET)
{
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.xverter_offset += df.tuning_step;
var_change = 1;
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if(ts.xverter_offset >= df.tuning_step) // subtract only if we have room to do so
{
ts.xverter_offset -= df.tuning_step;
}
else
{
ts.xverter_offset = 0; // else set to zero
}
var_change = 1;
}
if(ts.xverter_offset > XVERTER_OFFSET_MAX)
{
ts.xverter_offset = XVERTER_OFFSET_MAX;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.xverter_offset = 0; // default for this option is to zero it out
var_change = 1;
}
if(var_change) // change?
{
UiDriver_FrequencyUpdateLOandDisplay(true);
}
// if(ts.xverter_mode) // transvert mode active?
if(RadioManagement_Transverter_IsEnabled() == false) // transvert mode inactive?
{
clr = Orange; // make number red to alert user of this!
}
uint32_t offset_offset = ts.xverter_offset > XVERTER_OFFSET_MAX_HZ? ((XVERTER_OFFSET_MAX_HZ)-(XVERTER_OFFSET_MAX_HZ)/1000):0;
snprintf(options,32, ts.xverter_offset > XVERTER_OFFSET_MAX_HZ? " %9ukHz" : " %9uHz", (uint)(ts.xverter_offset-offset_offset)); // print with nine digits
// break;
}
// case CONFIG_XVTR_FREQUENCY_OFFSET_TX: // Adjust transverter tx Frequency offset
else if(select==CONFIG_XVTR_FREQUENCY_OFFSET_TX)
{
if(var >= 1) // setting increase?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.xverter_offset_tx += df.tuning_step;
var_change = 1;
}
else if(var <= -1) // setting decrease?
{
ts.menu_var_changed = 1; // indicate that a change has occurred
if(ts.xverter_offset_tx >= df.tuning_step) // subtract only if we have room to do so
{
ts.xverter_offset_tx -= df.tuning_step;
}
else
{
ts.xverter_offset_tx = 0; // else set to zero
}
var_change = 1;
}
if(ts.xverter_offset_tx > XVERTER_OFFSET_MAX)
{
ts.xverter_offset_tx = XVERTER_OFFSET_MAX;
}
if(mode == MENU_PROCESS_VALUE_SETDEFAULT)
{
ts.menu_var_changed = 1; // indicate that a change has occurred
ts.xverter_offset_tx = 0; // default for this option is to zero it out
var_change = 1;
}
if(var_change) // change?
{
UiDriver_FrequencyUpdateLOandDisplay(true);
}
if(RadioManagement_Transverter_IsEnabled() == false) // transvert mode inactive?
{
// clr = Red; // make number red to alert user of this!
clr = Orange; // make number orange to alert user of this!
}
// snprintf(options,32, " %9uHz", (uint)ts.xverter_offset); // print with nine digits
if (ts.xverter_offset_tx != 0)
{
uint32_t offset_offset = ts.xverter_offset_tx > XVERTER_OFFSET_MAX_HZ? ((XVERTER_OFFSET_MAX_HZ)-(XVERTER_OFFSET_MAX_HZ)/1000):0;
snprintf(options,32, ts.xverter_offset_tx > XVERTER_OFFSET_MAX_HZ? " %9ukHz" : " %9uHz", (uint)(ts.xverter_offset_tx-offset_offset)); // print with nine digits
}
else
{
txt_ptr = " Same as RX";
}
// break;
}
// case CONFIG_2200M_5W_ADJUST: // 2200m 5 watt adjust
else if(select==CONFIG_2200M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_2200, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_630M_5W_ADJUST: // 630m 5 watt adjust
else if(select==CONFIG_630M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_630, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_160M_5W_ADJUST: // 160m 5 watt adjust
else if(select==CONFIG_160M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_160, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_80M_5W_ADJUST: // 80m 5 watt adjust
else if(select==CONFIG_80M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_80, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_60M_5W_ADJUST: // 60m 5 watt adjust
else if(select==CONFIG_60M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_60, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_40M_5W_ADJUST: // 40m 5 watt adjust
else if(select==CONFIG_40M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_40, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_30M_5W_ADJUST: // 30m 5 watt adjust
else if(select==CONFIG_30M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_30, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_20M_5W_ADJUST: // 20m 5 watt adjust
else if(select==CONFIG_20M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_20, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_17M_5W_ADJUST: // 17m 5 watt adjust
else if(select==CONFIG_17M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_17, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_15M_5W_ADJUST: // 15m 5 watt adjust
else if(select==CONFIG_15M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_15, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_12M_5W_ADJUST: // 12m 5 watt adjust
else if(select==CONFIG_12M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_12, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_10M_5W_ADJUST: // 10m 5 watt adjust
else if(select==CONFIG_10M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_10, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_6M_5W_ADJUST: // 6m 5 watt adjust
else if(select==CONFIG_6M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_6, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_4M_5W_ADJUST: // 4m 5 watt adjust
else if(select==CONFIG_4M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_4, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_2M_5W_ADJUST: // 2m 5 watt adjust
else if(select==CONFIG_2M_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_2, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_70CM_5W_ADJUST: // 70cm 5 watt adjust
else if(select==CONFIG_70CM_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_70, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_23CM_5W_ADJUST: // 23cm 5 watt adjust
else if(select==CONFIG_23CM_5W_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_23, PA_LEVEL_HIGH, options, &clr);
// break;
}
// case CONFIG_2200M_FULL_POWER_ADJUST: // 2200m 5 watt adjust
else if(select==CONFIG_2200M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_2200, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_630M_FULL_POWER_ADJUST: // 630m 5 watt adjust
else if(select==CONFIG_630M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_630, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_160M_FULL_POWER_ADJUST: // 160m 5 watt adjust
else if(select==CONFIG_160M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_160, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_80M_FULL_POWER_ADJUST: // 80m 5 watt adjust
else if(select==CONFIG_80M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_80, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_60M_FULL_POWER_ADJUST: // 60m 5 watt adjust
else if(select==CONFIG_60M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_60, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_40M_FULL_POWER_ADJUST: // 40m 5 watt adjust
else if(select==CONFIG_40M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_40, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_30M_FULL_POWER_ADJUST: // 30m 5 watt adjust
else if(select==CONFIG_30M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_30, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_20M_FULL_POWER_ADJUST: // 20m 5 watt adjust
else if(select==CONFIG_20M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_20, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_17M_FULL_POWER_ADJUST: // 17m 5 watt adjust
else if(select==CONFIG_17M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_17, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_15M_FULL_POWER_ADJUST: // 15m 5 watt adjust
else if(select==CONFIG_15M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_15, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_12M_FULL_POWER_ADJUST: // 12m 5 watt adjust
else if(select==CONFIG_12M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_12, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_10M_FULL_POWER_ADJUST: // 10m 5 watt adjust
else if(select==CONFIG_10M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_10, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_6M_FULL_POWER_ADJUST: // 6m 5 watt adjust
else if(select==CONFIG_6M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_6, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_4M_FULL_POWER_ADJUST: // 4m 5 watt adjust
else if(select==CONFIG_4M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_4, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_2M_FULL_POWER_ADJUST: // 2m 5 watt adjust
else if(select==CONFIG_2M_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_2, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_70CM_FULL_POWER_ADJUST: // 70cm 5 watt adjust
else if(select==CONFIG_70CM_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_70, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_23CM_FULL_POWER_ADJUST: // 23cm 5 watt adjust
else if(select==CONFIG_23CM_FULL_POWER_ADJUST)
{
UiDriverMenuBandPowerAdjust(var, mode, BAND_MODE_23, PA_LEVEL_FULL, options, &clr);
// break;
}
// case CONFIG_REDUCE_POWER_ON_LOW_BANDS:
else if(select==CONFIG_REDUCE_POWER_ON_LOW_BANDS)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags2,0,options,&clr, FLAGS2_LOW_BAND_BIAS_REDUCE);
// break;
}
// case CONFIG_REDUCE_POWER_ON_HIGH_BANDS:
else if(select==CONFIG_REDUCE_POWER_ON_HIGH_BANDS)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags2,0,options,&clr, FLAGS2_HIGH_BAND_BIAS_REDUCE);
// break;
}
#ifdef OBSOLETE_NR
// case CONFIG_DSP_NR_DECORRELATOR_BUFFER_LENGTH: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NR_DECORRELATOR_BUFFER_LENGTH)
{
ts.dsp.nr_delaybuf_len &= 0xfff0; // mask bottom nybble to enforce 16-count boundary
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.dsp.nr_delaybuf_len,
DSP_NR_BUFLEN_MIN,
DSP_NR_BUFLEN_MAX,
DSP_NR_BUFLEN_DEFAULT,
16);
if(ts.dsp.nr_delaybuf_len <= ts.dsp.nr_numtaps) // is buffer smaller/equal to number of taps?
ts.dsp.nr_delaybuf_len = ts.dsp.nr_numtaps + 16; // yes - it must always be larger than number of taps!
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NR_ENABLE) // only update if DSP NR active
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
if(!(ts.dsp.active & DSP_NR_ENABLE)) // mark orange if DSP NR not active
clr = Orange;
if(ts.dsp.nr_numtaps >= ts.dsp.nr_delaybuf_len) // Warn if number of taps greater than/equal buffer length!
clr = Red;
snprintf(options,32, " %u", (uint)ts.dsp.nr_delaybuf_len);
// break;
}
// case CONFIG_DSP_NR_FFT_NUMTAPS: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NR_FFT_NUMTAPS)
{
ts.dsp.nr_numtaps &= 0xf0; // mask bottom nybble to enforce 16-count boundary
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.nr_numtaps,
DSP_NR_NUMTAPS_MIN,
DSP_NR_NUMTAPS_MAX,
DSP_NR_NUMTAPS_DEFAULT,
16);
if(ts.dsp.nr_numtaps >= ts.dsp.nr_delaybuf_len) // is number of taps equal or greater than buffer length?
{
ts.dsp.nr_delaybuf_len = ts.dsp.nr_numtaps + 16; // yes - make buffer larger
}
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NR_ENABLE) // only update if DSP NR active
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
if(!(ts.dsp.active & DSP_NR_ENABLE)) // mark orange if DSP NR not active
{
clr = Orange;
}
if(ts.dsp.nr_numtaps >= ts.dsp.nr_delaybuf_len) // Warn if number of taps greater than/equal buffer length!
{
clr = Red;
}
snprintf(options,32, " %u", ts.dsp.nr_numtaps);
// break;
}
// case CONFIG_DSP_NOTCH_CONVERGE_RATE: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NOTCH_CONVERGE_RATE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_mu,
0,
DSP_NOTCH_MU_MAX,
DSP_NOTCH_MU_DEFAULT,
1);
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if Notch DSP is active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if Notch DSP not active
{
clr = Orange;
}
snprintf(options,32, " %u", ts.dsp.notch_mu);
// break;
}
// case CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_delaybuf_len,
DSP_NOTCH_BUFLEN_MIN,
DSP_NOTCH_BUFLEN_MAX,
DSP_NOTCH_DELAYBUF_DEFAULT,
8);
if(ts.dsp.notch_delaybuf_len <= ts.dsp.notch_numtaps) // did we try to decrease it smaller than FFT size?
{
ts.dsp.notch_delaybuf_len = ts.dsp.notch_numtaps + 8; // yes - limit it to previous size
}
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if DSP Notch active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if DSP Notch not active
{
clr = Orange;
}
if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len)
{
clr = Red;
}
snprintf(options,32, " %u", (uint)ts.dsp.notch_delaybuf_len);
// break;
}
// case CONFIG_DSP_NOTCH_FFT_NUMTAPS: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NOTCH_FFT_NUMTAPS)
{
ts.dsp.notch_numtaps &= 0xf0; // mask bottom nybble to enforce 16-count boundary
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_numtaps,
0,
DSP_NOTCH_NUMTAPS_MAX,
DSP_NOTCH_NUMTAPS_DEFAULT,
16);
if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len) // force buffer size to always be larger than number of taps
ts.dsp.notch_delaybuf_len = ts.dsp.notch_numtaps + 8;
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if DSP NR active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if DSP NR not active
{
clr = Orange;
}
if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len) // Warn if number of taps greater than/equal buffer length!
{
clr = Red;
}
snprintf(options,32, " %u", ts.dsp.notch_numtaps);
// break;
}
/*
case CONFIG_AGC_TIME_CONSTANT: // Adjustment of Noise Blanker AGC Time Constant
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.nb_agc_time_const,
0,
NB_MAX_AGC_SETTING,
NB_AGC_DEFAULT,
1);
if(var_change) // parameter changed?
{
AudioManagement_CalcNB_AGC(); // yes - recalculate new values for Noise Blanker AGC
}
snprintf(options,32, " %u", ts.nb_agc_time_const);
break;
*/
#endif
#ifdef USE_LMS_AUTONOTCH
// case CONFIG_DSP_NOTCH_CONVERGE_RATE: // Adjustment of DSP autonotch convergence rate
else if(select==CONFIG_DSP_NOTCH_CONVERGE_RATE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_mu,
0,
DSP_NOTCH_MU_MAX,
DSP_NOTCH_MU_DEFAULT,
1);
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if Notch DSP is active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if Notch DSP not active
{
clr = Orange;
}
snprintf(options,32, " %u", ts.dsp.notch_mu);
// break;
}
// case CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NOTCH_DECORRELATOR_BUFFER_LENGTH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_delaybuf_len,
DSP_NOTCH_BUFLEN_MIN,
DSP_NOTCH_BUFLEN_MAX,
DSP_NOTCH_DELAYBUF_DEFAULT,
8);
if(ts.dsp.notch_delaybuf_len <= ts.dsp.notch_numtaps) // did we try to decrease it smaller than FFT size?
{
ts.dsp.notch_delaybuf_len = ts.dsp.notch_numtaps + 8; // yes - limit it to previous size
}
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if DSP Notch active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if DSP Notch not active
{
clr = Orange;
}
if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len)
{
clr = Red;
}
snprintf(options,32, " %u", (uint)ts.dsp.notch_delaybuf_len);
// break;
}
// case CONFIG_DSP_NOTCH_FFT_NUMTAPS: // Adjustment of DSP noise reduction de-correlation delay buffer length
else if(select==CONFIG_DSP_NOTCH_FFT_NUMTAPS)
{
ts.dsp.notch_numtaps &= 0xf0; // mask bottom nybble to enforce 16-count boundary
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.dsp.notch_numtaps,
16,
DSP_NOTCH_NUMTAPS_MAX,
DSP_NOTCH_NUMTAPS_DEFAULT,
16);
// if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len) // force buffer size to always be larger than number of taps
// ts.dsp.notch_delaybuf_len = ts.dsp.notch_numtaps + 8;
if(var_change) // did something change?
{
if(ts.dsp.active & DSP_NOTCH_ENABLE) // only update if DSP NR active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
if(!(ts.dsp.active & DSP_NOTCH_ENABLE)) // mark orange if DSP NR not active
{
clr = Orange;
}
if(ts.dsp.notch_numtaps >= ts.dsp.notch_delaybuf_len) // Warn if number of taps greater than/equal buffer length!
{
clr = Red;
}
snprintf(options,32, " %u", ts.dsp.notch_numtaps);
// break;
}
#endif
// case CONFIG_AM_TX_FILTER_DISABLE: // Enable/disable AM TX audio filter
else if(select==CONFIG_AM_TX_FILTER_DISABLE)
{
temp_var_u8 = !(ts.flags1 & FLAGS1_AM_TX_FILTER_DISABLE);
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp_var_u8,0,options,&clr);
if(var_change) // did the status change and is translate mode NOT active?
{
CLR_OR_SET_BITMASK(!temp_var_u8, ts.flags1, FLAGS1_AM_TX_FILTER_DISABLE);
}
if(ts.flags1 & FLAGS1_AM_TX_FILTER_DISABLE) // Display status of TX audio filter
{
clr = Orange; // warn user that filter is off!
}
// break;
}
/* case CONFIG_SSB_TX_FILTER_DISABLE: // Enable/disable SSB TX audio filter
temp_var = ts.flags1 & FLAGS1_SSB_TX_FILTER_DISABLE;
tchange = UiDriverMenuItemChangeDisableOnOff(var, mode, &temp_var,0,options,&clr);
if(tchange) // did the status change and is translate mode NOT active?
{
if(temp_var) // SSB TX audio filter is disabled
{
ts.flags1 |= FLAGS1_SSB_TX_FILTER_DISABLE; // set bit
}
else
{ // SSB TX audio filter is enabled
ts.flags1 &= ~FLAGS1_SSB_TX_FILTER_DISABLE; // clear bit
}
}
if(ts.flags1 & FLAGS1_SSB_TX_FILTER_DISABLE) // Display status of TX audio filter
{
clr = Red; // warn user that filter is off!
}
break;
*/
// case CONFIG_SSB_TX_FILTER: // Type of SSB TX audio filter
else if(select==CONFIG_SSB_TX_FILTER)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.tx_filter,
// 0,
1,
TX_FILTER_ESSB_6k,
TX_FILTER_TENOR,
1
);
switch(ts.tx_filter) {
case TX_FILTER_SOPRANO:
txt_ptr = " SOPRANO";
break;
case TX_FILTER_TENOR:
txt_ptr = " TENOR";
break;
case TX_FILTER_BASS:
txt_ptr = " BASS";
break;
case TX_FILTER_ESSB_4k:
txt_ptr = " eSSB 4k";
break;
case TX_FILTER_ESSB_5k:
txt_ptr = " eSSB 5k";
break;
case TX_FILTER_ESSB_6k:
txt_ptr = " eSSB 6k";
break;
}
if(var_change)
{
TxProcessor_Set(ts.dmod_mode);
}
// break;
}
// case CONFIG_TUNE_TONE_MODE: // set power for antenne tuning
else if(select==CONFIG_TUNE_TONE_MODE)
{
temp_var_u8 = ts.menu_var_changed;
// this is not save, so no need to mark as dirty,
// we just remember the state and restore it
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.tune_tone_mode,
TUNE_TONE_SINGLE,
TUNE_TONE_TWO,
TUNE_TONE_SINGLE,
1);
switch(ts.tune_tone_mode)
{
case TUNE_TONE_SINGLE:
txt_ptr = " Single";
break;
case TUNE_TONE_TWO:
txt_ptr = "Two Tone";
break;
default:
break;
}
ts.menu_var_changed = temp_var_u8;
// break;
}
// case CONFIG_TUNE_POWER_LEVEL: // set power for antenne tuning
else if(select==CONFIG_TUNE_POWER_LEVEL)
{
var_change = UiDriverMenuItemChangeUInt8(var*(-1), mode, &ts.tune_power_level,
0,
PA_LEVEL_TUNE_KEEP_CURRENT,
PA_LEVEL_TUNE_KEEP_CURRENT,
1);
if (ts.tune_power_level < mchf_power_levelsInfo.count)
{
char txt[5];
UiDriver_Power2String(txt,sizeof(txt),mchf_power_levelsInfo.levels[ts.tune_power_level].mW);
snprintf(options,32," %s",txt);
}
else
{
txt_ptr = " as TX PWR";
}
// break;
}
#if 0
// case CONFIG_SPECTRUM_FFT_WINDOW_TYPE: // set step size of of waterfall display?
else if(select==CONFIG_SPECTRUM_FFT_WINDOW_TYPE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.fft_window_type,
0,
FFT_WINDOW_MAX-1,
FFT_WINDOW_DEFAULT,
1);
switch(ts.fft_window_type)
{
case FFT_WINDOW_RECTANGULAR:
txt_ptr = "Rectangular";
break;
case FFT_WINDOW_COSINE:
txt_ptr = " Cosine";
break;
case FFT_WINDOW_BARTLETT:
txt_ptr = " Bartlett";
break;
case FFT_WINDOW_WELCH:
txt_ptr = " Welch";
break;
case FFT_WINDOW_HANN:
txt_ptr = " Hann";
break;
case FFT_WINDOW_HAMMING:
txt_ptr = " Hamming";
break;
case FFT_WINDOW_BLACKMAN:
txt_ptr = " Blackman";
break;
case FFT_WINDOW_NUTTALL:
txt_ptr = " Nuttall";
break;
}
// break;
}
#endif
// case CONFIG_RESET_SER_EEPROM:
else if(select==CONFIG_RESET_SER_EEPROM)
{
if(SerialEEPROM_24xx_Exists() == false)
{
txt_ptr = " n/a";
clr = Red;
}
else
{
txt_ptr = "n/a";
uint8_t test = 0;
clr = White;
UiDriverMenuItemChangeUInt8(var, mode, &test,
0,
0,
10,
1
);
switch(test)
{
case 0:
txt_ptr = "press DEFLT";
break;
case 10:
UiMenu_DisplayValue(" Working",Red,pos);
// clear EEPROM
SerialEEPROM_Clear_Signature();
SerialEEPROM_Clear_AllVariables();
Board_Reboot();
break;
}
}
// break;
}
// case CONFIG_RESET_SER_EEPROM_SIGNATURE:
else if(select==CONFIG_RESET_SER_EEPROM_SIGNATURE)
{
if(SerialEEPROM_24xx_Exists() == false)
{
txt_ptr = " n/a";
clr = Red;
}
else
{
txt_ptr = "n/a";
uint8_t test = 0;
clr = White;
UiDriverMenuItemChangeUInt8(var, mode, &test,
0,
0,
10,
1
);
switch(test)
{
case 0:
txt_ptr = "press DEFLT";
break;
case 10:
UiMenu_DisplayValue(" Working",Red,pos);
// clear EEPROM
SerialEEPROM_Clear_Signature();
Board_Reboot();
break;
}
}
// break;
}
// case MENU_FP_CW_01:
// case MENU_FP_CW_02:
// case MENU_FP_CW_03:
// case MENU_FP_CW_04:
else if(select==MENU_FP_CW_01 || select==MENU_FP_CW_02 || select==MENU_FP_CW_03 || select==MENU_FP_CW_04)
{
UiMenu_ChangeFilterPathMemory(var, mode, options, &clr, FILTER_MODE_CW,(select - MENU_FP_CW_01)+1);
// break;
}
// case MENU_FP_AM_01:
// case MENU_FP_AM_02:
// case MENU_FP_AM_03:
// case MENU_FP_AM_04:
else if(select==MENU_FP_AM_01 || select==MENU_FP_AM_02 || select==MENU_FP_AM_03 || select==MENU_FP_AM_04)
{
UiMenu_ChangeFilterPathMemory(var, mode, options, &clr, FILTER_MODE_AM,(select - MENU_FP_AM_01)+1);
// break;
}
// case MENU_FP_SSB_01:
// case MENU_FP_SSB_02:
// case MENU_FP_SSB_03:
// case MENU_FP_SSB_04:
else if(select==MENU_FP_SSB_01 || select==MENU_FP_SSB_02 || select==MENU_FP_SSB_03 || select==MENU_FP_SSB_04)
{
UiMenu_ChangeFilterPathMemory(var, mode, options, &clr, FILTER_MODE_SSB,(select - MENU_FP_SSB_01)+1);
// break;
}
// case MENU_FP_SAM_01:
// case MENU_FP_SAM_02:
// case MENU_FP_SAM_03:
// case MENU_FP_SAM_04:
// UiMenu_ChangeFilterPathMemory(var, mode, options, &clr, FILTER_MODE_SAM,(select - MENU_FP_SAM_01)+1);
// break;
// case CONFIG_CAT_IN_SANDBOX:
else if(select==CONFIG_CAT_IN_SANDBOX)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.flags1,0,options,&clr, FLAGS1_CAT_IN_SANDBOX);
if(!(ts.flags1 & FLAGS1_CAT_IN_SANDBOX))
{
ts.cat_band_index = 255;
}
// break;
}
// case CONFIG_CAT_XLAT: // CAT xlat reporting
else if(select==CONFIG_CAT_XLAT)
{
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &ts.xlat,0,options,&clr);
// break;
}
// case MENU_DEBUG_TX_AUDIO: // Step size button swap on/off
else if(select==MENU_DEBUG_TX_AUDIO)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.stream_tx_audio,
0,
STREAM_TX_AUDIO_NUM-1,
STREAM_TX_AUDIO_OFF,
1);
switch(ts.stream_tx_audio)
{
case STREAM_TX_AUDIO_OFF:
txt_ptr = " OFF";
break;
case STREAM_TX_AUDIO_SRC:
txt_ptr = " Source";
break;
case STREAM_TX_AUDIO_FILT:
txt_ptr = " Filtered";
break;
case STREAM_TX_AUDIO_DIGIQ:
txt_ptr = " Final IQ";
break;
case STREAM_TX_AUDIO_GENIQ:
txt_ptr = "Generated IQ";
break;
}
// break;
}
#ifdef STM32F4
// case CONFIG_I2C1_SPEED: //
else if(select==CONFIG_I2C1_SPEED)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.i2c_speed[I2C_BUS_1],
1,
20,
I2C1_SPEED_DEFAULT,
1
);
if(var_change)
{
UhsdrHw_I2C_ChangeSpeed(&hi2c1);
}
snprintf(options, 32, " %3dkHz",(unsigned int)(ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 );
if((ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 < 50 || (ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 > 250)
{
clr = Red;
}
if(((ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 > 50 && (ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 < 90) || ((ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 > 210 && (ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 < 250))
{
clr = Yellow;
}
if((ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 > 90 && (ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 < 210)
{
clr = Green;
}
// break;
}
// case CONFIG_I2C2_SPEED: //
else if(select==CONFIG_I2C2_SPEED)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &ts.i2c_speed[I2C_BUS_2],
1,
20,
I2C2_SPEED_DEFAULT,
1
);
if(var_change)
{
UhsdrHw_I2C_ChangeSpeed(&hi2c2);
}
snprintf(options, 32, " %3ukHz",(unsigned int)(ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 );
if((ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 < 50 || (ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 > 250)
{
clr = Red;
}
if(((ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 > 50 && (ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 < 90) || ((ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 > 210 && (ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 < 250))
{
clr = Yellow;
}
if((ts.i2c_speed[I2C_BUS_2]*I2C_BUS_SPEED_MULT) / 1000 > 90 && (ts.i2c_speed[I2C_BUS_1]*I2C_BUS_SPEED_MULT) / 1000 < 210)
{
clr = Green;
}
// break;
}
#endif
// case CONFIG_RTC_HOUR:
else if(select==CONFIG_RTC_HOUR)
{
RTC_TimeTypeDef rtc;
Rtc_GetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
rtc.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
rtc.StoreOperation = RTC_STOREOPERATION_SET;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &rtc.Hours,
0,
23,
0,
1);
if(var_change) // did something change?
{
HAL_RTC_SetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
}
snprintf(options,32, " %2u", rtc.Hours);
// break;
}
// case CONFIG_RTC_MIN:
else if(select==CONFIG_RTC_MIN)
{
RTC_TimeTypeDef rtc;
Rtc_GetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
rtc.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
rtc.StoreOperation = RTC_STOREOPERATION_SET;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &rtc.Minutes,
0,
59,
0,
1);
if(var_change) // did something change?
{
HAL_RTC_SetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
}
snprintf(options,32, " %2u", rtc.Minutes);
// break;
}
// case CONFIG_RTC_SEC:
else if(select==CONFIG_RTC_SEC)
{
RTC_TimeTypeDef rtc;
Rtc_GetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
rtc.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
rtc.StoreOperation = RTC_STOREOPERATION_SET;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &rtc.Seconds,
0,
59,
0,
1);
if(var_change) // did something change?
{
HAL_RTC_SetTime(&hrtc, &rtc, RTC_FORMAT_BIN);
}
snprintf(options,32, " %2u", rtc.Seconds);
// break;
}
// case CONFIG_RTC_CALIB:
else if(select==CONFIG_RTC_CALIB)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.rtc_calib,
RTC_CALIB_PPM_MIN,
RTC_CALIB_PPM_MAX,
RTC_CALIB_PPM_DEFAULT,
1);
if(var_change) // did something change?
{
Rtc_SetPpm(ts.rtc_calib);
}
snprintf(options,32, "%4dppm", ts.rtc_calib);
// break;
}
// case CONFIG_RTC_START:
else if(select==CONFIG_RTC_START)
{
txt_ptr = "Do it!";
clr = White;
if(var>=1)
{
Rtc_Start();
Board_Reboot();
// TODO: we will not reach this but in future we may switch the keyboard dynamically...
txt_ptr = " Done!";
clr = Green;
}
// break;
}
// case CONFIG_RTC_RESET:
else if(select==CONFIG_RTC_RESET)
{
txt_ptr = "Do it!";
clr = White;
if(var>=1)
{
Rtc_FullReset();
txt_ptr = " Done!";
clr = Green;
}
// break;
}
// case MENU_DEBUG_ENABLE_INFO: // Debug infos on LCD on/off
else if(select==MENU_DEBUG_ENABLE_INFO)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.show_debug_info,0,options,&clr);
if(var_change)
{
UiDriver_DebugInfo_DisplayEnable(ts.show_debug_info);
}
// break;
}
#ifdef USE_TWO_CHANNEL_AUDIO
// case MENU_DEBUG_ENABLE_STEREO: // stereo demodulation on/off
else if(select==MENU_DEBUG_ENABLE_STEREO)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.stereo_enable,0,options,&clr);
switch(ts.stereo_enable)
{
case 0:
txt_ptr = " OFF";
break;
case 1:
txt_ptr = " ON";
break;
}
// break;
}
#endif
#ifdef USE_LEAKY_LMS
// case MENU_DEBUG_LEAKY_LMS:
else if(select==MENU_DEBUG_LEAKY_LMS)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.enable_leaky_LMS,0,options,&clr);
// break;
}
// case MENU_DEBUG_NR_POST_AGC_SELECT: // selection of location of DSP noise reduction - pre audio filter/AGC or post AGC/filter
else if(select==MENU_DEBUG_NR_POST_AGC_SELECT)
{
temp_var_u8 = ts.dsp.active & DSP_NR_POSTAGC_ENABLE;
var_change = UiDriverMenuItemChangeEnableOnOff(var, mode, &temp_var_u8,0,options,&clr);
// var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.dsp.active, 0, options, &clr, DSP_NR_POSTAGC_ENABLE);
if(var_change) // did something change?
{
CLR_OR_SET_BITMASK(temp_var_u8, ts.dsp.active, DSP_NR_POSTAGC_ENABLE);
if(ts.dsp.active & DSP_NR_ENABLE) // only update if DSP NR active
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
}
// break;
}
// case MENU_DEBUG_ANR_GAIN: //
else if(select==MENU_DEBUG_ANR_GAIN)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &leakyLMS.two_mu_int,
1,
10000,
100,
10
);
if(var_change)
{
leakyLMS.two_mu = leakyLMS.two_mu_int / 1000000;
ts.anr_two_mu_int = leakyLMS.two_mu_int;
}
snprintf(options, 32, " %4u",(unsigned int)leakyLMS.two_mu_int);
// break;
}
// case MENU_DEBUG_ANR_LEAK: //
else if(select==MENU_DEBUG_ANR_LEAK)
{
var_change = UiDriverMenuItemChangeUInt32(var, mode, &leakyLMS.gamma_int,
1,
1000,
100,
10
);
if(var_change)
{
leakyLMS.gamma = leakyLMS.gamma_int / 1000.0;
ts.anr_gamma_int = leakyLMS.gamma_int;
}
snprintf(options, 32, " %4u",(unsigned int)leakyLMS.gamma_int);
// break;
}
// case MENU_DEBUG_ANR_TAPS: //
else if(select==MENU_DEBUG_ANR_TAPS)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &leakyLMS.n_taps,
1,
192,
64,
2
);
if(var_change)
{
// leakyLMS.gamma = leakyLMS.gamma_int / 1000;
}
snprintf(options, 32, " %3u",(unsigned int)leakyLMS.n_taps);
ts.anr_n_taps = leakyLMS.n_taps;
// break;
}
// case MENU_DEBUG_ANR_DELAY: //
else if(select==MENU_DEBUG_ANR_DELAY)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &leakyLMS.delay,
1,
64,
16,
2
);
if(var_change)
{
ts.anr_delay = leakyLMS.delay;
}
snprintf(options, 32, " %3u",(unsigned int)leakyLMS.delay);
// break;
}
#endif
// this is now adjusted by ts.dsp.nr_strength
/* case MENU_DEBUG_NR_ALPHA: //
var_change = UiDriverMenuItemChangeInt16(var, mode, &nr_params.alpha_int,
700,
999,
920,
2
);
if(var_change)
{
nr_params.alpha = (float32_t)nr_params.alpha_int / 1000.0;
}
snprintf(options, 32, " %3u",(unsigned int)nr_params.alpha_int);
break;
*/
// case MENU_DEBUG_NR_GAIN_SHOW: //
else if(select==MENU_DEBUG_NR_GAIN_SHOW)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.nr_gain_display,
0,
1,
0,
1
);
switch(ts.nr_gain_display)
{
case 0:
txt_ptr = " OFF";
break;
case 1:
txt_ptr = " Hk";
break;
/*case 2:
txt_ptr = " notch";
break;
case 3:
txt_ptr = "HK & notch";
break; */
}
// break;
}
/*case MENU_DEBUG_NR_GAIN_SMOOTH_ALPHA: //
var_change = UiDriverMenuItemChangeInt16(var, mode, &nr_params.gain_smooth_alpha_int,
100,
990,
250,
2
);
if(var_change)
{
nr_params.gain_smooth_alpha = (float32_t)nr_params.gain_smooth_alpha_int / 1000.0;
}
snprintf(options, 32, " %3u",(unsigned int)nr_params.gain_smooth_alpha_int);
break;
case MENU_DEBUG_NR_LONG_TONE_ALPHA: //
var_change = UiDriverMenuItemChangeUInt32(var, mode, &nr_params.long_tone_alpha_int,
90000,
99999,
99900,
10
);
if(var_change)
{
nr_params.long_tone_alpha = (float32_t)nr_params.long_tone_alpha_int / 100000.0;
}
snprintf(options, 32, " %5u",(unsigned int)nr_params.long_tone_alpha_int);
break;
case MENU_DEBUG_NR_LONG_TONE_THRESH: //
var_change = UiDriverMenuItemChangeInt16(var, mode, &nr_params.long_tone_thresh,
10,
16000,
600,
200
);
if(var_change)
{
// nr_params.vad_thresh = (float32_t)nr_params.vad_thresh_int / 1000.0;
}
snprintf(options, 32, " %5u",(unsigned int)nr_params.long_tone_thresh);
break;
case MENU_DEBUG_NR_THRESH: //
var_change = UiDriverMenuItemChangeUInt32(var, mode, &nr_params.vad_thresh_int,
100,
20000,
1000,
50
);
if(var_change)
{
nr_params.vad_thresh = (float32_t)nr_params.vad_thresh_int / 1000.0;
}
snprintf(options, 32, " %5u",(unsigned int)nr_params.vad_thresh_int);
break;*/
// case MENU_DEBUG_NR_BETA: //
else if(select==MENU_DEBUG_NR_BETA)
{
{
int16_t beta_int = nr_params.beta * 1000;
var_change = UiDriverMenuItemChangeInt16(var, mode, &beta_int,
700,
999,
960,
2
);
if(var_change)
{
nr_params.beta = (float32_t)beta_int / 1000.0;
}
snprintf(options, 32, " %3u",(unsigned int)beta_int);
}
// break;
}
/*case MENU_DEBUG_NR_Mode: //
var_change = UiDriverMenuItemChangeInt16(var, mode, &nr_params.mode,
0,
2,
0,
1
);
switch(nr_params.mode)
{
case 0:
txt_ptr = " Release";
break;
case 1:
txt_ptr = " Devel1";
break;
case 2:
txt_ptr = " Devel2";
}
if(var_change)
{
switch(nr_params.mode)
{
case 0:
nr_params.beta = 0.850;
nr_params.beta_int=850;
nr_params.first_time = 1; //Restart the noisereduction
break;
case 1:
nr_params.beta = 0.960;
nr_params.beta_int=960;
nr_params.first_time = 1; //Restart the noisereduction
case 2:
nr_params.beta = 0.960;
nr_params.beta_int=960;
nr_params.first_time = 1; //Restart the noisereduction
break;
}
}
break; */
// case MENU_DEBUG_NR_ASNR:
else if(select==MENU_DEBUG_NR_ASNR)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &NR2.asnr,
2,
30,
30,
1);
if(var_change) // did something change?
{
//nr_params.first_time = 1;
}
snprintf(options,32, " %3u", (unsigned int)NR2.asnr);
// break;
}
// case MENU_DEBUG_NR_GAIN_SMOOTH_WIDTH:
else if(select==MENU_DEBUG_NR_GAIN_SMOOTH_WIDTH)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &NR2.width,
1,
5,
4,
1);
if(var_change) // did something change?
{
//nr_params.first_time = 1;
}
snprintf(options,32, " %3u", (unsigned int)NR2.width);
// break;
}
// case MENU_DEBUG_NR_GAIN_SMOOTH_THRESHOLD:
else if(select==MENU_DEBUG_NR_GAIN_SMOOTH_THRESHOLD)
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &NR2.power_threshold_int,
10,
100,
40,
5);
if(var_change) // did something change?
{
//nr_params.first_time = 1;
}
snprintf(options,32, " %3u", (unsigned int)NR2.power_threshold_int);
// break;
}
/*
case MENU_DEBUG_NR_VAD_DELAY: //
var_change = UiDriverMenuItemChangeInt16(var, mode, &nr_params.vad_delay,
0,
20,
2,
1
);
if(var_change)
{
}
snprintf(options, 32, " %2u",(unsigned int)nr_params.vad_delay);
break;
*/
// case MENU_DEBUG_CLONEOUT:
else if(select==MENU_DEBUG_CLONEOUT)
{
txt_ptr = " Do it!";
clr = White;
if(var>=1)
{
CatDriver_CloneOutStart();
txt_ptr = "Working";
var = 1;
clr = Green;
}
// break;
}
// case MENU_DEBUG_CLONEIN:
else if(select==MENU_DEBUG_CLONEIN)
{
txt_ptr = " Do it!";
clr = White;
if(var>=1)
{
CatDriver_CloneInStart();
txt_ptr = "Waiting";
var = 1;
clr = Green;
}
// break;
}
// case MENU_DEBUG_NEW_NB:
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.new_nb,0,options,&clr);
// break;//
//#if defined(STM32F7) || defined(STM32H7)
/* case MENU_DEBUG_NR_FFT_SIZE:
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &nr_params.fft_256_enable,0,options,&clr);
ts.NR_FFT_L = 128;
ts.NR_FFT_LOOP_NO = 2;
if(nr_params.fft_256_enable)
{
ts.NR_FFT_LOOP_NO = 1;
ts.NR_FFT_L = 256;
}
break;
case MENU_DEBUG_NR_DEC_ENABLE:
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.NR_decimation_enable,0,options,&clr);
break;
//#endif
// case MENU_DEBUG_NR_ENABLE:
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &nr_params.enable,0,options,&clr);
// break;
case MENU_DEBUG_NR_LONG_TONE_ENABLE:
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &nr_params.long_tone_enable,0,options,&clr);
if(var_change)
{
nr_params.long_tone_reset = true;
}
break;*/
/* case MENU_DEBUG_NR_VAD_TYPE:
var_change = UiDriverMenuItemChangeUInt8(var, mode, &NR2.VAD_type,
0,
2,
0,
1);
switch(NR2.VAD_type)
{
case 0:
txt_ptr = " Sohn";
break;
case 1:
txt_ptr = "Esch & Vary";
break;
case 2:
txt_ptr = " ZCR";
break;
}
break;
case MENU_DEBUG_NR_GAIN_SMOOTH_ENABLE:
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &nr_params.gain_smooth_enable,0,options,&clr);
break;*/
// case MENU_DEBUG_RTTY_ATC:
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.rtty_atc_enable,0,options,&clr);
// break;
// case MENU_CW_DECODER:
else if(select==MENU_CW_DECODER)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_decoder_enable,
0,
1,
0,
1);
if (var_change)
{
if (ts.dmod_mode == DEMOD_CW)
{
UiDriver_UpdateDemodSpecificDisplayAfterParamChange();
}
Board_RedLed(LED_STATE_OFF);
}
switch(ts.cw_decoder_enable)
{
case 0:
txt_ptr = "OFF";
break;
case 1:
txt_ptr = " ON";
break;
}
// break;
}
// case MENU_DEBUG_CW_OFFSET_SHIFT_KEEP_SIGNAL:
else if(select==MENU_DEBUG_CW_OFFSET_SHIFT_KEEP_SIGNAL)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.cw_offset_shift_keep_signal,0,options,&clr);
// break;
}
// case MENU_CW_DECODER_USE_3_GOERTZEL:
else if(select==MENU_CW_DECODER_USE_3_GOERTZEL)
{
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &cw_decoder_config.use_3_goertzels,0,options,&clr);
temp_var_bool = cw_decoder_config.use_3_goertzels;
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &temp_var_bool, 0, options, &clr);
cw_decoder_config.use_3_goertzels = temp_var_bool;
// break;
}
// case MENU_CW_DECODER_SHOW_CW_LED:
else if(select==MENU_CW_DECODER_SHOW_CW_LED)
{
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &cw_decoder_config.show_CW_LED,0,options,&clr);
temp_var_bool = cw_decoder_config.show_CW_LED;
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &temp_var_bool, 0, options, &clr);
cw_decoder_config.show_CW_LED = temp_var_bool;
if (cw_decoder_config.show_CW_LED == false)
{
Board_RedLed(LED_STATE_OFF);
}
// break;
}
// case MENU_CW_DECODER_SNAP_ENABLE:
else if(select==MENU_CW_DECODER_SNAP_ENABLE)
{
// var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &cw_decoder_config.snap_enable,0,options,&clr);
temp_var_bool = cw_decoder_config.snap_enable;
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &temp_var_bool, 0, options, &clr);
cw_decoder_config.snap_enable = temp_var_bool;
if (var_change)
{
if (ts.dmod_mode == DEMOD_CW)
{
UiDriver_UpdateDemodSpecificDisplayAfterParamChange();
}
if(!cw_decoder_config.snap_enable)
{
ts.expflags1 = ts.expflags1 | EXPFLAGS1_TUNE_HELPER_DEFENABLE;
}
else
{
ts.expflags1 = ts.expflags1 & ~EXPFLAGS1_TUNE_HELPER_DEFENABLE;
}
}
// break;
}
// case MENU_DIGITAL_MODE_SELECT:
else if(select==MENU_DIGITAL_MODE_SELECT)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.digital_mode,0,DigitalMode_Num_Modes-1,0,1);
if (var_change)
{
// TODO: Factor this out into a Ui function for (de-)activating Rtty mode
if (RadioManagement_IsApplicableDemodMode(DEMOD_DIGI))
{
UiDriver_SetDemodMode(DEMOD_DIGI);
}
}
snprintf(options,32," %s",digimodes[ts.digital_mode].label);
clr = digimodes[ts.digital_mode].enabled?White:Red;
// break;
}
// case CONFIG_BANDEF_SELECT:
else if(select==CONFIG_BANDEF_SELECT)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &bandinfo_idx,0,BAND_INFO_SET_NUM-1,0,1);
if (var_change)
{
bandInfo = bandInfos[bandinfo_idx].bands;
UiDriver_UpdateDisplayAfterParamChange();
}
snprintf(options,32," %s",bandInfos[bandinfo_idx].name);
// break;
}
// case CONFIG_CAT_PTT_RTS:
else if(select==CONFIG_CAT_PTT_RTS)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &ts.enable_ptt_rts,0,options,&clr);
// break;
}
// case MENU_DEBUG_OSC_SI5351_PLLRESET:
else if(select==MENU_DEBUG_OSC_SI5351_PLLRESET)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.debug_si5351a_pllreset,
0,
3,
0,
1);
switch(ts.debug_si5351a_pllreset)
{
case 0:
txt_ptr = " Always";
break;
case 1:
txt_ptr = " Divider";
break;
case 2:
txt_ptr = "IQ Divider";
break;
case 3:
txt_ptr = " Never";
break;
}
// break;
}
#ifdef USE_HMC1023
// case MENU_DEBUG_HMC1023_COARSE:
else if(select==MENU_DEBUG_HMC1023_COARSE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &hmc1023.coarse,0,8,0,1);
if (var_change)
{
hmc1023_set_coarse(hmc1023.coarse);
}
snprintf(options,32," %2d",hmc1023.coarse);
// break;
}
// case MENU_DEBUG_HMC1023_FINE:
else if(select==MENU_DEBUG_HMC1023_FINE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &hmc1023.fine,0,11,0,1);
if (var_change)
{
hmc1023_set_fine(hmc1023.fine);
}
snprintf(options,32," %2d",hmc1023.fine);
// break;
}
// case MENU_DEBUG_HMC1023_OPAMP:
else if(select==MENU_DEBUG_HMC1023_OPAMP)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &hmc1023.opamp,0,3,0,1);
if (var_change)
{
hmc1023_set_bias_opamp(hmc1023.opamp);
}
snprintf(options,32," %2d",hmc1023.opamp);
// break;
}
// case MENU_DEBUG_HMC1023_DRVR:
else if(select==MENU_DEBUG_HMC1023_DRVR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &hmc1023.drvr,0,3,0,1);
if (var_change)
{
hmc1023_set_bias_drvr(hmc1023.drvr);
}
snprintf(options,32," %2d",hmc1023.drvr);
// break;
}
// case MENU_DEBUG_HMC1023_GAIN:
else if(select==MENU_DEBUG_HMC1023_GAIN)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &hmc1023.gain,0,options,&clr);
if (var_change)
{
hmc1023_set_gain(hmc1023.gain);
}
// break;
}
// case MENU_DEBUG_HMC1023_BYPASS:
else if(select==MENU_DEBUG_HMC1023_BYPASS)
{
var_change = UiDriverMenuItemChangeEnableOnOffBool(var, mode, &hmc1023.bypass,0,options,&clr);
if (var_change)
{
hmc1023_set_bypass(hmc1023.bypass);
}
// break;
}
#endif
// case CONFIG_SMETER_ATTACK:
else if(select==CONFIG_SMETER_ATTACK)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &sm.config.alphaSplit.AttackAlpha, SMETER_ALPHA_MIN, SMETER_ALPHA_MAX, SMETER_ALPHA_ATTACK_DEFAULT,1);
snprintf(options,32," %d",sm.config.alphaSplit.AttackAlpha);
// break;
}
// case CONFIG_SMETER_DECAY:
else if(select==CONFIG_SMETER_DECAY)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &sm.config.alphaSplit.DecayAlpha, SMETER_ALPHA_MIN, SMETER_ALPHA_MAX, SMETER_ALPHA_DECAY_DEFAULT,1);
snprintf(options,32," %d",sm.config.alphaSplit.DecayAlpha);
// break;
}
// case CONFIG_VSWR_PROTECTION_THRESHOLD:
else if(select==CONFIG_VSWR_PROTECTION_THRESHOLD)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.debug_vswr_protection_threshold,
1,
10,
1,
1);
if (ts.debug_vswr_protection_threshold < 2)
{
txt_ptr = "OFF";
}
else
{
snprintf(options,32," %d",ts.debug_vswr_protection_threshold);
}
// break;
}
#ifdef USE_FREEDV
// case MENU_DEBUG_FREEDV_MODE:
else if(select==MENU_DEBUG_FREEDV_MODE)
{
temp_var_u8 = freedv_conf.mode;
var_change = UiDriverMenuItemChangeUInt8(var, mode, &temp_var_u8,
0,
freedv_modes_num-1,
0,
1);
if (var_change)
{
if (FreeDV_SetMode(temp_var_u8, false) == false)
{
clr = Red;
}
}
txt_ptr = freedv_modes[freedv_conf.mode].name;
// break;
}
// case MENU_DEBUG_FREEDV_SQL_THRESHOLD:
else if(select==MENU_DEBUG_FREEDV_SQL_THRESHOLD)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &freedv_conf.squelch_snr_thresh,
FDV_SQUELCH_OFF,
FDV_SQUELCH_MAX,
FDV_SQUELCH_DEFAULT,
1);
if (var_change)
{
FreeDV_Squelch_Update(&freedv_conf);
}
if (FreeDV_Is_Squelch_Enable(&freedv_conf))
{
snprintf(options,32," %ld",FreeDV_Get_Squelch_SNR(&freedv_conf));
}
else
{
txt_ptr = "OFF";
}
// break;
}
#endif
// case MENU_DEBUG_SMOOTH_DYN_TUNE:
else if(select==MENU_DEBUG_SMOOTH_DYN_TUNE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_SMOOTH_DYNAMIC_TUNE);
clr = White;
// break;
}
// case MENU_DEBUG_CAL_LO_TX_SUPR_0:
else if(select==MENU_DEBUG_CAL_LO_TX_SUPR_0)
{
// if ((!ts.lotx_dacs_present) || (ts.band_lo_tx_supr == 13))
if (!ts.lotx_dacs_present)
{
clr = Orange;
txt_ptr = "N/A";
// break;
}
if (ts.lotx_dacs_present) //(ts.txrx_mode == TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.cal_lo_tx_supr0[ts.band_lo_tx_supr],
MIN_LO_TX_SUPR_BALANCE,
MAX_LO_TX_SUPR_BALANCE,
2048,
1);
}
else // Orange if not in correct mode
{
*clr_ptr = Orange;
}
if (ts.cal_lo_tx_supr0[ts.band_lo_tx_supr] == 2048)
{
snprintf(options,32, " OFF");
}
else
{
snprintf(options,32, "%4d", ts.cal_lo_tx_supr0[ts.band_lo_tx_supr]);
}
if(var_change)
{
LO_TX_SUPR_DAC_WriteReg(0, ts.cal_lo_tx_supr0[ts.band_lo_tx_supr]); // Set the DAC0 voltage
}
// break;
}
// case MENU_DEBUG_CAL_LO_TX_SUPR_1:
else if(select==MENU_DEBUG_CAL_LO_TX_SUPR_1)
{
// if ((!ts.lotx_dacs_present) || (ts.band_lo_tx_supr == 13))
if (!ts.lotx_dacs_present)
{
clr = Orange;
txt_ptr = "N/A";
// break;
}
if (ts.lotx_dacs_present) //(ts.txrx_mode == TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.cal_lo_tx_supr1[ts.band_lo_tx_supr],
MIN_LO_TX_SUPR_BALANCE,
MAX_LO_TX_SUPR_BALANCE,
2048,
1);
}
else // Orange if not in correct mode
{
*clr_ptr = Orange;
}
if (ts.cal_lo_tx_supr1[ts.band_lo_tx_supr] == 2048)
{
snprintf(options,32, " OFF");
}
else
{
snprintf(options,32, "%4d", ts.cal_lo_tx_supr1[ts.band_lo_tx_supr]);
}
if(var_change)
{
LO_TX_SUPR_DAC_WriteReg(1, ts.cal_lo_tx_supr1[ts.band_lo_tx_supr]); // Set the DAC1 voltage
}
// break;
}
// case CONFIG_WIDE_SPEC_DEF:
else if(select==CONFIG_WIDE_SPEC_DEF)
{
if ((ts.txrx_mode != TRX_MODE_TX) && (ts.Layout->Size.x == 320)) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_WIDE_SPEC_DEF);
clr = White;
}
else
{
*clr_ptr = Orange;
}
// break;
}
// case MENU_NO_SHOW_BNDMEM:
else if(select==MENU_NO_SHOW_BNDMEM)
{
if (ts.txrx_mode != TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_NO_SHOW_BNDMEM);
clr = White;
}
else
{
*clr_ptr = Orange;
}
if(var_change)
{
if(ts.expflags1 & EXPFLAGS1_NO_SHOW_BNDMEM)
{
UiDriver_ClearMemoryLabel();
}
UiDriver_DisplayMemoryLabel();
}
// break;
}
// case CONFIG_BANDCH_JUMP_SWAP:
else if(select==CONFIG_BANDCH_JUMP_SWAP)
{
if (ts.txrx_mode != TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_BANDCH_JUMP_SWAP);
clr = White;
}
else
{
*clr_ptr = Orange;
}
// break;
}
#ifdef SDR_AMBER
// case MENU_INPUT_STATE:
else if(select==MENU_INPUT_STATE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.amber_input_state,
0,
3,
0,
1);
if (ts.amber_input_state == 0)
{
txt_ptr = " PRE";
}
else if(ts.amber_input_state == 1)
{
txt_ptr = "NoPRE";
}
else if(ts.amber_input_state == 2)
{
txt_ptr = "ATT12";
}
else if(ts.amber_input_state == 3)
{
txt_ptr = "ATT24";
}
if(var_change)
{
Board_Amber_InputStateSet(ts.amber_input_state);
}
// break;
}
#endif
// case MENU_BOX_COLOUR: // screen boxes colour
else if(select==MENU_BOX_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.box_colour,
0,
SPEC_MAX_COLOUR,
SPEC_BLUE,
1
);
if(var_change)
{
UiDriver_UpdateDisplayAfterParamChange();
}
UiMenu_MapColors(ts.box_colour,options,&clr);
// break;
}
// case MENU_TXTLINE_COLOUR: // ticker colour
else if(select==MENU_TXTLINE_COLOUR)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.txtline_colour,
0,
SPEC_MAX_COLOUR,
SPEC_YELLOW,
1
);
if(var_change)
{
UiDriver_UpdateDisplayAfterParamChange();
}
UiMenu_MapColors(ts.txtline_colour,options,&clr);
// break;
}
// case CONFIG_ENC123_REVERSE:
else if(select==CONFIG_ENC1_REVERSE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_ENC1_REVERSE);
clr = White;
// break;
}
else if(select==CONFIG_ENC2_REVERSE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_ENC2_REVERSE);
clr = White;
}
else if(select==CONFIG_ENC3_REVERSE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_ENC3_REVERSE);
clr = White;
}
// case CONFIG_ENC4_REVERSE:
else if(select==CONFIG_ENC4_REVERSE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_ENC4_REVERSE);
clr = White;
// break;
}
// case MENU_CW_BEACON_INTERVAL:
else if(select==MENU_CW_BEACON_INTERVAL)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.swbi,
BEACON_INTERVAL_1M,
BEACON_INTERVAL_15M,
1,
1);
if (ts.swbi == BEACON_INTERVAL_1M)
{
txt_ptr = " 1";
}
else if(ts.swbi == BEACON_INTERVAL_3M)
{
txt_ptr = " 3";
}
else if(ts.swbi == BEACON_INTERVAL_5M)
{
txt_ptr = " 5";
}
else if(ts.swbi == BEACON_INTERVAL_10M)
{
txt_ptr = "10";
}
else if(ts.swbi == BEACON_INTERVAL_15M)
{
txt_ptr = "15";
}
if (var_change)
{
if (ts.swbi == BEACON_INTERVAL_1M)
{
ts.cw_beacon_interval = 6000;
}
else if(ts.swbi == BEACON_INTERVAL_3M)
{
ts.cw_beacon_interval = 18000;
}
else if(ts.swbi == BEACON_INTERVAL_5M)
{
ts.cw_beacon_interval = 30000;
}
else if(ts.swbi == BEACON_INTERVAL_10M)
{
ts.cw_beacon_interval = 60000;
}
else if(ts.swbi == BEACON_INTERVAL_15M)
{
ts.cw_beacon_interval = 90000;
}
}
// break;
}
// case MENU_CW_MACRO_INTERVAL:
else if(select==MENU_CW_MACRO_INTERVAL)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.keyer_cycled_interval,
1,
5,
3,
1
);
if (ts.keyer_cycled_interval == 1)
{
txt_ptr = "1";
}
else if(ts.keyer_cycled_interval == 2)
{
txt_ptr = "2";
}
else if(ts.keyer_cycled_interval == 3)
{
txt_ptr = "3";
}
else if(ts.keyer_cycled_interval == 4)
{
txt_ptr = "4";
}
else if(ts.keyer_cycled_interval == 5)
{
txt_ptr = "5";
}
// break;
}
// case MENU_DEBUG_SHOW_GREETING:
else if(select==MENU_DEBUG_SHOW_GREETING)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_SHOW_GREETING);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ *clr_ptr = Orange; }
// break;
}
// case MENU_PEAK_IND_TUNE:
else if(select==MENU_PEAK_IND_TUNE)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.peak_ind_tune,
0,
24,
0,
1);
clr = White;
if(ts.peak_ind_tune == 0)
{
txt_ptr = " OFF";;
}
else
{
// snprintf(options,32, " %3.2f", ts.peak_ind_tune * 0.25);
snprintf(options,32, " %4u", ts.peak_ind_tune * 250);
}
// break;
}
// case MENU_CLEAR_PAN_ON_TX:
else if(select==MENU_CLEAR_PAN_ON_TX)
{
if (ts.txrx_mode != TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CLEAR_PAN_ON_TX);
clr = White;
}
else
{
*clr_ptr = Orange;
}
// break;
}
// case MENU_SMETER_AM_NOT_LO:
else if(select==MENU_SMETER_AM_NOT_LO)
{
if (ts.txrx_mode != TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_SMETER_AM_NOT_LO);
clr = White;
}
else
{
*clr_ptr = Orange;
}
// break;
}
// case MENU_CW_FAST_MACRO_1_2:
else if(select==MENU_CW_FAST_MACRO_1_2)
{
if (ts.txrx_mode != TRX_MODE_TX) // only allow adjustment if in right mode
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_FAST_MACRO_1_2);
clr = White;
}
else
{
*clr_ptr = Orange;
}
// break;
}
// case MENU_DEBUG_CLEAN_TX_CW_RTTY_BPSK:
else if(select==MENU_DEBUG_CLEAN_TX_CW_RTTY_BPSK)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CLEAR_TX_CW_RTTY_BPSK);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ *clr_ptr = Orange; }
// break;
}
// case MENU_CW_SMOOTH:
else if(select==MENU_CW_SMOOTH)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cw_smooth,
0,
3,
1,
1);
if (ts.cw_smooth == 0)
{
txt_ptr = " 3";
}
else if(ts.cw_smooth == 1)
{
txt_ptr = " 5";
}
else if(ts.cw_smooth == 2)
{
txt_ptr = " 8";
}
else if(ts.cw_smooth == 3)
{
txt_ptr = "10";
}
if (var_change)
{
CW_Smooth_Settings();
}
// break;
}
// case MENU_DEBUG_CB_27MC_TX_ENABLE:
else if(select==MENU_DEBUG_CB_27MC_TX_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CB_27MC_TX_ENABLE);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ clr = Orange; }
// break;
}
// case MENU_DEBUG_CB_26MC_TX_ENABLE:
else if(select==MENU_DEBUG_CB_26MC_TX_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CB_26MC_TX_ENABLE);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ clr = Orange; }
// break;
}
// case MENU_DEBUG_CB_12W_SSB_TX_ENABLE:
else if(select==MENU_DEBUG_CB_12W_SSB_TX_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CB_12W_SSB_TX_ENABLE);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ clr = Orange; }
// break;
}
// case MENU_DEBUG_CB_10W_TX_ENABLE:
else if(select==MENU_DEBUG_CB_10W_TX_ENABLE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags1,0,options,&clr, EXPFLAGS1_CB_10W_TX_ENABLE);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ clr = Orange; }
// break;
}
// case MENU_DEBUG_MEM_BW_MOD_BAND:
else if(select==MENU_DEBUG_MEM_BW_MOD_BAND)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_TEMP_MEM_BW_MOD_BAND);
if (ts.txrx_mode == TRX_MODE_RX) // only allow adjustment if in right mode
{ clr = White; }
else
{ clr = Orange; }
// break;
}
#ifdef SDR_AMBER
else if(select==MENU_DEBUG_ILLUM_BUTT)
{
if(!ts.amber_io8_present)
{
txt_ptr = "N/A";
clr = Orange;
}
else
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_ILLUM_BUTT);
if (var_change)
{
Board_IllumButt();
}
clr = White;
}
}
else if(select==MENU_DEBUG_BPF_OPTION)
{
if(!ts.amber_io8_present)
{
txt_ptr = "N/A";
clr = Orange;
}
else
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_3_ADD_BPF);
clr = White;
}
}
else if(select==MENU_DEBUG_XVTR_OFF_PA)
{
if(!ts.amber_io8_present)
{
txt_ptr = "N/A";
clr = Orange;
}
else if (ts.txrx_mode == TRX_MODE_TX) // only allow adjustment if in right mode
{
clr = Orange;
}
else
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_XVTR_OFF_PA);
clr = White;
}
if (var_change)
{
if ((ts.expflags2 & EXPFLAGS2_XVTR_OFF_PA) && (ts.xverter_mode & 0xf)) // Option is ON & XVTR mode is ON
{
ts.amber_io8_state = ts.amber_io8_state & ~128; // reset bit
}
else
{
ts.amber_io8_state = ts.amber_io8_state | 128; // set bit
}
Board_AmberIOx8_Write(ts.amber_io8_state);
}
}
else if(select==MENU_DEBUG_BANDCODE)
{
if(!ts.amber_io8_present)
{
txt_ptr = "N/A";
}
else
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.amber_pa_bandcode_mode,
0,
3,
1,
1);
if (ts.amber_pa_bandcode_mode == 0) {txt_ptr = " OFF";}
else if(ts.amber_pa_bandcode_mode == 1) {txt_ptr = " 4LPF direct";}
else if(ts.amber_pa_bandcode_mode == 2) {txt_ptr = " 4LPF code";}
else if(ts.amber_pa_bandcode_mode == 3) {txt_ptr = "Yaesu FT-891";}
if (var_change)
{
RadioManagement_Set_PA_Bandcode(ts.tune_freq);
}
}
}
else if(select==MENU_DEBUG_ALT_PWR_CTRL)
{
if(!ts.amber_dac_pwr_tx_present)
{
clr = Orange;
txt_ptr = "N/A";
}
else
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_ALT_PWR_CTRL);
clr = White;
if(ts.expflags2 & EXPFLAGS2_ALT_PWR_CTRL)
{
// ts.expflags2 = ts.expflags2 | EXPFLAGS2_ALT_PWR_CTRL;
txt_ptr = " ON";
// UiDriver_RefreshPowerLevel(ts.band_effective, ts.power_level);
}
else
{
txt_ptr = "OFF";
ts.amber_dac_pwr_tx_state = DAC_5W;
ALT_RWP_CTRL_DAC_WriteReg(DAC_5W); // Set the DAC voltage
// UiDriver_RefreshPowerLevel(ts.band_effective, ts.power_level);
}
}
}
else if(select==MENU_DEBUG_ALT_PWR_CTRL_VOL)
{
if (!ts.amber_dac_pwr_tx_present)
{
clr = Orange;
txt_ptr = "N/A";
}
else
{
var_change = UiDriverMenuItemChangeInt16(var, mode, &ts.amber_dac_pwr_tx_state,
0,
4096,
2048,
10);
clr = White;
if (ts.amber_dac_pwr_tx_state == 2048)
{
snprintf(options,32, "HALF");
}
else
{
snprintf(options,32, "%4d", ts.amber_dac_pwr_tx_state);
}
if(var_change)
{
ALT_RWP_CTRL_DAC_WriteReg(ts.amber_dac_pwr_tx_state); // Set the DAC voltage
}
}
}
#endif
else if(select==MENU_DEBUG_DISABLE_TP) // Disable touchscreen actions
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_DISABLE_TP);
if (ts.tp->present) // only allow adjustment if touchscreen are present
{ clr = White; }
else
{ *clr_ptr = Orange; }
if (var_change)
{
if(ts.expflags2 & EXPFLAGS2_DISABLE_TP)
{
ts.disabled_tp = true;
}
else
{
ts.disabled_tp = false;
}
}
}
else if(select==MENU_DEBUG_FMENUS_SEL)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_FMENUS_SELECT);
clr = White;
if(ts.expflags2 & EXPFLAGS2_FMENUS_SELECT)
{
txt_ptr = " Menu";
}
else
{
txt_ptr = "Carousel";
}
}
else if(select==MENU_DEBUG_IMPROV_IQ_ADJ)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_IMPROV_IQ_ADJ);
}
else if(select==MENU_DEBUG_F6_IND_SEL)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_AMBER_4INCH_F6_IND);
clr = White;
if(ts.expflags2 & EXPFLAGS2_AMBER_4INCH_F6_IND)
{
txt_ptr = " AT";
}
else
{
txt_ptr = "Soft";
}
if (var_change)
{
UiDriver_CreateFunctionButtons(false);
}
}
else if(select==MENU_DEBUG_F7_IND_SEL)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_AMBER_4INCH_F7_IND);
clr = White;
if(ts.expflags2 & EXPFLAGS2_AMBER_4INCH_F7_IND)
{
txt_ptr = "POWER";
}
else
{
txt_ptr = " AT";
}
if (var_change)
{
UiDriver_CreateFunctionButtons(false);
}
}
else if(select==CONFIG_TX_REVERB_GAIN)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.reverb_gain,
0,
100,
0,
1
);
if(var_change)
{
AudioReverb_SetWet();
}
snprintf(options, 32, " %u%%", ts.reverb_gain);
if(ts.reverb_gain == 0)
{
txt_ptr = " OFF";
}
}
else if(select==CONFIG_TX_REVERB_DELAY)
{
var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.reverb_delay,
25,
100,
25,
1
);
if(var_change)
{
AudioReverb_SetDelay();
}
snprintf(options, 32, " %u%%", ts.reverb_delay);
}
else if(select==CONFIG_TX_EQ0 || select==CONFIG_TX_EQ1 || select==CONFIG_TX_EQ2 || select==CONFIG_TX_EQ3 || select==CONFIG_TX_EQ4)
{
uint8_t n = 0;
switch (select) {
case CONFIG_TX_EQ0:
n = 0;
break;
case CONFIG_TX_EQ1:
n = 1;
break;
case CONFIG_TX_EQ2:
n = 2;
break;
case CONFIG_TX_EQ3:
n = 3;
break;
case CONFIG_TX_EQ4:
n = 4;
break;
};
var_change = UiDriverMenuItemChangeInt(var, mode, &ts.dsp.tx_eq_gain[n],
MIN_TX_EQ,
MAX_TX_EQ,
0,
1
);
if(var_change)
{
AudioDriver_SetProcessingChain(ts.dmod_mode, false);
}
snprintf(options, 32, " %ddb", ts.dsp.tx_eq_gain[n]);
}
else if(select==MENU_DEBUG_BEEP_GEN)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_BEEP_GEN);
clr = White;
if(ts.expflags2 & EXPFLAGS2_BEEP_GEN)
{
txt_ptr = " ON";
}
else
{
txt_ptr = "OFF";
}
}
else if(select==MENU_DEBUG_BAND_OFF_160M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_160M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_160M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_80M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_80M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_80M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_60M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_60M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_60M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_40M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_40M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_40M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_30M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_30M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_30M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_20M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_20M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_20M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_17M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_17M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_17M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_15M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_15M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_15M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_12M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_12M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_12M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_10M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_10M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_10M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_BAND_OFF_6M)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_BAND_OFF_6M);
clr = White;
if(ts.expflags3 & EXPFLAGS3_BAND_OFF_6M)
{ txt_ptr = "YES"; }
else
{ txt_ptr = " NO"; }
}
else if(select==MENU_DEBUG_REDUCE_POWER_ON_LOW_BANDS_MORE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags3,0,options,&clr, EXPFLAGS3_LOW_BAND_BIAS_REDUCE_MORE);
}
else if(select==MENU_DEBUG_SHOW_SWR_ONLY_TUNE)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_SHOW_SWR_ONLY_TUNE);
}
else if(select==MENU_DEBUG_CONTEST)
{
var_change = UiDriverMenuItemChangeEnableOnOffFlag(var, mode, &ts.expflags2,0,options,&clr, EXPFLAGS2_CONTEST_MODE_F3_ON);
}
// else if(select==MENU_DEBUG_CONTEST_COLOUR)
// {
// var_change = UiDriverMenuItemChangeUInt8(var, mode, &ts.cq_colour,
// 0,
// SPEC_MAX_COLOUR,
// SPEC_BLUE3,
// 1
// );
// UiMenu_MapColors(ts.cq_colour,options,&clr);
// }
// default: // Move to this location if we get to the bottom of the table!
else
{
txt_ptr = "ERROR!";
// break;
}
*txt_ptr_ptr = txt_ptr;
*clr_ptr = clr;
}