/** ******************************************************************************
 * @file    String.c
 * @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
 ********************************************************************************/
 
typedef  struct{
	
	uint8_t	 (*Hex_str)(char *ascii_str,char hex_str[]);
	
	uint8_t (*char_2_hex)(char c1,char c2);
	
	uint8_t (*char_2_dec)(char c1,char c2);
	
	uint16_t  (*dec_arry)(char ascii_str[],uint8_t dex_arry[]);
	
	uint16_t  (*hex_arry)(char ascii_str[],uint8_t hex_arry[]);
	
	uint8_t		(*R_CUT)(char *str,char buff[],uint8_t len);
	
	uint8_t		(*L_CUT)(char *str,char buff[],uint8_t len);
	
}TO;

typedef  struct{
	
	uint8_t	 (*Hex_Str)(uint8_t ascii_str[]);
	
	uint8_t  (*Ascii_Str)(uint8_t ascii_str[]);
	
	uint16_t (*dec_arry)(uint8_t ascii_str[]);
	
	uint16_t (*hex_arry)(uint8_t ascii_str[]);
	
	uint8_t  (*R_CUT)(char *str,uint8_t len);
	
	uint8_t  (*L_CUT)(char *str,uint8_t len);
	
	uint8_t  (*L_Shift)(char *str,uint8_t len);
	
}Convert;


typedef struct{
	
	
	uint8_t (*hexStr)(uint8_t arry[],char hex_str[],uint16_t len);

	uint8_t (*decStr)(uint8_t arry[],char dec_str[],uint16_t len);

	uint8_t (*asciiStr)(uint8_t arry[],char dec_str[],uint16_t len);
	
	uint8_t (*R_CUT)(uint8_t arry[],uint8_t arry_len,uint8_t cut_len);

	uint8_t (*L_CUT)(uint8_t arry[],uint8_t arry_len,uint8_t len);
	
}Array;

typedef struct
{
	
	int a;
	
	
}_AT;

typedef  struct{
	
	TO to;
	
	Convert convert;
	
}STR;

void STR_init(STR * st);
void Array_init(Array *ar);
extern STR  Str;
extern Array array;

/**@brief AsciiStr_2_HexStr :	string 按ascii理解，单个单个的转变成 hex 字符串
* @param  ascii_str		 : 字符串或数组,是数组的情况下需要保证有结束位
* @param  hex_str	 		 : 生成的新字符串
* 例子:		"stm32f103"   "73746D33326631"
*/
uint8_t AsciiStr_2_HexStr(char *ascii_str,char hex_str[]);
/**@brief str_2_dec_arry:【string 数据按10进制理解，两两转化成 8位数组 arry】
*  @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* return 会返回长度
* 例子:		char s[]="32323232" ---> uint8_t arry={32,32,32,32};
*/
uint16_t str_2_dec_arry(char ascii_str[],uint8_t dex_arry[]);

/**@brief str_2_hex_arry:【string 数据按10进制理解，两两转化成 8位数组 arry】
*  @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* return 会返回长度
* 例子:		char s[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32};
*/
uint16_t str_2_hex_arry(char ascii_str[],uint8_t hex_arry[]);

/**@brief  char_2_hex:两个字符按16进制理解转换成一个十六进制，return返回
* 例子:		char c1='1'  char c2='1'  uint8_t a=11;
*/
uint8_t  char_2_hex(char c1,char c2);
/**@brief  char_2_dec两个字符按10进制理解转换成一个十进制，return返回
* 例子:		char c1='1'  char c2='1'  uint8_t a=0x11;
*/
uint8_t  char_2_dec(char c1,char c2);
/**@brief R_CUT:右靠裁剪len长至buff，str为原数据，之所以选择加一个buff是为了保护原数据
*/
uint8_t R_CUT(char *str,char buff[],uint8_t len);
/**@brief L_CUT:左靠裁剪len长至buff，str为原数据，之所以选择加一个buff是为了保护原数据
*/
uint8_t L_CUT(char *str,char buff[],uint8_t len);

/**@brief AsciiStr_convert_HexStr:ascii字符数组转hex字符数组
* @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* 例子:		"stm32f103"  "73746D33326631"
*/
uint8_t AsciiStr_convert_HexStr(uint8_t ascii_str[]);

/**@brief str_2_dec_arry:【string 数据按10进制理解，两两转化成 8位数组 arry】
*  @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* return 会返回长度
* 例子:		char s[]="32323232" ---> uint8_t arry={32,32,32,32};
*/
uint16_t str_convert_dec_arry(uint8_t ascii_str[]);

/**@brief str_2_hex_arry:【string 数据按10进制理解，两两转化成 8位数组 arry】
*  @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* return 会返回长度
* 例子:		char s[]="32323232" ---> uint8_t arry={0x32,0x32,0x32,0x32};
*/
uint16_t str_convert_hex_arry(uint8_t ascii_str[]);
/**@brief AsciiStr_convert_HexStr:ascii字符数组转hex字符数组
* @param  ascii_str		 : 字符串或数组,导入后自身会被转化成hex的字符串
* 例子:		"73746D33326631"    "stm32f103"  
*/
uint8_t HexStr_convert_AsciiStr(uint8_t ascii_str[]);
/**@brief R_CUT:右靠裁剪len长至buff,直接改变原数据
*/
uint8_t Convert_R_CUT(char *str,uint8_t len);
/**@brief L_CUT:左靠裁剪len长至buff，直接改变原数据
*/
uint8_t Convert_L_CUT(char *str,uint8_t len);
/**@brief Shift_left:字符串左移，直接改变原数据
*/
uint8_t Shift_left(char *str,uint8_t len);
/*----------------------------------------------------------------------------------*/

/**@brief Arry_2_hexstr :	8位数组按数据理解转换成16进制表示的字符串
* @param  arry		 : 输入数组
* @param  hex_str 		 : 生成的字符串

* 例子:	uint8_t arry={0x32,0x32,0x32,0x32}; ---> "32323232"
*/
uint8_t Arry_2_hexstr(uint8_t arry[],char hex_str[],uint16_t len);
/**@brief Arry_2_decstr :	8位数组按数据理解转换成16进制表示的字符串
* @param  arry		 : 输入数组
* @param  hex_str 		 : 生成的字符串

* 例子:	uint8_t arry={0x32,0x32,0x32,0x32}; ---> "32323232"
*/
uint8_t Arry_2_decstr(uint8_t arry[],char dec_str[],uint16_t len);
/**@brief Arry_2_AsciiStr :	8位数组按ascii理解转换成16进制表示的字符串
* @param  arry		 : 输入数组
* @param  hex_str 		 : 生成的字符串

* 例子:	uint8_t arry={0x32,0x32,0x32,0x32}; ---> "2222"
*/
uint8_t Arry_2_AsciiStr(uint8_t arry[],char dec_str[],uint16_t len);
/**@brief R_CUT:右靠裁剪len长至buff，
*/
uint8_t Arry_R_CUT(uint8_t arry[],uint8_t arry_len,uint8_t cut_len);
/**@brief L_CUT:左靠裁剪len长至buff，
*/
uint8_t Arry_L_CUT(uint8_t arry[],uint8_t arry_len,uint8_t len);


