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 */