Files
kunlun/app/iot_ge_modbus_app/iot_modbus_ext.h
2024-09-28 14:24:04 +08:00

303 lines
9.1 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef _IOT_MODBUS_EXT_H_
#define _IOT_MODBUS_EXT_H_
#include "iot_utils_api.h"
#ifdef __cplusplus
extern "C" {
#endif
#define big_little_swap16(d) ((((uint16_t)(d) & 0xff00) >> 8) | \
(((uint16_t)(d) & 0x00ff) << 8))
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
/** fn code enum */
typedef enum _modbus_fn_code_e {
/* have to stay at the front */
MODBUS_EXT_FNCODE_MIN = 0x00,
/** modbus ext query cmd fn */
MODBUS_EXT_QUERY_FN = 0x03,
/** modbus ext set single register cmd fn */
MODBUS_EXT_SET_SINGLE_REG_FN = 0x06,
/** modbus ext set multi register cmd fn */
MODBUS_EXT_SET_MULTI_REG_FN = 0x10,
MODBUS_EXT_FNCODE_MAX = 0x10,
} modbus_fn_code_e;
/* fn = MODBUS_EXT_SET_SINGLE_REG_CMD
* subfn code is mapping to register address.
*/
enum modbus_set_single_ra_e {
/** set adapter id cmd subfn */
AID_SET_RA = 0x1000,
/** set slaver address cmd subfn */
SA_SET_RA = 0x1002,
/** set white list cmd subfn */
WL_SET_RA = 0x1004,
/** set gpio cmd subfn */
GPIO_SET_BASE_RA = 0x6e00,
};
/* fn = MODBUS_EXT_SET_MULTI_REG_CMD */
enum modbus_set_multi_ra_e {
/** add item in white list */
WL_ADD_ITEM_SET_RA = 0x1008,
/** remove item from white list */
WL_RM_ITEM_SET_RA = 0x1010,
};
/* fn = MODBUS_EXT_QUERY_CMD */
enum modbus_query_ra_e {
/** query adapter id cmd subfn */
AID_QUERY_RA = 0x1000,
/** query slaver address cmd subfn */
SA_QUERY_RA = 0x1002,
/** query item count from white list cmd subfn */
WL_ITEM_COUNT_QUERY_RA = 0x1006,
/** query item from white list cmd subfn */
WL_ITEM_QUERY_BASE_RA = 0x6000,
/** query gpio cmd subfn */
GPIO_QUERY_BASE_RA = 0x6e00,
};
/* modbus cmd tansmit direction */
typedef enum _mb_transmit_direction_e {
MODBUS_CMD_FROM_UART,
MODBUS_CMD_FROM_PLC,
} mb_transmit_direction_e;
/* modbus ext protocol frame header */
typedef struct _mb_extend_frm_hdr_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* register address. */
uint16_t reg_addr;
} mb_extend_fn_hdr_t;
typedef struct _mb_ext_cmd_current_t {
mb_extend_fn_hdr_t hdr;
/* the data of current cmd */
uint16_t data;
mb_transmit_direction_e dir;
} mb_ext_cmd_current_t;
/* modbus ext protocol frame tail */
typedef struct _mb_ext_frm_tail_t {
/* crc16 for modbus ext frame */
uint16_t check_sum;
} mb_ext_frm_tail_t;
// set single register sub fn.
typedef struct _mb_ext_frame_aid_set_t {
mb_extend_fn_hdr_t hdr;
/* adapter id. */
uint16_t adapt_id;
mb_ext_frm_tail_t tail;
} mb_ext_frame_aid_set_t;
typedef struct _mb_ext_frame_sa_set_t {
mb_extend_fn_hdr_t hdr;
/* slaver address. */
uint16_t slaver_addr;
mb_ext_frm_tail_t tail;
} mb_ext_frame_sa_set_t;
typedef struct _mb_ext_frame_wl_set_t {
mb_extend_fn_hdr_t hdr;
/* 00:disable wl, 01:enable wl. */
uint16_t enable_wl;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_set_t;
typedef struct _mb_ext_frame_gpio_set_t {
mb_extend_fn_hdr_t hdr;
/* 0:low level, 1:high level. */
uint16_t gpio_value;
mb_ext_frm_tail_t tail;
} mb_ext_frame_gpio_set_t;
// set multi register sub fn.
typedef struct _mb_ext_frame_wl_add_item_set_t {
mb_extend_fn_hdr_t hdr;
uint16_t reg_count;
uint8_t data_len;
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
uint16_t slaver_addr;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_add_item_t;
typedef struct _mb_ext_frame_wl_rm_item_set_t {
mb_extend_fn_hdr_t hdr;
uint16_t reg_count;
uint8_t data_len;
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
uint16_t slaver_addr;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_rm_item_t;
// query sub fn.
typedef struct _mb_ext_frame_aid_query_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_aid_query_t;
typedef struct _mb_ext_frame_sa_query_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_sa_query_t;
typedef struct _mb_ext_frame_wl_item_count_query_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_query_t;
typedef struct _mb_ext_frame_wl_item_query_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_item_query_t;
typedef struct _mb_ext_frame_gpio_query_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_gpio_query_t;
// resp
typedef struct _mb_ext_frame_set_resp_t {
mb_extend_fn_hdr_t hdr;
/* data of set to resp */
uint16_t data;
mb_ext_frm_tail_t tail;
} mb_ext_frame_set_resp_t;
typedef struct _mb_ext_frame_aid_query_resp_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* bytes num of data */
uint8_t data_len;
/* adapter id. */
uint16_t adapt_id;
mb_ext_frm_tail_t tail;
} mb_ext_frame_aid_query_resp_t;
typedef struct _mb_ext_frame_sa_query_resp_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* bytes num of data */
uint8_t data_len;
uint16_t slaver_addr;
mb_ext_frm_tail_t tail;
} mb_ext_frame_sa_query_resp_t;
typedef struct _mb_ext_frame_wl_item_count_query_resp_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* bytes num of data */
uint8_t data_len;
uint16_t item_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_item_count_query_resp_t;
typedef struct _mb_ext_frame_wl_item_query_resp_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* bytes num of data */
uint8_t data_len;
uint8_t mac_addr[IOT_MAC_ADDR_LEN];
uint16_t slaver_addr;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_item_query_resp_t;
typedef struct _mb_ext_frame_gpio_query_resp_t {
/* slaver address. */
uint8_t sa;
/* command code. */
uint8_t fn;
/* bytes num of data */
uint8_t data_len;
/* value of the gpio */
uint16_t gpio_value;
mb_ext_frm_tail_t tail;
} mb_ext_frame_gpio_query_resp_t;
typedef struct _mb_ext_frame_wl_item_set_resp_t {
mb_extend_fn_hdr_t hdr;
/* count of register to read */
uint16_t reg_count;
mb_ext_frm_tail_t tail;
} mb_ext_frame_wl_item_set_resp_t;
/* Gree Fn Code handle. Each Code should define itself function*/
typedef bool_t(* MODBUS_FN_HANDLE)(uint8_t *data, uint8_t len, \
mb_transmit_direction_e dir);
/* Modbus function code table */
typedef struct _mb_fnhdl_tbl_t
{
/*gree function code*/
uint32_t cmdid;
/*each code handler*/
MODBUS_FN_HANDLE cmd_handle_fn;
/*each fn handle statistic */
uint32_t cmd_num;
} mb_fnhdl_tbl_t;
#pragma pack(pop)
uint8_t iot_mb_ext_cmd_handler(uint8_t * data, uint16_t len,
mb_transmit_direction_e dir);
void iot_mb_ext_resp_cmd_timeout_or_failed();
uint8_t iot_mb_ext_handle_resp_from_ge(iot_pkt_t *p_pkt_frame);
#ifdef __cplusplus
}
#endif
#endif /* _IOT_MODBUS_EXT_H_ */