0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-04-28 14:21:25 +03:00

Fixed silly error I made

This commit is contained in:
OneOfEleven 2023-10-05 16:28:20 +01:00
parent bd9f337a5b
commit 40d09591b3
8 changed files with 123 additions and 121 deletions

View File

@ -200,6 +200,8 @@ endif
# May cause unhelpful build failures # May cause unhelpful build failures
#CFLAGS += -Wpadded #CFLAGS += -Wpadded
# catch any and all warnings
CFLAGS += -Wextra CFLAGS += -Wextra
CFLAGS += -DPRINTF_INCLUDE_CONFIG_H CFLAGS += -DPRINTF_INCLUDE_CONFIG_H

View File

@ -1376,7 +1376,7 @@ void APP_CheckKeys(void)
Key == KEY_DOWN || Key == KEY_DOWN ||
Key == KEY_EXIT || Key == KEY_EXIT ||
Key == KEY_MENU || Key == KEY_MENU ||
Key <= KEY_9) // keys 0-9 can be held down to bypass pressing the F-Key (Key >= KEY_0 && Key <= KEY_9)) // keys 0-9 can be held down to bypass pressing the F-Key
{ {
gKeyBeingHeld = true; gKeyBeingHeld = true;
APP_ProcessKey(Key, true, true); APP_ProcessKey(Key, true, true);

View File

@ -1175,7 +1175,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (edit_index < 10) if (edit_index < 10)
{ {
if (/* Key >= KEY_0 && */ Key <= KEY_9) if (Key >= KEY_0 && Key <= KEY_9)
{ {
edit[edit_index] = '0' + Key - KEY_0; edit[edit_index] = '0' + Key - KEY_0;

View File

@ -28,70 +28,69 @@ uint16_t gDebounceCounter;
bool gWasFKeyPressed; bool gWasFKeyPressed;
static const struct { static const struct {
// Using a 16 bit pre-calculated shift and invert is cheaper
// than using 8 bit and doing shift and invert in code.
uint16_t set_to_zero_mask;
//We are very fortunate. // Using a 16 bit pre-calculated shift and invert is cheaper
//The key and pin defines fit together in a single u8, // than using 8 bit and doing shift and invert in code.
//making this very efficient uint16_t set_to_zero_mask;
struct {
uint8_t key : 5; //Key 23 is highest // We are very fortunate.
uint8_t pin : 3; //Pin 6 is highest // The key and pin defines fit together in a single u8, making this very efficient
} pins[4]; struct {
} keyboard[5] = { uint8_t key : 5; // Key 23 is highest
/* Zero row */ uint8_t pin : 3; // Pin 6 is highest
{ } pins[4];
//Set to zero to handle special case of nothing pulled down.
.set_to_zero_mask = 0, } keyboard[] = {
.pins = {
{ .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0}, // Zero row
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, {
/* Duplicate to fill the array with valid values */ // Set to zero to handle special case of nothing pulled down.
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, .set_to_zero_mask = 0xffff,
{ .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1}, .pins = {
} { .key = KEY_SIDE1, .pin = GPIOA_PIN_KEYBOARD_0},
}, { .key = KEY_SIDE2, .pin = GPIOA_PIN_KEYBOARD_1},
/* First row */
{ // Duplicate to fill the array with valid values
.set_to_zero_mask = (uint16_t)(~(1u << GPIOA_PIN_KEYBOARD_4)), { .key = KEY_INVALID, .pin = GPIOA_PIN_KEYBOARD_1},
.pins = { { .key = KEY_INVALID, .pin = GPIOA_PIN_KEYBOARD_1}
{ .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0}, }
{ .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1}, },
{ .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2}, { // First row
{ .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_4) & 0xffff,
} .pins = {
}, { .key = KEY_MENU, .pin = GPIOA_PIN_KEYBOARD_0},
/* Second row */ { .key = KEY_1, .pin = GPIOA_PIN_KEYBOARD_1},
{ { .key = KEY_4, .pin = GPIOA_PIN_KEYBOARD_2},
.set_to_zero_mask = (uint16_t)(~(1u << GPIOA_PIN_KEYBOARD_5)), { .key = KEY_7, .pin = GPIOA_PIN_KEYBOARD_3}
.pins = { }
{ .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0}, },
{ .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1}, { // Second row
{ .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_5) & 0xffff,
{ .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3}, .pins = {
} { .key = KEY_UP, .pin = GPIOA_PIN_KEYBOARD_0},
}, { .key = KEY_2 , .pin = GPIOA_PIN_KEYBOARD_1},
/* Third row */ { .key = KEY_5 , .pin = GPIOA_PIN_KEYBOARD_2},
{ { .key = KEY_8 , .pin = GPIOA_PIN_KEYBOARD_3}
.set_to_zero_mask = (uint16_t)(~(1u << GPIOA_PIN_KEYBOARD_6)), }
.pins = { },
{ .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0}, { // Third row
{ .key = KEY_3 , .pin = GPIOA_PIN_KEYBOARD_1}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_6) & 0xffff,
{ .key = KEY_6 , .pin = GPIOA_PIN_KEYBOARD_2}, .pins = {
{ .key = KEY_9 , .pin = GPIOA_PIN_KEYBOARD_3}, { .key = KEY_DOWN, .pin = GPIOA_PIN_KEYBOARD_0},
} { .key = KEY_3 , .pin = GPIOA_PIN_KEYBOARD_1},
}, { .key = KEY_6 , .pin = GPIOA_PIN_KEYBOARD_2},
/* Fourth row */ { .key = KEY_9 , .pin = GPIOA_PIN_KEYBOARD_3}
{ }
.set_to_zero_mask = (uint16_t)(~(1u << GPIOA_PIN_KEYBOARD_7)), },
.pins = { { // Fourth row
{ .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0}, .set_to_zero_mask = ~(1u << GPIOA_PIN_KEYBOARD_7) & 0xffff,
{ .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1}, .pins = {
{ .key = KEY_0 , .pin = GPIOA_PIN_KEYBOARD_2}, { .key = KEY_EXIT, .pin = GPIOA_PIN_KEYBOARD_0},
{ .key = KEY_F , .pin = GPIOA_PIN_KEYBOARD_3}, { .key = KEY_STAR, .pin = GPIOA_PIN_KEYBOARD_1},
} { .key = KEY_0 , .pin = GPIOA_PIN_KEYBOARD_2},
}, { .key = KEY_F , .pin = GPIOA_PIN_KEYBOARD_3}
}
}
}; };
KEY_Code_t KEYBOARD_Poll(void) KEY_Code_t KEYBOARD_Poll(void)
@ -101,40 +100,43 @@ KEY_Code_t KEYBOARD_Poll(void)
// if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) // if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT))
// return KEY_PTT; // return KEY_PTT;
// ***************** // *****************
for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++)
for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++)
{
uint16_t reg;
// Set all high
GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 |
1u << GPIOA_PIN_KEYBOARD_5 |
1u << GPIOA_PIN_KEYBOARD_6 |
1u << GPIOA_PIN_KEYBOARD_7;
// Clear the pin we are selecting
GPIOA->DATA &= keyboard[j].set_to_zero_mask;
// Wait for the pins to stabilize
SYSTICK_DelayUs(1);
// Read all 4 GPIO pins at once
reg = GPIOA->DATA;
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
{ {
//Set all high const uint16_t mask = 1u << keyboard[j].pins[i].pin;
GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 | if (!(reg & mask))
1u << GPIOA_PIN_KEYBOARD_5 | {
1u << GPIOA_PIN_KEYBOARD_6 | Key = keyboard[j].pins[i].key;
1u << GPIOA_PIN_KEYBOARD_7 ; break;
//Clear the pin we are selecting }
GPIOA->DATA &= keyboard[j].set_to_zero_mask; }
//Wait for the pins to stabilize. 1 works for me. if (Key != KEY_INVALID)
SYSTICK_DelayUs(2); break;
}
// Read all 4 GPIO pins at once // Create I2C stop condition. Since we might have toggled I2C pins.
uint16_t reg = GPIOA->DATA; // This leaves GPIOA_PIN_KEYBOARD_4 and GPIOA_PIN_KEYBOARD_5 high
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) I2C_Stop();
{
uint16_t mask = 1u << keyboard[j].pins[i].pin;
if (!(reg & mask))
{
Key = keyboard[j].pins[i].key;
break;
}
}
if (Key != KEY_INVALID)
break;
}
//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 // Reset VOICE pins
GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6);

View File

@ -21,30 +21,28 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
enum KEY_Code_t { typedef enum {
KEY_0 = 0, KEY_INVALID = 0,
KEY_1 = 1, KEY_0,
KEY_2 = 2, KEY_1,
KEY_3 = 3, KEY_2,
KEY_4 = 4, KEY_3,
KEY_5 = 5, KEY_4,
KEY_6 = 6, KEY_5,
KEY_7 = 7, KEY_6,
KEY_8 = 8, KEY_7,
KEY_9 = 9, KEY_8,
KEY_MENU = 10, KEY_9,
KEY_UP = 11, KEY_MENU,
KEY_DOWN = 12, KEY_UP,
KEY_EXIT = 13, KEY_DOWN,
KEY_STAR = 14, KEY_EXIT,
KEY_F = 15, KEY_STAR,
KEY_PTT = 21, KEY_F,
KEY_SIDE2 = 22, KEY_PTT,
KEY_SIDE1 = 23, KEY_SIDE2,
KEY_INVALID = 255 KEY_SIDE1
}; } KEY_Code_t;
typedef enum KEY_Code_t KEY_Code_t;
extern KEY_Code_t gKeyReading0; extern KEY_Code_t gKeyReading0;
extern KEY_Code_t gKeyReading1; extern KEY_Code_t gKeyReading1;

Binary file not shown.

Binary file not shown.

4
misc.h
View File

@ -31,7 +31,7 @@
#define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) #define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST)
#define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) #define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST)
typedef enum { enum {
MR_CHANNEL_FIRST = 0, MR_CHANNEL_FIRST = 0,
MR_CHANNEL_LAST = 199u, MR_CHANNEL_LAST = 199u,
FREQ_CHANNEL_FIRST = 200u, FREQ_CHANNEL_FIRST = 200u,
@ -39,7 +39,7 @@ typedef enum {
NOAA_CHANNEL_FIRST = 207u, NOAA_CHANNEL_FIRST = 207u,
NOAA_CHANNEL_LAST = 216u, NOAA_CHANNEL_LAST = 216u,
LAST_CHANNEL LAST_CHANNEL
} channel_num_t; };
enum { enum {
FLASHLIGHT_OFF = 0, FLASHLIGHT_OFF = 0,