135 lines
3.4 KiB
C
135 lines
3.4 KiB
C
|
|
|
|
#include "cmsis_os2.h"
|
|
#include "usbd_cdc.h"
|
|
#include "usbd_cdc_if.h"
|
|
|
|
#include "cmsis_os2.h"
|
|
|
|
/* Define the task attributes */
|
|
#define TASK_STACK_SIZE 1024
|
|
#define TASK_PRIORITY osPriorityNormal
|
|
|
|
/* Declare the thread function */
|
|
|
|
|
|
#define MAX_PACKET_SIZE 512-4 // Define your maximum packet size
|
|
#define NUM_BUFFERS 4 // Define the number of buffers you want to use
|
|
|
|
/* Declare static memory for the task */
|
|
static uint32_t UsbDataHandler_TaskStack[TASK_STACK_SIZE];
|
|
static const osThreadAttr_t UsbDataHandler_TaskAttr = {
|
|
.name = "UsbDataHandler",
|
|
.stack_mem = UsbDataHandler_TaskStack,
|
|
.stack_size = sizeof(UsbDataHandler_TaskStack),
|
|
.priority = TASK_PRIORITY
|
|
};
|
|
|
|
|
|
// Static queue data structures
|
|
static osMessageQueueId_t usbDataHandlerQueue;
|
|
static uint8_t usbDataHandlerQueueControlBlock[32];
|
|
static uint8_t usbDataHandlerQueueStorageArea[NUM_BUFFERS * sizeof(uint32_t)];
|
|
static const osMessageQueueAttr_t usbDataHandlerQueueAttr = {
|
|
.name = "UsbDataHandlerQueue",
|
|
.attr_bits = 0,
|
|
.cb_mem = &usbDataHandlerQueueControlBlock,
|
|
.cb_size = sizeof(usbDataHandlerQueueControlBlock),
|
|
.mq_mem = usbDataHandlerQueueStorageArea,
|
|
.mq_size = sizeof(usbDataHandlerQueueStorageArea)
|
|
};
|
|
|
|
typedef struct {
|
|
uint16_t type;
|
|
uint16_t length;
|
|
uint8_t data[MAX_PACKET_SIZE];
|
|
} Packet;
|
|
|
|
typedef union {
|
|
Packet pack;
|
|
uint8_t bytes[sizeof(Packet)];
|
|
}Packet_u;
|
|
|
|
|
|
Packet_u buffers[NUM_BUFFERS];
|
|
uint32_t bufferIndex = 0;
|
|
uint32_t dataIndex = 0;
|
|
uint16_t packetLength = 0;
|
|
|
|
void UsbDataHandler_Task(void *argument);
|
|
|
|
|
|
void UsbDataHander_Start(void) {
|
|
/* Create the task */
|
|
osThreadId_t UsbDataHandler_TaskHandle = osThreadNew(UsbDataHandler_Task, NULL, &UsbDataHandler_TaskAttr);
|
|
|
|
/* Create the message queue */
|
|
usbDataHandlerQueue = osMessageQueueNew(NUM_BUFFERS, sizeof(uint32_t), &usbDataHandlerQueueAttr);
|
|
|
|
|
|
/* Check if the task was created successfully */
|
|
if (UsbDataHandler_TaskHandle == NULL) {
|
|
/* Handle error */
|
|
}
|
|
}
|
|
|
|
void UsbDataHandler_Task(void *argument) {
|
|
uint32_t msg_buffer_index;
|
|
|
|
while(1) {
|
|
/* Wait for a full packet */
|
|
osMessageQueueGet(usbDataHandlerQueue, &msg_buffer_index, NULL, osWaitForever);
|
|
|
|
switch (buffers[msg_buffer_index].pack.type)
|
|
{
|
|
|
|
case 0xF01:
|
|
|
|
break;
|
|
|
|
case 0xF02:
|
|
break;
|
|
|
|
case 0xF03:
|
|
break;
|
|
|
|
case 0xF04:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
USBD_StatusTypeDef UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len) {
|
|
/* Copy the data into the current buffer */
|
|
for (uint32_t i = 0; i < Len; i++) {
|
|
buffers[bufferIndex].bytes[dataIndex] = Buf[i];
|
|
dataIndex++;
|
|
|
|
/* Check if we have received the packet type and length */
|
|
if (dataIndex == 4) {
|
|
/* Extract the packet length */
|
|
packetLength = buffers[bufferIndex].pack.length;
|
|
}
|
|
|
|
/* Check if we have received a full packet */
|
|
if (dataIndex - 4 == packetLength) {
|
|
/* Notify the task that a full packet is received */
|
|
osMessageQueuePut(usbDataHandlerQueue, &bufferIndex, 0, 0);
|
|
|
|
/* Prepare for the next packet */
|
|
bufferIndex = (bufferIndex + 1) % NUM_BUFFERS;
|
|
dataIndex = 0;
|
|
packetLength = 0;
|
|
}
|
|
}
|
|
|
|
return USBD_OK;
|
|
} |