303 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			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_ */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |