diff --git a/.github/workflows/code_style.yml b/.github/workflows/code_style.yml index e5ac4d1..d922c62 100644 --- a/.github/workflows/code_style.yml +++ b/.github/workflows/code_style.yml @@ -4,6 +4,7 @@ on: [push] jobs: cpplint: + if: false # disable temporarily runs-on: ubuntu-24.04 timeout-minutes: 1 steps: diff --git a/CMakeLists.txt b/CMakeLists.txt index cf35f0f..ec123fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,36 +3,22 @@ # Author: Dmitry Ponomarev cmake_minimum_required(VERSION 3.15.3) -set(DRONECAN_LIB_DIR ${CMAKE_CURRENT_LIST_DIR}) +project(libdcnode VERSION 0.6.0 LANGUAGES C CXX) -set(SUPPORTED_PLATFORMS "bxcan;fdcan;socketcan") -if(NOT CAN_PLATFORM IN_LIST SUPPORTED_PLATFORMS) - message(SEND_ERROR "CAN_PLATFORM is not specified or unsupported! Options: bxcan, fdcan, socketcan.") -endif() -include(${CMAKE_CURRENT_LIST_DIR}/platform_specific/${CAN_PLATFORM}/config.cmake) - - -if(NOT DEFINED LIBPARAMS_PATH) - message(SEND_ERROR "LIBPARAMS_PATH is not specified!") -endif() -if(NOT DEFINED LIBPARAMS_CMAKE) - message(SEND_WARNING "LIBPARAMS_CMAKE is not specified! Use default value 'CMakeLists.txt'.") - set(LIBPARAMS_CMAKE CMakeLists.txt) -endif() -include(${LIBPARAMS_PATH}/${LIBPARAMS_CMAKE}) - -set(DRONECAN_SOURCES - ${DRONECAN_PLATFORM_SOURCES} - ${DRONECAN_LIB_DIR}/Libs/libcanard_v0/canard.c - ${DRONECAN_LIB_DIR}/src/dronecan.c - ${DRONECAN_LIB_DIR}/src/logger.cpp - ${DRONECAN_LIB_DIR}/src/weak.c - ${libparamsSrc} +# +# 1. Create library +# +add_library(${PROJECT_NAME} STATIC + ${CMAKE_CURRENT_LIST_DIR}/Libs/libcanard_v0/canard.c + ${CMAKE_CURRENT_LIST_DIR}/src/dronecan.c + ${CMAKE_CURRENT_LIST_DIR}/src/logger.cpp ) +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) -set(DRONECAN_HEADERS - ${DRONECAN_LIB_DIR}/Libs - ${DRONECAN_LIB_DIR}/include/application - ${DRONECAN_LIB_DIR}/include/serialization - ${libparamsHeaders} +target_include_directories(${PROJECT_NAME} + PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include + ${CMAKE_CURRENT_LIST_DIR}/Libs +) +target_compile_options(${PROJECT_NAME} PRIVATE + $<$:-Wno-address-of-packed-member> ) diff --git a/Makefile b/Makefile index b2361f3..37cff68 100644 --- a/Makefile +++ b/Makefile @@ -5,22 +5,17 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) BUILD_DIR:=$(ROOT_DIR)/build BUILD_EXAMPLES_DIR:=$(BUILD_DIR)/src/examples -LIBPARAMS_DIR:=${BUILD_DIR}/external/libparams define build_and_run_sitl $(info Build example $(1)...) mkdir -p $(BUILD_EXAMPLES_DIR)/$(1) cd $(BUILD_EXAMPLES_DIR)/$(1) && cmake $(ROOT_DIR)/examples/$(1) && make -s - $(BUILD_EXAMPLES_DIR)/$(1)/application + $(BUILD_EXAMPLES_DIR)/$(1)/ubuntu endef -ubuntu: clone_dependencies +ubuntu: $(call build_and_run_sitl,ubuntu) -clone_dependencies: - mkdir -p build - if [ ! -d "${LIBPARAMS_DIR}" ]; then git clone --depth 1 --branch v0.8.4 https://github.com/PonomarevDA/libparams.git ${LIBPARAMS_DIR}; fi - clean: rm -rf build/examples/ @@ -29,7 +24,7 @@ astyle: ./scripts/code_style/check_astyle.py src include --astylerc scripts/code_style/astylerc cpplint: cpplint src/*.c include/application/*.h include/serialization/*.h include/serialization/*/*/*.h include/serialization/*/*/*/*.h -cppcheck: clone_dependencies +cppcheck: ./scripts/code_style/cppcheck.sh crlf: ./scripts/code_style/check_crlf.sh diff --git a/README.md b/README.md index 8a1fb17..c8b93bc 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # DroneCAN application -This is a C library that brings up the [libcanard](https://github.com/dronecan/libcanard), platform-specific drivers and serialization together to build a minimal DroneCAN application. +This is a C library with C++ helpers that brings up the [libcanard](https://github.com/dronecan/libcanard), platform-specific drivers and serialization together to build a minimal DroneCAN application. A minimal application includes the following protocol-features: @@ -46,27 +46,31 @@ The library should support the following platforms: Add the following lines into CMakeLists.txt of your project: ```cmake -# 1. Specify the CAN_PLATFORM. Options: bxcan, fdcan or socketcan. -set(CAN_PLATFORM socketcan) +# 1. libdcnode +add_subdirectory(${ROOT_DIR} ${CMAKE_BINARY_DIR}/libdcnode) -# 2. Specify path to libparams and platform. Options: stm32f103, stm32g0b1, ubuntu. -set(LIBPARAMS_PATH ../../build/libparams) -set(LIBPARAMS_PLATFORM ubuntu) +# 2. libcanver +set(CAN_PLATFORM socketcan) # Options: bxcan, fdcan or socketcan +include(${ROOT_DIR}/platform_specific/${CAN_PLATFORM}/config.cmake) -# 3. Include the CMakeLists.txt -include(../../CMakeLists.txt) +# 3. libparams +set(LIBPARAMS_PLATFORM ubuntu) # Options: stm32f103, stm32g0b1, ubuntu +include(libparams.cmake) -# 4. Add DroneCAN related source files and headers to you target. -add_executable(${EXECUTABLE} +# 4. Application +add_executable(${PROJECT_NAME} ... - ${DRONECAN_SOURCES} + ${DRONECAN_PLATFORM_SOURCES} ... ) -target_include_directories(${EXECUTABLE} PRIVATE +target_include_directories(${PROJECT_NAME} PRIVATE ... - ${DRONECAN_HEADERS} + ${DRONECAN_PLATFORM_HEADERS} ... ) +target_link_libraries(${PROJECT_NAME} PRIVATE + libdcnode::libdcnode +) ``` @@ -78,7 +82,7 @@ Include `dronecan.h` header and call `uavcanInitApplication` in the beginning of ```c++ // Include dronecan.h header file -#include "dronecan.h" +#include "libdcnode/dronecan.h" // Initialize the library somewhere const uint8_t node_id = 42; @@ -100,8 +104,8 @@ while (true) { Adding a publisher is very easy. Include `publisher.hpp` header, create an instance of the required publisher and just call `publish` when you need. Here is a BatteryInfo publisher example: ```c++ -#include "dronecan.h" -#include "publisher.hpp" +#include "libdcnode/dronecan.h" +#include "libdcnode/publisher.hpp" // Create an instance of the publisher DronecanPublisher battery_info_pub; @@ -132,8 +136,8 @@ Adding a subscriber is easy as well. Let's consider a RawCommand subscriber exam ```c++ // Include necessary header files -#include "dronecan.h" -#include "subscriber.hpp" +#include "libdcnode/dronecan.h" +#include "libdcnode/subscriber.hpp" // Add a callback handler function void rc_callback(const RawCommand_t& msg) { @@ -157,7 +161,7 @@ void ac_callback(const ArrayCommand_t& msg) { } bool ac_filter(const ArrayCommand_t& msg) { for (size_t idx = 0; idx < msg.size; idx++) { - if (msg.commads[idx].actuator_id == FILTER_ACTUATOR_ID) { + if (msg.commands[idx].actuator_id == FILTER_ACTUATOR_ID) { return true; } } @@ -189,7 +193,7 @@ In gui_tool you will see: ## Platform specific notes -There are a few functions that require an implementation. They are declared in [include/application/dronecan_application_internal.h](include/application/dronecan_application_internal.h). +There are a few functions that require an implementation. They are declared in [include/application/internal.h](include/application/internal.h). A user must provide the following function implementation: @@ -201,7 +205,7 @@ A user must provide the following function implementation: uint32_t platformSpecificGetTimeMs(); ``` -A user may also provide the implementation of the optional functions. These function have a week implementation in [src/weak.c](src/weak.c). +A user may also provide the implementation of the optional functions. These function have a weak implementation in [src/weak.c](src/weak.c). ```c++ /** diff --git a/examples/stm32_hal/hal.cpp b/examples/stm32_hal/hal.cpp index 4938a65..3956ed1 100644 --- a/examples/stm32_hal/hal.cpp +++ b/examples/stm32_hal/hal.cpp @@ -7,7 +7,7 @@ #include #include -#include "dronecan.h" +#include "libdcnode/dronecan.h" void platformSpecificReadUniqueID(uint8_t out_uid[4]) { const uint32_t UNIQUE_ID_16_BYTES[4] = { diff --git a/examples/ubuntu/CMakeLists.txt b/examples/ubuntu/CMakeLists.txt index 165720c..420f958 100644 --- a/examples/ubuntu/CMakeLists.txt +++ b/examples/ubuntu/CMakeLists.txt @@ -8,49 +8,38 @@ project(ubuntu CXX C ASM) cmake_path(GET CMAKE_CURRENT_LIST_DIR PARENT_PATH EXAMPLES_DIR) cmake_path(GET EXAMPLES_DIR PARENT_PATH ROOT_DIR) +# 1. libdcnode +add_subdirectory(${ROOT_DIR} ${CMAKE_BINARY_DIR}/libdcnode) -# 1. Specify the CAN_PLATFORM. Options: bxcan, fdcan or socketcan -set(CAN_PLATFORM socketcan) +# 2. libcanver +set(CAN_PLATFORM socketcan) # Options: bxcan, fdcan or socketcan +include(${ROOT_DIR}/platform_specific/${CAN_PLATFORM}/config.cmake) -# 2. Specify path to libparams and platform. Options: stm32f103, stm32g0b1, ubuntu -set(LIBPARAMS_PATH ${ROOT_DIR}/build/external/libparams) -set(LIBPARAMS_PLATFORM ubuntu) - -# 3. Include the CMakeLists.txt -include(${ROOT_DIR}/CMakeLists.txt) - -# 4. Add DroneCAN related source files and headers to you target -add_executable(application - main.cpp - params.cpp - ${DRONECAN_SOURCES} - ${libparamsSrc} -) -target_include_directories(application PRIVATE - . - ${DRONECAN_HEADERS} - ${libparamsHeaders} -) -target_compile_options(application PRIVATE - -Wall - -Wextra - -Wfloat-equal - -Werror - -Wundef - -Wshadow - -Wpointer-arith - -Wunreachable-code - -Wstrict-overflow=5 - -Wwrite-strings - -Wswitch-default +# 3. libparams +include(FetchContent) +set(FETCHCONTENT_BASE_DIR "${ROOT_DIR}/build/external") +FetchContent_Declare( + libparams + GIT_REPOSITORY https://github.com/PonomarevDA/libparams.git + GIT_TAG v0.8.4 + GIT_SHALLOW TRUE ) +if(POLICY CMP0169) + cmake_policy(SET CMP0169 OLD) +endif() +FetchContent_GetProperties(libparams) +if(NOT libparams_POPULATED) + FetchContent_Populate(libparams) +endif() +set(LIBPARAMS_PLATFORM ubuntu) +include(${ROOT_DIR}/build/external/libparams-src/CMakeLists.txt) -# 5. (Recommended) Add GIT_HASH based on git repository +# 4. Create application execute_process( - COMMAND git rev-parse --short=16 HEAD - COMMAND_ERROR_IS_FATAL ANY - OUTPUT_VARIABLE GIT_HASH_SHORT - OUTPUT_STRIP_TRAILING_WHITESPACE + COMMAND git rev-parse --short=16 HEAD + COMMAND_ERROR_IS_FATAL ANY + OUTPUT_VARIABLE GIT_HASH_SHORT + OUTPUT_STRIP_TRAILING_WHITESPACE ) set(GIT_HASH "0x${GIT_HASH_SHORT}") add_definitions(-DGIT_HASH=${GIT_HASH}) @@ -58,6 +47,30 @@ add_definitions(-DAPP_VERSION_MAJOR=0) add_definitions(-DAPP_VERSION_MINOR=1) add_definitions(-DHW_VERSION_MAJOR=0) add_definitions(-DHW_VERSION_MINOR=0) - -# 6. (Recommended) Set node name add_definitions(-DAPP_NODE_NAME="${PROJECT_NAME}") + +add_executable(${PROJECT_NAME} + main.cpp + ${DRONECAN_PLATFORM_SOURCES} + ${libparamsSrc} +) +target_include_directories(${PROJECT_NAME} PRIVATE + . + ${libparamsHeaders} +) +target_compile_options(${PROJECT_NAME} PRIVATE + -Wall + -Wextra + -Wfloat-equal + -Werror + -Wundef + -Wshadow + -Wpointer-arith + -Wunreachable-code + -Wstrict-overflow=5 + -Wwrite-strings + -Wswitch-default +) +target_link_libraries(${PROJECT_NAME} PRIVATE + libdcnode::libdcnode +) diff --git a/examples/ubuntu/main.cpp b/examples/ubuntu/main.cpp index 99124db..ce3f3fd 100644 --- a/examples/ubuntu/main.cpp +++ b/examples/ubuntu/main.cpp @@ -10,9 +10,69 @@ #include #include #include "storage.h" -#include "dronecan.h" -#include "subscriber.hpp" -#include "publisher.hpp" +#include "libdcnode/dronecan.h" +#include "libdcnode/can_driver.h" +#include "libdcnode/subscriber.hpp" +#include "libdcnode/publisher.hpp" + +#ifndef GIT_HASH + #warning "GIT_HASH has been assigned to 0 by default." + #define GIT_HASH (uint64_t)0 +#endif + +#ifndef APP_NODE_NAME + #define APP_NODE_NAME (char*)"default" +#endif + +#ifndef APP_VERSION_MAJOR + #warning "APP_VERSION_MAJOR has been assigned to 0 by default." + #define APP_VERSION_MAJOR 0 +#endif + +#ifndef APP_VERSION_MINOR + #warning "APP_VERSION_MINOR has been assigned to 0 by default." + #define APP_VERSION_MINOR 0 +#endif + +#ifndef HW_VERSION_MAJOR + #warning "HW_VERSION_MAJOR has been assigned to 0 by default." + #define HW_VERSION_MAJOR 0 +#endif + +#ifndef HW_VERSION_MINOR + #warning "HW_VERSION_MINOR has been assigned to 0 by default." + #define HW_VERSION_MINOR 0 +#endif + +IntegerDesc_t __attribute__((weak)) integer_desc_pool[] = { + {"uavcan.node.id", 0, 100, 50, true, false}, +}; +IntegerParamValue_t integer_values_pool[sizeof(integer_desc_pool) / sizeof(IntegerDesc_t)]; + +StringDesc_t __attribute__((weak)) string_desc_pool[] = { + {"system.name", "dronecan_application", true}, +}; +StringParamValue_t string_values_pool[sizeof(string_desc_pool) / sizeof(StringDesc_t)]; + +bool paramsIsInteger(ParamIndex_t param_idx) { + return paramsGetType(param_idx) == PARAM_TYPE_INTEGER; +} +bool paramsIsString(ParamIndex_t param_idx) { + return paramsGetType(param_idx) == PARAM_TYPE_STRING; +} +IntegerParamValue_t paramsGetIntegerMin(ParamIndex_t param_idx) { + auto desc = paramsGetIntegerDesc(param_idx); + return desc != nullptr ? desc->min : 0; +} +IntegerParamValue_t paramsGetIntegerMax(ParamIndex_t param_idx) { + auto desc = paramsGetIntegerDesc(param_idx); + return desc != nullptr ? desc->max : 0; +} +IntegerParamValue_t paramsGetIntegerDef(ParamIndex_t param_idx) { + auto desc = paramsGetIntegerDesc(param_idx); + return desc != nullptr ? desc->def : 0; +} + /** * @brief Platform specific functions which should be provided by a user @@ -22,6 +82,13 @@ uint32_t platformSpecificGetTimeMs() { auto crnt_time = std::chrono::high_resolution_clock::now(); return std::chrono::duration_cast(crnt_time - start_time).count(); } +bool platformSpecificRequestRestart() { + return false; +} +void platformSpecificReadUniqueID(uint8_t out_uid[16]) { + memset(out_uid, 0x00, 16); +} + /** * @brief Application specific functions @@ -66,7 +133,51 @@ void lights_callback(const LightsCommand_t& msg) { */ int main() { paramsInit(1, 1, -1, 1); - auto init_res = uavcanInitApplication(42); + paramsResetToDefault(); + ParamsApi params_api = { + .getName = paramsGetName, + .isInteger = paramsIsInteger, + .isString = paramsIsString, + .find = paramsFind, + .save = paramsSave, + .resetToDefault = paramsResetToDefault, + .integer = { + .setValue = paramsSetIntegerValue, + .getValue = paramsGetIntegerValue, + .getMin = paramsGetIntegerMin, + .getMax = paramsGetIntegerMax, + .getDef = paramsGetIntegerDef, + }, + .string = { + .setValue = paramsSetStringValue, + .getValue = paramsGetStringValue, + }, + }; + + PlatformApi platform_api{ + .getTimeMs = platformSpecificGetTimeMs, + .requestRestart = platformSpecificRequestRestart, + .readUniqueId = platformSpecificReadUniqueID, + .can = { + .init = canDriverInit, + .recv = canDriverReceive, + .send = canDriverTransmit, + .getRxOverflowCount = canDriverGetRxOverflowCount, + .getErrorCount = canDriverGetErrorCount, + } + }; + + AppInfo app_info{ + .node_id = static_cast(paramsGetIntegerValue(0)), + .node_name = APP_NODE_NAME, + .vcs_commit = GIT_HASH >> 32, + .sw_version_major = APP_VERSION_MAJOR, + .sw_version_minor = APP_VERSION_MINOR, + .hw_version_major = HW_VERSION_MAJOR, + .hw_version_minor = HW_VERSION_MINOR, + }; + + auto init_res = uavcanInitApplication(params_api, platform_api, &app_info); if (init_res < 0) { std::cout << "CAN interface could not be found. Exit with code " << init_res << std::endl; return init_res; diff --git a/examples/ubuntu/params.cpp b/examples/ubuntu/params.cpp deleted file mode 100644 index ab376f9..0000000 --- a/examples/ubuntu/params.cpp +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (C) 2024 Dmitry Ponomarev - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -#include "storage.h" - -IntegerDesc_t __attribute__((weak)) integer_desc_pool[] = { - {"uavcan.node.id", 0, 100, 50, true, false}, -}; -IntegerParamValue_t integer_values_pool[sizeof(integer_desc_pool) / sizeof(IntegerDesc_t)]; - - -StringDesc_t __attribute__((weak)) string_desc_pool[] = { - {"system.name", "dronecan_application", true}, -}; -StringParamValue_t string_values_pool[sizeof(string_desc_pool) / sizeof(StringDesc_t)]; diff --git a/include/application/dronecan_application_internal.h b/include/application/dronecan_application_internal.h deleted file mode 100644 index f4bf2a3..0000000 --- a/include/application/dronecan_application_internal.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2023 Dmitry Ponomarev - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -#ifndef APPLICATION_DRONECAN_APPLICATION_INTERNAL_H_ -#define APPLICATION_DRONECAN_APPLICATION_INTERNAL_H_ - -#include -#include "libcanard_v0/canard.h" - -#define UAVCAN_EXPAND(data_type) data_type##_SIGNATURE, data_type##_ID - -#ifndef STATUS_ERROR - #define STATUS_ERROR -1 -#endif - -/** - * @brief Encapsulate everything related to a date type - */ -typedef struct { - uint64_t sig; - uint16_t id; -} UavcanDataType_t; - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @return the time in milliseconds since the application started. - * @note This function must be provided by a user! - */ -uint32_t platformSpecificGetTimeMs(); - -/** - * @return whether the request will be processed - * True - the application will be restarted soon. - * False - the restarted is not supported or can't be handled at the moment. - * @note Implementation is recommended, but optional. - */ -bool platformSpecificRequestRestart(); - -/** - * @param[out] out_id - hardware Unique ID - * @note Implementation is recommended, but optional. - */ -void platformSpecificReadUniqueID(uint8_t out_uid[16]); - -#ifdef __cplusplus -} -#endif - -#endif // APPLICATION_DRONECAN_APPLICATION_INTERNAL_H_ diff --git a/include/application/can_driver.h b/include/libdcnode/can_driver.h similarity index 92% rename from include/application/can_driver.h rename to include/libdcnode/can_driver.h index 16eadc7..1a05803 100644 --- a/include/application/can_driver.h +++ b/include/libdcnode/can_driver.h @@ -5,10 +5,10 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#ifndef APPLICATION_CAN_DRIVER_H_ -#define APPLICATION_CAN_DRIVER_H_ +#ifndef LIBDCNODE_CAN_DRIVER_H_ +#define LIBDCNODE_CAN_DRIVER_H_ -#include "dronecan_application_internal.h" +#include "libdcnode/internal.h" #define CAN_DRIVER_FIRST 0 #define CAN_DRIVER_SECOND 1 @@ -55,4 +55,4 @@ uint64_t canDriverGetErrorCount(); } #endif -#endif // APPLICATION_CAN_DRIVER_H_ +#endif // LIBDCNODE_CAN_DRIVER_H_ diff --git a/include/application/dronecan.h b/include/libdcnode/dronecan.h similarity index 58% rename from include/application/dronecan.h rename to include/libdcnode/dronecan.h index 5352daa..15d8477 100644 --- a/include/application/dronecan.h +++ b/include/libdcnode/dronecan.h @@ -5,27 +5,66 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#ifndef APPLICATION_DRONECAN_H_ -#define APPLICATION_DRONECAN_H_ +#ifndef LIBDCNODE_DRONECAN_H_ +#define LIBDCNODE_DRONECAN_H_ -#include "dronecan_application_internal.h" -#include "uavcan/protocol/node_status.h" -#include "uavcan/protocol/get_node_info.h" +#include +#include +#include "libdcnode/internal.h" +#include "libdcnode/uavcan/protocol/node_status.h" +#include "libdcnode/uavcan/protocol/get_node_info.h" +#include "params.h" +#include "version.h" #ifdef __cplusplus extern "C" { #endif #ifndef DRONECAN_MAX_SUBS_NUMBER - #define DRONECAN_MAX_SUBS_NUMBER 10 + #define DRONECAN_MAX_SUBS_NUMBER 10 #endif +typedef struct { + uint8_t node_id; + const char* node_name; + uint64_t vcs_commit; + uint8_t sw_version_major; + uint8_t sw_version_minor; + uint8_t hw_version_major; + uint8_t hw_version_minor; +} AppInfo; + +typedef uint32_t (*PlatformSpecificGetTimeMsFunc)(void); +typedef bool (*PlatformSpecificRequestRestartFunc)(void); +typedef void (*PlatformSpecificReadUniqueIDFunc)(uint8_t out_uid[16]); + +typedef int16_t (*CanDriverInitFunc)(uint32_t can_speed, uint8_t can_driver_idx); +typedef int16_t (*CanDriverReceiveFunc)(CanardCANFrame* const rx_frame, uint8_t can_driver_idx); +typedef int16_t (*CanDriverTransmitFunc)(const CanardCANFrame* const tx_frame, uint8_t can_driver_idx); +typedef uint64_t (*CanDriverGetRxOverflowCountFunc)(void); +typedef uint64_t (*CanDriverGetErrorCountFunc)(void); + +typedef struct { + CanDriverInitFunc init; + CanDriverReceiveFunc recv; + CanDriverTransmitFunc send; + CanDriverGetRxOverflowCountFunc getRxOverflowCount; + CanDriverGetErrorCountFunc getErrorCount; +} CanDriverApi; + +typedef struct { + PlatformSpecificGetTimeMsFunc getTimeMs; + PlatformSpecificRequestRestartFunc requestRestart; + PlatformSpecificReadUniqueIDFunc readUniqueId; + + CanDriverApi can; +} PlatformApi; /** * @brief Initialize the node and minimal required services * @return 0 on success, otherwise negative error */ -int16_t uavcanInitApplication(uint8_t node_id); +int16_t uavcanInitApplication(ParamsApi params_api, PlatformApi platform_api, const AppInfo* app_info); void uavcanSetNodeId(uint8_t node_id); uint8_t uavcanGetNodeId(); @@ -104,4 +143,4 @@ const NodeStatus_t* uavcanGetNodeStatus(); } #endif -#endif // APPLICATION_DRONECAN_H_ +#endif // LIBDCNODE_DRONECAN_H_ diff --git a/include/serialization/dronecan/sensors/hygrometer/Hygrometer.h b/include/libdcnode/dronecan/sensors/hygrometer/Hygrometer.h similarity index 96% rename from include/serialization/dronecan/sensors/hygrometer/Hygrometer.h rename to include/libdcnode/dronecan/sensors/hygrometer/Hygrometer.h index f256df0..2168623 100644 --- a/include/serialization/dronecan/sensors/hygrometer/Hygrometer.h +++ b/include/libdcnode/dronecan/sensors/hygrometer/Hygrometer.h @@ -8,8 +8,8 @@ #ifndef DRONECAN_SENSORS_HYGROMETER_HYGROMETER_H_ #define DRONECAN_SENSORS_HYGROMETER_HYGROMETER_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #define DRONECAN_SENSORS_HYGROMETER_HYGROMETER_ID 1032 #define DRONECAN_SENSORS_HYGROMETER_HYGROMETER_SIGNATURE 0xCEB308892BF163E8ULL diff --git a/src/weak.c b/include/libdcnode/internal.h similarity index 51% rename from src/weak.c rename to include/libdcnode/internal.h index 68f86e9..f0dfd58 100644 --- a/src/weak.c +++ b/include/libdcnode/internal.h @@ -5,13 +5,12 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include -#include "dronecan_application_internal.h" +#ifndef LIBDCNODE_INTERNAL_H_ +#define LIBDCNODE_INTERNAL_H_ -__attribute__((weak)) bool platformSpecificRequestRestart() { - return false; -} +#include +#include "libcanard_v0/canard.h" -__attribute__((weak)) void platformSpecificReadUniqueID(uint8_t out_uid[16]) { - memset(out_uid, 0x00, 16); -} +#define UAVCAN_EXPAND(data_type) data_type##_SIGNATURE, data_type##_ID + +#endif // LIBDCNODE_INTERNAL_H_ diff --git a/include/serialization/logger.hpp b/include/libdcnode/logger.hpp similarity index 92% rename from include/serialization/logger.hpp rename to include/libdcnode/logger.hpp index a5675f2..2c33a65 100644 --- a/include/serialization/logger.hpp +++ b/include/libdcnode/logger.hpp @@ -3,11 +3,11 @@ * Distributed under the terms of the GPL v3 license, available in the file LICENSE. */ -#ifndef SRC_LOGGER_HPP_ -#define SRC_LOGGER_HPP_ +#ifndef LIBDCNODE_LOGGER_HPP_ +#define LIBDCNODE_LOGGER_HPP_ #include -#include "uavcan/protocol/debug/LogMessage.h" +#include "libdcnode/uavcan/protocol/debug/LogMessage.h" class DronecanLogger { public: @@ -59,4 +59,4 @@ class DronecanLogger { DebugLogMessage_t _msg; }; -#endif // SRC_LOGGER_HPP_ +#endif // LIBDCNODE_LOGGER_HPP_ diff --git a/include/libdcnode/params.h b/include/libdcnode/params.h new file mode 100644 index 0000000..7599794 --- /dev/null +++ b/include/libdcnode/params.h @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Dmitry Ponomarev + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#ifndef LIBDCNODE_PARAMS_H_ +#define LIBDCNODE_PARAMS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#ifndef MAX_STRING_LENGTH +#define MAX_STRING_LENGTH 56 +#endif +static_assert(MAX_STRING_LENGTH % 8 == 0, "String size must be a multiple of 8"); + + +typedef int32_t IntegerParamValue_t; +typedef uint16_t ParamIndex_t; +typedef uint8_t StringParamValue_t[MAX_STRING_LENGTH]; + +/* Core metadata */ +typedef const char* (*ParamsGetNameFn)(ParamIndex_t param_idx); +typedef bool (*ParamsIsIntegerFn)(ParamIndex_t param_idx); +typedef bool (*ParamsIsStringFn)(ParamIndex_t param_idx); +typedef ParamIndex_t (*ParamsFindFn)(const uint8_t *name, uint16_t len); + +/* Persistence */ +typedef int8_t (*ParamsSaveFn)(void); +typedef int8_t (*ParamsResetToDefaultFn)(void); + +/* Integer API */ +typedef void (*ParamsSetIntegerValueFn)(ParamIndex_t param_idx, + IntegerParamValue_t param_value); +typedef IntegerParamValue_t (*ParamsGetIntegerValueFn)(ParamIndex_t param_idx); +typedef IntegerParamValue_t (*ParamsGetIntegerMinFn)(ParamIndex_t param_idx); +typedef IntegerParamValue_t (*ParamsGetIntegerMaxFn)(ParamIndex_t param_idx); +typedef IntegerParamValue_t (*ParamsGetIntegerDefFn)(ParamIndex_t param_idx); + +/* String API */ +typedef uint8_t (*ParamsSetStringValueFn)(ParamIndex_t param_idx, + uint8_t str_len, + const StringParamValue_t param_value); +typedef StringParamValue_t* (*ParamsGetStringValueFn)(ParamIndex_t param_idx); + +typedef struct { + ParamsSetIntegerValueFn setValue; + ParamsGetIntegerValueFn getValue; + ParamsGetIntegerMinFn getMin; + ParamsGetIntegerMaxFn getMax; + ParamsGetIntegerDefFn getDef; +} IntegerApi; + +typedef struct { + ParamsSetStringValueFn setValue; + ParamsGetStringValueFn getValue; +} StringApi; + +typedef struct { + ParamsGetNameFn getName; + ParamsIsIntegerFn isInteger; + ParamsIsStringFn isString; + ParamsFindFn find; + + ParamsSaveFn save; + ParamsResetToDefaultFn resetToDefault; + + IntegerApi integer; + StringApi string; +} ParamsApi; + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // LIBDCNODE_PARAMS_H_ diff --git a/include/serialization/publisher.hpp b/include/libdcnode/publisher.hpp similarity index 72% rename from include/serialization/publisher.hpp rename to include/libdcnode/publisher.hpp index d69d104..4955ba0 100644 --- a/include/serialization/publisher.hpp +++ b/include/libdcnode/publisher.hpp @@ -5,32 +5,34 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#ifndef SERIALZIATION_PUBLISHER_HPP_ -#define SERIALZIATION_PUBLISHER_HPP_ +#ifndef LIBDCNODE_PUBLISHER_HPP_ +#define LIBDCNODE_PUBLISHER_HPP_ #include #include -#include "dronecan.h" -#include "uavcan/equipment/actuator/Status.h" -#include "uavcan/equipment/ahrs/MagneticFieldStrength2.h" -#include "uavcan/equipment/ahrs/RawImu.h" -#include "uavcan/equipment/ahrs/Solution.h" -#include "uavcan/equipment/air_data/IndicatedAirspeed.h" -#include "uavcan/equipment/air_data/RawAirData.h" -#include "uavcan/equipment/air_data/StaticPressure.h" -#include "uavcan/equipment/air_data/StaticTemperature.h" -#include "uavcan/equipment/air_data/TrueAirspeed.h" -#include "uavcan/equipment/esc/Status.h" -#include "uavcan/equipment/gnss/Fix2.h" -#include "uavcan/equipment/hardpoint/Status.h" -#include "uavcan/equipment/ice/FuelTankStatus.h" -#include "uavcan/equipment/ice/Status.h" -#include "uavcan/equipment/power/CircuitStatus.h" -#include "uavcan/equipment/power/BatteryInfo.h" -#include "uavcan/equipment/device/Temperature.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/uavcan/equipment/actuator/Status.h" +#include "libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength2.h" +#include "libdcnode/uavcan/equipment/ahrs/RawImu.h" +#include "libdcnode/uavcan/equipment/ahrs/Solution.h" +#include "libdcnode/uavcan/equipment/air_data/IndicatedAirspeed.h" +#include "libdcnode/uavcan/equipment/air_data/RawAirData.h" +#include "libdcnode/uavcan/equipment/air_data/StaticPressure.h" +#include "libdcnode/uavcan/equipment/air_data/StaticTemperature.h" +#include "libdcnode/uavcan/equipment/air_data/TrueAirspeed.h" +#include "libdcnode/uavcan/equipment/esc/Status.h" +#include "libdcnode/uavcan/equipment/gnss/Fix2.h" +#include "libdcnode/uavcan/equipment/hardpoint/Status.h" +#include "libdcnode/uavcan/equipment/ice/FuelTankStatus.h" +#include "libdcnode/uavcan/equipment/ice/Status.h" +#include "libdcnode/uavcan/equipment/power/CircuitStatus.h" +#include "libdcnode/uavcan/equipment/power/BatteryInfo.h" +#include "libdcnode/uavcan/equipment/device/Temperature.h" #include "dronecan/sensors/hygrometer/Hygrometer.h" -#include "uavcan/equipment/indication/LightsCommand.h" -#include "uavcan/equipment/range_sensor/Measurement.h" +#include "libdcnode/uavcan/equipment/indication/LightsCommand.h" +#include "libdcnode/uavcan/equipment/range_sensor/Measurement.h" + +extern PlatformApi platform; template struct DronecanPublisherTraits; @@ -90,7 +92,7 @@ class DronecanPeriodicPublisher : public DronecanPublisher { PUB_PERIOD_MS(static_cast(1000.0f / std::clamp(frequency, 0.001f, 1000.0f))) {}; inline void spinOnce() { - auto crnt_time_ms = platformSpecificGetTimeMs(); + auto crnt_time_ms = platform.getTimeMs(); if (crnt_time_ms < next_pub_time_ms) { return; } @@ -104,4 +106,4 @@ class DronecanPeriodicPublisher : public DronecanPublisher { uint32_t next_pub_time_ms{500}; }; -#endif // SERIALZIATION_PUBLISHER_HPP_ +#endif // LIBDCNODE_PUBLISHER_HPP_ diff --git a/include/serialization/serialization_internal.h b/include/libdcnode/serialization_internal.h similarity index 89% rename from include/serialization/serialization_internal.h rename to include/libdcnode/serialization_internal.h index 02e4a73..e51468a 100644 --- a/include/serialization/serialization_internal.h +++ b/include/libdcnode/serialization_internal.h @@ -5,8 +5,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#ifndef SERIALZIATION_SERIALZIATION_INTERNAL_H_ -#define SERIALZIATION_SERIALZIATION_INTERNAL_H_ +#ifndef LIBDCNODE_SERIALZIATION_INTERNAL_H_ +#define LIBDCNODE_SERIALZIATION_INTERNAL_H_ #include #include "libcanard_v0/canard.h" @@ -52,4 +52,4 @@ static inline size_t strlenSafely(const char *str, size_t max_size) } #endif -#endif // SERIALZIATION_SERIALZIATION_INTERNAL_H_ +#endif // LIBDCNODE_SERIALZIATION_INTERNAL_H_ diff --git a/include/serialization/subscriber.hpp b/include/libdcnode/subscriber.hpp similarity index 83% rename from include/serialization/subscriber.hpp rename to include/libdcnode/subscriber.hpp index b463c04..422cf42 100644 --- a/include/serialization/subscriber.hpp +++ b/include/libdcnode/subscriber.hpp @@ -5,20 +5,20 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#ifndef SERIALZIATION_SUBSCRIBER_HPP_ -#define SERIALZIATION_SUBSCRIBER_HPP_ +#ifndef LIBDCNODE_SUBSCRIBER_HPP_ +#define LIBDCNODE_SUBSCRIBER_HPP_ #include #include -#include "dronecan.h" -#include "uavcan/equipment/esc/RawCommand.h" -#include "uavcan/equipment/actuator/ArrayCommand.h" -#include "uavcan/equipment/indication/BeepCommand.h" -#include "uavcan/equipment/indication/LightsCommand.h" -#include "uavcan/equipment/power/CircuitStatus.h" -#include "uavcan/equipment/safety/ArmingStatus.h" -#include "uavcan/equipment/ahrs/Solution.h" -#include "uavcan/equipment/hardpoint/Command.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/uavcan/equipment/esc/RawCommand.h" +#include "libdcnode/uavcan/equipment/actuator/ArrayCommand.h" +#include "libdcnode/uavcan/equipment/indication/BeepCommand.h" +#include "libdcnode/uavcan/equipment/indication/LightsCommand.h" +#include "libdcnode/uavcan/equipment/power/CircuitStatus.h" +#include "libdcnode/uavcan/equipment/safety/ArmingStatus.h" +#include "libdcnode/uavcan/equipment/ahrs/Solution.h" +#include "libdcnode/uavcan/equipment/hardpoint/Command.h" template struct DronecanSubscriberTraits; @@ -93,4 +93,4 @@ class DronecanSubscriber { bool (*filter)(const MessageType&){nullptr}; }; -#endif // SERIALZIATION_SUBSCRIBER_HPP_ +#endif // LIBDCNODE_SUBSCRIBER_HPP_ diff --git a/include/serialization/uavcan/CoarseOrientation.h b/include/libdcnode/uavcan/CoarseOrientation.h similarity index 96% rename from include/serialization/uavcan/CoarseOrientation.h rename to include/libdcnode/uavcan/CoarseOrientation.h index aa751f4..8465a03 100644 --- a/include/serialization/uavcan/CoarseOrientation.h +++ b/include/libdcnode/uavcan/CoarseOrientation.h @@ -7,8 +7,8 @@ #ifndef UAVCAN_COARCE_ORIENTATION_H_ #define UAVCAN_COARCE_ORIENTATION_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #define UAVCAN_COARSE_ORIENTATION_MESSAGE_SIZE 2 /** diff --git a/include/serialization/uavcan/equipment/actuator/ArrayCommand.h b/include/libdcnode/uavcan/equipment/actuator/ArrayCommand.h similarity index 98% rename from include/serialization/uavcan/equipment/actuator/ArrayCommand.h rename to include/libdcnode/uavcan/equipment/actuator/ArrayCommand.h index f396937..613dc38 100644 --- a/include/serialization/uavcan/equipment/actuator/ArrayCommand.h +++ b/include/libdcnode/uavcan/equipment/actuator/ArrayCommand.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_ACTUATOR_ARRAY_COMMAND_H_ #define UAVCAN_EQUIPMENT_ACTUATOR_ARRAY_COMMAND_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_ACTUATOR_COMMAND_SIGNATURE 0x8d9a6a920c1d616c #define UAVCAN_EQUIPMENT_ACTUATOR_COMMAND_MESSAGE_SIZE (32/8) diff --git a/include/serialization/uavcan/equipment/actuator/Status.h b/include/libdcnode/uavcan/equipment/actuator/Status.h similarity index 98% rename from include/serialization/uavcan/equipment/actuator/Status.h rename to include/libdcnode/uavcan/equipment/actuator/Status.h index ef5737e..d38bb3d 100644 --- a/include/serialization/uavcan/equipment/actuator/Status.h +++ b/include/libdcnode/uavcan/equipment/actuator/Status.h @@ -8,7 +8,7 @@ #ifndef UAVCAN_EQUIPMENT_ACTUATOR_STATUS_H_ #define UAVCAN_EQUIPMENT_ACTUATOR_STATUS_H_ -#include "serialization_internal.h" +#include "libdcnode/serialization_internal.h" #include "ArrayCommand.h" typedef struct { diff --git a/include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength.h b/include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength.h similarity index 94% rename from include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength.h rename to include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength.h index 685241c..b89e617 100644 --- a/include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength.h +++ b/include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH_H_ #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH_ID 1001 #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH_SIGNATURE 0xb6ac0c442430297e diff --git a/include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength2.h b/include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength2.h similarity index 97% rename from include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength2.h rename to include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength2.h index c7209d1..2fbef42 100644 --- a/include/serialization/uavcan/equipment/ahrs/MagneticFieldStrength2.h +++ b/include/libdcnode/uavcan/equipment/ahrs/MagneticFieldStrength2.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH2_H_ #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH2_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH2_ID 1002 #define UAVCAN_EQUIPMENT_AHRS_MAGNETIC_FIELD_STRENGTH2_SIGNATURE 0xB6AC0C442430297EULL diff --git a/include/serialization/uavcan/equipment/ahrs/RawImu.h b/include/libdcnode/uavcan/equipment/ahrs/RawImu.h similarity index 97% rename from include/serialization/uavcan/equipment/ahrs/RawImu.h rename to include/libdcnode/uavcan/equipment/ahrs/RawImu.h index 3ba144a..372f9f1 100644 --- a/include/serialization/uavcan/equipment/ahrs/RawImu.h +++ b/include/libdcnode/uavcan/equipment/ahrs/RawImu.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AHRS_RAW_IMU_H_ #define UAVCAN_EQUIPMENT_AHRS_RAW_IMU_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AHRS_RAW_IMU_ID 1003 #define UAVCAN_EQUIPMENT_AHRS_RAW_IMU_SIGNATURE (0x8280632C40E574B5ULL) diff --git a/include/serialization/uavcan/equipment/ahrs/Solution.h b/include/libdcnode/uavcan/equipment/ahrs/Solution.h similarity index 98% rename from include/serialization/uavcan/equipment/ahrs/Solution.h rename to include/libdcnode/uavcan/equipment/ahrs/Solution.h index f0220fc..6c7b4cb 100644 --- a/include/serialization/uavcan/equipment/ahrs/Solution.h +++ b/include/libdcnode/uavcan/equipment/ahrs/Solution.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AHRS_SOLUTION_H_ #define UAVCAN_EQUIPMENT_AHRS_SOLUTION_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AHRS_SOLUTION_ID 1000 #define UAVCAN_EQUIPMENT_AHRS_SOLUTION_SIGNATURE 0x72a63a3c6f41fa9b diff --git a/include/serialization/uavcan/equipment/air_data/IndicatedAirspeed.h b/include/libdcnode/uavcan/equipment/air_data/IndicatedAirspeed.h similarity index 96% rename from include/serialization/uavcan/equipment/air_data/IndicatedAirspeed.h rename to include/libdcnode/uavcan/equipment/air_data/IndicatedAirspeed.h index d5a45e1..1556f8a 100644 --- a/include/serialization/uavcan/equipment/air_data/IndicatedAirspeed.h +++ b/include/libdcnode/uavcan/equipment/air_data/IndicatedAirspeed.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AIR_DATA_INDICATED_AIRSPEED_H_ #define UAVCAN_EQUIPMENT_AIR_DATA_INDICATED_AIRSPEED_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #define UAVCAN_EQUIPMENT_AIR_DATA_INDICATED_AIRSPEED_ID 1021 #define UAVCAN_EQUIPMENT_AIR_DATA_INDICATED_AIRSPEED_SIGNATURE 0xA1892D72AB8945FULL diff --git a/include/serialization/uavcan/equipment/air_data/RawAirData.h b/include/libdcnode/uavcan/equipment/air_data/RawAirData.h similarity index 97% rename from include/serialization/uavcan/equipment/air_data/RawAirData.h rename to include/libdcnode/uavcan/equipment/air_data/RawAirData.h index 43e1af4..de50d49 100644 --- a/include/serialization/uavcan/equipment/air_data/RawAirData.h +++ b/include/libdcnode/uavcan/equipment/air_data/RawAirData.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_H_ #define UAVCAN_EQUIPMENT_AIR_DATA_RAWAIRDATA_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #define UAVCAN_EQUIPMENT_AIR_DATA_RAW_AIR_DATA_ID 1027 #define UAVCAN_EQUIPMENT_AIR_DATA_RAW_AIR_DATA_SIGNATURE 0xc77df38ba122f5da diff --git a/include/serialization/uavcan/equipment/air_data/StaticPressure.h b/include/libdcnode/uavcan/equipment/air_data/StaticPressure.h similarity index 96% rename from include/serialization/uavcan/equipment/air_data/StaticPressure.h rename to include/libdcnode/uavcan/equipment/air_data/StaticPressure.h index 035bcd7..3909c10 100644 --- a/include/serialization/uavcan/equipment/air_data/StaticPressure.h +++ b/include/libdcnode/uavcan/equipment/air_data/StaticPressure.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AIR_DATA_STATIC_PRESSURE_H_ #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_PRESSURE_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_PRESSURE_ID 1028 #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_PRESSURE_SIGNATURE 0xcdc7c43412bdc89a diff --git a/include/serialization/uavcan/equipment/air_data/StaticTemperature.h b/include/libdcnode/uavcan/equipment/air_data/StaticTemperature.h similarity index 96% rename from include/serialization/uavcan/equipment/air_data/StaticTemperature.h rename to include/libdcnode/uavcan/equipment/air_data/StaticTemperature.h index ced5629..cf5a4d4 100644 --- a/include/serialization/uavcan/equipment/air_data/StaticTemperature.h +++ b/include/libdcnode/uavcan/equipment/air_data/StaticTemperature.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AIR_DATA_STATIC_TEMPERATURE_H_ #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_TEMPERATURE_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_TEMPERATURE_ID 1029 #define UAVCAN_EQUIPMENT_AIR_DATA_STATIC_TEMPERATURE_SIGNATURE 0x49272a6477d96271 diff --git a/include/serialization/uavcan/equipment/air_data/TrueAirspeed.h b/include/libdcnode/uavcan/equipment/air_data/TrueAirspeed.h similarity index 96% rename from include/serialization/uavcan/equipment/air_data/TrueAirspeed.h rename to include/libdcnode/uavcan/equipment/air_data/TrueAirspeed.h index 48557a7..a6638c0 100644 --- a/include/serialization/uavcan/equipment/air_data/TrueAirspeed.h +++ b/include/libdcnode/uavcan/equipment/air_data/TrueAirspeed.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_AIR_DATA_TRUE_AIRSPEED_H_ #define UAVCAN_EQUIPMENT_AIR_DATA_TRUE_AIRSPEED_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #define UAVCAN_EQUIPMENT_AIR_DATA_TRUE_AIRSPEED_ID 1020 #define UAVCAN_EQUIPMENT_AIR_DATA_TRUE_AIRSPEED_SIGNATURE 0x306F69E0A591AFAAULL diff --git a/include/serialization/uavcan/equipment/camera_gimbal/Status.h b/include/libdcnode/uavcan/equipment/camera_gimbal/Status.h similarity index 92% rename from include/serialization/uavcan/equipment/camera_gimbal/Status.h rename to include/libdcnode/uavcan/equipment/camera_gimbal/Status.h index 196811e..eea4c52 100644 --- a/include/serialization/uavcan/equipment/camera_gimbal/Status.h +++ b/include/libdcnode/uavcan/equipment/camera_gimbal/Status.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_CAMERA_GIMBAL_STATUS_H_ #define UAVCAN_EQUIPMENT_CAMERA_GIMBAL_STATUS_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_CAMERA_GIMBAL_STATUS_ID 1044 #define UAVCAN_EQUIPMENT_CAMERA_GIMBAL_STATUS_SIGNATURE 0xb9f127865be0d61e diff --git a/include/serialization/uavcan/equipment/device/Temperature.h b/include/libdcnode/uavcan/equipment/device/Temperature.h similarity index 96% rename from include/serialization/uavcan/equipment/device/Temperature.h rename to include/libdcnode/uavcan/equipment/device/Temperature.h index 11781ee..f5e0c8e 100644 --- a/include/serialization/uavcan/equipment/device/Temperature.h +++ b/include/libdcnode/uavcan/equipment/device/Temperature.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_DEVICE_TEMPERATURE_ID 1110 #define UAVCAN_EQUIPMENT_DEVICE_TEMPERATURE_SIGNATURE 0x70261c28a94144c6 diff --git a/include/serialization/uavcan/equipment/esc/RawCommand.h b/include/libdcnode/uavcan/equipment/esc/RawCommand.h similarity index 98% rename from include/serialization/uavcan/equipment/esc/RawCommand.h rename to include/libdcnode/uavcan/equipment/esc/RawCommand.h index 214701c..717e189 100644 --- a/include/serialization/uavcan/equipment/esc/RawCommand.h +++ b/include/libdcnode/uavcan/equipment/esc/RawCommand.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_ESC_RAWCOMMAND_ID 1030 #define UAVCAN_EQUIPMENT_ESC_RAWCOMMAND_SIGNATURE 0x217f5c87d7ec951d diff --git a/include/serialization/uavcan/equipment/esc/Status.h b/include/libdcnode/uavcan/equipment/esc/Status.h similarity index 98% rename from include/serialization/uavcan/equipment/esc/Status.h rename to include/libdcnode/uavcan/equipment/esc/Status.h index 5a0d3a5..256a8c4 100644 --- a/include/serialization/uavcan/equipment/esc/Status.h +++ b/include/libdcnode/uavcan/equipment/esc/Status.h @@ -9,7 +9,7 @@ #define UAVCAN_EQUIPMENT_ESC_STATUS_H_ #include -#include "serialization_internal.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_ESC_STATUS_ID 1034 #define UAVCAN_EQUIPMENT_ESC_STATUS_SIGNATURE 0xa9af28aea2fbb254 diff --git a/include/serialization/uavcan/equipment/gnss/ECEFPositionVelocity.h b/include/libdcnode/uavcan/equipment/gnss/ECEFPositionVelocity.h similarity index 95% rename from include/serialization/uavcan/equipment/gnss/ECEFPositionVelocity.h rename to include/libdcnode/uavcan/equipment/gnss/ECEFPositionVelocity.h index 7c6257a..1156806 100644 --- a/include/serialization/uavcan/equipment/gnss/ECEFPositionVelocity.h +++ b/include/libdcnode/uavcan/equipment/gnss/ECEFPositionVelocity.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_GNSS_ECEFPOSITIONVELOCITY_H_ #define UAVCAN_EQUIPMENT_GNSS_ECEFPOSITIONVELOCITY_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_GNSS_ECEF_MESSAGE_SIZE 27 // (32*3+36*3+6)/8 + 1 diff --git a/include/serialization/uavcan/equipment/gnss/Fix2.h b/include/libdcnode/uavcan/equipment/gnss/Fix2.h similarity index 98% rename from include/serialization/uavcan/equipment/gnss/Fix2.h rename to include/libdcnode/uavcan/equipment/gnss/Fix2.h index 915ede2..be98831 100644 --- a/include/serialization/uavcan/equipment/gnss/Fix2.h +++ b/include/libdcnode/uavcan/equipment/gnss/Fix2.h @@ -8,8 +8,8 @@ #ifndef UAVCAN_EQUIPMENT_GNSS_FIX2_H_ #define UAVCAN_EQUIPMENT_GNSS_FIX2_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #include "ECEFPositionVelocity.h" #define UAVCAN_EQUIPMENT_GNSS_FIX2_ID 1063 diff --git a/include/serialization/uavcan/equipment/hardpoint/Command.h b/include/libdcnode/uavcan/equipment/hardpoint/Command.h similarity index 97% rename from include/serialization/uavcan/equipment/hardpoint/Command.h rename to include/libdcnode/uavcan/equipment/hardpoint/Command.h index d5f8ce5..d04a803 100644 --- a/include/serialization/uavcan/equipment/hardpoint/Command.h +++ b/include/libdcnode/uavcan/equipment/hardpoint/Command.h @@ -7,8 +7,8 @@ #ifndef UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_H_ #define UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_ID 1070 #define UAVCAN_EQUIPMENT_HARDPOINT_COMMAND_SIGNATURE 0xa1a036268b0c3455 diff --git a/include/serialization/uavcan/equipment/hardpoint/Status.h b/include/libdcnode/uavcan/equipment/hardpoint/Status.h similarity index 97% rename from include/serialization/uavcan/equipment/hardpoint/Status.h rename to include/libdcnode/uavcan/equipment/hardpoint/Status.h index 96c4fd5..a58c96b 100644 --- a/include/serialization/uavcan/equipment/hardpoint/Status.h +++ b/include/libdcnode/uavcan/equipment/hardpoint/Status.h @@ -6,8 +6,8 @@ #ifndef UAVCAN_EQUIPMENT_HARDPOINT_STATUS_H_ #define UAVCAN_EQUIPMENT_HARDPOINT_STATUS_H_ -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_HARDPOINT_STATUS_ID 1071 #define UAVCAN_EQUIPMENT_HARDPOINT_STATUS_SIGNATURE 0x624a519d42553d82 diff --git a/include/serialization/uavcan/equipment/ice/FuelTankStatus.h b/include/libdcnode/uavcan/equipment/ice/FuelTankStatus.h similarity index 97% rename from include/serialization/uavcan/equipment/ice/FuelTankStatus.h rename to include/libdcnode/uavcan/equipment/ice/FuelTankStatus.h index 077c77f..14dbee8 100644 --- a/include/serialization/uavcan/equipment/ice/FuelTankStatus.h +++ b/include/libdcnode/uavcan/equipment/ice/FuelTankStatus.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_ICE_FUELTANK_STATUS_ID 1129 #define UAVCAN_EQUIPMENT_ICE_FUELTANK_STATUS_SIGNATURE 0x286b4a387ba84bc4 diff --git a/include/serialization/uavcan/equipment/ice/Status.h b/include/libdcnode/uavcan/equipment/ice/Status.h similarity index 98% rename from include/serialization/uavcan/equipment/ice/Status.h rename to include/libdcnode/uavcan/equipment/ice/Status.h index de2dc0f..a766b2c 100644 --- a/include/serialization/uavcan/equipment/ice/Status.h +++ b/include/libdcnode/uavcan/equipment/ice/Status.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_ICE_RECIPROCATING_STATUS_ID 1120 #define UAVCAN_EQUIPMENT_ICE_RECIPROCATING_STATUS_SIGNATURE 0xd38aa3ee75537ec6 diff --git a/include/serialization/uavcan/equipment/indication/BeepCommand.h b/include/libdcnode/uavcan/equipment/indication/BeepCommand.h similarity index 97% rename from include/serialization/uavcan/equipment/indication/BeepCommand.h rename to include/libdcnode/uavcan/equipment/indication/BeepCommand.h index 0ea1372..3f7757b 100644 --- a/include/serialization/uavcan/equipment/indication/BeepCommand.h +++ b/include/libdcnode/uavcan/equipment/indication/BeepCommand.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_INDICATION_BEEPCOMMAND_ID 1080 #define UAVCAN_EQUIPMENT_INDICATION_BEEPCOMMAND_SIGNATURE 0xBE9EA9FEC2B15D52ULL diff --git a/include/serialization/uavcan/equipment/indication/LightsCommand.h b/include/libdcnode/uavcan/equipment/indication/LightsCommand.h similarity index 98% rename from include/serialization/uavcan/equipment/indication/LightsCommand.h rename to include/libdcnode/uavcan/equipment/indication/LightsCommand.h index 24a9012..82ad602 100644 --- a/include/serialization/uavcan/equipment/indication/LightsCommand.h +++ b/include/libdcnode/uavcan/equipment/indication/LightsCommand.h @@ -9,8 +9,8 @@ #define UAVCAN_EQUIPMENT_INDICATION_LIGHTS_COMMANDS_H_ #include "SingleLightCommand.h" -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_INDICATION_LIGHTS_COMMAND_ID 1081 #define UAVCAN_EQUIPMENT_INDICATION_LIGHTS_COMMAND_SIGNATURE 0x2031d93c8bdd1ec4 diff --git a/include/serialization/uavcan/equipment/indication/RGB565.h b/include/libdcnode/uavcan/equipment/indication/RGB565.h similarity index 100% rename from include/serialization/uavcan/equipment/indication/RGB565.h rename to include/libdcnode/uavcan/equipment/indication/RGB565.h diff --git a/include/serialization/uavcan/equipment/indication/SingleLightCommand.h b/include/libdcnode/uavcan/equipment/indication/SingleLightCommand.h similarity index 100% rename from include/serialization/uavcan/equipment/indication/SingleLightCommand.h rename to include/libdcnode/uavcan/equipment/indication/SingleLightCommand.h diff --git a/include/serialization/uavcan/equipment/power/BatteryInfo.h b/include/libdcnode/uavcan/equipment/power/BatteryInfo.h similarity index 97% rename from include/serialization/uavcan/equipment/power/BatteryInfo.h rename to include/libdcnode/uavcan/equipment/power/BatteryInfo.h index 9f3639e..0a0ea82 100644 --- a/include/serialization/uavcan/equipment/power/BatteryInfo.h +++ b/include/libdcnode/uavcan/equipment/power/BatteryInfo.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_POWER_BATTERY_INFO_ID 1092 #define UAVCAN_EQUIPMENT_POWER_BATTERY_INFO_SIGNATURE 0x249c26548a711966 diff --git a/include/serialization/uavcan/equipment/power/CircuitStatus.h b/include/libdcnode/uavcan/equipment/power/CircuitStatus.h similarity index 98% rename from include/serialization/uavcan/equipment/power/CircuitStatus.h rename to include/libdcnode/uavcan/equipment/power/CircuitStatus.h index 52bd464..a53d131 100644 --- a/include/serialization/uavcan/equipment/power/CircuitStatus.h +++ b/include/libdcnode/uavcan/equipment/power/CircuitStatus.h @@ -9,7 +9,7 @@ #define UAVCAN_EQUIPMENT_POWER_CIRCUIT_STATUS_H_ #include -#include "serialization_internal.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_POWER_CIRCUIT_STATUS_ID 1091 #define UAVCAN_EQUIPMENT_POWER_CIRCUIT_STATUS_SIGNATURE 0x8313d33d0ddda115 diff --git a/include/serialization/uavcan/equipment/range_sensor/Measurement.h b/include/libdcnode/uavcan/equipment/range_sensor/Measurement.h similarity index 97% rename from include/serialization/uavcan/equipment/range_sensor/Measurement.h rename to include/libdcnode/uavcan/equipment/range_sensor/Measurement.h index 6280486..726cdaf 100644 --- a/include/serialization/uavcan/equipment/range_sensor/Measurement.h +++ b/include/libdcnode/uavcan/equipment/range_sensor/Measurement.h @@ -6,8 +6,8 @@ #ifndef UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_H_ #define UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_H_ -#include "serialization_internal.h" -#include "dronecan.h" +#include "libdcnode/serialization_internal.h" +#include "libdcnode/dronecan.h" #include "../../CoarseOrientation.h" #define UAVCAN_EQUIPMENT_RANGE_SENSOR_MEASUREMENT_ID 1050 diff --git a/include/serialization/uavcan/equipment/safety/ArmingStatus.h b/include/libdcnode/uavcan/equipment/safety/ArmingStatus.h similarity index 94% rename from include/serialization/uavcan/equipment/safety/ArmingStatus.h rename to include/libdcnode/uavcan/equipment/safety/ArmingStatus.h index ae2110f..b3642b8 100644 --- a/include/serialization/uavcan/equipment/safety/ArmingStatus.h +++ b/include/libdcnode/uavcan/equipment/safety/ArmingStatus.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_EQUIPMENT_SAFETY_ARMING_STATUS_ID 1100 #define UAVCAN_EQUIPMENT_SAFETY_ARMING_STATUS_SIGNATURE 0x8700f375556a8003 diff --git a/include/serialization/uavcan/protocol/debug/LogMessage.h b/include/libdcnode/uavcan/protocol/debug/LogMessage.h similarity index 94% rename from include/serialization/uavcan/protocol/debug/LogMessage.h rename to include/libdcnode/uavcan/protocol/debug/LogMessage.h index 6d4ba9e..f53dc4a 100644 --- a/include/serialization/uavcan/protocol/debug/LogMessage.h +++ b/include/libdcnode/uavcan/protocol/debug/LogMessage.h @@ -10,8 +10,8 @@ #include #include -#include "dronecan.h" -#include "serialization_internal.h" +#include "libdcnode/dronecan.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_ID 16383 #define UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_SIGNATURE 0xd654a48e0c049d75 @@ -74,6 +74,8 @@ static inline int8_t dronecan_protocol_debug_log_message_serialize( memcpy(&buffer[1], obj->source, obj->source_size); memcpy(&buffer[obj->source_size + 1], obj->text, obj->text_size); + *inout_buffer_size_bytes = 1 + obj->source_size + obj->text_size; + return 0; } @@ -99,7 +101,7 @@ static inline int8_t dronecan_protocol_debug_log_message_set_source( msg->source_size = strnlen(source, UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_MAX_SOURCE_LEN); msg->source[UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_MAX_SOURCE_LEN - 1] = '\0'; - memcpy((char*)msg->source, source, msg->source_size); + memcpy(msg->source, source, msg->source_size); return 0; } @@ -113,7 +115,7 @@ static inline int8_t dronecan_protocol_debug_log_message_set_text( msg->text_size = strnlen(text, UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_MAX_TEXT_LEN); msg->text[UAVCAN_PROTOCOL_DEBUG_LOG_MESSAGE_MAX_TEXT_LEN - 1] = '\0'; - memcpy((char*)msg->text, text, msg->text_size); + memcpy(msg->text, text, msg->text_size); return 0; } diff --git a/include/serialization/uavcan/protocol/get_node_info.h b/include/libdcnode/uavcan/protocol/get_node_info.h similarity index 96% rename from include/serialization/uavcan/protocol/get_node_info.h rename to include/libdcnode/uavcan/protocol/get_node_info.h index e2e9aab..2fca241 100644 --- a/include/serialization/uavcan/protocol/get_node_info.h +++ b/include/libdcnode/uavcan/protocol/get_node_info.h @@ -9,9 +9,9 @@ #define UAVCAN_PROTOCOL_GET_NODE_INFO_H_ #include -#include "dronecan_application_internal.h" +#include "libdcnode/internal.h" #include "node_status.h" -#include "serialization_internal.h" +#include "libdcnode/serialization_internal.h" #define UAVCAN_GET_NODE_INFO_DATA_TYPE_ID 1 diff --git a/include/serialization/uavcan/protocol/get_transport_stats.h b/include/libdcnode/uavcan/protocol/get_transport_stats.h similarity index 98% rename from include/serialization/uavcan/protocol/get_transport_stats.h rename to include/libdcnode/uavcan/protocol/get_transport_stats.h index 3c758f7..da2527d 100644 --- a/include/serialization/uavcan/protocol/get_transport_stats.h +++ b/include/libdcnode/uavcan/protocol/get_transport_stats.h @@ -8,7 +8,7 @@ #ifndef UAVCAN_PROTOCOL_GET_TRANSPORT_STATS_H_ #define UAVCAN_PROTOCOL_GET_TRANSPORT_STATS_H_ -#include "dronecan_application_internal.h" +#include "libdcnode/internal.h" /** * @brief uavcan.protocol.CANIfaceStats diff --git a/include/serialization/uavcan/protocol/node_status.h b/include/libdcnode/uavcan/protocol/node_status.h similarity index 89% rename from include/serialization/uavcan/protocol/node_status.h rename to include/libdcnode/uavcan/protocol/node_status.h index 4003687..cfb7bbb 100644 --- a/include/serialization/uavcan/protocol/node_status.h +++ b/include/libdcnode/uavcan/protocol/node_status.h @@ -8,7 +8,7 @@ #ifndef UAVCAN_PROTOCOL_NODE_STATUS_H_ #define UAVCAN_PROTOCOL_NODE_STATUS_H_ -#include "dronecan_application_internal.h" +#include "libdcnode/internal.h" /** * @brief uavcan.protocol.NodeStatus @@ -56,9 +56,12 @@ static inline void uavcanEncodeNodeStatus( uint8_t buffer[UAVCAN_PROTOCOL_NODE_STATUS_MESSAGE_SIZE], const NodeStatus_t* node_status) { + canardEncodeScalar(buffer, 0, 32, &node_status->uptime_sec); - canardEncodeScalar(buffer, 32, 2, (uint8_t*)&node_status->health); - canardEncodeScalar(buffer, 34, 3, (uint8_t*)&node_status->mode); + const uint8_t health_u8 = (uint8_t)node_status->health; + canardEncodeScalar(buffer, 32, 2, &health_u8); + const uint8_t mode_u8 = (uint8_t)node_status->mode; + canardEncodeScalar(buffer, 34, 3, &mode_u8); canardEncodeScalar(buffer, 37, 3, &node_status->sub_mode); canardEncodeScalar(buffer, 40, 16, &node_status->vendor_specific_status_code); } diff --git a/include/serialization/uavcan/protocol/param/execute_opcode.h b/include/libdcnode/uavcan/protocol/param/execute_opcode.h similarity index 95% rename from include/serialization/uavcan/protocol/param/execute_opcode.h rename to include/libdcnode/uavcan/protocol/param/execute_opcode.h index 3097c84..7fb735e 100644 --- a/include/serialization/uavcan/protocol/param/execute_opcode.h +++ b/include/libdcnode/uavcan/protocol/param/execute_opcode.h @@ -8,7 +8,7 @@ #ifndef UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_H_ #define UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_H_ -#include "dronecan_application_internal.h" +#include "libdcnode/internal.h" #define UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_ID 10 #define UAVCAN_PROTOCOL_PARAM_EXECUTEOPCODE_SIGNATURE 0xa7b622f939d1a466 @@ -22,7 +22,7 @@ extern "C" { static inline uint8_t uavcanProtocolParamExecuteOpcodeDecode(CanardRxTransfer* transfer) { - uint8_t opcode; + uint8_t opcode = 0; canardDecodeScalar(transfer, 0, 8, false, &opcode); return opcode; } diff --git a/include/serialization/uavcan/protocol/param/getset.h b/include/libdcnode/uavcan/protocol/param/getset.h similarity index 91% rename from include/serialization/uavcan/protocol/param/getset.h rename to include/libdcnode/uavcan/protocol/param/getset.h index 0704d1b..2a2c0d6 100644 --- a/include/serialization/uavcan/protocol/param/getset.h +++ b/include/libdcnode/uavcan/protocol/param/getset.h @@ -9,8 +9,8 @@ #define UAVCAN_PROTOCOL_PARAM_GETSET_H_ #include -#include "dronecan_application_internal.h" -#include "serialization_internal.h" +#include "libdcnode/internal.h" +#include "libdcnode/serialization_internal.h" #define STRING_MAX_SIZE 56 @@ -31,25 +31,20 @@ typedef enum { extern "C" { #endif -void canardEncodeI64(uint8_t* buf, uint32_t offset, int64_t* val) -{ - canardEncodeScalar(buf, offset, 64, val); -} - -void uavcanEncodeParamValueInt32(uint8_t* buffer, uint16_t offset, int32_t value) +static inline void uavcanEncodeParamValueInt32(uint8_t* buffer, uint16_t offset, int32_t value) { const uint8_t tag_integer = PARAM_VALUE_INTEGER; int64_t value_i64 = value; canardEncodeScalar(buffer, offset, 3, &tag_integer); - canardEncodeI64(buffer, offset + 3, &value_i64); + canardEncodeScalar(buffer, offset + 3, 64, &value_i64); } -void uavcanEncodeParamNumericValueInt32(uint8_t* buffer, uint16_t offset, int32_t value) +static inline void uavcanEncodeParamNumericValueInt32(uint8_t* buffer, uint16_t offset, int32_t value) { const uint8_t tag_integer = PARAM_VALUE_INTEGER; int64_t value_i64 = value; canardEncodeScalar(buffer, offset, 2, &tag_integer); - canardEncodeI64(buffer, offset + 2, &value_i64); + canardEncodeScalar(buffer, offset + 2, 64, &value_i64); } uint16_t uavcanParamGetSetMakeIntResponse( diff --git a/include/serialization/uavcan/protocol/restart_node.h b/include/libdcnode/uavcan/protocol/restart_node.h similarity index 87% rename from include/serialization/uavcan/protocol/restart_node.h rename to include/libdcnode/uavcan/protocol/restart_node.h index 0e24f18..4b19953 100644 --- a/include/serialization/uavcan/protocol/restart_node.h +++ b/include/libdcnode/uavcan/protocol/restart_node.h @@ -8,11 +8,19 @@ #ifndef UAVCAN_PROTOCOL_RESTART_NODE_H_ #define UAVCAN_PROTOCOL_RESTART_NODE_H_ -#include "dronecan_application_internal.h" +#ifdef __cplusplus +extern "C" { +#endif + +#include "libdcnode/internal.h" #define UAVCAN_PROTOCOL_RESTART_NODE_ID 5 #define UAVCAN_PROTOCOL_RESTART_NODE_SIGNATURE 0x569e05394a3017f0 #define UAVCAN_PROTOCOL_RESTART_NODE_RESPONSE_SIZE 1 #define UAVCAN_PROTOCOL_RESTART_NODE UAVCAN_EXPAND(UAVCAN_PROTOCOL_RESTART_NODE) +#ifdef __cplusplus +} +#endif + #endif // UAVCAN_PROTOCOL_RESTART_NODE_H_ diff --git a/include/libdcnode/version.h b/include/libdcnode/version.h new file mode 100644 index 0000000..f82e99a --- /dev/null +++ b/include/libdcnode/version.h @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2025 Dmitry Ponomarev + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#ifndef LIBDCNODE_VERSION_H_ +#define LIBDCNODE_VERSION_H_ + +#define LIBDCNODE_VERSION_MAJOR 0 +#define LIBDCNODE_VERSION_MINOR 6 +#define LIBDCNODE_VERSION_PATCH 0 +#define LIBDCNODE_VERSION_STR "0.6.0" + +#endif // LIBDCNODE_VERSION_H_ diff --git a/libdcnode.cmake b/libdcnode.cmake new file mode 100644 index 0000000..9e8e8f9 --- /dev/null +++ b/libdcnode.cmake @@ -0,0 +1,17 @@ +# Copyright (c) 2023 Dmitry Ponomarev +# Distributed under the MPL v2.0 License, available in the file LICENSE. +# Author: Dmitry Ponomarev + +cmake_minimum_required(VERSION 3.15.3) + +set(DRONECAN_SOURCES + ${CMAKE_CURRENT_LIST_DIR}/Libs/libcanard_v0/canard.c + ${CMAKE_CURRENT_LIST_DIR}/src/dronecan.c + ${CMAKE_CURRENT_LIST_DIR}/src/logger.cpp +) + +set(DRONECAN_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/Libs + ${CMAKE_CURRENT_LIST_DIR}/include/application + ${CMAKE_CURRENT_LIST_DIR}/include/serialization +) diff --git a/platform_specific/bxcan/can_driver.c b/platform_specific/bxcan/can_driver.c index caf3cde..7a3435c 100644 --- a/platform_specific/bxcan/can_driver.c +++ b/platform_specific/bxcan/can_driver.c @@ -5,7 +5,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "can_driver.h" +#include "libdcnode/can_driver.h" #include "canard_stm32.h" #include "main.h" diff --git a/platform_specific/fdcan/can_driver.c b/platform_specific/fdcan/can_driver.c index 82f748b..b8bc22c 100644 --- a/platform_specific/fdcan/can_driver.c +++ b/platform_specific/fdcan/can_driver.c @@ -5,7 +5,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "can_driver.h" +#include "libdcnode/can_driver.h" #include #include "main.h" diff --git a/platform_specific/socketcan/can_driver.c b/platform_specific/socketcan/can_driver.c index fe5ca2c..996428e 100644 --- a/platform_specific/socketcan/can_driver.c +++ b/platform_specific/socketcan/can_driver.c @@ -5,7 +5,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "can_driver.h" +#include "libdcnode/can_driver.h" #include "socketcan.h" #ifndef SOCKETCAN_INTERFACE_NAME diff --git a/scripts/code_style/cppcheck.sh b/scripts/code_style/cppcheck.sh index 3e34a6e..d9cf3bf 100755 --- a/scripts/code_style/cppcheck.sh +++ b/scripts/code_style/cppcheck.sh @@ -11,10 +11,8 @@ cppcheck --enable=all \ --suppress=missingIncludeSystem \ --suppress=unusedFunction \ --suppress=toomanyconfigs \ - -I ${REPO_DIR}/build/external/libparams/libparams \ -I ${REPO_DIR}/Libs \ - -I ${REPO_DIR}/include/application \ - -I ${REPO_DIR}/include/serialization \ + -I ${REPO_DIR}/include \ -I ${REPO_DIR}/platform_specific/socketcan/ \ -I /usr/include/ \ ${REPO_DIR}/src/ diff --git a/src/dronecan.c b/src/dronecan.c index 88cd56a..ccc5f23 100644 --- a/src/dronecan.c +++ b/src/dronecan.c @@ -5,52 +5,23 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -#include "dronecan.h" +#include "libdcnode/dronecan.h" #include -#include "uavcan/protocol/get_transport_stats.h" -#include "uavcan/protocol/node_status.h" -#include "uavcan/protocol/restart_node.h" -#include "uavcan/protocol/param/execute_opcode.h" -#include "uavcan/protocol/param/getset.h" -#include "storage.h" -#include "can_driver.h" - - -#ifndef APP_NODE_NAME - #define APP_NODE_NAME (char*)"default" -#endif - -#ifndef GIT_HASH - #warning "GIT_HASH has been assigned to 0 by default." - #define GIT_HASH (uint64_t)0 -#endif - -#ifndef APP_VERSION_MAJOR - #warning "APP_VERSION_MAJOR has been assigned to 0 by default." - #define APP_VERSION_MAJOR 0 -#endif - -#ifndef APP_VERSION_MINOR - #warning "APP_VERSION_MINOR has been assigned to 0 by default." - #define APP_VERSION_MINOR 0 -#endif - -#ifndef HW_VERSION_MAJOR - #warning "HW_VERSION_MAJOR has been assigned to 0 by default." - #define HW_VERSION_MAJOR 0 -#endif - -#ifndef HW_VERSION_MINOR - #warning "HW_VERSION_MINOR has been assigned to 0 by default." - #define HW_VERSION_MINOR 0 +#include "libdcnode/uavcan/protocol/get_transport_stats.h" +#include "libdcnode/uavcan/protocol/node_status.h" +#include "libdcnode/uavcan/protocol/restart_node.h" +#include "libdcnode/uavcan/protocol/param/execute_opcode.h" +#include "libdcnode/uavcan/protocol/param/getset.h" +#include "libdcnode/can_driver.h" + +#ifndef MAX_PARAM_NAME_LENGTH + #define MAX_PARAM_NAME_LENGTH 32 #endif #ifndef CANARD_BUFFER_SIZE - #define CANARD_BUFFER_SIZE 1024 + #define CANARD_BUFFER_SIZE 1024 #endif -#define CAN_SPEED 1000000 - /** * @brief Encapsulate everything required for a subscriber @@ -100,6 +71,8 @@ typedef struct { static_assert(sizeof(DronecanNodeInstance) == INSTANCE_SIZE); static DronecanNodeInstance node = {}; +static ParamsApi params = {}; +PlatformApi platform = {}; static bool shouldAcceptTransfer(const CanardInstance* ins, uint64_t* out_data_type_signature, @@ -118,8 +91,20 @@ static void uavcanProtocolRestartNodeHandle(CanardRxTransfer* transfer); static void uavcanProtocolGetTransportStatHandle(CanardRxTransfer* transfer); static void uavcanProtocolNodeStatusHandle(CanardRxTransfer* transfer); -int16_t uavcanInitApplication(uint8_t node_id) { - int16_t res = canDriverInit(CAN_SPEED, CAN_DRIVER_FIRST); +int16_t uavcanInitApplication(ParamsApi params_api, PlatformApi platform_api, const AppInfo* app_info) { + if (app_info) { + uavcanSetNodeName(app_info->node_name); + node.sw_version.vcs_commit = app_info->vcs_commit; + node.sw_version.major = app_info->sw_version_major; + node.sw_version.minor = app_info->sw_version_minor; + node.hw_version.major = app_info->hw_version_major; + node.hw_version.minor = app_info->hw_version_minor; + } + + params = params_api; + platform = platform_api; + + int16_t res = platform.can.init(1000000, CAN_DRIVER_FIRST); if (res < 0) { return res; } @@ -130,7 +115,8 @@ int16_t uavcanInitApplication(uint8_t node_id) { onTransferReceived, shouldAcceptTransfer, NULL); - canardSetLocalNodeID(&node.g_canard, node_id); + + canardSetLocalNodeID(&node.g_canard, app_info ? app_info->node_id : 50); node.node_status.uptime_sec = 0; node.node_status.health = NODE_STATUS_HEALTH_OK; @@ -138,13 +124,7 @@ int16_t uavcanInitApplication(uint8_t node_id) { node.node_status.sub_mode = 0; node.node_status.vendor_specific_status_code = 0; - node.sw_version.vcs_commit = GIT_HASH >> 32; - node.sw_version.major = APP_VERSION_MAJOR; - node.sw_version.minor = APP_VERSION_MINOR; - node.hw_version.major = HW_VERSION_MAJOR; - node.hw_version.minor = HW_VERSION_MINOR; - - platformSpecificReadUniqueID(node.hw_version.unique_id); + platform.readUniqueId(node.hw_version.unique_id); uavcanSubscribe(UAVCAN_GET_NODE_INFO_DATA_TYPE, uavcanProtocolGetNodeInfoHandle); uavcanSubscribe(UAVCAN_PROTOCOL_PARAM_GETSET, uavcanProtocolParamGetSetHandle); @@ -165,7 +145,7 @@ uint8_t uavcanGetNodeId() { } void uavcanSpinOnce() { - uint32_t now_ms = platformSpecificGetTimeMs(); + uint32_t now_ms = platform.getTimeMs(); uavcanProcessSending(); uavcanProcessReceiving(now_ms); uavcanSpinNodeStatus(now_ms); @@ -248,7 +228,7 @@ void uavcanStatsIncreaseUartRx(uint32_t num) { node.iface_stats.can_iface_stats[0].frames_rx += num; } uint64_t uavcanGetErrorCount() { - return canDriverGetErrorCount(); + return platform.can.getErrorCount(); } void uavcanSetNodeHealth(NodeStatusHealth_t health) { @@ -320,7 +300,7 @@ static uint8_t uavcanProcessSending() { uint8_t tx_attempt = 0; uint8_t tx_frames_counter = 0; while (txf) { - const int tx_res = canDriverTransmit(txf, CAN_DRIVER_FIRST); + const int tx_res = platform.can.send(txf, CAN_DRIVER_FIRST); if (tx_res > 0) { canardPopTxQueue(&node.g_canard); txf = canardPeekTxQueue(&node.g_canard); @@ -340,9 +320,9 @@ static uint8_t uavcanProcessSending() { static bool uavcanProcessReceiving(uint32_t crnt_time_ms) { CanardCANFrame rx_frame; for (size_t idx = 0; idx < 10; idx++) { - int16_t res = canDriverReceive(&rx_frame, CAN_DRIVER_FIRST); + int16_t res = platform.can.recv(&rx_frame, CAN_DRIVER_FIRST); if (res) { - uint64_t crnt_time_us = crnt_time_ms * 1000; + uint64_t crnt_time_us = crnt_time_ms * 1000UL; canardHandleRxFrame(&node.g_canard, &rx_frame, crnt_time_us); } else { break; @@ -408,7 +388,7 @@ static void uavcanProtocolParamGetSetHandle(CanardRxTransfer* transfer) { // uint13 index uint16_t param_idx; if (param_name_length) { - param_idx = paramsFind(recv_name, param_name_length); + param_idx = params.find(recv_name, param_name_length); } else { param_idx = uavcanParamGetSetDecodeIndex(transfer); } @@ -417,19 +397,25 @@ static void uavcanProtocolParamGetSetHandle(CanardRxTransfer* transfer) { uint8_t resp[96] = ""; uint16_t len; - const char* name = paramsGetName(param_idx); - if (paramsGetType(param_idx) == PARAM_TYPE_INTEGER) { + const char* name = params.getName(param_idx); + if (params.isInteger(param_idx)) { if (set_value_type_tag == PARAM_VALUE_INTEGER) { - paramsSetIntegerValue(param_idx, val_int64); + params.integer.setValue(param_idx, val_int64); } - const IntegerDesc_t* desc = paramsGetIntegerDesc(param_idx); - IntegerParamValue_t val = paramsGetIntegerValue(param_idx); - len = uavcanParamGetSetMakeIntResponse(resp, val, desc->def, desc->min, desc->max, name); - } else if (paramsGetType(param_idx) == PARAM_TYPE_STRING) { + IntegerParamValue_t val = params.integer.getValue(param_idx); + len = uavcanParamGetSetMakeIntResponse( + resp, + val, + params.integer.getDef(param_idx), + params.integer.getMin(param_idx), + params.integer.getMax(param_idx), + name + ); + } else if (params.isString(param_idx)) { if (set_value_type_tag == PARAM_VALUE_STRING) { - paramsSetStringValue(param_idx, str_len, val_string); + params.string.setValue(param_idx, str_len, val_string); } - char* str_value = (char*)paramsGetStringValue(param_idx); + const char* str_value = (const char*)params.string.getValue(param_idx); len = uavcanParamGetSetMakeStringResponse(resp, str_value, name); } else { len = uavcanParamGetSetMakeEmptyResponse(resp); @@ -445,10 +431,10 @@ static void uavcanParamExecuteOpcodeHandle(CanardRxTransfer* transfer) { int8_t ok; switch (opcode) { case 0: - ok = (paramsSave() == -1) ? 0 : 1; + ok = (params.save() == -1) ? 0 : 1; break; case 1: - ok = (paramsResetToDefault() < 0) ? 0 : 1; + ok = (params.resetToDefault() < 0) ? 0 : 1; break; default: ok = -1; @@ -459,13 +445,13 @@ static void uavcanParamExecuteOpcodeHandle(CanardRxTransfer* transfer) { } static void uavcanProtocolRestartNodeHandle(__attribute__((unused)) CanardRxTransfer* transfer) { - uint8_t response_buffer = platformSpecificRequestRestart() ? 128 : 0; + uint8_t response_buffer = platform.requestRestart() ? 128 : 0; uavcanRespond(transfer, UAVCAN_PROTOCOL_RESTART_NODE, &response_buffer, 1); } static void uavcanProtocolGetTransportStatHandle(CanardRxTransfer* transfer) { uint8_t transport_stats_buffer[UAVCAN_PROTOCOL_GET_TRANSPORT_STATS_MAX_SIZE]; - node.iface_stats.transfer_errors = canDriverGetErrorCount(); + node.iface_stats.transfer_errors = platform.can.getErrorCount(); uavcanEncodeTransportStats(transport_stats_buffer, &node.iface_stats); uavcanRespond(transfer, UAVCAN_PROTOCOL_GET_TRANSPORT_STATS, transport_stats_buffer, 72); diff --git a/src/logger.cpp b/src/logger.cpp index 10aceb7..d766d06 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -3,8 +3,8 @@ * Distributed under the terms of the GPL v3 license, available in the file LICENSE. */ -#include "logger.hpp" -#include "uavcan/protocol/debug/LogMessage.h" +#include "libdcnode/logger.hpp" +#include "libdcnode/uavcan/protocol/debug/LogMessage.h" DronecanLogger::DronecanLogger(const char* source) { init(source);