199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			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_ */
 |