/*
 * example.c
 *
 *  Created on: Jan 31, 2024
 */

#define MAX_BUFFOR_DATA 20

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {

    if (huart->Instance == USART6) {

              tail = Size % sizeof(dma_uart6_receive_buffer);

              Example_Data_Receiver(dma_uart6_receive_buffer,Size);

              memset(dma_uart6_receive_buffer, '\0', RX_BUFFER_SIZE);

              HAL_UARTEx_ReceiveToIdle_DMA(huart, dma_uart6_receive_buffer,
                              RX_BUFFER_SIZE);
      }

	__HAL_DMA_DISABLE_IT(huart->hdmarx, DMA_IT_HT);
}


char bufor_odbioru[MAX_BUFFOR_DATA];

int8_t ExampleFunctionTurnOnLight() {

	bool status=false;

	char *wiadomosc = "1234TURN_ON_LIGHT";

	char oczekuje[7] = "LIGHT_ON";

	HAL_UART_Transmit_DMA(&huart2, wiadomosc,strlen(wiadomosc));

	// !!! O to miejsce wlasnie pytam. Chce, zeby po zwroceniu LIGHT_ON
	// wszystko trafiło do funkcji ExampleFunctionTurnOnLight
	status = Example_Response(oczekuje,strlen(oczekuje));


	return status;
}


bool Example_Response(uint8_t *data,uint8_t size){

	uint16_t timeout = 2000; // ms

    uint16_t interval= 500; // ms

    do {

            if ((HAL_GetTick() - interval) > timeout) {

                    timeout -= 100;

               if(bufor_odbioru!=NULL){
					if(memcmp(bufor_odbioru,data,size)==0){
						/// !!!!O to miejsce wlasnie pytam jak tutaj wrocic do ExampleFunctionTurnOnLight
						// Na chwilę obecną jest wszystko w while i ExampleFunctionTurnOnLight czeka na odpowiedz Example_Response

						memset(bufor_odbioru,0,MAX_BUFFOR_DATA);
						return true;
					}

               }
                    interval = HAL_GetTick();

            }

            HAL_IncTick();


    } while (timeout > 0);

    return false;

}


void Example_Data_Receiver(char *data,uint8_t size){

	/// Parsowanie danych - dla przyklad bez parsowania, aby sie nie zaglebiac
	bufor_odbioru = data;
}