/** ******************************************************************************
 * @file    AT_Module.h
 * @author  度云未来 DOIOT
 * @brief   针对公司模块AT指令的处理库
 ******************************************************************************
 * @attention
 * <h2><center>&copy; Copyright (c) 2019 成都度云未来
 * All rights reserved.</center></h2>
 * 注意:本程序针对cubemx 生成的hal库程序快速开发
 * 环境:keil5.0
 * STM32Cube FW_F1 V1.8.0
 ********************************************************************************/
//#define Ask_arry_size     2
#define Ask_arry_len      20
//[Ask_arry_size][Ask_arry_len]
typedef struct{
	
		/*发送的指令      */
		char *SEND_CMD;  		 
		/*应该响应的指令      */
    char *ASK[Ask_arry_len];  
		/*需要校验的指令数      */
		uint32_t crc_size;	
		/*指令等待超时时间*/
	  uint32_t timeout; 		
		/*重发次数*/
		uint32_t REF_Count;		
		/*失败时要跳转的指令位置*/
		uint32_t jump;			
		/*支持注册一个发送前奏回调函数*/
		void (*BeforeCpltCallback)();
		/*支持注册一个发送且校验完成完成回调函数,参数默认为rx_buff*/
		void (*AfterCpltCallback)(char *rx_buff);
		/*支持注册一个错误处理校验函数,参数默认为rx_buff*/
		void (*ErrorCpltCallback)(char *rx_buff);
		/*完成后延时*/
		uint32_t delay_time;
	
}AT_CMD;  /*发送指令结构体*/

/*开模组长度char数组的宏*/
#if 0
#define MODULE_RDA_MAXlen 128
#define rxbuff(name)  				 			 char(name)[MODULE_RDA_MAXlen]={0}
#define clear(name)								 memset(name,0,MODULE_RDA_MAXlen)
#else
#define MODULE_RDA_MAXlen 160
#define rxbuff(name)  				 			 char(name)[MODULE_RDA_MAXlen]={0}
#define clear(name)								 memset(name,0,MODULE_RDA_MAXlen)
#endif

/**@brief 开始启动AT任务*/
uint8_t AT_TASK_START(AT_CMD task[],uint8_t Size);

#define cmd_length			256				/*响应指令最大长度*/
/**@brief 发送且阻塞读取校验*/
uint8_t Module_SEND_CRC(char* send_cmd,char *ack_str,uint32_t overtime);
/**@brief 发送且阻塞读取校验,支持多组参数*/
uint8_t Module_SEND_A_CRC(char* send_cmd,char cmd_arry[][cmd_length],uint8_t arry_size,uint8_t crc_size);
/**@brief 阻塞读取并校验*/
uint8_t Module_Read_A_CRC(char cmd_arry[],uint32_t overtime);
/**@brief 阻塞轮询,校验成功后返回*/
uint8_t AT_CMD_Polling(char *send_cmd,char*ack,uint32_t Polling_delay,uint32_t overtime);

/*-字符处理函数------【旧版】---------------------------------------------------------------------------------*/

/**@brief 以字符包裹为标志提取子串*/
uint8_t AT_GET_Data(char * buff,uint8_t * get_data,char*sign,uint8_t Number_of_groups);
/**@brief 以子串包裹为标志提取子串*/
uint8_t AT_GET_Data_2Param(char * buff,uint8_t get_data[],char*head,char*tail);
/**@brief 把标志位的子串替换为要替换的子串*/
uint8_t AT_Data_Replace(char buff[],char *str1, char *str2);
/**@brief AT_GET_Data_Param_number :指定的标志位开始，提取后面的数据，直到遇到\r,\n,*/
uint8_t AT_GET_Data_Param(char * buff,uint8_t get_data[],char*head);

/**@brief AT_Extract_numbers:把导入的数组提纯为纯数字*/
uint8_t AT_Extract_numbers(char buff[]);
/**@brief AT_Extract_numbers :导入的数组提纯为纯字符和数字*/
uint8_t AT_Extract_numbers_letters(char buff[]);
/**@brief AT_Remove_spaces :去掉空字符,\r,\n,space */
uint8_t AT_Remove_spaces(char buff[]);


#define HAL_Delay(x)


#define AT_INFO(fmt,arg...)           //trace_otp_trace1(uart_msg_send, 4, fmt, ##arg);
//printf("<<-EEPROM-INFO->> "fmt"\n",##arg)
#define AT_ERROR(fmt,arg...)          //printf("<<-EEPROM-ERROR->> "fmt"\n",##arg)
#define AT_DEBUG(fmt,arg...)          /*do{\
	                                          if(EEPROM_DEBUG_ON)\
	                                          printf("<<-EEPROM-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
                                          }while(0)*/

/*调试打印  */
#define debug_printf(fmt,arg...)		printf("<<-at_debug_printf->> "fmt"\r\n",##arg)
/*往模组打印*/
#define module_printf(fmt,arg...)		trace_otp_trace1(uart_msg_send, UART_ME3616, fmt, ##arg);

int Module_Blocking_Read(char *buffer, u32 timeout);
