diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 481fe99..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "files.associations": { - "stm32h7xx_hal_conf.h": "c" - } -} \ No newline at end of file diff --git a/Application/Tasks/CMakeLists.txt b/Application/Tasks/CMakeLists.txt index 9b58a2d..439c08f 100644 --- a/Application/Tasks/CMakeLists.txt +++ b/Application/Tasks/CMakeLists.txt @@ -1,2 +1,3 @@ add_library(Tasks UsbDataHandler.c UsbDataHandler.h) -target_include_directories(Tasks PUBLIC ./) \ No newline at end of file +target_include_directories(Tasks PUBLIC ./) +target_link_libraries(Tasks PUBLIC PROTOS) \ No newline at end of file diff --git a/Application/Tasks/UsbDataHandler.c b/Application/Tasks/UsbDataHandler.c index c245cb7..2cdd9a3 100644 --- a/Application/Tasks/UsbDataHandler.c +++ b/Application/Tasks/UsbDataHandler.c @@ -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 +#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: - break; + 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; + } } - - - - } } @@ -132,4 +149,9 @@ USBD_StatusTypeDef UsbDataHandler_RxCallback(uint8_t* Buf, uint32_t Len) { } return USBD_OK; -} \ No newline at end of file +} + +__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) {} \ No newline at end of file diff --git a/Application/Tasks/UsbDataHandler.h b/Application/Tasks/UsbDataHandler.h index 6e64963..709035b 100644 --- a/Application/Tasks/UsbDataHandler.h +++ b/Application/Tasks/UsbDataHandler.h @@ -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 diff --git a/CMakeLists.txt b/CMakeLists.txt index e5ec203..c5a8afd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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( $<$: ${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 $<$: > $<$: - # -Wno-volatile - # -Wold-style-cast - # -Wuseless-cast - # -Wsuggest-override + -Wno-volatile + -Wold-style-cast + -Wuseless-cast + -Wsuggest-override > $<$:-x assembler-with-cpp -MMD -MP> $<$:-Og -g3 -ggdb> diff --git a/USB_DEVICE/App/usb_device.c b/USB_DEVICE/App/usb_device.c index c874093..36b6b76 100644 --- a/USB_DEVICE/App/usb_device.c +++ b/USB_DEVICE/App/usb_device.c @@ -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 */ }