assets
This commit is contained in:
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user