/***********************************************************************************************************
 * Copyright (c)  2023 - 2024, Unicmicro Co.,Ltd .
 * All rights reserved.
 * Filename    : um2011A.h
 * Description : um2011A drvier header file
 * Author(s)   : yanhaihua
 * version     : V1.0
 * Modify date : 2024-10-26
 ***********************************************************************************************************/
#ifndef __UM2011A_H__
#define __UM2011A_H__

#include "typedefs.h"
#include "um2011A_defs.h"

#ifdef __cplusplus
extern "C" {
#endif

void um2011A_init(void);																					/* 初始化um2011A */

void um2011A_write_reg(u8_t addr,u8_t value);																/* 写寄存器 */
void um2011A_write_regs(u8_t addr,u8_t *dat,u8_t len);														/* 写连续地址寄存器 */
em_ret_t um2011A_read_reg_enable(void);                                                                     /* spi读寄存器使能 */
u8_t um2011A_read_reg(u8_t addr);																			/* 读寄存器 */
void um2011A_read_regs(u8_t addr,u8_t *dat,u8_t len);														/* 读连续地址寄存器 */

void um2011A_clear_tx_fifo(void);																			/* 清空FIFO写指针 */
void um2011A_write_fifo(u8_t *dat,u8_t len);                                                      			/* 写FIFO数据 */
void um2011A_clear_rx_fifo(void);																			/* 清除FIFO读指针 */
void um2011A_read_fifo(u8_t *dat,u8_t len);																	/* 读FIFO数据 */
void um2011A_fifo_merge(void);                                                                              /* RX_FIFO和TX_FIFO联接使用，在RX状态或TX状态作为128字节FIFO使用 */
void um2011A_fifo_notmerge(void);                                                                           /* RX_FIFO和TX_FIFO独立使用，分别为64个字节 */
void um2011A_set_fifo_full_thres(u8_t value);                                                            	/* FIFO满门限，芯片接收数据写入FIFO时，FIFO剩余的数据空间低于value个字节时产生fifo_flag中断 */
void um2011A_set_fifo_empty_thres(u8_t value);                                                           	/* FIFO空门限，芯片发射数据时，FIFO剩余的数据低于value个字节时产生fifo_flag中断 */
void um2011A_fifo_save_data(BOOL enable);                                                            		/* 使能UM2011在sleep状态下，FIFO数据保存;不使能，sleep状态下，FIFO数据丢失 */

void um2011A_into_sleep(void);																				/* 进入Sleep模式 */
em_ret_t um2011A_into_idle(void);																			/* 进入IDLE模式 */
em_ret_t um2011A_into_tx(void);                                                                             /* 进入TX模式 */
em_ret_t um2011A_into_rx(void);																				/* 进入RX模式 */
em_ret_t um2011A_into_tx_fson(void);																		/* 进入TX FSON模式 */
em_ret_t um2011A_into_rx_fson(void);																		/* 进入RX FSON模式 */
void um2011A_into_wor(void);																				/* 进入WOR模式 */
em_ret_t um2011A_cal_rcl(void);																				/* 校准RCL */
void um2011A_into_tx_carrier(void);																			/* 发射载波 */
void um2011A_reset_digt(void);																				/* 数字复位 */

void um2011A_set_freq(float freq,float xtal);												    			/* 设置频点 */
void um2011A_set_modulation(em_mod_t mod);																	/* 设置模式 */
void um2011A_set_ch_step(float step,float xtal);                                                            /* 设置信道步进 */
void um2011A_set_ch_index(u8_t ch);                                                                      	/* 设置信道序号 */

void um2011A_nirq_enable(em_nirq_sel_t nirq);                                                               /* 设置nIRQ的中断使能 */
void um2011A_set_gpio_dir(em_pin_sel_t pin,em_io_dir_t dir);                                               	/* 设置芯片GPIO0,GPIO1,GPIO2引脚输出方向 */
em_io_dir_t um2011A_get_gpio_dir(em_pin_sel_t pin);                                                        	/* 获取芯片GPIO0,GPIO1,GPIO2引脚输出方向 */
void um2011A_set_gpio0_sel(em_gpio_out_sel_t mode);                                                     	/* GPIO0引脚的输出信号选择 */
void um2011A_set_gpio1_sel(em_gpio_out_sel_t mode);                                                         /* GPIO1引脚的输出信号选择 */
void um2011A_set_gpio2_sel(em_gpio_out_sel_t mode);                                                         /* GPIO2引脚的输出信号选择 */
void um2011A_set_clkout(em_gpio_brclk_sel_t clk);															/* 输出时钟 */
void um2011A_event_output(em_event_outpin_t pin);                                                           /* 输出WOR EVENT信号 */

void um2011A_set_lbd_enable(BOOL enable);																	/* 设置LBD使能 */
void um2011A_set_lbd_volt(float value);                                                                    	/* 设置LBD报警电压 */
void um2011A_scan_lbd_volt(void);																			/* 扫描LBD电压一次 */
float um2011A_read_lbd_value(void);                                                                         /* 读LBD电压值 */

void um2011A_postamble_en(BOOL enable);                                                              		/* 设置后导码使能 */
void um2011A_set_postamble(u8_t value,u8_t len);                                                      		/* 设置后导码值与字节长度 */
void um2011A_set_txpkt_num(u8_t num);                                                                    	/* 设置每个发射命令重复发射的数据包数量 */
																										
void um2011A_set_packet_mode(em_packet_mode_t mode);                                                        /* 设置包模式 */
void um2011A_set_payload_bit_order(em_bit_order_t order);                                                   /* 设置包模式下payload的bit顺序 */

void um2011A_set_direct_tx(BOOL enable, em_pin_sel_t pin);                                     				/* 使能直通发射并选择数据输入引脚 */

void um2011A_set_preamble(BOOL enable,u16_t len,em_unit_t unit);                                  			/* 设置preamble使能及字节长度 */
void um2011A_set_preamble_match_len(u8_t bits);                                                           	/* 设置RX时，preamble match 的字节长度 */

void um2011A_set_syncword_enable(BOOL enable);                                                       		/* 设置同步字使能 */
void um2011A_set_syncword_bit_order(em_bit_order_t order);                                                  /* 设置同步字bit顺序 */
void um2011A_set_syncword_value(u8_t* syncword,u8_t bits);                                    				/* 设置同步字长度及ID */

float um2011A_get_rssi(void);                                                                               /* 获取RSSI值 */
void um2011A_clear_all_int(void);                                                                           /* 清除所有中断，包括pjd_vaild、syncword_int、preamble_int、pkt_flag_int */
u8_t um2011A_get_status(void);																				/* 获取状态,包括fifo空或满中断、包接收/发射完成中断、CRC error、preamble中断、syncword中断*/

#ifdef __cplusplus
}
#endif

#endif
