You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

248 lines
8.2 KiB

#ifndef __UAVCAN_H
#define __UAVCAN_H
#ifdef __cplusplus
extern "C"
{
#endif
#include <stdio.h>
#include <stdint.h>
#include "canard.h"
#include "canard_stm32.h"
#include "main.h"
#include "node_timestamp.h"
#include "node_coarse_orientation.h"
#include "node_proximity.h"
#include "uavcan_filter.h"
#include "bootloader_interface.h"
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
#define APP_VERSION_MAJOR 1
#define APP_VERSION_MINOR 3
#define HARDWARE_VERSION_MAJOR 1
#define APP_NODE_NAME "zrzk.proxi.1"
#define GIT_HASH 0xBADC0FFE
#define UAVCAN_GET_NODE_INFO_DATA_TYPE_SIGNATURE 0xee468a8121c46a9e
#define UAVCAN_GET_NODE_INFO_DATA_TYPE_ID 1
#define UAVCAN_GET_NODE_INFO_RESPONSE_MAX_SIZE ((3015 + 7) / 8)
#define UAVCAN_NODE_HEALTH_OK 0
#define UAVCAN_NODE_HEALTH_WARNING 1
#define UAVCAN_NODE_HEALTH_ERROR 2
#define UAVCAN_NODE_HEALTH_CRITICAL 3
#define UAVCAN_NODE_MODE_OPERATIONAL 0
#define UAVCAN_NODE_MODE_INITIALIZATION 1
#define UAVCAN_NODE_STATUS_MESSAGE_SIZE 7
#define UAVCAN_NODE_STATUS_DATA_TYPE_ID 341
#define UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE 0x0f0868d0c1a7c6f1
#define UAVCAN_PROTOCOL_DEBUG_KEYVALUE_ID 16370
#define UAVCAN_PROTOCOL_DEBUG_KEYVALUE_SIGNATURE 0xe02f25d6e0c98ae0
#define UAVCAN_PROTOCOL_DEBUG_KEYVALUE_MESSAGE_SIZE 62
#define UAVCAN_DEBUG_LOG_MESSAGE_DATA_TYPE_ID 16383
#define UAVCAN_DEBUG_LOG_MESSAGE_DATA_TYPE_SIGNATURE 0xd654a48e0c049d75
#define UAVCAN_DEBUG_LOG_MESSAGE_MESSAGE_SIZE ((983 + 7) / 8)
#define UNIQUE_ID_LENGTH_BYTES 16
#define UNIQUE_STM32_DEVICE_ID_LENGTH 12
// #define UAVCAN_NODE_ID_ALLOCATION_DATA_TYPE_ID 1
// #define UAVCAN_NODE_ID_ALLOCATION_DATA_TYPE_SIGNATURE 0x0b2a812620a11d40
// #define UAVCAN_NODE_ID_ALLOCATION_MIN_REQUEST_PERIOD_US 600U
// #define UAVCAN_NODE_ID_ALLOCATION_MAX_REQUEST_PERIOD_US 1000U
// #define UAVCAN_NODE_ID_ALLOCATION_MIN_FOLLOWUP_PERIOD_US 0U
// #define UAVCAN_NODE_ID_ALLOCATION_MAX_FOLLOWUP_PERIOD_US 400U
// #define UAVCAN_NODE_ID_ALLOCATION_UID_BIT_OFFSET 8
// #define UAVCAN_NODE_ID_ALLOCATION_MAX_LENGTH_OF_UID_IN_REQUEST 6
// #define UAVCAN_NODE_ID_ALLOCATION_RANDOM_TIMEOUT_RANGE_USEC 400UL
// #define UAVCAN_NODE_ID_ALLOCATION_REQUEST_DELAY_OFFSET_USEC 600UL
#define UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_ID 16383
#define UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_SIGNATURE (0xD654A48E0C049D75ULL)
#define UAVCAN_PROTOCOL_DEBUG_LOGMESSAGE_MAX_SIZE ((983 + 7) / 8)
#define UAVCAN_BEGIN_FIRMWARE_UPDATE_DATA_TYPE_ID 40
#define UAVCAN_BEGIN_FIRMWARE_UPDATE_DATA_TYPE_SIGNATURE 0xb7d725df72724126
#define UAVCAN_BEGIN_FIRMWARE_UPDATE_RESPONSE_MAX_SIZE ((1031 + 7) / 8)
#define UAVCAN_BEGIN_FIRMWARE_UPDATE_REQUEST_MAX_SIZE ((1616 + 7) / 8)
#define UAVCAN_FILE_READ_DATA_TYPE_ID 48
#define UAVCAN_FILE_READ_DATA_TYPE_SIGNATURE 0x8dcdca939f33f678
#define UAVCAN_FILE_READ_REQUEST_MAX_SIZE ((1648 + 7) / 8)
#define UAVCAN_FILE_READ_RESPONSE_MAX_SIZE ((2073 + 7) / 8)
#define UAVCAN_RESTART_NODE_DATA_TYPE_ID 5
#define UAVCAN_RESTART_NODE_DATA_TYPE_SIGNATURE 0x569e05394a3017f0
#define UAVCAN_RESTART_NODE_REQUEST_MAX_SIZE ((40 + 7) / 8)
#define UAVCAN_RESTART_NODE_RESPONSE_MAX_SIZE ((1 + 7) / 8)
#define UAVCAN_PARAM_GETSET_REQUEST_MAX_SIZE ((1791 + 7) / 8)
#define UAVCAN_PARAM_GETSET_RESPONSE_MAX_SIZE ((2967 + 7) / 8)
#define UAVCAN_PARAM_GETSET_DATA_TYPE_SIGNATURE 0xa7b622f939d1a4d5
#define UAVCAN_PARAM_GETSET_DATA_TYPE_ID 11
#define UAVCAN_NODE_ID_ALLOCATION_DATA_TYPE_ID 1
#define UAVCAN_NODE_ID_ALLOCATION_DATA_TYPE_SIGNATURE 0x0b2a812620a11d40
#define UAVCAN_NODE_ID_ALLOCATION_MIN_REQUEST_PERIOD_US 600000U
#define UAVCAN_NODE_ID_ALLOCATION_MAX_REQUEST_PERIOD_US 1000000U
#define UAVCAN_NODE_ID_ALLOCATION_MIN_FOLLOWUP_PERIOD_US 0U
#define UAVCAN_NODE_ID_ALLOCATION_MAX_FOLLOWUP_PERIOD_US 400000U
#define UAVCAN_NODE_ID_ALLOCATION_UID_BIT_OFFSET 8
#define UAVCAN_NODE_ID_ALLOCATION_MAX_LENGTH_OF_UID_IN_REQUEST 6
#define RCPWM_PERIOD_uS 20000
#define RCPWM_NEUTRAL_uS 1500
#define RCPWM_MAGNITUDE_uS 500
#define UAVCAN_MODE_GET_STATE 21
#define UABCAN_MODE_GET_SN 20
#define CANARD_SPIN_PERIOD 1000
#define PUBLISHER_PERIOD_mS 25
#define PUBLISHER_PERIOD_mS_low 1000
#define CANARD_STATUS_PERIOD 1050
#define FIlTER_USED_AMOUNT 2
//#define UAVCAN_PROTOCOL_DEBUG_LOGLEVEL_DEBUG 0 // 0
//#define UAVCAN_PROTOCOL_DEBUG_LOGLEVEL_INFO 1 // 1
//#define UAVCAN_PROTOCOL_DEBUG_LOGLEVEL_WARNING 2 // 2
//#define UAVCAN_PROTOCOL_DEBUG_LOGLEVEL_ERROR 3 // 3
#define USE_CAN_LOG 1
#undef MIN
#undef MAX
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
static const uint8_t uavcan_local_node = 65;
typedef struct
{
// FieldTypes
uint8_t id; // bit len 8
uint8_t command; // bit len 8
uint8_t param1; // bit len 8
uint8_t param2; // bit len 8
uint8_t param3; // bit len 8
uint8_t param4; // bit len 8
} uavcan_zrzk_request_t;
typedef enum
{
UAVCAN_LOGLEVEL_DEBUG = 0,
UAVCAN_LOGLEVEL_INFO = 1,
UAVCAN_LOGLEVEL_WARNING = 2,
UAVCAN_LOGLEVEL_ERROR = 3
} uavcan_log_level_t;
typedef struct
{
uavcan_log_level_t log_level; // bit len 8 // bit len 8
char source[31]; // Static Array 8bit[12] max items
char text[90]; // Static Array 8bit[12] max items
} uavcan_log_msg_t;
typedef struct
{
uint64_t tick_ms;
CanardCANFrame canard_CAN_frame;
} uavcan_rev_t;
typedef struct
{
uint32_t uptime_sec;
uint16_t vendor_specific_status_code;
uint8_t health;
uint8_t mode;
uint8_t sub_mode;
} uavcan_node_status_t;
typedef struct
{
uint32_t id;
union
{
uavcan_node_status_t node_state;
uavcan_proximity_t proximity;
} content;
} uavcan_send_data_t;
typedef enum
{
SENSOR_TYPE_UNDEFINED = 0,
SENSOR_TYPE_SONAR,
SENSOR_TYPE_LIDAR,
SENSOR_TYPE_RADAR
} sensor_type_e;
typedef enum
{
READING_TYPE_UNDEFINED = 0,
READING_TYPE_VALID_RANGE = 1,
READING_TYPE_TOO_CLOSE = 2,
READING_TYPE_TOO_FAR = 3
} reading_type_e;
//------------------------------Filter-Start-----------------------------------------
//----------------------------Filter-END----------------------------------
void action_transfer_received_request(CanardInstance *ins, CanardRxTransfer *transfer);
void action_transfer_received_broadcast(CanardInstance *ins, CanardRxTransfer *transfer);
void action_transfer_received_response(CanardInstance *ins, CanardRxTransfer *transfer);
void make_node_status_message(uint8_t buffer[UAVCAN_NODE_STATUS_MESSAGE_SIZE]);
void read_unique_id(uint8_t *out_uid);
void publish_node_status(void);
void uavcan_init(void);
void canard_publish(void);
//void camera_geocmd_handleCanard(CanardRxTransfer* transfer);
static void handle_canard_get_node_info(CanardRxTransfer *transfer);
void send_canard(void);
void receive_canard(void);
void publish_node_status(void);
void publishCanard(void);
//void getsetHandleCanard(CanardRxTransfer *transfer);
//void getNodeInfoHandleCanard(CanardRxTransfer *transfer);
static uint16_t make_node_info_message(uint8_t buffer[UAVCAN_GET_NODE_INFO_RESPONSE_MAX_SIZE]);
void getNodeStateHandleCanard(CanardRxTransfer *transfer);
void init_allocation(void);
void handle_allocation_data(CanardInstance *ins, CanardRxTransfer *transfer);
//uint8_t umin(uint8_t a,uint8_t b);
static float get_random_float(void);
void send_to_can_log(uavcan_log_msg_t *msg);
void publish_zr_request(uavcan_zrzk_request_t *source);
//uint32_t test_index_value(uint32_t new_tick, uint32_t *last_tick, uint32_t *tick_inter_max);
void handle_uavcan_rx_frame(const uavcan_rev_t *msg);
void handle_uav_state(CanardRxTransfer *transfer);
void uavcan_init_with_cubemx(void);
void send_uavcan_data(uavcan_send_data_t *send_data);
void publish_proximity(uavcan_proximity_t *msg);
void send_uavcan_proximity(uavcan_proximity_t *data);
void request_node_restart(void);
void check_need_to_jump_boot(void);
uint8_t get_node_id(void);
void uavcan_init_fifo(uint8_t node_id);
void uavcan_cleanup_stale_transfers(uint64_t time_us);
void handle_restart_node(CanardRxTransfer *transfer);
void uavcan_init_by_allocation(void);
void allocation_update(void);
#ifdef __cplusplus
}
#endif
#endif