mirror of
https://github.com/OneOfEleven/uv-k5-firmware-custom.git
synced 2025-04-28 14:21:25 +03:00
Fic typing in keys bug
This commit is contained in:
parent
40d09591b3
commit
5c346c8466
2
Makefile
2
Makefile
@ -202,7 +202,7 @@ endif
|
|||||||
#CFLAGS += -Wpadded
|
#CFLAGS += -Wpadded
|
||||||
|
|
||||||
# catch any and all warnings
|
# catch any and all warnings
|
||||||
CFLAGS += -Wextra
|
#CFLAGS += -Wextra
|
||||||
|
|
||||||
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H
|
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H
|
||||||
CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\"
|
CFLAGS += -DGIT_HASH=\"$(GIT_HASH)\"
|
||||||
|
26
README.md
26
README.md
@ -9,20 +9,24 @@ Anyway, have fun.
|
|||||||
|
|
||||||
# Radio performance
|
# Radio performance
|
||||||
|
|
||||||
Please note that the Quansheng uv-k radios are not professional quality transceivers, their
|
Please note that the Quansheng UV-Kx radios are not professional quality transceivers, their
|
||||||
performance is strictly limited, somewhat below that of a decent transceiver. The RX front
|
performance is strictly limited. The RX front end has no track-tuned band pass filtering
|
||||||
end has no track-tuned band pass filtering at all, and so are wide band/wide open to any
|
at all, and so are wide band/wide open to any and all signals over a large frequency range.
|
||||||
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.
|
|
||||||
|
|
||||||
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
|
# 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) ..
|
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
|
* or
|
||||||
* Long-press '5' .. Toggle selected channel scanlist setting .. if NOAA is disabled in Makefile
|
* 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
|
# Some changes made from the Quansheng firmware
|
||||||
|
|
||||||
|
19
app/main.c
19
app/main.c
@ -68,7 +68,14 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
|
|||||||
uint8_t Vfo = gEeprom.TX_VFO;
|
uint8_t Vfo = gEeprom.TX_VFO;
|
||||||
|
|
||||||
if (gScreenToDisplay == DISPLAY_MENU)
|
if (gScreenToDisplay == DISPLAY_MENU)
|
||||||
|
{
|
||||||
|
// if (beep)
|
||||||
|
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (beep)
|
||||||
|
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||||
|
|
||||||
switch (Key)
|
switch (Key)
|
||||||
{
|
{
|
||||||
@ -530,6 +537,10 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
|||||||
|
|
||||||
static void MAIN_Key_MENU(const bool bKeyPressed, const 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)
|
if (bKeyHeld)
|
||||||
{ // menu key held down (long press)
|
{ // 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);
|
const bool bFlag = (gInputBoxIndex == 0);
|
||||||
gInputBoxIndex = 0;
|
gInputBoxIndex = 0;
|
||||||
|
|
||||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
|
||||||
|
|
||||||
if (bFlag)
|
if (bFlag)
|
||||||
{
|
{
|
||||||
gFlagRefreshSetting = true;
|
gFlagRefreshSetting = true;
|
||||||
|
|
||||||
gRequestDisplayScreen = DISPLAY_MENU;
|
gRequestDisplayScreen = DISPLAY_MENU;
|
||||||
|
|
||||||
#ifdef ENABLE_VOICE
|
#ifdef ENABLE_VOICE
|
||||||
gAnotherVoiceID = VOICE_ID_MENU;
|
gAnotherVoiceID = VOICE_ID_MENU;
|
||||||
#endif
|
#endif
|
||||||
@ -808,7 +815,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
{
|
{
|
||||||
if (!bKeyHeld)
|
if (!bKeyHeld)
|
||||||
{
|
{
|
||||||
const char Character = DTMF_GetCharacter(Key);
|
const char Character = DTMF_GetCharacter(Key - KEY_0);
|
||||||
if (Character != 0xFF)
|
if (Character != 0xFF)
|
||||||
{ // add key to DTMF string
|
{ // add key to DTMF string
|
||||||
DTMF_Append(Character);
|
DTMF_Append(Character);
|
||||||
@ -827,7 +834,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
|||||||
// TODO: ???
|
// TODO: ???
|
||||||
if (Key > KEY_PTT)
|
if (Key > KEY_PTT)
|
||||||
{
|
{
|
||||||
Key = KEY_SIDE2;
|
Key = KEY_SIDE2; // what's this doing ???
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Key)
|
switch (Key)
|
||||||
|
@ -58,10 +58,10 @@ enum GPIOC_PINS {
|
|||||||
GPIOC_PIN_PTT = 5
|
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);
|
uint8_t GPIO_CheckBit(volatile uint32_t *pReg, uint8_t Bit);
|
||||||
void GPIO_FlipBit(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_SetBit( volatile uint32_t *pReg, uint8_t Bit);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -22,10 +22,10 @@
|
|||||||
#include "driver/i2c.h"
|
#include "driver/i2c.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
KEY_Code_t gKeyReading0 = KEY_INVALID;
|
KEY_Code_t gKeyReading0 = KEY_INVALID;
|
||||||
KEY_Code_t gKeyReading1 = KEY_INVALID;
|
KEY_Code_t gKeyReading1 = KEY_INVALID;
|
||||||
uint16_t gDebounceCounter;
|
uint16_t gDebounceCounter = 0;
|
||||||
bool gWasFKeyPressed;
|
bool gWasFKeyPressed = false;
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
|
|
||||||
@ -42,9 +42,8 @@ static const struct {
|
|||||||
|
|
||||||
} keyboard[] = {
|
} keyboard[] = {
|
||||||
|
|
||||||
// Zero row
|
{ // Zero row
|
||||||
{
|
// Set to zero to handle special case of nothing pulled down
|
||||||
// Set to zero to handle special case of nothing pulled down.
|
|
||||||
.set_to_zero_mask = 0xffff,
|
.set_to_zero_mask = 0xffff,
|
||||||
.pins = {
|
.pins = {
|
||||||
{ .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0},
|
{ .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
|
// Read all 4 GPIO pins at once
|
||||||
reg = GPIOA->DATA;
|
reg = GPIOA->DATA;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
|
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
|
||||||
{
|
{
|
||||||
const uint16_t mask = 1u << keyboard[j].pins[i].pin;
|
const uint16_t mask = 1u << keyboard[j].pins[i].pin;
|
||||||
@ -134,13 +134,13 @@ KEY_Code_t KEYBOARD_Poll(void)
|
|||||||
break;
|
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
|
// This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high
|
||||||
I2C_Stop();
|
I2C_Stop();
|
||||||
|
|
||||||
// Reset VOICE pins
|
// Reset VOICE pins
|
||||||
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);
|
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;
|
return Key;
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,7 @@ void ST7565_FillScreen(uint8_t Value)
|
|||||||
ST7565_Init(false);
|
ST7565_Init(false);
|
||||||
|
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, false);
|
SPI_ToggleMasterMode(&SPI0->CR, false);
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
for (i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
@ -135,6 +136,7 @@ void ST7565_FillScreen(uint8_t Value)
|
|||||||
}
|
}
|
||||||
SPI_WaitForUndocumentedTxFifoStatusBit();
|
SPI_WaitForUndocumentedTxFifoStatusBit();
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, true);
|
SPI_ToggleMasterMode(&SPI0->CR, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,6 +154,8 @@ void ST7565_Init(const bool full)
|
|||||||
|
|
||||||
SYSTEM_DelayMs(120);
|
SYSTEM_DelayMs(120);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
SPI_ToggleMasterMode(&SPI0->CR, false);
|
||||||
|
|
||||||
ST7565_WriteByte(0xA2); // bias 9
|
ST7565_WriteByte(0xA2); // bias 9
|
||||||
ST7565_WriteByte(0xC0); // com normal
|
ST7565_WriteByte(0xC0); // com normal
|
||||||
@ -164,9 +168,10 @@ void ST7565_Init(const bool full)
|
|||||||
ST7565_WriteByte(0x24); //
|
ST7565_WriteByte(0x24); //
|
||||||
ST7565_WriteByte(0x81); // volume first ?
|
ST7565_WriteByte(0x81); // volume first ?
|
||||||
|
|
||||||
|
ST7565_WriteByte(0x1f); // contrast ?
|
||||||
|
|
||||||
if (full)
|
if (full)
|
||||||
{
|
{
|
||||||
ST7565_WriteByte(0x1f); // contrast ?
|
|
||||||
ST7565_WriteByte(0x2B); // power control ?
|
ST7565_WriteByte(0x2B); // power control ?
|
||||||
|
|
||||||
SYSTEM_DelayMs(1);
|
SYSTEM_DelayMs(1);
|
||||||
@ -181,11 +186,11 @@ void ST7565_Init(const bool full)
|
|||||||
ST7565_WriteByte(0x2F); //
|
ST7565_WriteByte(0x2F); //
|
||||||
|
|
||||||
SYSTEM_DelayMs(40);
|
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_WaitForUndocumentedTxFifoStatusBit();
|
||||||
|
|
||||||
SPI_ToggleMasterMode(&SPI0->CR, true);
|
SPI_ToggleMasterMode(&SPI0->CR, true);
|
||||||
|
BIN
firmware.bin
BIN
firmware.bin
Binary file not shown.
Binary file not shown.
@ -16,12 +16,13 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "driver/keyboard.h"
|
||||||
#include "ui/inputbox.h"
|
#include "ui/inputbox.h"
|
||||||
|
|
||||||
char gInputBox[8];
|
char gInputBox[8];
|
||||||
uint8_t gInputBoxIndex;
|
uint8_t gInputBoxIndex;
|
||||||
|
|
||||||
void INPUTBOX_Append(char Digit)
|
void INPUTBOX_Append(const char Digit)
|
||||||
{
|
{
|
||||||
if (gInputBoxIndex >= sizeof(gInputBox))
|
if (gInputBoxIndex >= sizeof(gInputBox))
|
||||||
return;
|
return;
|
||||||
@ -29,6 +30,6 @@ void INPUTBOX_Append(char Digit)
|
|||||||
if (gInputBoxIndex == 0)
|
if (gInputBoxIndex == 0)
|
||||||
memset(gInputBox, 10, sizeof(gInputBox));
|
memset(gInputBox, 10, sizeof(gInputBox));
|
||||||
|
|
||||||
gInputBox[gInputBoxIndex++] = Digit;
|
gInputBox[gInputBoxIndex++] = Digit - KEY_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
extern char gInputBox[8];
|
extern char gInputBox[8];
|
||||||
extern uint8_t gInputBoxIndex;
|
extern uint8_t gInputBoxIndex;
|
||||||
|
|
||||||
void INPUTBOX_Append(char Digit);
|
void INPUTBOX_Append(const char Digit);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user