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 */
|
||||
|
||||
Reference in New Issue
Block a user