/*
* 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;
}