Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5e34c4be9 | ||
|
|
b0a01cd8cf | ||
|
|
21535c9ca0 | ||
|
|
8c9bdaacbc | ||
|
|
388c3dadf1 | ||
|
|
72fc4bf52f | ||
|
|
def555678d | ||
|
|
16e79bee7d | ||
|
|
9777b5df8b | ||
|
|
c057f8a097 | ||
|
|
034139d7d5 | ||
|
|
03a51525b6 | ||
|
|
f074114d13 | ||
|
|
8a60535f9d | ||
|
|
c2be853ef1 | ||
|
|
9f1e6ab91f | ||
|
|
25334823e5 | ||
|
|
2796973ad3 | ||
|
|
2344478301 | ||
|
|
61527d1281 |
44
Makefile
44
Makefile
@@ -36,6 +36,7 @@ ENABLE_AUDIO_BAR := 1
|
|||||||
ENABLE_COPY_CHAN_TO_VFO := 1
|
ENABLE_COPY_CHAN_TO_VFO := 1
|
||||||
ENABLE_SPECTRUM := 1
|
ENABLE_SPECTRUM := 1
|
||||||
ENABLE_REDUCE_LOW_MID_TX_POWER:= 0
|
ENABLE_REDUCE_LOW_MID_TX_POWER:= 0
|
||||||
|
ENABLE_BYP_RAW_DEMODULATORS := 0
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
@@ -320,6 +321,9 @@ endif
|
|||||||
ifeq ($(ENABLE_REDUCE_LOW_MID_TX_POWER),1)
|
ifeq ($(ENABLE_REDUCE_LOW_MID_TX_POWER),1)
|
||||||
CFLAGS += -DENABLE_REDUCE_LOW_MID_TX_POWER
|
CFLAGS += -DENABLE_REDUCE_LOW_MID_TX_POWER
|
||||||
endif
|
endif
|
||||||
|
ifeq ($(ENABLE_BYP_RAW_DEMODULATORS),1)
|
||||||
|
CFLAGS += -DENABLE_BYP_RAW_DEMODULATORS
|
||||||
|
endif
|
||||||
|
|
||||||
LDFLAGS =
|
LDFLAGS =
|
||||||
ifeq ($(ENABLE_CLANG),0)
|
ifeq ($(ENABLE_CLANG),0)
|
||||||
@@ -352,10 +356,44 @@ LIBS =
|
|||||||
|
|
||||||
DEPS = $(OBJS:.o=.d)
|
DEPS = $(OBJS:.o=.d)
|
||||||
|
|
||||||
|
ifdef OS
|
||||||
|
RM = del /Q
|
||||||
|
FixPath = $(subst /,\,$1)
|
||||||
|
WHERE = where
|
||||||
|
else
|
||||||
|
ifeq ($(shell uname), Linux)
|
||||||
|
RM = rm -f
|
||||||
|
FixPath = $1
|
||||||
|
WHERE = which
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq (, $(shell $(WHERE) python))
|
||||||
|
MY_PYTHON := python
|
||||||
|
else ifneq (, $(shell $(WHERE) python3))
|
||||||
|
MY_PYTHON := python3
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifdef MY_PYTHON
|
||||||
|
HAS_CRCMOD := $(shell $(MY_PYTHON) -c "import crcmod" 2>&1)
|
||||||
|
endif
|
||||||
|
|
||||||
all: $(TARGET)
|
all: $(TARGET)
|
||||||
$(OBJCOPY) -O binary $< $<.bin
|
$(OBJCOPY) -O binary $< $<.bin
|
||||||
-python fw-pack.py $<.bin $(GIT_HASH) $<.packed.bin
|
|
||||||
-python3 fw-pack.py $<.bin $(GIT_HASH) $<.packed.bin
|
ifndef MY_PYTHON
|
||||||
|
$(info )
|
||||||
|
$(info !!!!!!!! PYTHON NOT FOUND, *.PACKED.BIN WON'T BE BUILT)
|
||||||
|
$(info )
|
||||||
|
else ifneq (,$(HAS_CRCMOD))
|
||||||
|
$(info )
|
||||||
|
$(info !!!!!!!! CRCMOD NOT INSTALLED, *.PACKED.BIN WON'T BE BUILT)
|
||||||
|
$(info !!!!!!!! run: pip install crcmod)
|
||||||
|
$(info )
|
||||||
|
else
|
||||||
|
-$(MY_PYTHON) fw-pack.py $<.bin $(GIT_HASH) $<.packed.bin
|
||||||
|
endif
|
||||||
|
|
||||||
$(SIZE) $<
|
$(SIZE) $<
|
||||||
|
|
||||||
debug:
|
debug:
|
||||||
@@ -382,4 +420,4 @@ bsp/dp32g030/%.h: hardware/dp32g030/%.def
|
|||||||
-include $(DEPS)
|
-include $(DEPS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(TARGET).bin $(TARGET).packed.bin $(TARGET) $(OBJS) $(DEPS)
|
$(RM) $(call FixPath, $(TARGET).bin $(TARGET).packed.bin $(TARGET) $(OBJS) $(DEPS))
|
||||||
|
|||||||
24
README.md
24
README.md
@@ -1,22 +1,22 @@
|
|||||||
# Main features:
|
# Main features:
|
||||||
- many of OneOfEleven mods, including AM fix
|
- many of OneOfEleven mods, including AM fix
|
||||||
- fagci spectrum analyzer (**F+5** to turn on)
|
- fagci spectrum analyzer (**F+5** to turn on)
|
||||||
- some other smaller mods introduced by me
|
- some other mods introduced by me
|
||||||
|
|
||||||
Go to [Wiki](https://github.com/egzumer/uv-k5-firmware-custom/wiki) to learn more.
|
# Manual
|
||||||
|
|
||||||
|
* [Radio operation](https://github.com/egzumer/uv-k5-firmware-custom/wiki/Radio-operation)
|
||||||
|
|
||||||
|
* [Menu](https://github.com/egzumer/uv-k5-firmware-custom/wiki/Menu)
|
||||||
|
|
||||||
|
* [Button functions](https://github.com/egzumer/uv-k5-firmware-custom/wiki/Button-functions)
|
||||||
|
|
||||||
|
* [Spectrum analyzer](https://github.com/egzumer/uv-k5-firmware-custom/wiki/Spectrum-analyzer)
|
||||||
|
|
||||||
|
* [Flashing the firmware](https://github.com/egzumer/uv-k5-firmware-custom/wiki/Flashing-the-firmware)
|
||||||
|
|
||||||
<img src="images/main.jpg" width=300 /><img src="images/spectrum.jpg" width=300 /><img src="images/audiobar.jpg" width=300 /><img src="images/rssibar.jpg" width=300 />
|
<img src="images/main.jpg" width=300 /><img src="images/spectrum.jpg" width=300 /><img src="images/audiobar.jpg" width=300 /><img src="images/rssibar.jpg" width=300 />
|
||||||
|
|
||||||
❗❗❗You can now calibrate the battery voltage reading in the radio menu.
|
|
||||||
|
|
||||||
<img src="images/batcal.jpg" width=300 />
|
|
||||||
|
|
||||||
To enter the calibration:
|
|
||||||
|
|
||||||
1. turn the radio on while holding PTT and the first side button
|
|
||||||
2. go to BATCAL option and adjust the voltage with UP/DOWN buttons
|
|
||||||
3. confirm the setting, calibration will be saved to EEPROM
|
|
||||||
|
|
||||||
|
|
||||||
# Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware
|
# Open reimplementation of the Quan Sheng UV-K5 v2.1.27 firmware
|
||||||
|
|
||||||
|
|||||||
12
app/action.c
12
app/action.c
@@ -270,6 +270,7 @@ void ACTION_Scan(bool bRestart)
|
|||||||
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
|
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
|
||||||
static void ACTION_AlarmOr1750(const bool b1750)
|
static void ACTION_AlarmOr1750(const bool b1750)
|
||||||
{
|
{
|
||||||
|
(void)b1750;
|
||||||
gInputBoxIndex = 0;
|
gInputBoxIndex = 0;
|
||||||
|
|
||||||
#if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
|
#if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
|
||||||
@@ -323,6 +324,14 @@ void ACTION_Scan(bool bRestart)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void ACTION_SwitchDemodul(void)
|
||||||
|
{
|
||||||
|
gTxVfo->Modulation++;
|
||||||
|
if(gTxVfo->Modulation == MODULATION_UKNOWN)
|
||||||
|
gTxVfo->Modulation = MODULATION_FM;
|
||||||
|
gRequestSaveChannel = 1;
|
||||||
|
}
|
||||||
|
|
||||||
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||||
{
|
{
|
||||||
if (gScreenToDisplay == DISPLAY_MAIN && gDTMF_InputMode) // entering DTMF code
|
if (gScreenToDisplay == DISPLAY_MAIN && gDTMF_InputMode) // entering DTMF code
|
||||||
@@ -438,5 +447,8 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
case ACTION_OPT_VFO_MR:
|
case ACTION_OPT_VFO_MR:
|
||||||
COMMON_SwitchVFOMode();
|
COMMON_SwitchVFOMode();
|
||||||
break;
|
break;
|
||||||
|
case ACTION_OPT_SWITCH_DEMODUL:
|
||||||
|
ACTION_SwitchDemodul();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ void ACTION_Scan(bool bRestart);
|
|||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
void ACTION_FM(void);
|
void ACTION_FM(void);
|
||||||
#endif
|
#endif
|
||||||
|
void ACTION_SwitchDemodul(void);
|
||||||
|
|
||||||
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
|
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
|
||||||
|
|
||||||
|
|||||||
85
app/app.c
85
app/app.c
@@ -71,7 +71,7 @@ static void UpdateRSSI(const int vfo)
|
|||||||
|
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
// add RF gain adjust compensation
|
// add RF gain adjust compensation
|
||||||
if (gEeprom.VfoInfo[vfo].AM_mode && gSetting_AM_fix)
|
if (gEeprom.VfoInfo[vfo].Modulation == MODULATION_AM && gSetting_AM_fix)
|
||||||
rssi -= rssi_gain_diff[vfo];
|
rssi -= rssi_gain_diff[vfo];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -526,7 +526,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
|
|||||||
const uint8_t orig_pga = 6; // -3dB
|
const uint8_t orig_pga = 6; // -3dB
|
||||||
|
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
if (gRxVfo->AM_mode && gSetting_AM_fix) { // AM RX mode
|
if (gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix) { // AM RX mode
|
||||||
if (reset_am_fix)
|
if (reset_am_fix)
|
||||||
AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency
|
AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency
|
||||||
AM_fix_10ms(chan);
|
AM_fix_10ms(chan);
|
||||||
@@ -540,10 +540,11 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AF gain - original QS values
|
// AF gain - original QS values
|
||||||
if (gRxVfo->AM_mode){
|
// if (gRxVfo->Modulation != MODULATION_FM){
|
||||||
BK4819_WriteRegister(BK4819_REG_48, 0xB3A8);
|
// BK4819_WriteRegister(BK4819_REG_48, 0xB3A8);
|
||||||
}
|
// }
|
||||||
else {
|
// else
|
||||||
|
{
|
||||||
BK4819_WriteRegister(BK4819_REG_48,
|
BK4819_WriteRegister(BK4819_REG_48,
|
||||||
(11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference
|
(11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference
|
||||||
( 0u << 10) | // AF Rx Gain-1
|
( 0u << 10) | // AF Rx Gain-1
|
||||||
@@ -554,7 +555,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
|
|||||||
#ifdef ENABLE_VOICE
|
#ifdef ENABLE_VOICE
|
||||||
if (gVoiceWriteIndex == 0) // AM/FM RX mode will be set when the voice has finished
|
if (gVoiceWriteIndex == 0) // AM/FM RX mode will be set when the voice has finished
|
||||||
#endif
|
#endif
|
||||||
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); // no need, set it now
|
RADIO_SetModulation(gRxVfo->Modulation); // no need, set it now
|
||||||
|
|
||||||
FUNCTION_Select(Function);
|
FUNCTION_Select(Function);
|
||||||
|
|
||||||
@@ -1209,8 +1210,8 @@ void APP_TimeSlice10ms(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
// if (gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix)
|
// if (gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation != MODULATION_FM && gSetting_AM_fix)
|
||||||
if (gRxVfo->AM_mode && gSetting_AM_fix)
|
if (gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix)
|
||||||
AM_fix_10ms(gEeprom.RX_VFO);
|
AM_fix_10ms(gEeprom.RX_VFO);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1723,57 +1724,7 @@ void APP_TimeSlice500ms(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (gLowBattery)
|
BATTERY_TimeSlice500ms();
|
||||||
{
|
|
||||||
gLowBatteryBlink = ++gLowBatteryCountdown & 1;
|
|
||||||
|
|
||||||
UI_DisplayBattery(0, gLowBatteryBlink);
|
|
||||||
|
|
||||||
if (gCurrentFunction != FUNCTION_TRANSMIT)
|
|
||||||
{ // not transmitting
|
|
||||||
|
|
||||||
if (gLowBatteryCountdown < 30)
|
|
||||||
{
|
|
||||||
if (gLowBatteryCountdown == 29 && !gChargingWithTypeC)
|
|
||||||
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gLowBatteryCountdown = 0;
|
|
||||||
|
|
||||||
if (!gChargingWithTypeC)
|
|
||||||
{ // not on charge
|
|
||||||
|
|
||||||
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
|
|
||||||
|
|
||||||
#ifdef ENABLE_VOICE
|
|
||||||
AUDIO_SetVoiceID(0, VOICE_ID_LOW_VOLTAGE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (gBatteryDisplayLevel == 0)
|
|
||||||
{
|
|
||||||
#ifdef ENABLE_VOICE
|
|
||||||
AUDIO_PlaySingleVoice(true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gReducedService = true;
|
|
||||||
|
|
||||||
//if (gCurrentFunction != FUNCTION_POWER_SAVE)
|
|
||||||
FUNCTION_Select(FUNCTION_POWER_SAVE);
|
|
||||||
|
|
||||||
ST7565_HardwareReset();
|
|
||||||
|
|
||||||
if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1))
|
|
||||||
BACKLIGHT_TurnOff(); // turn the backlight off
|
|
||||||
}
|
|
||||||
#ifdef ENABLE_VOICE
|
|
||||||
else
|
|
||||||
AUDIO_PlaySingleVoice(false);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gScreenToDisplay == DISPLAY_SCANNER && gScannerEditState == 0 && gScanCssState < SCAN_CSS_STATE_FOUND)
|
if (gScreenToDisplay == DISPLAY_SCANNER && gScannerEditState == 0 && gScanCssState < SCAN_CSS_STATE_FOUND)
|
||||||
{
|
{
|
||||||
@@ -1956,8 +1907,18 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gEeprom.KEY_LOCK && gCurrentFunction != FUNCTION_TRANSMIT && Key != KEY_PTT)
|
bool lowBatPopup = gLowBattery && !gLowBatteryConfirmed && gScreenToDisplay == DISPLAY_MAIN;
|
||||||
{ // keyboard is locked
|
|
||||||
|
if ((gEeprom.KEY_LOCK || lowBatPopup) && gCurrentFunction != FUNCTION_TRANSMIT && Key != KEY_PTT)
|
||||||
|
{ // keyboard is locked or low battery popup
|
||||||
|
|
||||||
|
// close low battery popup
|
||||||
|
if(Key == KEY_EXIT && bKeyPressed && lowBatPopup) {
|
||||||
|
gLowBatteryConfirmed = true;
|
||||||
|
gUpdateDisplay = true;
|
||||||
|
AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Key == KEY_F)
|
if (Key == KEY_F)
|
||||||
{ // function/key-lock key
|
{ // function/key-lock key
|
||||||
|
|||||||
30
app/menu.c
30
app/menu.c
@@ -109,7 +109,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
|
|||||||
|
|
||||||
case MENU_STEP:
|
case MENU_STEP:
|
||||||
*pMin = 0;
|
*pMin = 0;
|
||||||
*pMax = ARRAY_SIZE(StepFrequencyTable) - 1;
|
*pMax = ARRAY_SIZE(gStepFrequencyTable) - 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_ABR:
|
case MENU_ABR:
|
||||||
@@ -232,7 +232,6 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
|
|||||||
case MENU_D_ST:
|
case MENU_D_ST:
|
||||||
case MENU_D_DCD:
|
case MENU_D_DCD:
|
||||||
case MENU_D_LIVE_DEC:
|
case MENU_D_LIVE_DEC:
|
||||||
case MENU_AM:
|
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
case MENU_NOAA_S:
|
case MENU_NOAA_S:
|
||||||
#endif
|
#endif
|
||||||
@@ -246,6 +245,11 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
|
|||||||
*pMax = ARRAY_SIZE(gSubMenu_OFF_ON) - 1;
|
*pMax = ARRAY_SIZE(gSubMenu_OFF_ON) - 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MENU_AM:
|
||||||
|
*pMin = 0;
|
||||||
|
*pMax = ARRAY_SIZE(gModulationStr) - 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case MENU_SCR:
|
case MENU_SCR:
|
||||||
*pMin = 0;
|
*pMin = 0;
|
||||||
*pMax = ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1;
|
*pMax = ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1;
|
||||||
@@ -381,7 +385,7 @@ void MENU_AcceptSetting(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_STEP:
|
case MENU_STEP:
|
||||||
gTxVfo->STEP_SETTING = gSubMenuSelection;
|
gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection);
|
||||||
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE))
|
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE))
|
||||||
{
|
{
|
||||||
gRequestSaveChannel = 1;
|
gRequestSaveChannel = 1;
|
||||||
@@ -702,7 +706,7 @@ void MENU_AcceptSetting(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_AM:
|
case MENU_AM:
|
||||||
gTxVfo->AM_mode = gSubMenuSelection;
|
gTxVfo->Modulation = gSubMenuSelection;
|
||||||
gRequestSaveChannel = 1;
|
gRequestSaveChannel = 1;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -778,12 +782,12 @@ void MENU_AcceptSetting(void)
|
|||||||
|
|
||||||
case MENU_BATCAL:
|
case MENU_BATCAL:
|
||||||
{ // voltages are averages between discharge curves of 1600 and 2200 mAh
|
{ // voltages are averages between discharge curves of 1600 and 2200 mAh
|
||||||
gBatteryCalibration[0] = (520ul * gSubMenuSelection) / 760; // 5.20V empty, blinking above this value, reduced functionality below
|
// gBatteryCalibration[0] = (520ul * gSubMenuSelection) / 760; // 5.20V empty, blinking above this value, reduced functionality below
|
||||||
gBatteryCalibration[1] = (689ul * gSubMenuSelection) / 760; // 6.89V, ~5%, 1 bars above this value
|
// gBatteryCalibration[1] = (689ul * gSubMenuSelection) / 760; // 6.89V, ~5%, 1 bars above this value
|
||||||
gBatteryCalibration[2] = (724ul * gSubMenuSelection) / 760; // 7.24V, ~17%, 2 bars above this value
|
// gBatteryCalibration[2] = (724ul * gSubMenuSelection) / 760; // 7.24V, ~17%, 2 bars above this value
|
||||||
gBatteryCalibration[3] = gSubMenuSelection; // 7.6V, ~29%, 3 bars above this value
|
gBatteryCalibration[3] = gSubMenuSelection; // 7.6V, ~29%, 3 bars above this value
|
||||||
gBatteryCalibration[4] = (771ul * gSubMenuSelection) / 760; // 7.71V, ~65%, 4 bars above this value
|
// gBatteryCalibration[4] = (771ul * gSubMenuSelection) / 760; // 7.71V, ~65%, 4 bars above this value
|
||||||
gBatteryCalibration[5] = 2300;
|
// gBatteryCalibration[5] = 2300;
|
||||||
SETTINGS_SaveBatteryCalibration(gBatteryCalibration);
|
SETTINGS_SaveBatteryCalibration(gBatteryCalibration);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -878,7 +882,7 @@ void MENU_ShowCurrentSetting(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_STEP:
|
case MENU_STEP:
|
||||||
gSubMenuSelection = gTxVfo->STEP_SETTING;
|
gSubMenuSelection = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_TXP:
|
case MENU_TXP:
|
||||||
@@ -1112,7 +1116,7 @@ void MENU_ShowCurrentSetting(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_AM:
|
case MENU_AM:
|
||||||
gSubMenuSelection = gTxVfo->AM_mode;
|
gSubMenuSelection = gTxVfo->Modulation;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
@@ -1603,9 +1607,9 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
|
|||||||
RADIO_SelectVfos();
|
RADIO_SelectVfos();
|
||||||
|
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->AM_mode == 0)
|
if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->Modulation == MODULATION_FM)
|
||||||
#else
|
#else
|
||||||
if (gRxVfo->AM_mode == 0)
|
if (gRxVfo->Modulation == MODULATION_FM)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (GetCurrentMenuId() == MENU_R_CTCS || GetCurrentMenuId() == MENU_R_DCS)
|
if (GetCurrentMenuId() == MENU_R_CTCS || GetCurrentMenuId() == MENU_R_DCS)
|
||||||
|
|||||||
@@ -49,7 +49,6 @@ ScanInfo scanInfo;
|
|||||||
KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0};
|
KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0};
|
||||||
|
|
||||||
const char *bwOptions[] = {" 25k", "12.5k", "6.25k"};
|
const char *bwOptions[] = {" 25k", "12.5k", "6.25k"};
|
||||||
const char *modulationTypeOptions[] = {" FM", " AM", "USB"};
|
|
||||||
const uint8_t modulationTypeTuneSteps[] = {100, 50, 10};
|
const uint8_t modulationTypeTuneSteps[] = {100, 50, 10};
|
||||||
const uint8_t modTypeReg47Values[] = {1, 7, 5};
|
const uint8_t modTypeReg47Values[] = {1, 7, 5};
|
||||||
|
|
||||||
@@ -103,7 +102,7 @@ static int Rssi2DBm(uint16_t rssi) { return (rssi >> 1) - 160; }
|
|||||||
|
|
||||||
static uint16_t GetRegMenuValue(uint8_t st) {
|
static uint16_t GetRegMenuValue(uint8_t st) {
|
||||||
RegisterSpec s = registerSpecs[st];
|
RegisterSpec s = registerSpecs[st];
|
||||||
return (BK4819_ReadRegister(s.num) >> s.offset) & s.maxValue;
|
return (BK4819_ReadRegister(s.num) >> s.offset) & s.mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetRegMenuValue(uint8_t st, bool add) {
|
static void SetRegMenuValue(uint8_t st, bool add) {
|
||||||
@@ -111,14 +110,14 @@ static void SetRegMenuValue(uint8_t st, bool add) {
|
|||||||
RegisterSpec s = registerSpecs[st];
|
RegisterSpec s = registerSpecs[st];
|
||||||
|
|
||||||
uint16_t reg = BK4819_ReadRegister(s.num);
|
uint16_t reg = BK4819_ReadRegister(s.num);
|
||||||
if (add && v <= s.maxValue - s.inc) {
|
if (add && v <= s.mask - s.inc) {
|
||||||
v += s.inc;
|
v += s.inc;
|
||||||
} else if (!add && v >= 0 + s.inc) {
|
} else if (!add && v >= 0 + s.inc) {
|
||||||
v -= s.inc;
|
v -= s.inc;
|
||||||
}
|
}
|
||||||
// TODO: use max value for bits count in max value, or reset by additional
|
// TODO: use max value for bits count in max value, or reset by additional
|
||||||
// mask in spec
|
// mask in spec
|
||||||
reg &= ~(s.maxValue << s.offset);
|
reg &= ~(s.mask << s.offset);
|
||||||
BK4819_WriteRegister(s.num, reg | (v << s.offset));
|
BK4819_WriteRegister(s.num, reg | (v << s.offset));
|
||||||
redrawScreen = true;
|
redrawScreen = true;
|
||||||
}
|
}
|
||||||
@@ -225,18 +224,6 @@ static void RestoreRegisters() {
|
|||||||
BK4819_WriteRegister(BK4819_REG_7E, R7E);
|
BK4819_WriteRegister(BK4819_REG_7E, R7E);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetModulation(ModulationType type) {
|
|
||||||
RestoreRegisters();
|
|
||||||
uint16_t reg = BK4819_ReadRegister(BK4819_REG_47);
|
|
||||||
reg &= ~(0b111 << 8);
|
|
||||||
BK4819_WriteRegister(BK4819_REG_47, reg | (modTypeReg47Values[type] << 8));
|
|
||||||
if (type == MOD_USB) {
|
|
||||||
BK4819_WriteRegister(BK4819_REG_3D, 0b0010101101000101);
|
|
||||||
BK4819_WriteRegister(BK4819_REG_37, 0x160F);
|
|
||||||
BK4819_WriteRegister(BK4819_REG_48, 0b0000001110101000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ToggleAFDAC(bool on) {
|
static void ToggleAFDAC(bool on) {
|
||||||
uint32_t Reg = BK4819_ReadRegister(BK4819_REG_30);
|
uint32_t Reg = BK4819_ReadRegister(BK4819_REG_30);
|
||||||
Reg &= ~(1 << 9);
|
Reg &= ~(1 << 9);
|
||||||
@@ -401,11 +388,24 @@ static void Measure() { rssiHistory[scanInfo.i] = scanInfo.rssi = GetRssi(); }
|
|||||||
|
|
||||||
// Update things by keypress
|
// Update things by keypress
|
||||||
|
|
||||||
|
static uint16_t dbm2rssi(int dBm)
|
||||||
|
{
|
||||||
|
return (dBm + 160)*2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ClampRssiTriggerLevel()
|
||||||
|
{
|
||||||
|
settings.rssiTriggerLevel = clamp(settings.rssiTriggerLevel, dbm2rssi(settings.dbMin), dbm2rssi(settings.dbMax));
|
||||||
|
}
|
||||||
|
|
||||||
static void UpdateRssiTriggerLevel(bool inc) {
|
static void UpdateRssiTriggerLevel(bool inc) {
|
||||||
if (inc)
|
if (inc)
|
||||||
settings.rssiTriggerLevel += 2;
|
settings.rssiTriggerLevel += 2;
|
||||||
else
|
else
|
||||||
settings.rssiTriggerLevel -= 2;
|
settings.rssiTriggerLevel -= 2;
|
||||||
|
|
||||||
|
ClampRssiTriggerLevel();
|
||||||
|
|
||||||
redrawScreen = true;
|
redrawScreen = true;
|
||||||
redrawStatus = true;
|
redrawStatus = true;
|
||||||
}
|
}
|
||||||
@@ -418,6 +418,8 @@ static void UpdateDBMax(bool inc) {
|
|||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClampRssiTriggerLevel();
|
||||||
redrawStatus = true;
|
redrawStatus = true;
|
||||||
redrawScreen = true;
|
redrawScreen = true;
|
||||||
SYSTEM_DelayMs(20);
|
SYSTEM_DelayMs(20);
|
||||||
@@ -474,12 +476,12 @@ static void UpdateFreqChangeStep(bool inc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void ToggleModulation() {
|
static void ToggleModulation() {
|
||||||
if (settings.modulationType < MOD_USB) {
|
if (settings.modulationType < MODULATION_UKNOWN - 1) {
|
||||||
settings.modulationType++;
|
settings.modulationType++;
|
||||||
} else {
|
} else {
|
||||||
settings.modulationType = MOD_FM;
|
settings.modulationType = MODULATION_FM;
|
||||||
}
|
}
|
||||||
SetModulation(settings.modulationType);
|
RADIO_SetModulation(settings.modulationType);
|
||||||
redrawScreen = true;
|
redrawScreen = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,7 +656,7 @@ static void DrawF(uint32_t f) {
|
|||||||
sprintf(String, "%u.%05u", f / 100000, f % 100000);
|
sprintf(String, "%u.%05u", f / 100000, f % 100000);
|
||||||
UI_PrintStringSmall(String, 8, 127, 0);
|
UI_PrintStringSmall(String, 8, 127, 0);
|
||||||
|
|
||||||
sprintf(String, "%s", modulationTypeOptions[settings.modulationType]);
|
sprintf(String, "%3s", gModulationStr[settings.modulationType]);
|
||||||
GUI_DisplaySmallest(String, 116, 1, false, true);
|
GUI_DisplaySmallest(String, 116, 1, false, true);
|
||||||
sprintf(String, "%s", bwOptions[settings.listenBw]);
|
sprintf(String, "%s", bwOptions[settings.listenBw]);
|
||||||
GUI_DisplaySmallest(String, 108, 7, false, true);
|
GUI_DisplaySmallest(String, 108, 7, false, true);
|
||||||
@@ -1160,7 +1162,7 @@ void APP_RunSpectrum() {
|
|||||||
newScanStart = true;
|
newScanStart = true;
|
||||||
|
|
||||||
ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off
|
ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off
|
||||||
SetModulation(settings.modulationType = MOD_FM);
|
RADIO_SetModulation(settings.modulationType = MODULATION_FM);
|
||||||
BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false);
|
BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false);
|
||||||
|
|
||||||
RelaunchScan();
|
RelaunchScan();
|
||||||
|
|||||||
@@ -99,12 +99,6 @@ typedef enum StepsCount {
|
|||||||
STEPS_16,
|
STEPS_16,
|
||||||
} StepsCount;
|
} StepsCount;
|
||||||
|
|
||||||
typedef enum ModulationType {
|
|
||||||
MOD_FM,
|
|
||||||
MOD_AM,
|
|
||||||
MOD_USB,
|
|
||||||
} ModulationType;
|
|
||||||
|
|
||||||
typedef enum ScanStep {
|
typedef enum ScanStep {
|
||||||
S_STEP_0_01kHz,
|
S_STEP_0_01kHz,
|
||||||
S_STEP_0_1kHz,
|
S_STEP_0_1kHz,
|
||||||
@@ -131,7 +125,7 @@ typedef struct SpectrumSettings {
|
|||||||
BK4819_FilterBandwidth_t listenBw;
|
BK4819_FilterBandwidth_t listenBw;
|
||||||
int dbMin;
|
int dbMin;
|
||||||
int dbMax;
|
int dbMax;
|
||||||
ModulationType modulationType;
|
ModulationMode_t modulationType;
|
||||||
bool backlightState;
|
bool backlightState;
|
||||||
} SpectrumSettings;
|
} SpectrumSettings;
|
||||||
|
|
||||||
@@ -149,14 +143,6 @@ typedef struct ScanInfo {
|
|||||||
uint8_t measurementsCount;
|
uint8_t measurementsCount;
|
||||||
} ScanInfo;
|
} ScanInfo;
|
||||||
|
|
||||||
typedef struct RegisterSpec {
|
|
||||||
char *name;
|
|
||||||
uint8_t num;
|
|
||||||
uint8_t offset;
|
|
||||||
uint16_t maxValue;
|
|
||||||
uint16_t inc;
|
|
||||||
} RegisterSpec;
|
|
||||||
|
|
||||||
typedef struct PeakInfo {
|
typedef struct PeakInfo {
|
||||||
uint16_t t;
|
uint16_t t;
|
||||||
uint16_t rssi;
|
uint16_t rssi;
|
||||||
|
|||||||
4
audio.c
4
audio.c
@@ -289,7 +289,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
|
|||||||
if (gCurrentFunction == FUNCTION_RECEIVE ||
|
if (gCurrentFunction == FUNCTION_RECEIVE ||
|
||||||
gCurrentFunction == FUNCTION_MONITOR ||
|
gCurrentFunction == FUNCTION_MONITOR ||
|
||||||
gCurrentFunction == FUNCTION_INCOMING) // 1of11
|
gCurrentFunction == FUNCTION_INCOMING) // 1of11
|
||||||
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM);
|
RADIO_SetModulation(gRxVfo->Modulation);
|
||||||
|
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (gFmRadioMode)
|
if (gFmRadioMode)
|
||||||
@@ -430,7 +430,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep)
|
|||||||
if (gCurrentFunction == FUNCTION_RECEIVE ||
|
if (gCurrentFunction == FUNCTION_RECEIVE ||
|
||||||
gCurrentFunction == FUNCTION_MONITOR ||
|
gCurrentFunction == FUNCTION_MONITOR ||
|
||||||
gCurrentFunction == FUNCTION_INCOMING) // 1of11
|
gCurrentFunction == FUNCTION_INCOMING) // 1of11
|
||||||
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM);
|
RADIO_SetModulation(gRxVfo->Modulation);
|
||||||
|
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (gFmRadioMode)
|
if (gFmRadioMode)
|
||||||
|
|||||||
@@ -10,10 +10,6 @@ extern const uint8_t BITMAP_RX[8];
|
|||||||
|
|
||||||
extern const uint8_t BITMAP_BatteryLevel[2];
|
extern const uint8_t BITMAP_BatteryLevel[2];
|
||||||
extern const uint8_t BITMAP_BatteryLevel1[17];
|
extern const uint8_t BITMAP_BatteryLevel1[17];
|
||||||
extern const uint8_t BITMAP_BatteryLevel2[17];
|
|
||||||
extern const uint8_t BITMAP_BatteryLevel3[17];
|
|
||||||
extern const uint8_t BITMAP_BatteryLevel4[17];
|
|
||||||
extern const uint8_t BITMAP_BatteryLevel5[17];
|
|
||||||
|
|
||||||
extern const uint8_t BITMAP_USB_C[9];
|
extern const uint8_t BITMAP_USB_C[9];
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,19 @@
|
|||||||
#ifndef BK4819_REGS_H
|
#ifndef BK4819_REGS_H
|
||||||
#define BK4819_REGS_H
|
#define BK4819_REGS_H
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char *name;
|
||||||
|
uint8_t num;
|
||||||
|
uint8_t offset;
|
||||||
|
uint16_t mask;
|
||||||
|
uint16_t inc;
|
||||||
|
} RegisterSpec;
|
||||||
|
|
||||||
|
static const RegisterSpec afcDisableRegSpec = {"AFC Disable", 0x73, 4, 1, 1};
|
||||||
|
static const RegisterSpec afOutRegSpec = {"AF Output Select", 0x47, 8, 0xF, 1};
|
||||||
|
static const RegisterSpec afDacGainRegSpec = {"AF DAC Gain", 0x48, 0, 0xF, 1};
|
||||||
|
|
||||||
enum BK4819_REGISTER_t {
|
enum BK4819_REGISTER_t {
|
||||||
BK4819_REG_00 = 0x00U,
|
BK4819_REG_00 = 0x00U,
|
||||||
BK4819_REG_02 = 0x02U,
|
BK4819_REG_02 = 0x02U,
|
||||||
|
|||||||
@@ -798,6 +798,12 @@ void BK4819_SetAF(BK4819_AF_Type_t AF)
|
|||||||
BK4819_WriteRegister(BK4819_REG_47, (6u << 12) | (AF << 8) | (1u << 6));
|
BK4819_WriteRegister(BK4819_REG_47, (6u << 12) | (AF << 8) | (1u << 6));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BK4819_SetRegValue(RegisterSpec s, uint16_t v) {
|
||||||
|
uint16_t reg = BK4819_ReadRegister(s.num);
|
||||||
|
reg &= ~(s.mask << s.offset);
|
||||||
|
BK4819_WriteRegister(s.num, reg | (v << s.offset));
|
||||||
|
}
|
||||||
|
|
||||||
void BK4819_RX_TurnOn(void)
|
void BK4819_RX_TurnOn(void)
|
||||||
{
|
{
|
||||||
// DSP Voltage Setting = 1
|
// DSP Voltage Setting = 1
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ enum BK4819_AF_Type_t
|
|||||||
BK4819_AF_FM = 1u, // FM
|
BK4819_AF_FM = 1u, // FM
|
||||||
BK4819_AF_ALAM = 2u, //
|
BK4819_AF_ALAM = 2u, //
|
||||||
BK4819_AF_BEEP = 3u, //
|
BK4819_AF_BEEP = 3u, //
|
||||||
BK4819_AF_BASEBAND1 = 4u, // SSB
|
BK4819_AF_BASEBAND1 = 4u, // RAW
|
||||||
BK4819_AF_BASEBAND2 = 5u, // SSB
|
BK4819_AF_BASEBAND2 = 5u, // USB
|
||||||
BK4819_AF_CTCO = 6u, // strange LF audio .. maybe the CTCSS LF line ?
|
BK4819_AF_CTCO = 6u, // strange LF audio .. maybe the CTCSS LF line ?
|
||||||
BK4819_AF_AM = 7u, // AM
|
BK4819_AF_AM = 7u, // AM
|
||||||
BK4819_AF_FSKO = 8u, // nothing
|
BK4819_AF_FSKO = 8u, // nothing
|
||||||
BK4819_AF_UNKNOWN3 = 9u, // distorted
|
BK4819_AF_UNKNOWN3 = 9u, // BYP
|
||||||
BK4819_AF_UNKNOWN4 = 10u, // nothing at all
|
BK4819_AF_UNKNOWN4 = 10u, // nothing at all
|
||||||
BK4819_AF_UNKNOWN5 = 11u, // distorted
|
BK4819_AF_UNKNOWN5 = 11u, // distorted
|
||||||
BK4819_AF_UNKNOWN6 = 12u, // distorted
|
BK4819_AF_UNKNOWN6 = 12u, // distorted
|
||||||
@@ -68,6 +68,7 @@ extern bool gRxIdleMode;
|
|||||||
void BK4819_Init(void);
|
void BK4819_Init(void);
|
||||||
uint16_t BK4819_ReadRegister(BK4819_REGISTER_t Register);
|
uint16_t BK4819_ReadRegister(BK4819_REGISTER_t Register);
|
||||||
void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data);
|
void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data);
|
||||||
|
void BK4819_SetRegValue(RegisterSpec s, uint16_t v);
|
||||||
void BK4819_WriteU8(uint8_t Data);
|
void BK4819_WriteU8(uint8_t Data);
|
||||||
void BK4819_WriteU16(uint16_t Data);
|
void BK4819_WriteU16(uint16_t Data);
|
||||||
|
|
||||||
|
|||||||
125
driver/st7565.c
125
driver/st7565.c
@@ -140,65 +140,116 @@ void ST7565_FillScreen(uint8_t Value)
|
|||||||
SPI_ToggleMasterMode(&SPI0->CR, true);
|
SPI_ToggleMasterMode(&SPI0->CR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Software reset
|
||||||
|
const uint8_t ST7565_CMD_SOFTWARE_RESET = 0xE2;
|
||||||
|
// Bias Select
|
||||||
|
// 1 0 1 0 0 0 1 BS
|
||||||
|
// Select bias setting 0=1/9; 1=1/7 (at 1/65 duty)
|
||||||
|
const uint8_t ST7565_CMD_BIAS_SELECT = 0xA2;
|
||||||
|
// COM Direction
|
||||||
|
// 1 1 0 0 MY - - -
|
||||||
|
// Set output direction of COM
|
||||||
|
// MY=1, reverse direction
|
||||||
|
// MY=0, normal direction
|
||||||
|
const uint8_t ST7565_CMD_COM_DIRECTION = 0xC0;
|
||||||
|
// SEG Direction
|
||||||
|
// 1 0 1 0 0 0 0 MX
|
||||||
|
// Set scan direction of SEG
|
||||||
|
// MX=1, reverse direction
|
||||||
|
// MX=0, normal direction
|
||||||
|
const uint8_t ST7565_CMD_SEG_DIRECTION = 0xA0;
|
||||||
|
// Inverse Display
|
||||||
|
// 1 0 1 0 0 1 1 INV
|
||||||
|
// INV =1, inverse display
|
||||||
|
// INV =0, normal display
|
||||||
|
const uint8_t ST7565_CMD_INVERSE_DISPLAY = 0xA6;
|
||||||
|
// All Pixel ON
|
||||||
|
// 1 0 1 0 0 1 0 AP
|
||||||
|
// AP=1, set all pixel ON
|
||||||
|
// AP=0, normal display
|
||||||
|
const uint8_t ST7565_CMD_ALL_PIXEL_ON = 0xA4;
|
||||||
|
// Regulation Ratio
|
||||||
|
// 0 0 1 0 0 RR2 RR1 RR0
|
||||||
|
// This instruction controls the regulation ratio of the built-in regulator
|
||||||
|
const uint8_t ST7565_CMD_REGULATION_RATIO = 0x20;
|
||||||
|
// Double command!! Set electronic volume (EV) level
|
||||||
|
// Send next: 0 0 EV5 EV4 EV3 EV2 EV1 EV0 contrast 0-63
|
||||||
|
const uint8_t ST7565_CMD_SET_EV = 0x81;
|
||||||
|
// Control built-in power circuit ON/OFF - 0 0 1 0 1 VB VR VF
|
||||||
|
// VB: Built-in Booster
|
||||||
|
// VR: Built-in Regulator
|
||||||
|
// VF: Built-in Follower
|
||||||
|
const uint8_t ST7565_CMD_POWER_CIRCUIT = 0x28;
|
||||||
|
// Set display start line 0-63
|
||||||
|
// 0 0 0 1 S5 S4 S3 S2 S1 S0
|
||||||
|
const uint8_t ST7565_CMD_SET_START_LINE = 0x40;
|
||||||
|
// Display ON/OFF
|
||||||
|
// 0 0 1 0 1 0 1 1 1 D
|
||||||
|
// D=1, display ON
|
||||||
|
// D=0, display OFF
|
||||||
|
const uint8_t ST7565_CMD_DISPLAY_ON_OFF = 0xAE;
|
||||||
|
|
||||||
|
uint8_t cmds[] = {
|
||||||
|
ST7565_CMD_BIAS_SELECT | 0, // Select bias setting: 1/9
|
||||||
|
ST7565_CMD_COM_DIRECTION | (0 << 3), // Set output direction of COM: normal
|
||||||
|
ST7565_CMD_SEG_DIRECTION | 1, // Set scan direction of SEG: reverse
|
||||||
|
ST7565_CMD_INVERSE_DISPLAY | 0, // Inverse Display: false
|
||||||
|
ST7565_CMD_ALL_PIXEL_ON | 0, // All Pixel ON: false - normal display
|
||||||
|
ST7565_CMD_REGULATION_RATIO | (4 << 0), // Regulation Ratio 5.0
|
||||||
|
|
||||||
|
ST7565_CMD_SET_EV, // Set contrast
|
||||||
|
31,
|
||||||
|
|
||||||
|
ST7565_CMD_POWER_CIRCUIT | 0b111, // Built-in power circuit ON/OFF: VB=1 VR=1 VF=1
|
||||||
|
ST7565_CMD_SET_START_LINE | 0, // Set Start Line: 0
|
||||||
|
ST7565_CMD_DISPLAY_ON_OFF | 1, // Display ON/OFF: ON
|
||||||
|
};
|
||||||
|
|
||||||
void ST7565_Init(const bool full)
|
void ST7565_Init(const bool full)
|
||||||
{
|
{
|
||||||
if (full)
|
if (full) {
|
||||||
{
|
|
||||||
SPI0_Init();
|
SPI0_Init();
|
||||||
|
|
||||||
ST7565_HardwareReset();
|
ST7565_HardwareReset();
|
||||||
|
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, false);
|
SPI_ToggleMasterMode(&SPI0->CR, false);
|
||||||
|
ST7565_WriteByte(ST7565_CMD_SOFTWARE_RESET); // software reset
|
||||||
ST7565_WriteByte(0xE2); // internal reset
|
|
||||||
|
|
||||||
SYSTEM_DelayMs(120);
|
SYSTEM_DelayMs(120);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, false);
|
SPI_ToggleMasterMode(&SPI0->CR, false);
|
||||||
|
|
||||||
ST7565_WriteByte(0xA2); // bias 9
|
|
||||||
ST7565_WriteByte(0xC0); // com normal
|
|
||||||
ST7565_WriteByte(0xA1); // reverse ?
|
|
||||||
|
|
||||||
ST7565_WriteByte(0xA6); // normal screen ?
|
|
||||||
// ST7565_WriteByte(0xA7); // inverse screen ?
|
|
||||||
|
|
||||||
ST7565_WriteByte(0xA4); // all points normal
|
for(uint8_t i = 0; i < 8; i++)
|
||||||
ST7565_WriteByte(0x24); //
|
ST7565_WriteByte(cmds[i]);
|
||||||
ST7565_WriteByte(0x81); // volume first ?
|
|
||||||
|
|
||||||
ST7565_WriteByte(0x1f); // contrast ?
|
if (full) {
|
||||||
|
ST7565_WriteByte(ST7565_CMD_POWER_CIRCUIT | 0b011); // VB=0 VR=1 VF=1
|
||||||
if (full)
|
SYSTEM_DelayMs(1);
|
||||||
{
|
ST7565_WriteByte(ST7565_CMD_POWER_CIRCUIT | 0b110); // VB=1 VR=1 VF=0
|
||||||
ST7565_WriteByte(0x2B); // power control ?
|
|
||||||
|
|
||||||
SYSTEM_DelayMs(1);
|
SYSTEM_DelayMs(1);
|
||||||
|
|
||||||
ST7565_WriteByte(0x2E); // power control ?
|
for(uint8_t i = 0; i < 4; i++) // why 4 times?
|
||||||
|
ST7565_WriteByte(ST7565_CMD_POWER_CIRCUIT | 0b111); // VB=1 VR=1 VF=1
|
||||||
SYSTEM_DelayMs(1);
|
|
||||||
|
|
||||||
ST7565_WriteByte(0x2F); //
|
|
||||||
ST7565_WriteByte(0x2F); //
|
|
||||||
ST7565_WriteByte(0x2F); //
|
|
||||||
ST7565_WriteByte(0x2F); //
|
|
||||||
|
|
||||||
SYSTEM_DelayMs(40);
|
SYSTEM_DelayMs(40);
|
||||||
}
|
}
|
||||||
|
|
||||||
ST7565_WriteByte(0x40); // start line ?
|
|
||||||
ST7565_WriteByte(0xAF); // display on ?
|
|
||||||
|
|
||||||
SPI_WaitForUndocumentedTxFifoStatusBit();
|
|
||||||
|
|
||||||
|
ST7565_WriteByte(ST7565_CMD_SET_START_LINE | 0); // line 0
|
||||||
|
ST7565_WriteByte(ST7565_CMD_DISPLAY_ON_OFF | 1); // D=1
|
||||||
|
SPI_WaitForUndocumentedTxFifoStatusBit();
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, true);
|
SPI_ToggleMasterMode(&SPI0->CR, true);
|
||||||
|
|
||||||
if (full)
|
if (full)
|
||||||
ST7565_FillScreen(0x00);
|
ST7565_FillScreen(0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ST7565_FixInterfGlitch(void)
|
||||||
|
{
|
||||||
|
SPI_ToggleMasterMode(&SPI0->CR, false);
|
||||||
|
for(uint8_t i = 0; i < ARRAY_SIZE(cmds); i++)
|
||||||
|
ST7565_WriteByte(cmds[i]);
|
||||||
|
SPI_WaitForUndocumentedTxFifoStatusBit();
|
||||||
|
SPI_ToggleMasterMode(&SPI0->CR, true);
|
||||||
|
}
|
||||||
|
|
||||||
void ST7565_HardwareReset(void)
|
void ST7565_HardwareReset(void)
|
||||||
{
|
{
|
||||||
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_RES);
|
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_RES);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ void ST7565_BlitFullScreen(void);
|
|||||||
void ST7565_BlitStatusLine(void);
|
void ST7565_BlitStatusLine(void);
|
||||||
void ST7565_FillScreen(uint8_t Value);
|
void ST7565_FillScreen(uint8_t Value);
|
||||||
void ST7565_Init(const bool full);
|
void ST7565_Init(const bool full);
|
||||||
|
void ST7565_FixInterfGlitch(void);
|
||||||
void ST7565_HardwareReset(void);
|
void ST7565_HardwareReset(void);
|
||||||
void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line);
|
void ST7565_SelectColumnAndLine(uint8_t Column, uint8_t Line);
|
||||||
void ST7565_WriteByte(uint8_t Value);
|
void ST7565_WriteByte(uint8_t Value);
|
||||||
|
|||||||
@@ -61,13 +61,29 @@ const freq_band_table_t frequencyBandTable[7] =
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ENABLE_12_5KHZ_STEP
|
|
||||||
// QS steps (*10 Hz)
|
const uint16_t gStepFrequencyTable[] = {
|
||||||
const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833};
|
250, 500, 625, 1000, 1250, 2500, 833,
|
||||||
#else
|
1, 5, 10, 25, 50, 100, 125, 1500, 3000, 5000, 10000, 12500, 25000, 50000
|
||||||
// includes 1.25kHz step
|
};
|
||||||
const uint16_t StepFrequencyTable[7] = {125, 250, 625, 1000, 1250, 2500, 833};
|
|
||||||
#endif
|
|
||||||
|
const uint8_t StepSortedIndexes[] = {
|
||||||
|
STEP_0_01kHz, STEP_0_05kHz, STEP_0_1kHz, STEP_0_25kHz, STEP_0_5kHz, STEP_1kHz, STEP_1_25kHz, STEP_2_5kHz, STEP_5kHz, STEP_6_25kHz,
|
||||||
|
STEP_8_33kHz, STEP_10kHz, STEP_12_5kHz, STEP_15kHz, STEP_25kHz, STEP_30kHz, STEP_50kHz, STEP_100kHz,
|
||||||
|
STEP_125kHz, STEP_250kHz, STEP_500kHz
|
||||||
|
};
|
||||||
|
uint8_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx)
|
||||||
|
{
|
||||||
|
return StepSortedIndexes[sortedIdx];
|
||||||
|
}
|
||||||
|
uint8_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t stepIdx)
|
||||||
|
{
|
||||||
|
for(uint8_t i = 0; i < ARRAY_SIZE(gStepFrequencyTable); i++)
|
||||||
|
if(StepSortedIndexes[i] == stepIdx)
|
||||||
|
return i;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency)
|
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency)
|
||||||
{
|
{
|
||||||
@@ -102,6 +118,8 @@ uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t T
|
|||||||
|
|
||||||
static int32_t rnd(int32_t freq, uint16_t step)
|
static int32_t rnd(int32_t freq, uint16_t step)
|
||||||
{
|
{
|
||||||
|
if(step == 1)
|
||||||
|
return freq;
|
||||||
return (freq + (step + 1) / 2) / step * step;
|
return (freq + (step + 1) / 2) / step * step;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,6 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define ENABLE_12_5KHZ_STEP
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const uint32_t lower;
|
const uint32_t lower;
|
||||||
const uint32_t upper;
|
const uint32_t upper;
|
||||||
@@ -31,7 +29,7 @@ extern const freq_band_table_t BX4819_band2;
|
|||||||
|
|
||||||
extern const freq_band_table_t frequencyBandTable[7];
|
extern const freq_band_table_t frequencyBandTable[7];
|
||||||
|
|
||||||
enum FREQUENCY_Band_t {
|
typedef enum {
|
||||||
BAND_NONE = -1,
|
BAND_NONE = -1,
|
||||||
BAND1_50MHz = 0,
|
BAND1_50MHz = 0,
|
||||||
BAND2_108MHz,
|
BAND2_108MHz,
|
||||||
@@ -40,35 +38,35 @@ enum FREQUENCY_Band_t {
|
|||||||
BAND5_350MHz,
|
BAND5_350MHz,
|
||||||
BAND6_400MHz,
|
BAND6_400MHz,
|
||||||
BAND7_470MHz
|
BAND7_470MHz
|
||||||
};
|
} FREQUENCY_Band_t;
|
||||||
typedef enum FREQUENCY_Band_t FREQUENCY_Band_t;
|
|
||||||
|
|
||||||
#ifndef ENABLE_12_5KHZ_STEP
|
|
||||||
// QS steps
|
|
||||||
enum STEP_Setting_t {
|
|
||||||
STEP_2_5kHz = 0,
|
|
||||||
STEP_5_0kHz,
|
|
||||||
STEP_6_25kHz,
|
|
||||||
STEP_10_0kHz,
|
|
||||||
STEP_12_5kHz,
|
|
||||||
STEP_25_0kHz,
|
|
||||||
STEP_8_33kHz
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
// includes 1.25kHz step
|
|
||||||
enum STEP_Setting_t {
|
|
||||||
STEP_1_25kHz = 0,
|
|
||||||
STEP_2_5kHz,
|
|
||||||
STEP_6_25kHz,
|
|
||||||
STEP_10_0kHz,
|
|
||||||
STEP_12_5kHz,
|
|
||||||
STEP_25_0kHz,
|
|
||||||
STEP_8_33kHz
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
typedef enum STEP_Setting_t STEP_Setting_t;
|
|
||||||
|
|
||||||
extern const uint16_t StepFrequencyTable[7];
|
typedef enum {
|
||||||
|
STEP_2_5kHz,
|
||||||
|
STEP_5kHz,
|
||||||
|
STEP_6_25kHz,
|
||||||
|
STEP_10kHz,
|
||||||
|
STEP_12_5kHz,
|
||||||
|
STEP_25kHz,
|
||||||
|
STEP_8_33kHz,
|
||||||
|
STEP_0_01kHz,
|
||||||
|
STEP_0_05kHz,
|
||||||
|
STEP_0_1kHz,
|
||||||
|
STEP_0_25kHz,
|
||||||
|
STEP_0_5kHz,
|
||||||
|
STEP_1kHz,
|
||||||
|
STEP_1_25kHz,
|
||||||
|
STEP_15kHz,
|
||||||
|
STEP_30kHz,
|
||||||
|
STEP_50kHz,
|
||||||
|
STEP_100kHz,
|
||||||
|
STEP_125kHz,
|
||||||
|
STEP_250kHz,
|
||||||
|
STEP_500kHz,
|
||||||
|
} STEP_Setting_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern const uint16_t gStepFrequencyTable[21];
|
||||||
|
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
extern const uint32_t NoaaFrequencyTable[10];
|
extern const uint32_t NoaaFrequencyTable[10];
|
||||||
@@ -78,6 +76,9 @@ FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency);
|
|||||||
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency);
|
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency);
|
||||||
uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step);
|
uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step);
|
||||||
|
|
||||||
|
uint8_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx);
|
||||||
|
uint8_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t step);
|
||||||
|
|
||||||
int TX_freq_check(const uint32_t Frequency);
|
int TX_freq_check(const uint32_t Frequency);
|
||||||
int RX_freq_check(const uint32_t Frequency);
|
int RX_freq_check(const uint32_t Frequency);
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#if defined(ENABLE_FMRADIO)
|
#if defined(ENABLE_FMRADIO)
|
||||||
#include "app/fm.h"
|
#include "app/fm.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "audio.h"
|
||||||
#include "bsp/dp32g030/gpio.h"
|
#include "bsp/dp32g030/gpio.h"
|
||||||
#include "dcs.h"
|
#include "dcs.h"
|
||||||
#include "driver/backlight.h"
|
#include "driver/backlight.h"
|
||||||
@@ -29,6 +30,7 @@
|
|||||||
#include "driver/bk4819.h"
|
#include "driver/bk4819.h"
|
||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "driver/system.h"
|
#include "driver/system.h"
|
||||||
|
#include "driver/st7565.h"
|
||||||
#include "frequencies.h"
|
#include "frequencies.h"
|
||||||
#include "functions.h"
|
#include "functions.h"
|
||||||
#include "helper/battery.h"
|
#include "helper/battery.h"
|
||||||
@@ -48,7 +50,7 @@ void FUNCTION_Init(void)
|
|||||||
{
|
{
|
||||||
gCurrentCodeType = gSelectedCodeType;
|
gCurrentCodeType = gSelectedCodeType;
|
||||||
if (gCssScanMode == CSS_SCAN_MODE_OFF)
|
if (gCssScanMode == CSS_SCAN_MODE_OFF)
|
||||||
gCurrentCodeType = gRxVfo->AM_mode ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType;
|
gCurrentCodeType = (gRxVfo->Modulation != MODULATION_FM) ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType;
|
||||||
}
|
}
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
else
|
else
|
||||||
@@ -104,6 +106,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
|
|||||||
|
|
||||||
if (PreviousFunction == FUNCTION_TRANSMIT)
|
if (PreviousFunction == FUNCTION_TRANSMIT)
|
||||||
{
|
{
|
||||||
|
ST7565_FixInterfGlitch();
|
||||||
gVFO_RSSI_bar_level[0] = 0;
|
gVFO_RSSI_bar_level[0] = 0;
|
||||||
gVFO_RSSI_bar_level[1] = 0;
|
gVFO_RSSI_bar_level[1] = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
128
helper/battery.c
128
helper/battery.c
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
#include "battery.h"
|
#include "battery.h"
|
||||||
#include "driver/backlight.h"
|
#include "driver/backlight.h"
|
||||||
|
#include "driver/st7565.h"
|
||||||
|
#include "functions.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "ui/battery.h"
|
#include "ui/battery.h"
|
||||||
@@ -29,30 +31,43 @@ uint16_t gBatteryVoltages[4];
|
|||||||
uint16_t gBatteryVoltageAverage;
|
uint16_t gBatteryVoltageAverage;
|
||||||
uint8_t gBatteryDisplayLevel;
|
uint8_t gBatteryDisplayLevel;
|
||||||
bool gChargingWithTypeC;
|
bool gChargingWithTypeC;
|
||||||
bool gLowBattery;
|
|
||||||
bool gLowBatteryBlink;
|
bool gLowBatteryBlink;
|
||||||
|
bool gLowBattery;
|
||||||
|
bool gLowBatteryConfirmed;
|
||||||
uint16_t gBatteryCheckCounter;
|
uint16_t gBatteryCheckCounter;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
BATTERY_LOW_INACTIVE,
|
||||||
|
BATTERY_LOW_ACTIVE,
|
||||||
|
BATTERY_LOW_CONFIRMED
|
||||||
|
} BatteryLow_t;
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t lowBatteryCountdown;
|
||||||
|
const uint16_t lowBatteryPeriod = 30;
|
||||||
|
|
||||||
volatile uint16_t gPowerSave_10ms;
|
volatile uint16_t gPowerSave_10ms;
|
||||||
|
|
||||||
|
|
||||||
unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV)
|
unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV)
|
||||||
{
|
{
|
||||||
const uint16_t crv1600[][2] = {
|
const uint16_t crv1600[][2] = {
|
||||||
{814, 100},
|
{828, 100},
|
||||||
{756, 24 },
|
{814, 97 },
|
||||||
{729, 7 },
|
{760, 25 },
|
||||||
{597, 0 },
|
{729, 6 },
|
||||||
{0, 0}
|
{630, 0 },
|
||||||
|
{0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t crv2200[][2] = {
|
const uint16_t crv2200[][2] = {
|
||||||
{823, 100},
|
{832, 100},
|
||||||
{740, 60},
|
{813, 95 },
|
||||||
{707, 21},
|
{740, 60 },
|
||||||
{680, 5},
|
{707, 21 },
|
||||||
{505, 0},
|
{682, 5 },
|
||||||
{0, 0}
|
{630, 0 },
|
||||||
|
{0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
const BATTERY_Type_t type = gEeprom.BATTERY_TYPE;
|
const BATTERY_Type_t type = gEeprom.BATTERY_TYPE;
|
||||||
@@ -84,17 +99,27 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
|
|||||||
const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel;
|
const uint8_t PreviousBatteryLevel = gBatteryDisplayLevel;
|
||||||
const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4;
|
const uint16_t Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + gBatteryVoltages[3]) / 4;
|
||||||
|
|
||||||
gBatteryDisplayLevel = 0;
|
|
||||||
|
|
||||||
for(uint8_t i = 6; i > 0; i--){
|
|
||||||
if (Voltage > gBatteryCalibration[i-1]) {
|
|
||||||
gBatteryDisplayLevel = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3];
|
gBatteryVoltageAverage = (Voltage * 760) / gBatteryCalibration[3];
|
||||||
|
|
||||||
|
if(gBatteryVoltageAverage > 890)
|
||||||
|
gBatteryDisplayLevel = 7; // battery overvoltage
|
||||||
|
else if(gBatteryVoltageAverage < 630)
|
||||||
|
gBatteryDisplayLevel = 0; // battery critical
|
||||||
|
else {
|
||||||
|
gBatteryDisplayLevel = 1;
|
||||||
|
const uint8_t levels[] = {5,17,41,65,88};
|
||||||
|
uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage);
|
||||||
|
for(uint8_t i = 6; i >= 1; i--){
|
||||||
|
if (perc > levels[i-2]) {
|
||||||
|
gBatteryDisplayLevel = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((gScreenToDisplay == DISPLAY_MENU) && GetCurrentMenuId() == MENU_VOL)
|
if ((gScreenToDisplay == DISPLAY_MENU) && GetCurrentMenuId() == MENU_VOL)
|
||||||
gUpdateDisplay = true;
|
gUpdateDisplay = true;
|
||||||
|
|
||||||
@@ -122,7 +147,9 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
|
|||||||
|
|
||||||
if (PreviousBatteryLevel != gBatteryDisplayLevel)
|
if (PreviousBatteryLevel != gBatteryDisplayLevel)
|
||||||
{
|
{
|
||||||
if (gBatteryDisplayLevel < 2)
|
if(gBatteryDisplayLevel > 2)
|
||||||
|
gLowBatteryConfirmed = false;
|
||||||
|
else if (gBatteryDisplayLevel < 2)
|
||||||
{
|
{
|
||||||
gLowBattery = true;
|
gLowBattery = true;
|
||||||
}
|
}
|
||||||
@@ -133,7 +160,64 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
|
|||||||
if (bDisplayBatteryLevel)
|
if (bDisplayBatteryLevel)
|
||||||
UI_DisplayBattery(gBatteryDisplayLevel, gLowBatteryBlink);
|
UI_DisplayBattery(gBatteryDisplayLevel, gLowBatteryBlink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!gLowBatteryConfirmed)
|
||||||
|
gUpdateDisplay = true;
|
||||||
|
|
||||||
gLowBatteryCountdown = 0;
|
lowBatteryCountdown = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BATTERY_TimeSlice500ms(void)
|
||||||
|
{
|
||||||
|
if (gLowBattery)
|
||||||
|
{
|
||||||
|
gLowBatteryBlink = ++lowBatteryCountdown & 1;
|
||||||
|
|
||||||
|
UI_DisplayBattery(0, gLowBatteryBlink);
|
||||||
|
|
||||||
|
if (gCurrentFunction != FUNCTION_TRANSMIT)
|
||||||
|
{ // not transmitting
|
||||||
|
|
||||||
|
if (lowBatteryCountdown < lowBatteryPeriod)
|
||||||
|
{
|
||||||
|
if (lowBatteryCountdown == lowBatteryPeriod-1 && !gChargingWithTypeC && !gLowBatteryConfirmed)
|
||||||
|
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lowBatteryCountdown = 0;
|
||||||
|
|
||||||
|
if (!gChargingWithTypeC)
|
||||||
|
{ // not on charge
|
||||||
|
if(!gLowBatteryConfirmed) {
|
||||||
|
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP);
|
||||||
|
#ifdef ENABLE_VOICE
|
||||||
|
AUDIO_SetVoiceID(0, VOICE_ID_LOW_VOLTAGE);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (gBatteryDisplayLevel == 0)
|
||||||
|
{
|
||||||
|
#ifdef ENABLE_VOICE
|
||||||
|
AUDIO_PlaySingleVoice(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
gReducedService = true;
|
||||||
|
|
||||||
|
//if (gCurrentFunction != FUNCTION_POWER_SAVE)
|
||||||
|
FUNCTION_Select(FUNCTION_POWER_SAVE);
|
||||||
|
|
||||||
|
ST7565_HardwareReset();
|
||||||
|
|
||||||
|
if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1))
|
||||||
|
BACKLIGHT_TurnOff(); // turn the backlight off
|
||||||
|
}
|
||||||
|
#ifdef ENABLE_VOICE
|
||||||
|
else
|
||||||
|
AUDIO_PlaySingleVoice(false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,8 +27,9 @@ extern uint16_t gBatteryVoltages[4];
|
|||||||
extern uint16_t gBatteryVoltageAverage;
|
extern uint16_t gBatteryVoltageAverage;
|
||||||
extern uint8_t gBatteryDisplayLevel;
|
extern uint8_t gBatteryDisplayLevel;
|
||||||
extern bool gChargingWithTypeC;
|
extern bool gChargingWithTypeC;
|
||||||
extern bool gLowBattery;
|
|
||||||
extern bool gLowBatteryBlink;
|
extern bool gLowBatteryBlink;
|
||||||
|
extern bool gLowBattery;
|
||||||
|
extern bool gLowBatteryConfirmed;
|
||||||
extern uint16_t gBatteryCheckCounter;
|
extern uint16_t gBatteryCheckCounter;
|
||||||
|
|
||||||
extern volatile uint16_t gPowerSave_10ms;
|
extern volatile uint16_t gPowerSave_10ms;
|
||||||
@@ -41,6 +42,7 @@ typedef enum {
|
|||||||
|
|
||||||
unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV);
|
unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV);
|
||||||
void BATTERY_GetReadings(const bool bDisplayBatteryLevel);
|
void BATTERY_GetReadings(const bool bDisplayBatteryLevel);
|
||||||
|
void BATTERY_TimeSlice500ms(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
1
misc.c
1
misc.c
@@ -197,7 +197,6 @@ bool g_SquelchLost;
|
|||||||
uint8_t gFlashLightState;
|
uint8_t gFlashLightState;
|
||||||
volatile uint16_t gFlashLightBlinkCounter;
|
volatile uint16_t gFlashLightBlinkCounter;
|
||||||
bool gFlagEndTransmission;
|
bool gFlagEndTransmission;
|
||||||
uint16_t gLowBatteryCountdown;
|
|
||||||
uint8_t gNextMrChannel;
|
uint8_t gNextMrChannel;
|
||||||
ReceptionMode_t gRxReceptionMode;
|
ReceptionMode_t gRxReceptionMode;
|
||||||
|
|
||||||
|
|||||||
1
misc.h
1
misc.h
@@ -274,7 +274,6 @@ extern bool g_SquelchLost;
|
|||||||
extern uint8_t gFlashLightState;
|
extern uint8_t gFlashLightState;
|
||||||
extern volatile uint16_t gFlashLightBlinkCounter;
|
extern volatile uint16_t gFlashLightBlinkCounter;
|
||||||
extern bool gFlagEndTransmission;
|
extern bool gFlagEndTransmission;
|
||||||
extern uint16_t gLowBatteryCountdown;
|
|
||||||
extern uint8_t gNextMrChannel;
|
extern uint8_t gNextMrChannel;
|
||||||
extern ReceptionMode_t gRxReceptionMode;
|
extern ReceptionMode_t gRxReceptionMode;
|
||||||
|
|
||||||
|
|||||||
85
radio.c
85
radio.c
@@ -44,6 +44,18 @@ uint8_t gSelectedCode;
|
|||||||
STEP_Setting_t gStepSetting;
|
STEP_Setting_t gStepSetting;
|
||||||
VfoState_t VfoState[2];
|
VfoState_t VfoState[2];
|
||||||
|
|
||||||
|
const char gModulationStr[][4] =
|
||||||
|
{
|
||||||
|
"FM",
|
||||||
|
"AM",
|
||||||
|
"USB",
|
||||||
|
|
||||||
|
#ifdef ENABLE_BYP_RAW_DEMODULATORS
|
||||||
|
"BYP",
|
||||||
|
"RAW"
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO)
|
bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO)
|
||||||
{ // return true if the channel appears valid
|
{ // return true if the channel appears valid
|
||||||
|
|
||||||
@@ -122,7 +134,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t
|
|||||||
pInfo->SCANLIST1_PARTICIPATION = true;
|
pInfo->SCANLIST1_PARTICIPATION = true;
|
||||||
pInfo->SCANLIST2_PARTICIPATION = true;
|
pInfo->SCANLIST2_PARTICIPATION = true;
|
||||||
pInfo->STEP_SETTING = STEP_12_5kHz;
|
pInfo->STEP_SETTING = STEP_12_5kHz;
|
||||||
pInfo->StepFrequency = StepFrequencyTable[pInfo->STEP_SETTING];
|
pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING];
|
||||||
pInfo->CHANNEL_SAVE = ChannelSave;
|
pInfo->CHANNEL_SAVE = ChannelSave;
|
||||||
pInfo->FrequencyReverse = false;
|
pInfo->FrequencyReverse = false;
|
||||||
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
|
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
|
||||||
@@ -133,7 +145,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t
|
|||||||
pInfo->Compander = 0; // off
|
pInfo->Compander = 0; // off
|
||||||
|
|
||||||
if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz))
|
if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz))
|
||||||
pInfo->AM_mode = 1;
|
pInfo->Modulation = MODULATION_AM;
|
||||||
|
|
||||||
RADIO_ConfigureSquelchAndOutputPower(pInfo);
|
RADIO_ConfigureSquelchAndOutputPower(pInfo);
|
||||||
}
|
}
|
||||||
@@ -253,13 +265,13 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
|
|||||||
if (Tmp > TX_OFFSET_FREQUENCY_DIRECTION_SUB)
|
if (Tmp > TX_OFFSET_FREQUENCY_DIRECTION_SUB)
|
||||||
Tmp = 0;
|
Tmp = 0;
|
||||||
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = Tmp;
|
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = Tmp;
|
||||||
gEeprom.VfoInfo[VFO].AM_mode = (Data[3] >> 4) & 1u;
|
gEeprom.VfoInfo[VFO].Modulation = (Data[3] >> 4);
|
||||||
|
|
||||||
Tmp = Data[6];
|
Tmp = Data[6];
|
||||||
if (Tmp >= ARRAY_SIZE(StepFrequencyTable))
|
if (Tmp >= ARRAY_SIZE(gStepFrequencyTable))
|
||||||
Tmp = STEP_12_5kHz;
|
Tmp = STEP_12_5kHz;
|
||||||
gEeprom.VfoInfo[VFO].STEP_SETTING = Tmp;
|
gEeprom.VfoInfo[VFO].STEP_SETTING = Tmp;
|
||||||
gEeprom.VfoInfo[VFO].StepFrequency = StepFrequencyTable[Tmp];
|
gEeprom.VfoInfo[VFO].StepFrequency = gStepFrequencyTable[Tmp];
|
||||||
|
|
||||||
Tmp = Data[7];
|
Tmp = Data[7];
|
||||||
if (Tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1))
|
if (Tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1))
|
||||||
@@ -407,7 +419,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
|
|||||||
pConfig->Frequency = 43300000;
|
pConfig->Frequency = 43300000;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gEeprom.VfoInfo[VFO].AM_mode)
|
if (gEeprom.VfoInfo[VFO].Modulation != MODULATION_FM)
|
||||||
{ // freq/chan is in AM mode
|
{ // freq/chan is in AM mode
|
||||||
gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = 0;
|
gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = 0;
|
||||||
// gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false; // no reason to disable DTMF decoding, aircraft use it on SSB
|
// gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false; // no reason to disable DTMF decoding, aircraft use it on SSB
|
||||||
@@ -605,7 +617,7 @@ void RADIO_SetupRegisters(bool switchToForeground)
|
|||||||
case BK4819_FILTER_BW_WIDE:
|
case BK4819_FILTER_BW_WIDE:
|
||||||
case BK4819_FILTER_BW_NARROW:
|
case BK4819_FILTER_BW_NARROW:
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
// BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->AM_mode && gSetting_AM_fix);
|
// BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->Modulation == MODULATION_AM && gSetting_AM_fix);
|
||||||
BK4819_SetFilterBandwidth(Bandwidth, true);
|
BK4819_SetFilterBandwidth(Bandwidth, true);
|
||||||
#else
|
#else
|
||||||
BK4819_SetFilterBandwidth(Bandwidth, false);
|
BK4819_SetFilterBandwidth(Bandwidth, false);
|
||||||
@@ -654,7 +666,13 @@ void RADIO_SetupRegisters(bool switchToForeground)
|
|||||||
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, true);
|
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, true);
|
||||||
|
|
||||||
// AF RX Gain and DAC
|
// AF RX Gain and DAC
|
||||||
BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); // 1011 00 111010 1000
|
//BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); // 1011 00 111010 1000
|
||||||
|
BK4819_WriteRegister(BK4819_REG_48,
|
||||||
|
(11u << 12) | // ??? .. 0 ~ 15, doesn't seem to make any difference
|
||||||
|
( 0u << 10) | // AF Rx Gain-1
|
||||||
|
(gEeprom.VOLUME_GAIN << 4) | // AF Rx Gain-2
|
||||||
|
(gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2)
|
||||||
|
|
||||||
|
|
||||||
InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST;
|
InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST;
|
||||||
|
|
||||||
@@ -662,7 +680,7 @@ void RADIO_SetupRegisters(bool switchToForeground)
|
|||||||
if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
|
if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (gRxVfo->AM_mode == 0)
|
if (gRxVfo->Modulation == MODULATION_FM)
|
||||||
{ // FM
|
{ // FM
|
||||||
uint8_t CodeType = gSelectedCodeType;
|
uint8_t CodeType = gSelectedCodeType;
|
||||||
uint8_t Code = gSelectedCode;
|
uint8_t Code = gSelectedCode;
|
||||||
@@ -738,15 +756,15 @@ void RADIO_SetupRegisters(bool switchToForeground)
|
|||||||
#ifdef ENABLE_VOX
|
#ifdef ENABLE_VOX
|
||||||
#ifdef ENABLE_NOAA
|
#ifdef ENABLE_NOAA
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
|
if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM)
|
||||||
#else
|
#else
|
||||||
if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
|
if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#ifdef ENABLE_FMRADIO
|
#ifdef ENABLE_FMRADIO
|
||||||
if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->AM_mode == 0)
|
if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->Modulation == MODULATION_FM)
|
||||||
#else
|
#else
|
||||||
if (gEeprom.VOX_SWITCH && gCurrentVfo->AM_mode == 0)
|
if (gEeprom.VOX_SWITCH && gCurrentVfo->Modulation == MODULATION_FM)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
@@ -758,7 +776,7 @@ void RADIO_SetupRegisters(bool switchToForeground)
|
|||||||
BK4819_DisableVox();
|
BK4819_DisableVox();
|
||||||
|
|
||||||
// RX expander
|
// RX expander
|
||||||
BK4819_SetCompander((gRxVfo->AM_mode == 0 && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0);
|
BK4819_SetCompander((gRxVfo->Modulation == MODULATION_FM && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED)
|
||||||
@@ -855,7 +873,7 @@ void RADIO_SetTxParameters(void)
|
|||||||
case BK4819_FILTER_BW_WIDE:
|
case BK4819_FILTER_BW_WIDE:
|
||||||
case BK4819_FILTER_BW_NARROW:
|
case BK4819_FILTER_BW_NARROW:
|
||||||
#ifdef ENABLE_AM_FIX
|
#ifdef ENABLE_AM_FIX
|
||||||
// BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->AM_mode && gSetting_AM_fix);
|
// BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->Modulation == MODULATION_AM && gSetting_AM_fix);
|
||||||
BK4819_SetFilterBandwidth(Bandwidth, true);
|
BK4819_SetFilterBandwidth(Bandwidth, true);
|
||||||
#else
|
#else
|
||||||
BK4819_SetFilterBandwidth(Bandwidth, false);
|
BK4819_SetFilterBandwidth(Bandwidth, false);
|
||||||
@@ -866,7 +884,7 @@ void RADIO_SetTxParameters(void)
|
|||||||
BK4819_SetFrequency(gCurrentVfo->pTX->Frequency);
|
BK4819_SetFrequency(gCurrentVfo->pTX->Frequency);
|
||||||
|
|
||||||
// TX compressor
|
// TX compressor
|
||||||
BK4819_SetCompander((gRxVfo->AM_mode == 0 && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0);
|
BK4819_SetCompander((gRxVfo->Modulation == MODULATION_FM && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0);
|
||||||
|
|
||||||
BK4819_PrepareTransmit();
|
BK4819_PrepareTransmit();
|
||||||
|
|
||||||
@@ -900,6 +918,37 @@ void RADIO_SetTxParameters(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RADIO_SetModulation(ModulationMode_t modulation)
|
||||||
|
{
|
||||||
|
BK4819_AF_Type_t mod;
|
||||||
|
switch(modulation) {
|
||||||
|
default:
|
||||||
|
case MODULATION_FM:
|
||||||
|
mod = BK4819_AF_FM;
|
||||||
|
break;
|
||||||
|
case MODULATION_AM:
|
||||||
|
mod = BK4819_AF_AM;
|
||||||
|
break;
|
||||||
|
case MODULATION_USB:
|
||||||
|
mod = BK4819_AF_BASEBAND2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifdef ENABLE_BYP_RAW_DEMODULATORS
|
||||||
|
case MODULATION_BYP:
|
||||||
|
mod = BK4819_AF_UNKNOWN3;
|
||||||
|
break;
|
||||||
|
case MODULATION_RAW:
|
||||||
|
mod = BK4819_AF_BASEBAND1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
BK4819_SetAF(mod);
|
||||||
|
BK4819_SetRegValue(afDacGainRegSpec, 0xF);
|
||||||
|
BK4819_WriteRegister(BK4819_REG_3D, modulation == MODULATION_USB ? 0 : 0x2AAB);
|
||||||
|
BK4819_SetRegValue(afcDisableRegSpec, modulation != MODULATION_FM);
|
||||||
|
}
|
||||||
|
|
||||||
void RADIO_SetVfoState(VfoState_t State)
|
void RADIO_SetVfoState(VfoState_t State)
|
||||||
{
|
{
|
||||||
if (State == VFO_STATE_NORMAL)
|
if (State == VFO_STATE_NORMAL)
|
||||||
@@ -964,7 +1013,7 @@ void RADIO_PrepareTX(void)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#ifndef ENABLE_TX_WHEN_AM
|
#ifndef ENABLE_TX_WHEN_AM
|
||||||
if (gCurrentVfo->AM_mode)
|
if (gCurrentVfo->Modulation != MODULATION_FM)
|
||||||
{ // not allowed to TX if in AM mode
|
{ // not allowed to TX if in AM mode
|
||||||
State = VFO_STATE_TX_DISABLE;
|
State = VFO_STATE_TX_DISABLE;
|
||||||
}
|
}
|
||||||
@@ -983,7 +1032,7 @@ void RADIO_PrepareTX(void)
|
|||||||
if (gBatteryDisplayLevel == 0)
|
if (gBatteryDisplayLevel == 0)
|
||||||
State = VFO_STATE_BAT_LOW; // charge your battery !
|
State = VFO_STATE_BAT_LOW; // charge your battery !
|
||||||
else
|
else
|
||||||
if (gBatteryDisplayLevel >= 6)
|
if (gBatteryDisplayLevel > 6)
|
||||||
State = VFO_STATE_VOLTAGE_HIGH; // over voltage .. this is being a pain
|
State = VFO_STATE_VOLTAGE_HIGH; // over voltage .. this is being a pain
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
20
radio.h
20
radio.h
@@ -61,6 +61,21 @@ enum VfoState_t
|
|||||||
};
|
};
|
||||||
typedef enum VfoState_t VfoState_t;
|
typedef enum VfoState_t VfoState_t;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MODULATION_FM,
|
||||||
|
MODULATION_AM,
|
||||||
|
MODULATION_USB,
|
||||||
|
|
||||||
|
#ifdef ENABLE_BYP_RAW_DEMODULATORS
|
||||||
|
MODULATION_BYP,
|
||||||
|
MODULATION_RAW,
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MODULATION_UKNOWN
|
||||||
|
} ModulationMode_t;
|
||||||
|
|
||||||
|
extern const char gModulationStr[MODULATION_UKNOWN][4];
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t Frequency;
|
uint32_t Frequency;
|
||||||
@@ -115,7 +130,7 @@ typedef struct VFO_Info_t
|
|||||||
|
|
||||||
uint8_t BUSY_CHANNEL_LOCK;
|
uint8_t BUSY_CHANNEL_LOCK;
|
||||||
|
|
||||||
uint8_t AM_mode;
|
ModulationMode_t Modulation;
|
||||||
|
|
||||||
uint8_t Compander;
|
uint8_t Compander;
|
||||||
|
|
||||||
@@ -154,11 +169,12 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0);
|
|||||||
void RADIO_ConfigureNOAA(void);
|
void RADIO_ConfigureNOAA(void);
|
||||||
#endif
|
#endif
|
||||||
void RADIO_SetTxParameters(void);
|
void RADIO_SetTxParameters(void);
|
||||||
|
void RADIO_SetModulation(ModulationMode_t modulation);
|
||||||
void RADIO_SetVfoState(VfoState_t State);
|
void RADIO_SetVfoState(VfoState_t State);
|
||||||
void RADIO_PrepareTX(void);
|
void RADIO_PrepareTX(void);
|
||||||
void RADIO_EnableCxCSS(void);
|
void RADIO_EnableCxCSS(void);
|
||||||
void RADIO_PrepareCssTX(void);
|
void RADIO_PrepareCssTX(void);
|
||||||
void RADIO_SendEndOfTransmission(void);
|
void RADIO_SendEndOfTransmission(void);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -215,7 +215,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
|
|||||||
State[0] = pVFO->freq_config_RX.Code;
|
State[0] = pVFO->freq_config_RX.Code;
|
||||||
State[1] = pVFO->freq_config_TX.Code;
|
State[1] = pVFO->freq_config_TX.Code;
|
||||||
State[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType;
|
State[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType;
|
||||||
State[3] = ((pVFO->AM_mode & 1u) << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION;
|
State[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION;
|
||||||
State[4] = 0
|
State[4] = 0
|
||||||
| (pVFO->BUSY_CHANNEL_LOCK << 4)
|
| (pVFO->BUSY_CHANNEL_LOCK << 4)
|
||||||
| (pVFO->OUTPUT_POWER << 2)
|
| (pVFO->OUTPUT_POWER << 2)
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ enum {
|
|||||||
ACTION_OPT_KEYLOCK,
|
ACTION_OPT_KEYLOCK,
|
||||||
ACTION_OPT_A_B,
|
ACTION_OPT_A_B,
|
||||||
ACTION_OPT_VFO_MR,
|
ACTION_OPT_VFO_MR,
|
||||||
|
ACTION_OPT_SWITCH_DEMODUL,
|
||||||
ACTION_OPT_LEN
|
ACTION_OPT_LEN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ void UI_DrawBattery(uint8_t* bitmap, uint8_t level, uint8_t blink)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
|
memmove(bitmap, BITMAP_BatteryLevel1, sizeof(BITMAP_BatteryLevel1));
|
||||||
if (level > 1)
|
if (level > 2)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint8_t bars = level - 1;
|
uint8_t bars = level - 2;
|
||||||
if (bars > 4)
|
if (bars > 4)
|
||||||
bars = 4;
|
bars = 4;
|
||||||
for (i = 0; i < bars; i++)
|
for (i = 0; i < bars; i++)
|
||||||
|
|||||||
68
ui/helper.c
68
ui/helper.c
@@ -21,6 +21,7 @@
|
|||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "ui/helper.h"
|
#include "ui/helper.h"
|
||||||
#include "ui/inputbox.h"
|
#include "ui/inputbox.h"
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#ifndef ARRAY_SIZE
|
#ifndef ARRAY_SIZE
|
||||||
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))
|
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))
|
||||||
@@ -178,3 +179,70 @@ void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center)
|
|||||||
pFb1 += char_width;
|
pFb1 += char_width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UI_DrawPixel(uint8_t x, uint8_t y, bool black)
|
||||||
|
{
|
||||||
|
gFrameBuffer[y/8][x] &= ~(1 << (y%8));
|
||||||
|
gFrameBuffer[y/8][x] |= black << (y%8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sort(int16_t *a, int16_t *b)
|
||||||
|
{
|
||||||
|
if(*a > *b) {
|
||||||
|
int16_t t = *a;
|
||||||
|
*a = *b;
|
||||||
|
*b = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI_DrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black)
|
||||||
|
{
|
||||||
|
if(x2==x1) {
|
||||||
|
sort(&y1, &y2);
|
||||||
|
for(int16_t i = y1; i <= y2; i++) {
|
||||||
|
UI_DrawPixel(x1, i, black);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const int multipl = 1000;
|
||||||
|
int a = (y2-y1)*multipl / (x2-x1);
|
||||||
|
int b = y1 - a * x1 / multipl;
|
||||||
|
|
||||||
|
sort(&x1, &x2);
|
||||||
|
for(int i = x1; i<= x2; i++)
|
||||||
|
{
|
||||||
|
UI_DrawPixel(i, i*a/multipl +b, black);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI_DrawRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black)
|
||||||
|
{
|
||||||
|
UI_DrawLine(x1,y1, x1,y2, black);
|
||||||
|
UI_DrawLine(x1,y1, x2,y1, black);
|
||||||
|
UI_DrawLine(x2,y1, x2,y2, black);
|
||||||
|
UI_DrawLine(x1,y2, x2,y2, black);
|
||||||
|
}
|
||||||
|
|
||||||
|
void UI_DisplayPopup(const char *string)
|
||||||
|
{
|
||||||
|
for(uint8_t i = 0; i < 7; i++) {
|
||||||
|
memset(gFrameBuffer[i], 0x00, 128);
|
||||||
|
}
|
||||||
|
|
||||||
|
// for(uint8_t i = 1; i < 5; i++) {
|
||||||
|
// memset(gFrameBuffer[i]+8, 0x00, 111);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for(uint8_t x = 10; x < 118; x++) {
|
||||||
|
// UI_DrawPixel(x, 10, true);
|
||||||
|
// UI_DrawPixel(x, 46-9, true);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for(uint8_t y = 11; y < 37; y++) {
|
||||||
|
// UI_DrawPixel(10, y, true);
|
||||||
|
// UI_DrawPixel(117, y, true);
|
||||||
|
// }
|
||||||
|
// DrawRectangle(9,9, 118,38, true);
|
||||||
|
UI_PrintString(string, 9, 118, 2, 8);
|
||||||
|
UI_PrintStringSmall("Press EXIT", 9, 118, 6);
|
||||||
|
}
|
||||||
@@ -29,6 +29,11 @@ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_
|
|||||||
#endif
|
#endif
|
||||||
void UI_PrintStringSmallBuffer(const char *pString, uint8_t *buffer);
|
void UI_PrintStringSmallBuffer(const char *pString, uint8_t *buffer);
|
||||||
void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center);
|
void UI_DisplayFrequency(const char *string, uint8_t X, uint8_t Y, bool center);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void UI_DisplayPopup(const char *string);
|
||||||
|
|
||||||
|
void UI_DrawPixel(uint8_t x, uint8_t y, bool black);
|
||||||
|
void UI_DrawLine(int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black);
|
||||||
|
void UI_DrawRectangle(int16_t x1, int16_t y1, int16_t x2, int16_t y2, bool black);
|
||||||
|
|
||||||
|
|||||||
41
ui/main.c
41
ui/main.c
@@ -156,7 +156,7 @@ static void DisplayRSSIBar(const int16_t rssi, const bool now)
|
|||||||
const int16_t rssi_dBm = (rssi / 2) - 160;
|
const int16_t rssi_dBm = (rssi / 2) - 160;
|
||||||
|
|
||||||
const uint8_t s_level = MIN(MAX((rssi_dBm - s0_dBm) / 6, 0), 9); // S0 - S9
|
const uint8_t s_level = MIN(MAX((rssi_dBm - s0_dBm) / 6, 0), 9); // S0 - S9
|
||||||
uint8_t overS9dBm = MIN(MAX(73 + rssi_dBm, 0), 99);
|
uint8_t overS9dBm = MIN(MAX(rssi_dBm - (s0_dBm + 9*6), 0), 99);
|
||||||
uint8_t overS9Bars = MIN(overS9dBm/10, 4);
|
uint8_t overS9Bars = MIN(overS9dBm/10, 4);
|
||||||
|
|
||||||
if(overS9Bars == 0) {
|
if(overS9Bars == 0) {
|
||||||
@@ -234,6 +234,12 @@ void UI_DisplayMain(void)
|
|||||||
// clear the screen
|
// clear the screen
|
||||||
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
|
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
|
||||||
|
|
||||||
|
if(gLowBattery && !gLowBatteryConfirmed) {
|
||||||
|
UI_DisplayPopup("LOW BATTERY");
|
||||||
|
ST7565_BlitFullScreen();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
|
if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
|
||||||
{ // tell user how to unlock the keyboard
|
{ // tell user how to unlock the keyboard
|
||||||
UI_PrintString("Long press #", 0, LCD_WIDTH, 1, 8);
|
UI_PrintString("Long press #", 0, LCD_WIDTH, 1, 8);
|
||||||
@@ -556,19 +562,24 @@ void UI_DisplayMain(void)
|
|||||||
// ************
|
// ************
|
||||||
|
|
||||||
String[0] = '\0';
|
String[0] = '\0';
|
||||||
if (gEeprom.VfoInfo[vfo_num].AM_mode)
|
|
||||||
{ // show the AM symbol
|
// show the modulation symbol
|
||||||
strcpy(String, "AM");
|
const char * s = "";
|
||||||
}
|
const ModulationMode_t mod = gEeprom.VfoInfo[vfo_num].Modulation;
|
||||||
else
|
switch (mod){
|
||||||
{ // or show the CTCSS/DCS symbol
|
case MODULATION_FM: {
|
||||||
const FREQ_Config_t *pConfig = (mode == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX;
|
const FREQ_Config_t *pConfig = (mode == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX;
|
||||||
const unsigned int code_type = pConfig->CodeType;
|
const unsigned int code_type = pConfig->CodeType;
|
||||||
const char *code_list[] = {"", "CT", "DCS", "DCR"};
|
const char *code_list[] = {"", "CT", "DCS", "DCR"};
|
||||||
if (code_type < ARRAY_SIZE(code_list))
|
if (code_type < ARRAY_SIZE(code_list))
|
||||||
strcpy(String, code_list[code_type]);
|
s = code_list[code_type];
|
||||||
}
|
break;
|
||||||
UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1);
|
}
|
||||||
|
default:
|
||||||
|
s = gModulationStr[mod];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
UI_PrintStringSmall(s, LCD_WIDTH + 24, 0, line + 1);
|
||||||
|
|
||||||
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
|
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
|
||||||
{ // show the TX power
|
{ // show the TX power
|
||||||
@@ -627,7 +638,7 @@ void UI_DisplayMain(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
|
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
|
||||||
if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix)
|
if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation == MODULATION_AM && gSetting_AM_fix)
|
||||||
{
|
{
|
||||||
if (gScreenToDisplay != DISPLAY_MAIN ||
|
if (gScreenToDisplay != DISPLAY_MAIN ||
|
||||||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||||
|
|||||||
51
ui/menu.c
51
ui/menu.c
@@ -338,7 +338,6 @@ const char gSubMenu_SCRAMBLER[11][7] =
|
|||||||
"3500Hz"
|
"3500Hz"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const t_sidefunction SIDEFUNCTIONS[] =
|
const t_sidefunction SIDEFUNCTIONS[] =
|
||||||
{
|
{
|
||||||
{"NONE", ACTION_OPT_NONE},
|
{"NONE", ACTION_OPT_NONE},
|
||||||
@@ -360,7 +359,8 @@ const t_sidefunction SIDEFUNCTIONS[] =
|
|||||||
#endif
|
#endif
|
||||||
{"LOCK\nKEYPAD", ACTION_OPT_KEYLOCK},
|
{"LOCK\nKEYPAD", ACTION_OPT_KEYLOCK},
|
||||||
{"SWITCH\nVFO", ACTION_OPT_A_B},
|
{"SWITCH\nVFO", ACTION_OPT_A_B},
|
||||||
{"VFO/MR", ACTION_OPT_VFO_MR},
|
{"VFO/MR", ACTION_OPT_VFO_MR},
|
||||||
|
{"SWITCH\nDEMODUL", ACTION_OPT_SWITCH_DEMODUL},
|
||||||
};
|
};
|
||||||
const t_sidefunction* gSubMenu_SIDEFUNCTIONS = SIDEFUNCTIONS;
|
const t_sidefunction* gSubMenu_SIDEFUNCTIONS = SIDEFUNCTIONS;
|
||||||
const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(SIDEFUNCTIONS);
|
const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(SIDEFUNCTIONS);
|
||||||
@@ -495,9 +495,11 @@ void UI_DisplayMenu(void)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case MENU_STEP:
|
case MENU_STEP: {
|
||||||
sprintf(String, "%d.%02ukHz", StepFrequencyTable[gSubMenuSelection] / 100, abs(StepFrequencyTable[gSubMenuSelection]) % 100);
|
uint16_t step = gStepFrequencyTable[FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection)];
|
||||||
|
sprintf(String, "%d.%02ukHz", step / 100, step % 100);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case MENU_TXP:
|
case MENU_TXP:
|
||||||
strcpy(String, gSubMenu_TXP[gSubMenuSelection]);
|
strcpy(String, gSubMenu_TXP[gSubMenuSelection]);
|
||||||
@@ -507,8 +509,7 @@ void UI_DisplayMenu(void)
|
|||||||
case MENU_T_DCS:
|
case MENU_T_DCS:
|
||||||
if (gSubMenuSelection == 0)
|
if (gSubMenuSelection == 0)
|
||||||
strcpy(String, "OFF");
|
strcpy(String, "OFF");
|
||||||
else
|
else if (gSubMenuSelection < 105)
|
||||||
if (gSubMenuSelection < 105)
|
|
||||||
sprintf(String, "D%03oN", DCS_Options[gSubMenuSelection - 1]);
|
sprintf(String, "D%03oN", DCS_Options[gSubMenuSelection - 1]);
|
||||||
else
|
else
|
||||||
sprintf(String, "D%03oI", DCS_Options[gSubMenuSelection - 105]);
|
sprintf(String, "D%03oI", DCS_Options[gSubMenuSelection - 105]);
|
||||||
@@ -517,38 +518,10 @@ void UI_DisplayMenu(void)
|
|||||||
case MENU_R_CTCS:
|
case MENU_R_CTCS:
|
||||||
case MENU_T_CTCS:
|
case MENU_T_CTCS:
|
||||||
{
|
{
|
||||||
#if 1
|
if (gSubMenuSelection == 0)
|
||||||
unsigned int Code;
|
strcpy(String, "OFF");
|
||||||
FREQ_Config_t *pConfig = (GetCurrentMenuId() == MENU_R_CTCS) ? &gTxVfo->freq_config_RX : &gTxVfo->freq_config_TX;
|
else
|
||||||
if (gSubMenuSelection == 0)
|
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10);
|
||||||
{
|
|
||||||
strcpy(String, "OFF");
|
|
||||||
|
|
||||||
if (pConfig->CodeType != CODE_TYPE_CONTINUOUS_TONE)
|
|
||||||
break;
|
|
||||||
Code = 0;
|
|
||||||
pConfig->CodeType = CODE_TYPE_OFF;
|
|
||||||
pConfig->Code = Code;
|
|
||||||
|
|
||||||
BK4819_ExitSubAu();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10);
|
|
||||||
|
|
||||||
pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE;
|
|
||||||
Code = gSubMenuSelection - 1;
|
|
||||||
pConfig->Code = Code;
|
|
||||||
|
|
||||||
BK4819_SetCTCSSFrequency(CTCSS_Options[Code]);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (gSubMenuSelection == 0)
|
|
||||||
strcpy(String, "OFF");
|
|
||||||
else
|
|
||||||
sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -612,7 +585,7 @@ void UI_DisplayMenu(void)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case MENU_AM:
|
case MENU_AM:
|
||||||
strcpy(String, (gSubMenuSelection == 0) ? "FM" : "AM");
|
strcpy(String, gModulationStr[gSubMenuSelection]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef ENABLE_AM_FIX_TEST1
|
#ifdef ENABLE_AM_FIX_TEST1
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ void UI_DisplayStatus()
|
|||||||
char s[8];
|
char s[8];
|
||||||
unsigned int space_needed;
|
unsigned int space_needed;
|
||||||
|
|
||||||
unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel5) - 3;
|
unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 3;
|
||||||
|
|
||||||
if (gChargingWithTypeC)
|
if (gChargingWithTypeC)
|
||||||
x2 -= sizeof(BITMAP_USB_C); // the radio is on charge
|
x2 -= sizeof(BITMAP_USB_C); // the radio is on charge
|
||||||
|
|||||||
17
win_make.bat
17
win_make.bat
@@ -18,15 +18,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:: Delete any left over files from previous compile
|
|
||||||
::
|
|
||||||
del /S /Q *.o >nul 2>nul
|
|
||||||
del /S /Q *.d >nul 2>nul
|
|
||||||
del /Q firmware >nul 2>nul
|
|
||||||
del /Q *.bin >nul 2>nul
|
|
||||||
|
|
||||||
:: You may need to edit/change these three paths to suit your setup
|
:: You may need to edit/change these three paths to suit your setup
|
||||||
::
|
::
|
||||||
:: Temporarily add the compiler and make program directories to the system PATH ..
|
:: Temporarily add the compiler and make program directories to the system PATH ..
|
||||||
@@ -40,14 +31,6 @@ del /Q *.bin >nul 2>nul
|
|||||||
make clean
|
make clean
|
||||||
make
|
make
|
||||||
|
|
||||||
:: Delete the spent files
|
|
||||||
::
|
|
||||||
del /S /Q *.o >nul 2>nul
|
|
||||||
del /S /Q *.d >nul 2>nul
|
|
||||||
del /Q firmware >nul 2>nul
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
:: If you have python installed, you can create a 'packed' .bin from the compiled firmware.bin file.
|
:: If you have python installed, you can create a 'packed' .bin from the compiled firmware.bin file.
|
||||||
:: The Quansheng windows upload-to-radio program requires a 'packed' .bin file.
|
:: The Quansheng windows upload-to-radio program requires a 'packed' .bin file.
|
||||||
|
|||||||
Reference in New Issue
Block a user