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

199 lines
6.5 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_TASK_H_
#define _IOT_MODBUS_TASK_H_
#include "iot_task_api.h"
#ifdef __cplusplus
extern "C" {
#endif
#if PLC_SUPPORT_CCO_ROLE
#define IOT_MODBUS_RT_TABLE_SUPPORT 1
#endif
/** Message type defination: */
#define IOT_MODBUS_TASK_MT_UART 1 /** message from uart. */
#define IOT_MODBUS_TASK_MT_TIMER 2 /** message from timer. */
#define IOT_MODBUS_TASK_MT_INTERNAL 3 /** message from modbus-task. */
/* message id for IOT_MODBUS_TASK_MT_TIMER */
#define IOT_MODBUS_TASK_MSG_ID_TMR_GE_START_MONITOR (1)
#define IOT_MODBUS_TASK_MSG_ID_TMR_UART_MB_TIMEOUT (2)
#define IOT_MODBUS_TASK_MSG_ID_CMD_HANDLE (3)
#if IOT_MODBUS_RT_TABLE_SUPPORT
#define IOT_MODBUS_TASK_MSG_ID_TMR_RT_UPDATE_TIMEOUT (4)
/* rout table update period, 20S */
#define IOT_MODBUS_TASK_RT_TIMER_PERIOD (20*1000) /* units:ms */
/* iot mac address hash table handle */
typedef void *iot_modbus_addr_rout_table_h;
#endif
#define IOT_MODBUS_MSG_ID_TMR_MB_EXT_RESP_TIMEOUT (5)
#define IOT_MODBUS_TASK_ID IOT_MODBUS_MID
/* stack size of task */
#if (IOT_PSRAM_ENABLE)
#define IOT_MODBUS_TASK_TASK_STACK_SIZE (2048)
#else
#define IOT_MODBUS_TASK_TASK_STACK_SIZE (512)
#endif
#define IOT_MODBUS_TASK_PROTO_TASK_PRIO (6)
/* number of messages pending in queue. */
#if (IOT_PSRAM_ENABLE)
#define IOT_MODBUS_TASK_TASK_POOL_SIZE (128)
#else
#define IOT_MODBUS_TASK_TASK_POOL_SIZE (32)
#endif
#define IOT_MODBUS_TASK_GE_START_TIMER_PERIOD (100) /* units:ms */
/* should greater than IOT_UART_NO_FMT_TIMEOUT(default 100ms) */
#define IOT_MODBUS_TASK_UART_MB_TIMER_PERIOD (120) /* units:ms */
#define IOT_FN160_TYPE_MODBUS (0x01)
/* define uart recv buffer. */
#define IOT_MODBUS_MAX_BUF_SIZE (1024)
#pragma pack(push) /* save the pack status */
#pragma pack(1) /* 1 byte align */
typedef struct _iot_mb_task_t {
/* task handle */
iot_task_h task;
/* uart handle */
iot_uart_h uart_h;
/* timer handle */
timer_id_t ge_start_timer;
timer_id_t uart_timer;
timer_id_t rt_update_timer;
timer_id_t mb_ext_resp_timer;
/* local mac address. */
uint8_t local_mac[IOT_MAC_ADDR_LEN];
#if PLC_SUPPORT_STA_ROLE
/* dest cco mac */
uint8_t dest_cco_mac[IOT_MAC_ADDR_LEN];
#endif
/* local device slave address for modbus */
uint8_t slave_addr;
/* buf to save uart modbus data */
uint8_t uart_mb_buf[IOT_MODBUS_MAX_BUF_SIZE];
/* uart modbus len */
uint32_t uart_mb_len;
/* buf to save ge modbus data */
uint8_t ge_mb_buf[IOT_MODBUS_MAX_BUF_SIZE];
/* ge modbus len */
uint32_t ge_mb_len;
#if IOT_MODBUS_RT_TABLE_SUPPORT
/* route table */
iot_modbus_addr_rout_table_h rt_table;
#endif
} iot_mb_task_t;
typedef struct _ge_fn160_appdata_mb_t {
uint8_t type; /* trans proto type */
uint8_t src_mac[IOT_MAC_ADDR_LEN];
uint8_t frame_total : 4, /* total frames */
frame_idx : 4; /* index current frame */
uint8_t data[0]; /* modbus raw data */
} ge_fn160_appdata_mb_t;
#pragma pack(pop)
/** modbus func code:
## bit access
0x02(2) Read Input Discrete
0x01(1) Read Coils
0x05(5) Write Single Coil
0x0F(15) Write Multiple Coils
## 16 bits access
0x04(4) Read Input Register
0x03(3) Read Multiple Registers
0x06(6) Write Single Register
0x10(16) Write Multiple Registers
0x17(23) Read/Write Multiple Registers
0x16(22) Mask Write Register
## error function code
the msb is 1 when above function code is error.
*/
typedef struct _iot_mb_data_check_t {
uint8_t func_code; /* modbus function code */
uint8_t min_len; /* modbus min len */
uint8_t not_fix_len; /* 0:use min_len;1:use min_len+append data len */
uint8_t byte_count_idx;/* append data len index */
} iot_mb_data_check_t;
/**
* @brief iot_modbus_rtu_crc16() - Compute the MODBUS RTU CRC
* @param buf: the pointer of data.
* @param len : data length.
* @return : crc16 of the modbus rtu.
*/
uint16_t iot_modbus_rtu_crc16(uint8_t *buf, uint32_t len);
/**
* @brief iot_modbus_fn160_appdata_pack() - pack fn160 appdata.
* @param mb_data: the pointer of data.
* @param mb_len : data length.
* @return : the packed data of fn160 appdata.
*/
iot_pkt_t *iot_modbus_fn160_appdata_pack(uint8_t *mb_data, uint32_t mb_len,
uint32_t curr_idx, uint32_t total_idx);
/**
* @brief iot_mb_task_post_uart_cmd() - recveived command from uart, send to
* common proto
* @param data: command data.
* @param len : command data length.
* @param param : other param.
* @return : ERR_OK - send successfully.
* ERR_FAIL - send failed.
*/
uint8_t iot_mb_task_post_uart_cmd(uint8_t * data, uint16_t len, uint32_t param);
/**
* @brief iot_mb_task_msg_post() - port pkt data.
* @param msg_type: message type.
* @param msg_id : message id.
* @param data : iot_pkt data will be post.
*/
void iot_mb_task_msg_post(uint16_t msg_type, uint16_t msg_id, iot_pkt_t *data);
/**
* @brief iot_mb_task_msg_post_to_uart() - send data to uart port.
* @param p_pkt_frame: pointer of pkt frame data buffer.
* @return ERR_OK
*/
uint32_t iot_mb_task_msg_post_to_uart(iot_uart_h uart_h, iot_pkt_t *p_pkt_frame);
/**
* @brief app_modbus_task_entry() - ge modbus app.
* @param none.
* @return: ERR_OK - successfully.
* ERR_FAIL - failed.
*/
uint32_t app_modbus_task_entry(void);
#ifdef __cplusplus
}
#endif
#endif /* _IOT_MODBUS_TASK_H_ */