254 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			254 lines
		
	
	
		
			8.6 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 __CVG_NWM_CTRL_PROTO_INTERNAL_H
 | ||
|  | #define __CVG_NWM_CTRL_PROTO_INTERNAL_H
 | ||
|  | 
 | ||
|  | #include "plc_fr.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if (PLC_SUPPORT_EXT_PROTO)
 | ||
|  | 
 | ||
|  | /* define interval for sending sync frames, uint is 1ms */ | ||
|  | #define CVG_NWM_CTRL_SEND_SYNC_INTERVAL         100
 | ||
|  | 
 | ||
|  | /* define the maximum number for send sync frames. */ | ||
|  | #define CVG_NWM_CTRL_SEND_SYNC_MAX_CNT          5
 | ||
|  | 
 | ||
|  | /* define interval for sending search frames, uint is 1ms */ | ||
|  | #define CVG_NWM_CTRL_SEND_SEARCH_INTERVAL       200
 | ||
|  | 
 | ||
|  | /* defines the limited parameter of sending search frames in each band. */ | ||
|  | #define CVG_NWM_CTRL_SEND_SEARCH_CNT_MIN        5   /* minimum number */
 | ||
|  | #define CVG_NWM_CTRL_SEND_SEARCH_CNT_MAX        25  /* maximum number */
 | ||
|  | 
 | ||
|  | /* define the maximum duration of search for target devices. uint is 1s */ | ||
|  | #define CVG_NWM_CTRL_SEARCH_MAX_DUR             100
 | ||
|  | 
 | ||
|  | /* define timer unit duration, uint is 1ms */ | ||
|  | #define CVG_NWM_CTRL_TIMER_UNIT_DUR             10000
 | ||
|  | 
 | ||
|  | /* waiting duration for synchronous frame reception, uint is 1ms */ | ||
|  | #define CVG_NWM_CTRL_WAIT_SYNC_DUR              2000
 | ||
|  | 
 | ||
|  | /* sync frame send interval in connected state
 | ||
|  |  * uint is CVG_NWM_CTRL_TIMER_UNIT_DUR. | ||
|  |  */ | ||
|  | #define CVG_NWM_CTRL_MAINTAIN_INTERVAL          3
 | ||
|  | 
 | ||
|  | /* if the device end does not receive any app message from the controller for
 | ||
|  |  * several consecutive check period, the connection will be disconnected | ||
|  |  * automatically, uint is CVG_NWM_CTRL_TIMER_UNIT_DUR | ||
|  |  */ | ||
|  | #define CVG_NWM_CTRL_DIS_CONN_CNT               18
 | ||
|  | 
 | ||
|  | /* define the state of the connected remote device */ | ||
|  | #define CVG_NWM_CTRL_PROTO_REMOTE_S_INVALID     0
 | ||
|  | #define CVG_NWM_CTRL_PROTO_REMOTE_S_SYNCING     1
 | ||
|  | #define CVG_NWM_CTRL_PROTO_REMOTE_S_CONNECTING  2
 | ||
|  | #define CVG_NWM_CTRL_PROTO_REMOTE_S_CONNECTED   3
 | ||
|  | 
 | ||
|  | /* defining two logical roles in the controller protocol */ | ||
|  | /* master end, initiator of connection */ | ||
|  | #define CVG_NWM_CTRL_PROTO_ROLE_MAS             1
 | ||
|  | /* slave end -- CCO and STA, connection recipients */ | ||
|  | #define CVG_NWM_CTRL_PROTO_ROLE_SLA             0
 | ||
|  | 
 | ||
|  | /* defining the priority of controller protocol frame */ | ||
|  | #define CVG_NWM_CTRL_PROTO_SYNC_PRIO            3
 | ||
|  | #define CVG_NWM_CTRL_PROTO_SEARCH_PRIO          3
 | ||
|  | 
 | ||
|  | /* defining the retry cnt of controller protocol frame */ | ||
|  | #define CVG_NWM_CTRL_PROTO_SYNC_RETRY_CNT       0
 | ||
|  | #define CVG_NWM_CTRL_PROTO_SEARCH_RETRY_CNT     0
 | ||
|  | 
 | ||
|  | /* sof frame from remote dev, msdu sn rec array size */ | ||
|  | #define CVG_NWM_CTRL_PROTO_REC_CNT              32
 | ||
|  | 
 | ||
|  | /* connected remote device descriptor */ | ||
|  | typedef struct _cvg_nwm_ctrl_remote_desc { | ||
|  |     /* TEI of the connected remote device, as follows:
 | ||
|  |      * 1. CCO: PLC_TEI_CCO | ||
|  |      * 2. STA without network:  0 | ||
|  |      * 3. STA with network: 2 ~ PLC_TEI_MAX | ||
|  |      * 4. controller: PLC_TEI_CTRL | ||
|  |      */ | ||
|  |     tei_t       tei; | ||
|  |     /* inactive counters of connected remote device, uint is
 | ||
|  |      * CVG_NWM_CTRL_TIMER_UNIT_DUR. | ||
|  |      */ | ||
|  |     uint8_t     inactive_cnt; | ||
|  |     /* state of connected remote device, see CVG_NWM_CTRL_PROTO_REMOTE_S_XXXX */ | ||
|  |     uint8_t     state; | ||
|  |     /* band id, see BEACON_FREQ_BAND_ID_XXX */ | ||
|  |     uint8_t     band_id; | ||
|  | } cvg_nwm_ctrl_remote_desc_t; | ||
|  | 
 | ||
|  | /* persistent info */ | ||
|  | typedef struct _cvg_nwm_ctrl_ps_info { | ||
|  |     /* target address to be connected, available if local device is master
 | ||
|  |      * role. | ||
|  |      */ | ||
|  |     uint8_t addr[IOT_MAC_ADDR_LEN]; | ||
|  |     /* current logical role, see CVG_NWM_CTRL_PROTO_ROLE_XXX */ | ||
|  |     uint8_t role; | ||
|  |     /* current device sn */ | ||
|  |     uint8_t sn; | ||
|  | } cvg_nwm_ctrl_ps_info_t; | ||
|  | 
 | ||
|  | /* master role descriptor */ | ||
|  | typedef  struct _cvg_nwm_ctrl_mas_desc { | ||
|  |     /* band index */ | ||
|  |     uint8_t     band_idx; | ||
|  |     /* sending search frame counters.*/ | ||
|  |     uint8_t     search_cnt; | ||
|  |     /* send maximum number of search frame in the current band */ | ||
|  |     uint8_t     search_max; | ||
|  |     /* search target device start time stamp, uint is 1s. */ | ||
|  |     uint32_t    search_start_ts; | ||
|  | } cvg_nwm_ctrl_mas_desc_t; | ||
|  | 
 | ||
|  | /* slave role descriptor */ | ||
|  | typedef  struct _cvg_nwm_ctrl_sla_desc { | ||
|  |     /* sending sync frame counters */ | ||
|  |     uint8_t     sync_cnt; | ||
|  | } cvg_nwm_ctrl_sla_desc_t; | ||
|  | 
 | ||
|  | /* controller protocol control block */ | ||
|  | typedef struct _cvg_nwm_ctrl_pcb { | ||
|  |     /* persistent info */ | ||
|  |     cvg_nwm_ctrl_ps_info_t      ps_info; | ||
|  |     /* check timer */ | ||
|  |     timer_id_t                  check_timer; | ||
|  |     /* sof frame from remote dev msdu record array */ | ||
|  |     uint16_t                    msdu_rec[CVG_NWM_CTRL_PROTO_REC_CNT]; | ||
|  |     /* lastest in use record index in msdu_rec array */ | ||
|  |     uint8_t                     msdu_rec_idx   :7, | ||
|  |     /* flag to mark if all msdu record is valid */ | ||
|  |                                 msdu_rec_valid :1; | ||
|  |     /* remote device data structure */ | ||
|  |     cvg_nwm_ctrl_remote_desc_t  remote; | ||
|  |     /* local device data structure */ | ||
|  |     union { | ||
|  |       cvg_nwm_ctrl_mas_desc_t   mas; | ||
|  |       cvg_nwm_ctrl_sla_desc_t   sla; | ||
|  |     } desc; | ||
|  | } cvg_nwm_ctrl_pcb_t; | ||
|  | 
 | ||
|  | /**
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_check_slave() - period check of controller protocol. | ||
|  |  *        as slave device - CCO and STA | ||
|  |  * @param:  nwm  -  nwm vdev pointer | ||
|  |  * @retval: ERR_OK    - normal connection behavior | ||
|  |  * @retval: otherwise - abnormal connection behavior | ||
|  |  */ | ||
|  | uint8_t cvg_nwm_ctrl_proto_check_slave(cvg_nwm_vdev_t *nwm); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_reset_internal() - controller protocol reset | ||
|  |  *        internal. | ||
|  |  * @param: pcb -  controller protocol pcb pointer | ||
|  |  */ | ||
|  | void cvg_nwm_ctrl_proto_reset_internal(cvg_nwm_ctrl_pcb_t *pcb); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_is_started() - check controller protocol state is | ||
|  |  *        started. | ||
|  |  * @param: pcb     -  controller protocol pcb pointer | ||
|  |  * @retval: 0      -  is not started | ||
|  |  *          otherwise - is started | ||
|  |  */ | ||
|  | uint8_t cvg_nwm_ctrl_proto_is_started(cvg_nwm_ctrl_pcb_t *pcb); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_set_active() - set controller protocol state to | ||
|  |  *        actived. | ||
|  |  * @param: nwm     -  nwm vdev pointer. | ||
|  |  */ | ||
|  | void cvg_nwm_ctrl_proto_set_active(cvg_nwm_vdev_t *nwm); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_check_msdu_rec() - check if this is a duplicate | ||
|  |  *        controller protocol sof frame. | ||
|  |  * @param: pcb     -  controller protocol pcb pointer | ||
|  |  * @param: sn      -  msdu sn | ||
|  |  * @retval: 0      -  is not duplicate | ||
|  |  *          otherwise - is duplicate | ||
|  |  */ | ||
|  | uint8_t cvg_nwm_ctrl_proto_check_msdu_rec(cvg_nwm_ctrl_pcb_t *pcb, uint16_t sn); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_search_req_rx() - handling search info from master | ||
|  |  *        device (controller) | ||
|  |  * @param: nwm     - nwm vdev pointer. | ||
|  |  * @param: addr    - target address to be searched. | ||
|  |  * @param: src_tei - TEI of master dev(controller). | ||
|  |  * @param: band_id - band id. | ||
|  |  * @param: phase   - logic phase. | ||
|  |  * @param: sn      - sn | ||
|  |  * @retval: ERR_OK         - search accepted. | ||
|  |  *          ERR_DISCONNECT - connection behavior terminated and disconnected. | ||
|  |  *          otherwise      - see err code. | ||
|  |  */ | ||
|  | uint8_t cvg_nwm_ctrl_proto_search_req_rx(cvg_nwm_vdev_t *nwm, | ||
|  |     uint8_t *addr, tei_t src_tei, uint8_t band_id, uint8_t phase, uint8_t sn); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_init() - controller protocol initialization. | ||
|  |  * @param: nwm  -  nwm vdev pointer | ||
|  |  * @retval: ERR_OK    - for success case | ||
|  |  *          otherwise - for failure case, see error code | ||
|  |  */ | ||
|  | uint32_t cvg_nwm_ctrl_proto_init(cvg_nwm_vdev_t *nwm); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_init() - controller protocol deinit. | ||
|  |  * @param: nwm  --  nwm vdev pointer | ||
|  |  */ | ||
|  | void cvg_nwm_ctrl_proto_deinit(cvg_nwm_vdev_t *nwm); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * @brief cvg_nwm_ctrl_proto_reset() - controller protocol reset. | ||
|  |  * @param: nwm  --  nwm vdev pointer | ||
|  |  */ | ||
|  | void cvg_nwm_ctrl_proto_reset(cvg_nwm_vdev_t *nwm); | ||
|  | 
 | ||
|  | #else /* PLC_SUPPORT_EXT_PROTO */
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_is_started(pcb) (0)
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_set_active(nwm)
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_check_msdu_rec(pcb, sn) (0)
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_init(nwm) (ERR_NOSUPP)
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_deinit(nwm)
 | ||
|  | 
 | ||
|  | #define cvg_nwm_ctrl_proto_reset(nwm)
 | ||
|  | 
 | ||
|  | uint8_t cvg_nwm_ctrl_proto_search_req_rx(cvg_nwm_vdev_t *nwm, | ||
|  |     uint8_t *addr, tei_t src_tei, uint8_t band_id, uint8_t phase, uint8_t sn); | ||
|  | 
 | ||
|  | #endif /* PLC_SUPPORT_EXT_PROTO */
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif /* __CVG_NWM_CTRL_PROTO_INTERNAL_H */
 |