#include "sys.h"
#include "usart.h"	  
#include "string.h"
#include <stdarg.h>
#include "delay.h"
#include "stdio.h"
#include "stdlib.h"
#include "stdio.h"
#include "oled.h"

#define Usart3ReadLen 120

//ֵ
char  Usart3ReadBuff[Usart3ReadLen]={0};  //�������ݻ���
u32 Usart3ReadCnt = 0;//����1���յ������ݸ���
u32 Usart3IdleCnt = 0;//������

#define Usart1ReadLen 100
//ֵ
char  Usart1ReadBuff[Usart1ReadLen]={0};  //�������ݻ���
u32 Usart1ReadCnt = 0;//����1���յ������ݸ���

#define Usart2ReadLen 100
//ֵ
char  Usart2ReadBuff[Usart2ReadLen]={0};  //�������ݻ���
u32 Usart2ReadCnt = 0;//����1���յ������ݸ���

#if 1
#pragma import(__use_no_semihosting)             
//��׼����Ҫ��֧�ֺ���                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//����_sys_exit()�Ա���ʹ�ð�����ģʽ    
_sys_exit(int x) 
{ 
	x = x; 
} 
//�ض���fputc���� 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//ѭ������,ֱ���������   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

 
void uart_init(u32 bound){
  //GPIO�˿�����
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//ʹ��USART1��GPIOAʱ��
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//�����������
  GPIO_Init(GPIOA, &GPIO_InitStructure);//��ʼ��GPIOA.9
   
  //USART1_RX	  GPIOA.10��ʼ��
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//��������
  GPIO_Init(GPIOA, &GPIO_InitStructure);//��ʼ��GPIOA.10  

  //Usart1 NVIC ����
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//��ռ���ȼ�3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//�����ȼ�3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨ��ʹ��
	NVIC_Init(&NVIC_InitStructure);	//����ָ���IJ�����ʼ��VIC�Ĵ���
  
   //USART ��ʼ������

	USART_InitStructure.USART_BaudRate = bound;//���ڲ�����
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//�ֳ�Ϊ8λ���ݸ�ʽ
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//һ��ֹͣλ
	USART_InitStructure.USART_Parity = USART_Parity_No;//����żУ��λ
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//��Ӳ������������
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//�շ�ģʽ

  USART_Init(USART1, &USART_InitStructure); //��ʼ������1
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//�������ڽ����ж�
  USART_Cmd(USART1, ENABLE);                    //ʹ�ܴ���1 

}


void uart3_init(u32 bound)
{

  USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//ʹ��USART3��
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//  GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);//���ö˿ڲ�����ӳ�� ����
	/* Enable the USART1 Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;       // ͨ������Ϊ����3�ж�
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority	= 0	;  // ��ռ���ȼ�
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	   // �ж���Ӧ���ȼ�0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		   // ���ж�
	NVIC_Init(&NVIC_InitStructure); 
	
	
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//�����������
    GPIO_Init(GPIOB, &GPIO_InitStructure); //��ʼ��PB10
   
    //USART3_RX	  PB.11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//��������
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //��ʼ��PB11
		
	/* ��4��������USART3����
	- BaudRate = 115200 baud
	- Word Length = 8 Bits
	- One Stop Bit
	- No parity
	- Hardware flow control disabled (RTS and CTS signals)
	- Receive and transmit enabled
	*/
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No   ;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART3, &USART_InitStructure);

	//USART_IT_IDLE
	 USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //   �����ж�ʹ��
	USART_Cmd(USART3,ENABLE);//  ʹ��U3
}

void uart2_init(u32 bound)
{
	
    GPIO_InitTypeDef GPIO_InitStructure;
	  USART_InitTypeDef USART_InitStructure;
	  NVIC_InitTypeDef NVIC_InitStructure;
	 
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//ʹ��USART2��GPIOAʱ��
 	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);	
		
	//	USART_DeInit(USART2);  //�����2
	 //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//�����������
    GPIO_Init(GPIOA, &GPIO_InitStructure); //��ʼ��PA2
   
    //USART2_RX	  PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//��������
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //��ʼ��PA3

   //USART ��ʼ������

	  USART_InitStructure.USART_BaudRate = bound;//һ������Ϊ9600;
	  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//�ֳ�Ϊ8λ���ݸ�ʽ
	  USART_InitStructure.USART_StopBits = USART_StopBits_1;//һ��ֹͣλ
	  USART_InitStructure.USART_Parity = USART_Parity_No;//����żУ��λ
	  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//��Ӳ������������
	  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//�շ�ģʽ

    USART_Init(USART2, &USART_InitStructure); //��ʼ������2
		
//		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//��ռ���ȼ�0
	  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		//�����ȼ�2
	  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQͨ��ʹ��
	  NVIC_Init(&NVIC_InitStructure);	//����ָ���IJ�����ʼ��VIC�Ĵ���

	 
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//�����ж�
			USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
    USART_Cmd(USART2, ENABLE);                    //ʹ�ܴ��� 

	
	}

	
void USART2_SendByte(u8 data)
{
	
	      while((USART2->SR&0X40)==0);//ѭ������,ֱ���������   
      USART2->DR = (u8) data;    
}

void USART2_String(char *pdat,int len)
{
	TIM_Cmd(TIM4, DISABLE); 	 //ʹ�ܶ�ʱ��2
   while(len>0)
	 {
          USART2_SendByte(*pdat++);
		      len--;
	 }
	 TIM_Cmd(TIM4, ENABLE); 
}
void USART3_SendByte(u8 data)
{
	
	      while((USART3->SR&0X40)==0);//ѭ������,ֱ���������   
      USART3->DR = (u8) data;    
}

void USART3_String(char *pdat,int len)
{
	TIM_Cmd(TIM4, DISABLE); 	 //ʹ�ܶ�ʱ��2
   while(len>0)
	 {
          USART3_SendByte(*pdat++);
		      len--;
	 }
	 TIM_Cmd(TIM4, ENABLE); 
}
void USART1_SendByte(u8 data)
{
	
	      while((USART1->SR&0X40)==0);//ѭ������,ֱ���������   
      USART1->DR = (u8) data;    
}

void USART1_String(char *pdat,int len)
{
	TIM_Cmd(TIM4, DISABLE); 	 //ʹ�ܶ�ʱ��2
   while(len>0)
	 {
          USART1_SendByte(*pdat++);
		      len--;
	 }
	 TIM_Cmd(TIM4, ENABLE); 
}


char String_Sub(char *pcBuf, char *pcRes,const char *pStart,const char *pEnd);

void USART2_IRQHandler(void)                	//����2�жϷ������ 
{
	 	  u8 Res=0,rxes;
	  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //�����ж�
		{
	    	Res =USART_ReceiveData(USART2);	//��ȡ���յ�������
		if(Usart2ReadCnt < Usart2ReadLen-1)
		{
			Usart2ReadBuff[Usart2ReadCnt] = Res;
		}
		else
		{
			Usart2ReadCnt=0;
		}
		Usart2ReadCnt ++;	//���ݸ���
		
	}
		if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)//�����ж� 
	{
		//�ö�SR��DR�ķ������IDLE
		rxes = USART2->SR;
		rxes = USART2->DR;
		
		Usart2ReadCnt=0;
		memset(Usart2ReadBuff,0,Usart2ReadLen);
	}
	

}
/****************************************************
 *  ��������	��void String_Sub(char *pcBuf, char *pcRes,char *pStart,char *pEnd)
 *	��������	: ��ȡ���������ַ���֮����ַ���  NB-iot���ݽ�����
 *	�����	��2019/7/26
 *	��д��  ��С�Ƶ��ӿƼ�
 *  ����    �� *pcBuf Դ�ַ���  *pcResĿ���ַ��� *pStart�ַ���1   *pEnd�ַ���2
 *	�汾��¼	��V1.0	
 *              : 
 ****************************************************/
char String_Sub(char *pcBuf, char *pcRes,const char *pStart,const char *pEnd)
{
	
	char *pcBegin = NULL;
	char *pcEnd = NULL;
	pcBegin = strstr((char*)pcBuf,pStart);
	pcEnd   = strstr((char*)pcBegin+strlen(pStart)+1, pEnd);
	if(pcBegin == NULL || pcEnd == NULL || pcBegin > pcEnd) 
	{
        return 0;//���󷵻�
	}
	else
	{
		pcBegin += strlen(pStart);
	//	memcpy(pcRes, pcBegin, pcEnd-pcBegin);//�ڴ濽����
		strncpy(pcRes, pcBegin, pcEnd-pcBegin);//��ʼ��������
//        pcRes[(pcEnd-pcBegin)+1]='\0';
	}
    return 1;
}


void USART3_IRQHandler(void)                	//����3�жϷ������ 
{
	  u8 Res=0,rxes;
	  if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //�����ж�
		{
	    	Res =USART_ReceiveData(USART3);	//��ȡ���յ�������
		if(Usart3ReadCnt < Usart3ReadLen-1)
		{
			Usart3ReadBuff[Usart3ReadCnt] = Res;
		}
		else
		{
			Usart3ReadCnt=0;
		}
		Usart3ReadCnt ++;	//���ݸ���
		Usart3IdleCnt = 0;
	}
		if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)//�����ж� 
	{
		//�ö�SR��DR�ķ������IDLE
		rxes = USART3->SR;
		rxes = USART3->DR;
		USART1_String(Usart3ReadBuff,Usart3ReadCnt);
	
		//memset(Usart3ReadBuff,0,Usart3ReadLen);
		Usart3ReadCnt=0;
	}
}

void USART1_IRQHandler(void)                	//����1�жϷ������
{
	u8 Res,rxes;

	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //�����ж�(���յ������ݱ�����0x0d 0x0a��β)
	{
	   	Res =USART_ReceiveData(USART1);	//��ȡ���յ�������
		if(Usart1ReadCnt < Usart1ReadLen-1)
		{
			Usart1ReadBuff[Usart1ReadCnt] = Res;
		}
		else
		{
			Usart1ReadCnt=0;
		}
		Usart1ReadCnt ++;	//���ݸ���
  } 
	if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//�����ж� 
	{
		
		//�ö�SR��DR�ķ������IDLE
		rxes = USART1->SR;
		rxes = USART1->DR;
		printf("%s",Usart1ReadBuff);
		Usart1ReadCnt=0;
		        
	}
}