This commit is contained in:
2025-11-21 19:36:36 -08:00
parent d5fa88642d
commit 1fa0398955
33 changed files with 115507 additions and 19190 deletions

View File

@@ -24,6 +24,7 @@
#include "usart.h"
#include "usb_device.h"
#include "gpio.h"
#include <stdbool.h>
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
@@ -33,11 +34,10 @@
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
// HID (Human Interface Device) report structure
typedef struct {
uint8_t MODIFIER; // Modifier keys (e.g., Ctrl, Shift, Alt, GUI/Win)
uint8_t RESERVED; // Reserved for alignment, always set to 0
uint8_t KEYPRESS[12]; // Array holding up to 12 keycodes being pressed
uint8_t MODIFIER; // Modifier keys (Ctrl, Shift, Alt, Win)
uint8_t RESERVED; // Always 0
uint8_t KEYPRESS[12]; // Up to 12 keycodes
} __attribute__((packed)) HIDReport;
@@ -55,6 +55,42 @@ typedef struct {
uint8_t KEYPRESS[12]; // Keypress data (similar to HIDReport, but for UART transmission)
} __attribute__((packed)) UARTMessage;
#define PACKET_SIZE 12
#define QUEUE_CAPACITY 32
typedef struct {
uint8_t data[QUEUE_CAPACITY][PACKET_SIZE];
volatile uint8_t head; // accessed in main
volatile uint8_t tail; // accessed in ISR
volatile uint8_t count; // optional, only if needed
} PacketQueue;
// Initialize
void pq_init(PacketQueue *q){
q->head = 0;
q->tail = 0;
q->count = 0;
}
// Called from ISR
bool pq_push(PacketQueue *q, const uint8_t packet[PACKET_SIZE]){
uint8_t nextTail = (q->tail + 1) % QUEUE_CAPACITY;
if(nextTail == q->head) return false; // queue full
memcpy(q->data[q->tail], packet, PACKET_SIZE);
q->tail = nextTail;
return true;
}
// Called from main
bool pq_pop(PacketQueue *q, uint8_t out_packet[PACKET_SIZE]){
if(q->head == q->tail) return false; // queue empty
memcpy(out_packet, q->data[q->head], PACKET_SIZE);
q->head = (q->head + 1) % QUEUE_CAPACITY;
return true;
}
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
@@ -72,6 +108,7 @@ typedef struct {
#define MODE_ACTIVE 2
#define MODE_DEBUG 3
#define UART_RX_BUFF_SIZE 64
#define QUEUE_SIZ 8
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
@@ -117,6 +154,8 @@ uint16_t DEPTH = 0;
uint16_t PORT_DEPTH[] = {0xFF, 0xFF, 0xFF, 0xFF};
UART_HandleTypeDef* PARENT;
UART_HandleTypeDef* PORTS[] = {&huart5, &huart1, &huart2, &huart4};
uint8_t KEYSTATE_CHANGED_FLAG = 0;
uint8_t KEYSTATE[ROW][COL];
//North East South West
UARTMessage reportBuff;
@@ -128,6 +167,15 @@ volatile int uartUpdateFlag = 0;
// Encoder state (TIM3 in encoder mode on PA6/PA7)
volatile int32_t LAST_ENCODER_COUNT = 0;
uint8_t UART_KEYSTATE[4][12];
PacketQueue huart1q;
PacketQueue huart2q;
PacketQueue huart4q;
PacketQueue huart5q;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@@ -142,6 +190,7 @@ void encoderProcess(void);
void resetReport(void);
void sendMessage(void);
void findBestParent();
void mergeChild();
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
@@ -194,9 +243,18 @@ int main(void)
HAL_UART_Receive_DMA(&huart2, (uint8_t*)&RX2Msg, sizeof(UARTMessage));
HAL_UART_Receive_DMA(&huart4, (uint8_t*)&RX4Msg, sizeof(UARTMessage));
HAL_UART_Receive_DMA(&huart5, (uint8_t*)&RX5Msg, sizeof(UARTMessage));
// Start TIM3 encoder (PA6/PA7) so we can read encoder delta
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
LAST_ENCODER_COUNT = __HAL_TIM_GET_COUNTER(&htim3);
//Prealloc Kestate matrix
memset(KEYSTATE, 0, sizeof(KEYSTATE));
pq_init(&huart1q);
pq_init(&huart2q);
pq_init(&huart4q);
pq_init(&huart5q);
/* USER CODE END 2 */
/* Infinite loop */
@@ -205,14 +263,18 @@ int main(void)
{
switch (MODE){
case MODE_ACTIVE:
KEYSTATE_CHANGED_FLAG = 1;
resetReport();
matrixScan();
encoderProcess();
UARTMessage UARTREPORT;
UARTREPORT.DEPTH = DEPTH;
UARTREPORT.TYPE = 0xEE;
memcpy(UARTREPORT.KEYPRESS, REPORT.KEYPRESS, sizeof(UARTREPORT.KEYPRESS));
HAL_UART_Transmit_DMA(PARENT, (uint8_t*)&UARTREPORT, sizeof(UARTREPORT));
mergeChild();
//encoderProcess();
if(KEYSTATE_CHANGED_FLAG == 1){
UARTMessage UARTREPORT;
UARTREPORT.DEPTH = DEPTH;
UARTREPORT.TYPE = 0xEE;
memcpy(UARTREPORT.KEYPRESS, REPORT.KEYPRESS, sizeof(UARTREPORT.KEYPRESS));
HAL_UART_Transmit_DMA(PARENT, (uint8_t*)&UARTREPORT, sizeof(UARTREPORT));
}
break;
case MODE_INACTIVE:
@@ -223,6 +285,8 @@ int main(void)
}else{
//TODO: Look for a parent module...
UARTMessage REQ;
REQ.DEPTH = 0;
REQ.TYPE = 0xFF; //Message code for request is 0xFF
@@ -241,14 +305,8 @@ int main(void)
case MODE_MAINBOARD:
resetReport();
matrixScan();//Something related to this making the key stick. Likely due to race conditions
encoderProcess();
if(uartUpdateFlag){
for(int i = 0; i < 12; i++){
REPORT.KEYPRESS[i] |= uartBuffer.KEYPRESS[i];
}
uartUpdateFlag = 0;
memset(uartBuffer.KEYPRESS, 0, 12);
}
mergeChild();
//encoderProcess();
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*)&REPORT, sizeof(REPORT));
break;
@@ -256,7 +314,7 @@ int main(void)
break;
}
HAL_Delay(100);
HAL_Delay(20);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
@@ -264,6 +322,31 @@ int main(void)
/* USER CODE END 3 */
}
void mergeChild(){
uint8_t packet[12];
if (pq_pop(&huart1q, packet)) {
memcpy(UART_KEYSTATE[1], packet, 12);
KEYSTATE_CHANGED_FLAG = 1;
}
if (pq_pop(&huart2q, packet)) {
memcpy(UART_KEYSTATE[2], packet, 12);
KEYSTATE_CHANGED_FLAG = 1;
}
if (pq_pop(&huart4q, packet)) {
memcpy(UART_KEYSTATE[3], packet, 12);
KEYSTATE_CHANGED_FLAG = 1;
}
if (pq_pop(&huart5q, packet)) {
memcpy(UART_KEYSTATE[0], packet, 12);
KEYSTATE_CHANGED_FLAG = 1;
}
for(int i = 0; i < 4; i++){
for(int j = 0; j < 12; j++){
REPORT.KEYPRESS[j] |= UART_KEYSTATE[i][j];
}
}
}
/**
* @brief System Clock Configuration
* @retval None
@@ -404,12 +487,22 @@ void handleUARTMessages(uint8_t *data, UART_HandleTypeDef *sender) {
case 0xEE:
//TODO: Append message to the thingy
if (MODE != MODE_INACTIVE) {
for (int i = 0; i < sizeof(REPORT.KEYPRESS); i++) {
uartBuffer.KEYPRESS[i] |= msg.KEYPRESS[i];
}
uartUpdateFlag = 1;
}
// if (MODE != MODE_INACTIVE) {
// for (int i = 0; i < sizeof(REPORT.KEYPRESS); i++) {
// uartBuffer.KEYPRESS[i] |= msg.KEYPRESS[i];
// }
// uartUpdateFlag = 1;
// }
if(sender == &huart5) {
pq_push(&huart5q, msg.KEYPRESS);
} else if(sender == &huart1) {
pq_push(&huart1q, msg.KEYPRESS);
} else if(sender == &huart2) {
pq_push(&huart2q, msg.KEYPRESS);
} else if(sender == &huart4) {
pq_push(&huart4q, msg.KEYPRESS);
}
break;
default:
@@ -428,18 +521,26 @@ void addUSBReport(uint8_t usageID){
}
void matrixScan(void){
for (uint8_t col = 0; col < COL; col++){
HAL_GPIO_WritePin(COLUMN_PINS[col].GPIOx, COLUMN_PINS[col].PIN, GPIO_PIN_SET);
HAL_Delay(1);
for(uint8_t row = 0; row < ROW; row++){
if(HAL_GPIO_ReadPin(ROW_PINS[row].GPIOx, ROW_PINS[row].PIN)){
addUSBReport(KEYCODES[row][col]);
uint8_t new_key = HAL_GPIO_ReadPin(ROW_PINS[row].GPIOx, ROW_PINS[row].PIN);
if(new_key != KEYSTATE[row][col]){
KEYSTATE_CHANGED_FLAG = 1;
KEYSTATE[row][col] = new_key;
}
if(new_key){
addUSBReport(KEYCODES[row][col]);
}
}
HAL_GPIO_WritePin(COLUMN_PINS[col].GPIOx, COLUMN_PINS[col].PIN, GPIO_PIN_RESET);
}
}
// Read TIM3 encoder counter, calculate delta and add corresponding keycodes
void encoderProcess(void){
int32_t cnt = (int32_t)__HAL_TIM_GET_COUNTER(&htim3);
@@ -466,8 +567,7 @@ void encoderProcess(void){
}
void resetReport(void){
REPORT.MODIFIER = 0;
memset(REPORT.KEYPRESS, 0, sizeof(REPORT.KEYPRESS));
memset(REPORT.KEYPRESS, 0, sizeof(REPORT.KEYPRESS));
}
/* USER CODE END 4 */

View File

@@ -1,10 +1,15 @@
../Core/Src/main.c:153:5:main 8
../Core/Src/main.c:263:6:SystemClock_Config 3
../Core/Src/main.c:307:6:HAL_UART_RxCpltCallback 5
../Core/Src/main.c:326:6:HAL_UART_ErrorCallback 5
../Core/Src/main.c:344:6:findBestParent 4
../Core/Src/main.c:365:6:handleUARTMessages 12
../Core/Src/main.c:414:6:addUSBReport 3
../Core/Src/main.c:422:6:matrixScan 4
../Core/Src/main.c:435:6:resetReport 1
../Core/Src/main.c:446:6:Error_Handler 1
../Core/Src/main.c:69:6:pq_init 1
../Core/Src/main.c:76:6:pq_push 2
../Core/Src/main.c:86:6:pq_pop 2
../Core/Src/main.c:205:5:main 7
../Core/Src/main.c:325:6:mergeChild 7
../Core/Src/main.c:354:6:SystemClock_Config 3
../Core/Src/main.c:398:6:HAL_UART_RxCpltCallback 5
../Core/Src/main.c:417:6:HAL_UART_ErrorCallback 5
../Core/Src/main.c:435:6:findBestParent 4
../Core/Src/main.c:456:6:handleUARTMessages 14
../Core/Src/main.c:515:6:addUSBReport 3
../Core/Src/main.c:523:6:matrixScan 5
../Core/Src/main.c:545:6:encoderProcess 9
../Core/Src/main.c:569:6:resetReport 1
../Core/Src/main.c:579:6:Error_Handler 1

View File

@@ -1,10 +1,15 @@
../Core/Src/main.c:153:5:main 48 static
../Core/Src/main.c:263:6:SystemClock_Config 88 static
../Core/Src/main.c:307:6:HAL_UART_RxCpltCallback 16 static
../Core/Src/main.c:326:6:HAL_UART_ErrorCallback 16 static
../Core/Src/main.c:344:6:findBestParent 24 static
../Core/Src/main.c:365:6:handleUARTMessages 64 static
../Core/Src/main.c:414:6:addUSBReport 24 static
../Core/Src/main.c:422:6:matrixScan 16 static
../Core/Src/main.c:435:6:resetReport 8 static
../Core/Src/main.c:446:6:Error_Handler 4 static,ignoring_inline_asm
../Core/Src/main.c:69:6:pq_init 16 static
../Core/Src/main.c:76:6:pq_push 24 static
../Core/Src/main.c:86:6:pq_pop 16 static
../Core/Src/main.c:205:5:main 40 static
../Core/Src/main.c:325:6:mergeChild 40 static
../Core/Src/main.c:354:6:SystemClock_Config 88 static
../Core/Src/main.c:398:6:HAL_UART_RxCpltCallback 16 static
../Core/Src/main.c:417:6:HAL_UART_ErrorCallback 16 static
../Core/Src/main.c:435:6:findBestParent 24 static
../Core/Src/main.c:456:6:handleUARTMessages 56 static
../Core/Src/main.c:515:6:addUSBReport 24 static
../Core/Src/main.c:523:6:matrixScan 16 static
../Core/Src/main.c:545:6:encoderProcess 32 static
../Core/Src/main.c:569:6:resetReport 8 static
../Core/Src/main.c:579:6:Error_Handler 4 static,ignoring_inline_asm

View File

@@ -7,6 +7,7 @@
C_SRCS += \
../Core/Src/dma.c \
../Core/Src/gpio.c \
../Core/Src/hid_queue.c \
../Core/Src/i2c.c \
../Core/Src/main.c \
../Core/Src/stm32f4xx_hal_msp.c \
@@ -20,6 +21,7 @@ C_SRCS += \
OBJS += \
./Core/Src/dma.o \
./Core/Src/gpio.o \
./Core/Src/hid_queue.o \
./Core/Src/i2c.o \
./Core/Src/main.o \
./Core/Src/stm32f4xx_hal_msp.o \
@@ -33,6 +35,7 @@ OBJS += \
C_DEPS += \
./Core/Src/dma.d \
./Core/Src/gpio.d \
./Core/Src/hid_queue.d \
./Core/Src/i2c.d \
./Core/Src/main.d \
./Core/Src/stm32f4xx_hal_msp.d \
@@ -51,7 +54,7 @@ Core/Src/%.o Core/Src/%.su Core/Src/%.cyclo: ../Core/Src/%.c Core/Src/subdir.mk
clean: clean-Core-2f-Src
clean-Core-2f-Src:
-$(RM) ./Core/Src/dma.cyclo ./Core/Src/dma.d ./Core/Src/dma.o ./Core/Src/dma.su ./Core/Src/gpio.cyclo ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/i2c.cyclo ./Core/Src/i2c.d ./Core/Src/i2c.o ./Core/Src/i2c.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.cyclo ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.cyclo ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.cyclo ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su ./Core/Src/tim.cyclo ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/usart.cyclo ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su
-$(RM) ./Core/Src/dma.cyclo ./Core/Src/dma.d ./Core/Src/dma.o ./Core/Src/dma.su ./Core/Src/gpio.cyclo ./Core/Src/gpio.d ./Core/Src/gpio.o ./Core/Src/gpio.su ./Core/Src/hid_queue.cyclo ./Core/Src/hid_queue.d ./Core/Src/hid_queue.o ./Core/Src/hid_queue.su ./Core/Src/i2c.cyclo ./Core/Src/i2c.d ./Core/Src/i2c.o ./Core/Src/i2c.su ./Core/Src/main.cyclo ./Core/Src/main.d ./Core/Src/main.o ./Core/Src/main.su ./Core/Src/stm32f4xx_hal_msp.cyclo ./Core/Src/stm32f4xx_hal_msp.d ./Core/Src/stm32f4xx_hal_msp.o ./Core/Src/stm32f4xx_hal_msp.su ./Core/Src/stm32f4xx_it.cyclo ./Core/Src/stm32f4xx_it.d ./Core/Src/stm32f4xx_it.o ./Core/Src/stm32f4xx_it.su ./Core/Src/syscalls.cyclo ./Core/Src/syscalls.d ./Core/Src/syscalls.o ./Core/Src/syscalls.su ./Core/Src/sysmem.cyclo ./Core/Src/sysmem.d ./Core/Src/sysmem.o ./Core/Src/sysmem.su ./Core/Src/system_stm32f4xx.cyclo ./Core/Src/system_stm32f4xx.d ./Core/Src/system_stm32f4xx.o ./Core/Src/system_stm32f4xx.su ./Core/Src/tim.cyclo ./Core/Src/tim.d ./Core/Src/tim.o ./Core/Src/tim.su ./Core/Src/usart.cyclo ./Core/Src/usart.d ./Core/Src/usart.o ./Core/Src/usart.su
.PHONY: clean-Core-2f-Src

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
"./Core/Src/dma.o"
"./Core/Src/gpio.o"
"./Core/Src/hid_queue.o"
"./Core/Src/i2c.o"
"./Core/Src/main.o"
"./Core/Src/stm32f4xx_hal_msp.o"

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{"hostname":"framework16","username":"ukim"}