diff --git a/Makefile b/Makefile index d9ebbe1..80b6b39 100644 --- a/Makefile +++ b/Makefile @@ -202,7 +202,7 @@ endif #CFLAGS += -Wpadded # catch any and all warnings -CFLAGS += -Wextra +#CFLAGS += -Wextra CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\" diff --git a/README.md b/README.md index 93ae5f9..31c7ea3 100644 --- a/README.md +++ b/README.md @@ -9,20 +9,24 @@ Anyway, have fun. # Radio performance -Please note that the Quansheng uv-k radios are not professional quality transceivers, their -performance is strictly limited, somewhat below that of a decent transceiver. The RX front -end has no track-tuned band pass filtering at all, and so are wide band/wide open to any -and all signals over a wide frequency range. -Using the radio in high intensity RF environments will nearly always destroy your reception, -the receiver simply doesn't have a great dynamic range, which means distorted AM audio with -strong received signals, there is nothing more anyone can do in firmware/software to stop that -happening once the RX gain adjustment I do (AM fix) reaches the hardwares limit. +Please note that the Quansheng UV-Kx radios are not professional quality transceivers, their +performance is strictly limited. The RX front end has no track-tuned band pass filtering +at all, and so are wide band/wide open to any and all signals over a large frequency range. -Saying that, they are nice toys for the price, fun to play with. +Using the radio in high intensity RF environments will most likely make reception anything but +easy (AM mode will suffer far more than FM ever will), the receiver simply doesn't have a +great dynamic range, which results in distorted AM audio with stronger RX'ed signals. +There is nothing more anyone can do in firmware/software to improve that, once the RX gain +adjustment I do (AM fix) reaches the hardwares limit, your AM RX audio will be all but +non-existant (just like Quansheng's firmware). +On the other hand, FM RX audio will/should be fine. + +But, they are nice toys for the price, fun to play with. # User customization -You can customize the firmware by enabling/disabling various compile options. +You can customize the firmware by enabling/disabling various compile options, this allows +us to remove certain firmware features in order to make room in the flash for others. You'll find the options at the top of "Makefile" ('0' = disable, '1' = enable) .. ``` @@ -68,7 +72,7 @@ ENABLE_COPY_CHAN_TO_VFO := 1 copy current channel into the other VFO * or * Long-press '5' .. Toggle selected channel scanlist setting .. if NOAA is disabled in Makefile * -* Long-press '*' .. Start scanning, then toggles scanlist scan 1, 2 or ALL channel scanning +* Long-press '*' .. Start scanning, then toggles the scanning between scanlists 1, 2 or ALL channels # Some changes made from the Quansheng firmware diff --git a/app/main.c b/app/main.c index fe08b78..a11036a 100644 --- a/app/main.c +++ b/app/main.c @@ -68,8 +68,15 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) uint8_t Vfo = gEeprom.TX_VFO; if (gScreenToDisplay == DISPLAY_MENU) + { +// if (beep) + gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; + } +// if (beep) + gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; + switch (Key) { case KEY_0: @@ -530,6 +537,10 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) { + if (bKeyPressed && !bKeyHeld) + // menu key pressed + gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; + if (bKeyHeld) { // menu key held down (long press) @@ -603,14 +614,10 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) const bool bFlag = (gInputBoxIndex == 0); gInputBoxIndex = 0; - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - if (bFlag) { gFlagRefreshSetting = true; - gRequestDisplayScreen = DISPLAY_MENU; - #ifdef ENABLE_VOICE gAnotherVoiceID = VOICE_ID_MENU; #endif @@ -808,7 +815,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (!bKeyHeld) { - const char Character = DTMF_GetCharacter(Key); + const char Character = DTMF_GetCharacter(Key - KEY_0); if (Character != 0xFF) { // add key to DTMF string DTMF_Append(Character); @@ -827,7 +834,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) // TODO: ??? if (Key > KEY_PTT) { - Key = KEY_SIDE2; + Key = KEY_SIDE2; // what's this doing ??? } switch (Key) diff --git a/driver/gpio.h b/driver/gpio.h index a6e6158..0d9f1d0 100644 --- a/driver/gpio.h +++ b/driver/gpio.h @@ -58,10 +58,10 @@ enum GPIOC_PINS { GPIOC_PIN_PTT = 5 }; -void GPIO_ClearBit(volatile uint32_t *pReg, uint8_t Bit); +void GPIO_ClearBit(volatile uint32_t *pReg, uint8_t Bit); uint8_t GPIO_CheckBit(volatile uint32_t *pReg, uint8_t Bit); -void GPIO_FlipBit(volatile uint32_t *pReg, uint8_t Bit); -void GPIO_SetBit(volatile uint32_t *pReg, uint8_t Bit); +void GPIO_FlipBit( volatile uint32_t *pReg, uint8_t Bit); +void GPIO_SetBit( volatile uint32_t *pReg, uint8_t Bit); #endif diff --git a/driver/keyboard.c b/driver/keyboard.c index 3b5f4b7..c6af554 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -22,10 +22,10 @@ #include "driver/i2c.h" #include "misc.h" -KEY_Code_t gKeyReading0 = KEY_INVALID; -KEY_Code_t gKeyReading1 = KEY_INVALID; -uint16_t gDebounceCounter; -bool gWasFKeyPressed; +KEY_Code_t gKeyReading0 = KEY_INVALID; +KEY_Code_t gKeyReading1 = KEY_INVALID; +uint16_t gDebounceCounter = 0; +bool gWasFKeyPressed = false; static const struct { @@ -42,9 +42,8 @@ static const struct { } keyboard[] = { - // Zero row - { - // Set to zero to handle special case of nothing pulled down. + { // Zero row + // Set to zero to handle special case of nothing pulled down .set_to_zero_mask = 0xffff, .pins = { { .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0}, @@ -120,6 +119,7 @@ KEY_Code_t KEYBOARD_Poll(void) // Read all 4 GPIO pins at once reg = GPIOA->DATA; + for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) { const uint16_t mask = 1u << keyboard[j].pins[i].pin; @@ -134,13 +134,13 @@ KEY_Code_t KEYBOARD_Poll(void) break; } - // Create I2C stop condition. Since we might have toggled I2C pins. + // Create I2C stop condition since we might have toggled I2C pins // This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high I2C_Stop(); // Reset VOICE pins GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); - GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_7); + GPIO_SetBit( &GPIOA->DATA, GPIOA_PIN_KEYBOARD_7); return Key; } diff --git a/driver/st7565.c b/driver/st7565.c index dd4061a..c2ccd3f 100644 --- a/driver/st7565.c +++ b/driver/st7565.c @@ -123,6 +123,7 @@ void ST7565_FillScreen(uint8_t Value) ST7565_Init(false); SPI_ToggleMasterMode(&SPI0->CR, false); + for (i = 0; i < 8; i++) { unsigned int j; @@ -135,6 +136,7 @@ void ST7565_FillScreen(uint8_t Value) } SPI_WaitForUndocumentedTxFifoStatusBit(); } + SPI_ToggleMasterMode(&SPI0->CR, true); } @@ -152,6 +154,8 @@ void ST7565_Init(const bool full) SYSTEM_DelayMs(120); } + else + SPI_ToggleMasterMode(&SPI0->CR, false); ST7565_WriteByte(0xA2); // bias 9 ST7565_WriteByte(0xC0); // com normal @@ -164,9 +168,10 @@ void ST7565_Init(const bool full) ST7565_WriteByte(0x24); // ST7565_WriteByte(0x81); // volume first ? + ST7565_WriteByte(0x1f); // contrast ? + if (full) { - ST7565_WriteByte(0x1f); // contrast ? ST7565_WriteByte(0x2B); // power control ? SYSTEM_DelayMs(1); @@ -181,11 +186,11 @@ void ST7565_Init(const bool full) ST7565_WriteByte(0x2F); // SYSTEM_DelayMs(40); - - ST7565_WriteByte(0x40); // start line ? - ST7565_WriteByte(0xAF); // display on ? } + ST7565_WriteByte(0x40); // start line ? + ST7565_WriteByte(0xAF); // display on ? + SPI_WaitForUndocumentedTxFifoStatusBit(); SPI_ToggleMasterMode(&SPI0->CR, true); diff --git a/firmware.bin b/firmware.bin index 61974d9..a14311b 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 450bac5..28c5bb7 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/ui/inputbox.c b/ui/inputbox.c index bc98197..c0c04e4 100644 --- a/ui/inputbox.c +++ b/ui/inputbox.c @@ -16,12 +16,13 @@ #include +#include "driver/keyboard.h" #include "ui/inputbox.h" char gInputBox[8]; uint8_t gInputBoxIndex; -void INPUTBOX_Append(char Digit) +void INPUTBOX_Append(const char Digit) { if (gInputBoxIndex >= sizeof(gInputBox)) return; @@ -29,6 +30,6 @@ void INPUTBOX_Append(char Digit) if (gInputBoxIndex == 0) memset(gInputBox, 10, sizeof(gInputBox)); - gInputBox[gInputBoxIndex++] = Digit; + gInputBox[gInputBoxIndex++] = Digit - KEY_0; } diff --git a/ui/inputbox.h b/ui/inputbox.h index be01fe9..4750178 100644 --- a/ui/inputbox.h +++ b/ui/inputbox.h @@ -22,7 +22,7 @@ extern char gInputBox[8]; extern uint8_t gInputBoxIndex; -void INPUTBOX_Append(char Digit); +void INPUTBOX_Append(const char Digit); #endif