1. 完善RPC注释
This commit is contained in:
parent
4887930ea2
commit
3a20363f23
@ -2,6 +2,15 @@
|
|||||||
* 日期: 2025-09-04
|
* 日期: 2025-09-04
|
||||||
* 作者: coffee
|
* 作者: coffee
|
||||||
* 描述: ARM和MCU交互通信模块
|
* 描述: ARM和MCU交互通信模块
|
||||||
|
* demo:
|
||||||
|
* 首次需要先初始化RPC调用
|
||||||
|
* HDRPCInitCall(发送回调, 存储RPC回调缓存, 回调缓存长度, 读取RPC会话);
|
||||||
|
* 读取数据:
|
||||||
|
* HDRPCReadData(...);
|
||||||
|
* 发送调用
|
||||||
|
* HDRPCSendData(sesion, 枚举值, 回调函数);
|
||||||
|
* 不需要回调
|
||||||
|
* HDRPCSendDataNotCall(sesion, 枚举值);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __HDRPC_H__
|
#ifndef __HDRPC_H__
|
||||||
@ -9,17 +18,11 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// 无效类型
|
// 设置超时时间
|
||||||
#define HDRPC_INVAID_TYPE 0xFF
|
|
||||||
|
|
||||||
// 无效功能
|
|
||||||
#define HDRPC_INVAID_FUNC 0xFFFF
|
|
||||||
|
|
||||||
// 默认超时
|
|
||||||
#define HDRPC_TIMEOUT 3000
|
#define HDRPC_TIMEOUT 3000
|
||||||
|
|
||||||
// 如果使用栈参数解析, 则最大支持的参数个数
|
// 如果使用栈参数解析, 则最大支持的参数个数
|
||||||
#define HDRPC_USE_SESSION_ARGS (5)
|
#define HDRPC_USE_SESSION_ARGS (9)
|
||||||
|
|
||||||
// 使用64位
|
// 使用64位
|
||||||
// #define HDRPC_USE_64
|
// #define HDRPC_USE_64
|
||||||
@ -42,7 +45,6 @@ typedef uint32_t HDRPCValue_t;
|
|||||||
* 0x11: UTF-16BE字符串, 数据首个字节为长度
|
* 0x11: UTF-16BE字符串, 数据首个字节为长度
|
||||||
* 0x20: 异常类型, u16类型
|
* 0x20: 异常类型, u16类型
|
||||||
*/
|
*/
|
||||||
|
|
||||||
enum eHDRPCType
|
enum eHDRPCType
|
||||||
{
|
{
|
||||||
kHDRPCUserData = 0x00, ///< 用户数据
|
kHDRPCUserData = 0x00, ///< 用户数据
|
||||||
@ -55,6 +57,14 @@ enum eHDRPCType
|
|||||||
kHDRPCException = 0x20, ///< 异常, u16
|
kHDRPCException = 0x20, ///< 异常, u16
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 协议异常指令
|
||||||
|
enum eHDRPCException {
|
||||||
|
kHDRPCNotException = 0x00, ///< 无异常
|
||||||
|
kHDRPCNotSupportFunction = 0x01, ///< 对应功能不支持
|
||||||
|
kHDRPCArgsTypeNotMatch = 0x02, ///< 参数类型不匹配
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) _HDRPCBuffer
|
typedef struct __attribute__((packed)) _HDRPCBuffer
|
||||||
{
|
{
|
||||||
uint8_t len; ///< 数据长度
|
uint8_t len; ///< 数据长度
|
||||||
@ -62,7 +72,7 @@ typedef struct __attribute__((packed)) _HDRPCBuffer
|
|||||||
} _HDRPCBuffer;
|
} _HDRPCBuffer;
|
||||||
|
|
||||||
///< 参数包
|
///< 参数包
|
||||||
typedef struct __attribute__((packed)) _HDRPCArgs
|
typedef struct __attribute__((packed)) HDRPCArgs
|
||||||
{
|
{
|
||||||
uint8_t type; ///< 类型数据
|
uint8_t type; ///< 类型数据
|
||||||
union __attribute__((packed))
|
union __attribute__((packed))
|
||||||
@ -79,29 +89,32 @@ typedef struct __attribute__((packed)) _HDRPCArgs
|
|||||||
|
|
||||||
typedef struct __attribute__((packed)) HDRPCSession
|
typedef struct __attribute__((packed)) HDRPCSession
|
||||||
{
|
{
|
||||||
uint8_t index; ///< 当前添加到的参数索引
|
uint16_t func; ///< 调用功能, 用于解析数据得到
|
||||||
uint8_t len; ///< 参数总长度
|
uint8_t index; ///< 当前添加到的参数索引
|
||||||
uint16_t func; ///< 调用功能, 用于解析数据得到
|
uint8_t exceptionSkip : 1; ///< 异常时不要调用回调(默认0: 调用回调, 1: 不调用回调)
|
||||||
HDRPCArgs *args;
|
uint8_t len : 7; ///< 参数总长度
|
||||||
|
HDRPCArgs *args; ///< 参数
|
||||||
} HDRPCSession;
|
} HDRPCSession;
|
||||||
|
|
||||||
// 此宏用于其他回调的参数声明
|
// 此宏用于其他回调的参数声明
|
||||||
#define HDRPC_CALL_ARGS HDRPCSession *session
|
#define HDRPC_CALL_ARGS HDRPCSession *session, uint8_t exception
|
||||||
typedef void (*HDRPCCallback)(HDRPCSession *session);
|
#define HDRPC_IS_EXCEPTION() (exception != kHDRPCNotException)
|
||||||
|
typedef void (*HDRPCCallback)(HDRPCSession *session, uint8_t exception);
|
||||||
typedef void (*HDRPCSendData)(HDRPCSession *session);
|
typedef void (*HDRPCSendData)(HDRPCSession *session);
|
||||||
|
|
||||||
// 调用缓存, 数据由用户提供
|
// 调用缓存, 内存由用户提供
|
||||||
typedef struct __attribute__((packed)) HDRPCCallBuffer {
|
typedef struct __attribute__((packed)) HDRPCCallBuffer {
|
||||||
uint8_t enbale : 1;
|
uint8_t enbale : 1; ///< 是否启用
|
||||||
uint8_t nameLen : 7;
|
uint8_t nameLen : 7; ///< 函数名长度
|
||||||
uint32_t time;
|
uint32_t time; ///< 上次调用时间
|
||||||
const char *name;
|
const char *name; ///< 函数名
|
||||||
HDRPCCallback callback;
|
HDRPCCallback callback; ///< 回调
|
||||||
} HDRPCCallBuffer;
|
} HDRPCCallBuffer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 初始化RPC会话
|
* @brief 初始化RPC会话
|
||||||
* @param session 参数会话
|
* @param session 参数会话
|
||||||
|
* @param args 参数包, 用于存储参数
|
||||||
* @param len 参数会话长度
|
* @param len 参数会话长度
|
||||||
*/
|
*/
|
||||||
void HDRPCInitSession(HDRPCSession *session, HDRPCArgs *args, uint8_t len);
|
void HDRPCInitSession(HDRPCSession *session, HDRPCArgs *args, uint8_t len);
|
||||||
@ -109,14 +122,14 @@ void HDRPCInitSession(HDRPCSession *session, HDRPCArgs *args, uint8_t len);
|
|||||||
/**
|
/**
|
||||||
* @brief 初始化RPC调用
|
* @brief 初始化RPC调用
|
||||||
* @param sendCall 发送数据回调
|
* @param sendCall 发送数据回调
|
||||||
* @param callback 回调缓存, 用于可注册RPC回调数量
|
* @param callBuff 回调缓存, 用于可注册RPC回调数量, 必须提供对应的内存, 如为空则无回调
|
||||||
* @param callLen 回调缓存长度
|
* @param callLen 回调缓存长度
|
||||||
* @param buffer 参数会话(如果不传递则使用栈分配)
|
* @param buffer 读取的RPC会话(如果不传递则使用栈分配)
|
||||||
*/
|
*/
|
||||||
void HDRPCInitCall(HDRPCSendData sendCall, HDRPCCallBuffer *callBuff, uint8_t callLen, HDRPCSession *buffer);
|
void HDRPCInitCall(HDRPCSendData sendCall, HDRPCCallBuffer *callBuff, uint8_t callLen, HDRPCSession *buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 使用这个来创建栈内参数包, 内部自增一个用于存储内部需要使用的用户数据
|
* @brief 使用这个来创建栈内参数包, 内部自增一个用于存储内部回调数据
|
||||||
* @param _name 参数包名称
|
* @param _name 参数包名称
|
||||||
* @param _len 参数包长度
|
* @param _len 参数包长度
|
||||||
*/
|
*/
|
||||||
|
|||||||
26
src/HDRPC.c
26
src/HDRPC.c
@ -10,6 +10,9 @@
|
|||||||
#define LogD(format, ...) printf("[%s:%s:%d]"format "\r\n", __FILE_NAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
#define LogD(format, ...) printf("[%s:%s:%d]"format "\r\n", __FILE_NAME__, __FUNCTION__, __LINE__, ##__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// 无效功能
|
||||||
|
#define HDRPC_INVAID_FUNC 0xFFFF
|
||||||
|
|
||||||
struct RPCInfo {
|
struct RPCInfo {
|
||||||
HDRPCSendData writeCall;
|
HDRPCSendData writeCall;
|
||||||
HDRPCCallBuffer *callback;
|
HDRPCCallBuffer *callback;
|
||||||
@ -29,13 +32,15 @@ static void UpdateTimeout(HDRPCCallBuffer *callBuff) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint32_t curr = HDLogGetTime();
|
uint32_t curr = HDLogGetTime();
|
||||||
|
#ifdef HDRPC_TIMEOUT
|
||||||
if (curr - callBuff->time > HDRPC_TIMEOUT) {
|
if (curr - callBuff->time > HDRPC_TIMEOUT) {
|
||||||
callBuff->enbale = 0;
|
callBuff->enbale = 0;
|
||||||
LogD("Call[%s] Timeout", callBuff->name);
|
LogD("Call[%s] Timeout", callBuff->name);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Call(HDRPCSession *session) {
|
static void Call(HDRPCSession *session, uint16_t exception) {
|
||||||
if (session == NULL) {
|
if (session == NULL) {
|
||||||
LogD("Session is nullptr");
|
LogD("Session is nullptr");
|
||||||
return ;
|
return ;
|
||||||
@ -63,7 +68,7 @@ static void Call(HDRPCSession *session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LogD("Call[%s]", sInfo.callback[i].name);
|
LogD("Call[%s]", sInfo.callback[i].name);
|
||||||
sInfo.callback[i].callback(session);
|
sInfo.callback[i].callback(session, exception);
|
||||||
LogD("Call[%s] End", sInfo.callback[i].name);
|
LogD("Call[%s] End", sInfo.callback[i].name);
|
||||||
|
|
||||||
sInfo.callback[i].enbale = 0;
|
sInfo.callback[i].enbale = 0;
|
||||||
@ -238,7 +243,22 @@ static void ReadCall(HDRPCSession *session, void *data, uint16_t len) {
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
Call(session);
|
uint16_t exception = kHDRPCNotException;;
|
||||||
|
for (uint8_t i = 0; i < session->index; ++i) {
|
||||||
|
if (session->args[i].type != kHDRPCException) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
exception = session->args[i].dataU16;
|
||||||
|
LogD("Call type[0x%x] Exception[0x%x]", session->args[i].type, exception);
|
||||||
|
|
||||||
|
// 开启异常跳过后, 出现异常不回调
|
||||||
|
if (session->exceptionSkip) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Call(session, exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user