protocolV1_1.h 6.9 KB
/*
 * @Author: 李嘉亮 lijialiang@jzdrones.com
 * @Date: 2023-11-22 17:32:04
 * @LastEditors: 李嘉亮 lijialiang@jzdrones.com
 * @LastEditTime: 2024-03-15 11:43:19
 * @FilePath: \A1_IMU_Control_Board_FreeRTOSd:\JZ_LJL_ESP32_WORKSPACE\STM32_DEV\Three-Axis_MES_BLDC_Gimbal\WorkSpace_ALL\ThreeAxisGimbal_Cre231213\Ext_Common\Communication\protocolV1.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef _PROTOCOL_1_1_H_
#define _PROTOCOL_1_1_H_

// #include "stm32f10x.h"
// #include "stdio.h"
#include <stdint.h>
#include <stdbool.h>

#include "protocolCommon.h"
/*

            Protocol (Internal) Version

 ____   ____    __          __          _____   
|_  _| |_  _|  /  |        /  |        / ___ `. 
  \ \   / /    `| |        `| |       |_/___) | 
   \ \ / /      | |         | |        .'____.' 
    \ ' /      _| |_   _   _| |_   _  / /_____  
     \_/      |_____| (_) |_____| (_) |_______| 

Font: Varsity
Character Generation website: http://patorjk.com/software/taag/#p=display&h=0&v=1&f=Varsity&t=V1.1.1

*/

/*

 ,---.  ,--.,--.          ,------.                 ,--.                      ,--.
'   .-' |  |`--',--,--,--.|  .--. ',--.--. ,---. ,-'  '-. ,---.  ,---. ,---. |  |
`.  `-. |  |,--.|        ||  '--' ||  .--'| .-. |'-.  .-'| .-. || .--'| .-. ||  |
.-'    ||  ||  ||  |  |  ||  | --' |  |   ' '-' '  |  |  ' '-' '\ `--.' '-' '|  |
`-----' `--'`--'`--`--`--'`--'     `--'    `---'   `--'   `---'  `---' `---' `--'

SlimProtocol - Simple frame-based communication protocol
======================ProtocolV1_1.h======================

WARNING: This Lib used by More than One Project , Please check compatibility before modifying

Version 1.1.2
LastUpdate Time : 2024.06.25 - 17:26
Note: Increase the protocol payload length

*/
/*================== Explanation ===================*/

/*
    枚举缩写解析
    F - Frame 帧 用来表示该枚举/数据与帧格式有关
    P - Parse 解析 用来表示该枚举/数据与解析过程有关
    M - Make  构造 用来表示该枚举/数据与帧构造过程有关

*/

/*==================Enum/Mark Define==================*/


/*__________Enum/Mark Of The Frame__________*/

/**
 * @brief 数据帧功能码1
 */
typedef enum
{
    PROTOCOL_F_FUNCTION_1_0X05 = 0x05, // 电机基本校准

    PROTOCOL_F_FUNCTION_1_0X06 = 0x06, // 电机定位校准&方向校准

    PROTOCOL_F_FUNCTION_1_0X64 = 0x64, // 云台俯仰

    PROTOCOL_F_FUNCTION_1_0X6F = 0x6F, // 角度查询

    PROTOCOL_F_FUNCTION_1_0X69 = 0x69, // 云台最大值、最小值、零度设置

    PROTOCOL_F_FUNCTION_1_0X50 = 0x50, // 请求连接

    PROTOCOL_F_FUNCTION_1_0X51 = 0x51, // 操作回复

    PROTOCOL_F_FUNCTION_1_0XFF = 0xFF, //工厂模式

    PROTOCOL_F_FUNCTION_1_0XA1 = 0xA1  //串口升级
} PROTOCOL_F_FUNCTION_1;

/**
 * @brief 数据帧功能码2
 */
typedef enum
{
    PROTOCOL_F_FUNCTION_2_0X00 = 0x00, //退出校准

    PROTOCOL_F_FUNCTION_2_0X01 = 0x01, //进入校准&操作成功

    PROTOCOL_F_FUNCTION_2_0X02 = 0x02, //开始指定轴校准&当前指定轴状态

    PROTOCOL_F_FUNCTION_2_0X03 = 0x03, //保存指定轴校准数据

    PROTOCOL_F_FUNCTION_2_0X04 = 0x04,  //退出指定轴校准

    PROTOCOL_F_FUNCTION_2_0X51 = 0x51, //云台设置&连接请求

    PROTOCOL_F_FUNCTION_2_0X52 = 0x52, 

    PROTOCOL_F_FUNCTION_2_0X53 = 0x53, 

    PROTOCOL_F_FUNCTION_2_0X54 = 0x54,//角度查询

    PROTOCOL_F_FUNCTION_2_0XFF = 0xFF,  //操作失败
    
    PROTOCOL_F_FUNCTION_2_0XA1 = 0xA1,  //进入工厂模式

    PROTOCOL_F_FUNCTION_2_0XA0 = 0xA0  //退出工厂模式

} PROTOCOL_F_FUNCTION_2;

typedef enum
{
    PROTOCOL_F_COMMSQR_00 = 0,
    PROTOCOL_F_COMMSQR_01 = 1,
    PROTOCOL_F_COMMSQR_02 = 2,
    PROTOCOL_F_COMMSQR_03 = 3
} PROTOCOL_F_COMMSQR;

/*__________Enum/Mark Of The Parse__________*/

typedef enum
{
    PROTOCOL_P_STATUS_OK = 0,   //帧解析成功
    PROTOCOL_P_STATUS_NOFRAME = -1,     // 没识别到帧
    PROTOCOL_P_STATUS_VERFAIL = -2,     // 校验失败
    PROTOCOL_P_STATUS_UNKNOWFRAME = -3, // 帧类型未知
} PROTOCOL_P_STATUS;

/*__________Enum/Mark Of The Make__________*/

typedef enum
{
    PROTOCOL_M_STATUS_OK = 0,
    PROTOCOL_M_STATUS_BUFFLENERR,
} PROTOCOL_M_STATUS;



/*__________Enum/Mark Of The Payload__________*/


/*==================DataType Define==================*/

#pragma pack(1) /*指定按1字节对齐*/

typedef struct
{
    float pitch;
    float roll;
    float yaw;
    float arg[3];
} Axis_3f;

typedef struct // 4btye + 5*4btype = 20 btyte
{
    uint8_t symbol;
    uint8_t dataH;
    uint8_t dataL;
} PayData_T1;

typedef union // 该联合体包含三轴结构体,共16个字节(32 / 8 * 4),联合体大小应当等于16字节
{
    uint8_t rawdata_8t[2];
    PayData_T1 rawdata;
    Axis_3f data_f;
} Pro_data;

typedef struct 
{
    int8_t  error;      //错误类型
    uint8_t fType;      //帧类型
    uint8_t sRoute;     //子路由节点
    uint8_t readPoint;  //最后读取点 - 帧尾索引 - 最多读到255
} Pro_Parse_Result;

#pragma pack() /*取消强制对齐*/

//_____________________通用数据帧设置 - 除非协议修改否则不能修改_____________________

#define PROTOCOL_LEN 12 // 最小数据帧长度

#define PROTOCOL_P_HEAD_0 0 // 帧头0位置
#define PROTOCOL_P_HEAD_1 1 // 帧头1位置
#define PROTOCOL_P_HEAD_2 2 // 帧头2位置

#define PROTOCOL_P_LEN_H 3    // 帧序列位置
#define PROTOCOL_P_LEN_L 4    // 帧序列位置
#define PROTOCOL_P_ASK 5    // 帧序列位置
#define PROTOCOL_P_SEQUENCE 6    // 帧序列位置

#define PROTOCOL_P_FUNCTION_1 7  // 一级功能码位置
#define PROTOCOL_P_FUNCTION_2 8 // 二级功能码位置

#define PROTOCOL_P_DATA 9  // 数据起始位置

//接收帧头
#define PROTOCOL_CONTENT_HEAD_0 0x5A //  帧头数据0
#define PROTOCOL_CONTENT_HEAD_1 0x5A //  帧头数据1
#define PROTOCOL_CONTENT_HEAD_2 0x77 //  帧头数据2

//回复帧头
#define PROTOCOL_CONTENT_RETHEAD_0 0x5B //  回复帧头数据0
#define PROTOCOL_CONTENT_RETHEAD_1 0x5B //  回复帧头数据1
#define PROTOCOL_CONTENT_RETHEAD_2 0x77 //  回复帧头数据2

//帧尾
#define PROTOCOL_CONTENT_TAIL_0 0x00 //  帧尾数据0
#define PROTOCOL_CONTENT_TAIL_1 0x23 //  帧尾数据1

//_____________________协议接收结果区_____________________
extern Pro_data current_axis_data;
extern Pro_data target_axis_data;
extern Pro_data Gen_dataResult;
extern Pro_data YawMot_dataResult;
extern Pro_data RollMot_dataResult;
extern uint8_t  commSequence ;
extern uint8_t  paraIndex ;

void Operation_Reply(PROTOCOL_F_FUNCTION_2 operation_Result);
void AnswerUpgradeFrame(uint8_t func, uint8_t data);
Pro_Parse_Result protocol_frame_parse(uint8_t *buff, uint32_t buff_len);
int protocol_frame_make(uint8_t type,PROTOCOL_F_FUNCTION_1 function_1, PROTOCOL_F_FUNCTION_2 function_2,uint8_t ask, PROTOCOL_F_COMMSQR frameSequence,\
uint8_t *buff,uint16_t buff_len,void const *data,uint16_t data_len);

#endif