First Draft of the UsbDataHandler
This commit is contained in:
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"stm32h7xx_hal_conf.h": "c"
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
add_library(Tasks UsbDataHandler.c UsbDataHandler.h)
|
||||
target_include_directories(Tasks PUBLIC ./)
|
||||
target_link_libraries(Tasks PUBLIC PROTOS)
|
||||
@@ -1,18 +1,16 @@
|
||||
|
||||
|
||||
#include "cmsis_os2.h"
|
||||
#include "usbd_cdc.h"
|
||||
#include "usbd_cdc_if.h"
|
||||
#include "usb_device.h"
|
||||
|
||||
#include "cmsis_os2.h"
|
||||
#include <pb_decode.h>
|
||||
#include "firmware.pb.h"
|
||||
|
||||
#include "UsbDataHandler.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
|
||||
|
||||
@@ -39,6 +37,7 @@ static const osMessageQueueAttr_t usbDataHandlerQueueAttr = {
|
||||
.mq_size = sizeof(usbDataHandlerQueueStorageArea)
|
||||
};
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint16_t type;
|
||||
uint16_t length;
|
||||
@@ -51,6 +50,14 @@ typedef union {
|
||||
}Packet_u;
|
||||
|
||||
|
||||
// static memory only for decoding messages
|
||||
union {
|
||||
FirmwareStart msg_FirmwareStart;
|
||||
FirmwarePackage msg_FirmwarePackage;
|
||||
FirmwarePackageAck msg_FirmwarePackageAck;
|
||||
FirmwareDone msg_FirmwareDone;
|
||||
} mem_msg_decode;
|
||||
|
||||
Packet_u buffers[NUM_BUFFERS];
|
||||
uint32_t bufferIndex = 0;
|
||||
uint32_t dataIndex = 0;
|
||||
@@ -66,43 +73,53 @@ void UsbDataHander_Start(void) {
|
||||
/* Create the message queue */
|
||||
usbDataHandlerQueue = osMessageQueueNew(NUM_BUFFERS, sizeof(uint32_t), &usbDataHandlerQueueAttr);
|
||||
|
||||
|
||||
/* Check if the task was created successfully */
|
||||
if (UsbDataHandler_TaskHandle == NULL) {
|
||||
if (UsbDataHandler_TaskHandle == NULL || usbDataHandlerQueue == NULL) {
|
||||
/* Handle error */
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
MX_USB_DEVICE_Init();
|
||||
|
||||
}
|
||||
|
||||
typedef void (*callback_func_t)(void*, uint32_t length);
|
||||
|
||||
typedef struct {
|
||||
uint16_t type;
|
||||
callback_func_t callback_func;
|
||||
void *msg_ptr;
|
||||
uint32_t msg_size;
|
||||
const pb_msgdesc_t *fields;
|
||||
} message_handler_t;
|
||||
|
||||
#define MESSAGE_HANDLER(type, message) {type, DataClbk_##message, &mem_msg_decode.msg_##message,message##_size , message##_fields}
|
||||
message_handler_t message_handlers[] = {
|
||||
MESSAGE_HANDLER(0xF01, FirmwareStart),
|
||||
MESSAGE_HANDLER(0xF02, FirmwarePackage),
|
||||
MESSAGE_HANDLER(0xF03, FirmwareDone),
|
||||
MESSAGE_HANDLER(0xF04, FirmwarePackageAck),
|
||||
};
|
||||
|
||||
void UsbDataHandler_Task(void *argument) {
|
||||
uint32_t msg_buffer_index;
|
||||
bool status;
|
||||
|
||||
while(1) {
|
||||
/* Wait for a full packet */
|
||||
osMessageQueueGet(usbDataHandlerQueue, &msg_buffer_index, NULL, osWaitForever);
|
||||
pb_istream_t stream = pb_istream_from_buffer(buffers[msg_buffer_index].pack.data, buffers[msg_buffer_index].pack.length);
|
||||
|
||||
switch (buffers[msg_buffer_index].pack.type)
|
||||
{
|
||||
|
||||
case 0xF01:
|
||||
|
||||
break;
|
||||
|
||||
case 0xF02:
|
||||
break;
|
||||
|
||||
case 0xF03:
|
||||
break;
|
||||
|
||||
case 0xF04:
|
||||
break;
|
||||
|
||||
default:
|
||||
for (uint32_t i = 0; i < sizeof(message_handlers) / sizeof(message_handler_t); i++) {
|
||||
if (buffers[msg_buffer_index].pack.type == message_handlers[i].type) {
|
||||
status = pb_decode(&stream, message_handlers[i].fields, message_handlers[i].msg_ptr);
|
||||
if (!status) {
|
||||
// Handle decode error
|
||||
}
|
||||
message_handlers[i].callback_func(message_handlers[i].msg_ptr, message_handlers[i].msg_size);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,3 +150,8 @@ USBD_StatusTypeDef UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len) {
|
||||
|
||||
return USBD_OK;
|
||||
}
|
||||
|
||||
__weak void DataClbk_FirmwareStart(void * msg, uint32_t length) {}
|
||||
__weak void DataClbk_FirmwarePackage(void * msg, uint32_t length) {}
|
||||
__weak void DataClbk_FirmwarePackageAck(void * msg, uint32_t length) {}
|
||||
__weak void DataClbk_FirmwareDone(void * msg, uint32_t length) {}
|
||||
@@ -2,6 +2,7 @@
|
||||
#define USBDATAHANDLER_H
|
||||
|
||||
#include "usbd_cdc_if.h"
|
||||
#include "firmware.pb.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -14,6 +15,11 @@ USBD_StatusTypeDef UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len);
|
||||
|
||||
|
||||
|
||||
void DataClbk_FirmwareStart(void * msg, uint32_t length);
|
||||
void DataClbk_FirmwarePackage(void * msg, uint32_t length);
|
||||
void DataClbk_FirmwarePackageAck(void * msg, uint32_t length);
|
||||
void DataClbk_FirmwareDone(void * msg, uint32_t length);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -61,14 +61,6 @@ set(linker_OPTS)
|
||||
include("cmake_generated/cmake_generated.cmake")
|
||||
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/nanopb/extra)
|
||||
find_package(Nanopb REQUIRED)
|
||||
include_directories(${NANOPB_INCLUDE_DIRS})
|
||||
nanopb_generate_cpp(PROTO_SRCS PROTO_HDRS RELPATH proto proto/firmware.proto)
|
||||
add_library(PROTOS ${PROTO_SRCS} ${PROTO_HDRS})
|
||||
target_include_directories(PROTOS PUBLIC ${NANOPB_INCLUDE_DIRS})
|
||||
|
||||
|
||||
# these options need to be applied for the hole project
|
||||
# so that all subprojects and libaries are compiled and compatable
|
||||
add_compile_options(
|
||||
@@ -99,6 +91,15 @@ add_link_options(
|
||||
-Wl,--print-memory-usage
|
||||
)
|
||||
|
||||
# Add project symbols (macros)
|
||||
add_compile_definitions(
|
||||
${symbols_SYMB}
|
||||
${symbols_c_SYMB}
|
||||
${symbols_cxx_SYMB}
|
||||
${symbols_asm_SYMB}
|
||||
)
|
||||
|
||||
|
||||
# Link directories setup
|
||||
# Must be before executable is added
|
||||
link_directories(${CMAKE_PROJECT_NAME} ${link_DIRS})
|
||||
@@ -118,17 +119,18 @@ include_directories(
|
||||
$<$<COMPILE_LANGUAGE:ASM>: ${include_asm_DIRS}>
|
||||
)
|
||||
|
||||
# Add project symbols (macros)
|
||||
add_compile_definitions(
|
||||
${symbols_SYMB}
|
||||
${symbols_c_SYMB}
|
||||
${symbols_cxx_SYMB}
|
||||
${symbols_asm_SYMB}
|
||||
)
|
||||
|
||||
add_subdirectory("lib")
|
||||
add_subdirectory("Application")
|
||||
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/nanopb/extra)
|
||||
find_package(Nanopb REQUIRED)
|
||||
include_directories(${NANOPB_INCLUDE_DIRS})
|
||||
nanopb_generate_cpp(PROTO_SRCS PROTO_HDRS RELPATH proto proto/firmware.proto)
|
||||
add_library(PROTOS ${PROTO_SRCS} ${PROTO_HDRS})
|
||||
target_include_directories(PROTOS PUBLIC ${NANOPB_INCLUDE_DIRS} ${PROJECT_BINARY_DIR})
|
||||
include_directories(${PROJECT_BINARY_DIR})
|
||||
|
||||
# Add linked libraries
|
||||
# target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC protobuf-nanopb-static)
|
||||
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver)
|
||||
@@ -141,10 +143,10 @@ target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE
|
||||
$<$<COMPILE_LANGUAGE:C>: >
|
||||
$<$<COMPILE_LANGUAGE:CXX>:
|
||||
|
||||
# -Wno-volatile
|
||||
# -Wold-style-cast
|
||||
# -Wuseless-cast
|
||||
# -Wsuggest-override
|
||||
-Wno-volatile
|
||||
-Wold-style-cast
|
||||
-Wuseless-cast
|
||||
-Wsuggest-override
|
||||
>
|
||||
$<$<COMPILE_LANGUAGE:ASM>:-x assembler-with-cpp -MMD -MP>
|
||||
$<$<CONFIG:Debug>:-Og -g3 -ggdb>
|
||||
|
||||
@@ -86,7 +86,7 @@ void MX_USB_DEVICE_Init(void)
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */
|
||||
HAL_PWREx_EnableUSBVoltageDetector();
|
||||
//HAL_PWREx_EnableUSBVoltageDetector();
|
||||
|
||||
/* USER CODE END USB_DEVICE_Init_PostTreatment */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user