#include <stdlib.h>
#include "usart.h"
#include "ESPE_USART_0.h"
#include "ADC_READ.h"

uint8_t  KS	= 0;	// keep sending
uint8_t  rcv;		// recieved char
uint8_t* to_send;	// pointer to a single byte of data vector (i can only send byte by byte)
uint16_t length;		// lenght of the message to send (in bytes)

uint8_t not_ready_msg[] = "NA";
//Zona definizione di funzioni
void USART_init(void){

  // abilita rx/tx su USART3
  USART3->CR1 |= USART_CR1_RE;
  USART3->CR1 |= USART_CR1_TE;
  // abilita rx/tx interrupts su USART3
  USART3->CR1 |= USART_CR1_RXNEIE;
  //USART3->CR1 |= USART_CR1_TCIE;

  // abilita DMA
  USART3->CR3 |= USART_CR3_DMAT;
}


void ESPE_USART_interrupt(void){
  /*
  // logica trasmissione
  if( USART3->ISR & USART_ISR_TC){
      // controlla se devo ancora inviare roba (ci sono altri elementi del vettore da mandare)
      // e se sto effettivamente inviando un vettore (KS=1)
      // (in questo caso devo fare due invii per elemento perchè questi occupano 2byte ciascuno)
      if ( (indx < length) & KS ){
	  USART3->TDR = to_send[indx];
	  indx++;
      }else{
	  USART3->ICR |= USART_ICR_TCCF;
	  KS 	= 0;
	  indx 	= 0;
      }
  }
  */
  // logica ricezione
  if( USART3->ISR & USART_ISR_RXNE_RXFNE){
      rcv = USART3->RDR;

      if(rcv == SEND_CHAR){

	  DMA1_Stream3->CR 	|= DMA_SxCR_EN;

	  //KS = 1;
	  //indx ++;
	  //USART3->TDR = to_send[0];

      }else if(rcv == ACQUIRE_CHAR){
	  // riporta indice DMA a 100
	  DMA2_Stream0->NDTR	= (uint16_t) N_MEAS;
	  // inizia la misura di ADC e fai partire timer
	  ADC3-> CR 		|= ADC_CR_ADSTART;
	  TIM6-> CR1 		|= TIM_CR1_CEN;

      }else{
	  USART3->TDR = rcv;
	  //KS = 0;
      }

  }
  //Per ovviare a dimenticanze azzeriamo all'uscita i flag della ricezione e trasmissione in ogni caso
  USART3->ICR |= USART_ICR_ORECF; //Cancella l'overrun. Capita quando si entra in debug
  USART3->ICR |= USART_ICR_TCCF ;  //Azzeramento flag interrupt trasmissione
  USART3->RQR |= USART_RQR_RXFRQ;  //Azzeramento flag interrupt ricezione
}
