/*
 * Modem_Core.h
 * Podstawowa warstwa komunikacji z modulem SIM7000E dla STM32 (HAL):
 * definicja struktury reprezentujacej modem, typ stanu (modem_state_t)
 * oraz funkcje bazowe do wysylania komend AT i odbierania odpowiedzi.
 * Transmisja danych do modemu odbywa sie przez HAL_UART_Transmit_DMA,
 * dlatego bufor nadawczy (bufout) jest polem struktury, a nie lokalna
 * zmienna w funkcji - DMA operuje na nim asynchronicznie, wiec musi
 * pozostac wazny (w pamieci) tak dlugo, jak trwa transmisja.
 */

#ifndef INC_MODEM_CORE_H_
#define INC_MODEM_CORE_H_

/* Includes ------------------------------------------------------------------*/
#include "stm32l4xx_hal.h"
#include <string.h>


/* Private define --------------------------------------------------------------*/
#define MODEM_BUFFER_SIZE 256

/* Exported types ---------------------------------------------------------------*/

// Stan modemu - typ wyliczeniowy, zeby nie zgadywac co oznacza "0" czy "1"
typedef enum {
    MODEM_STATE_OK,
    MODEM_STATE_CMD,
    MODEM_STATE_TIMEOUT,
    MODEM_STATE_ERROR
} modem_state_t;



// Glowna struktura reprezentujaca caly modul SIM7000E
typedef struct {
    UART_HandleTypeDef *huart;   // interfejs UART podpiety do modemu (np. &huart1)
    GPIO_TypeDef *pwr_port;      // port GPIO linii PWRKEY
    uint16_t pwr_pin;            // numer pinu PWRKEY (np. GPIO_PIN_0)

    char bufin[MODEM_BUFFER_SIZE];   // bufor odbiorczy - gromadzi surowa odpowiedz modemu
    uint16_t bufin_index;

    char bufout[MODEM_BUFFER_SIZE];  // bufor nadawczy - zrodlo danych dla HAL_UART_Transmit_DMA

    modem_state_t status;
    double lat;   // szerokosc geograficzna - dostep przez Modem_GPS_Get_Lat()
    double lon;   // dlugosc geograficzna - dostep przez Modem_GPS_Get_Lon()
    uint8_t fix; // 1 = wazny fix, 0 = brak/blad odczytu
} sim7000e_t;

/* Exported function prototypes --------------------------------------------------*/
void Debug_Print(const char *text); // wypisanie tekstu na kanal diagnostyczny (USART2/VCP)
void Modem_Send_String(sim7000e_t *sim, const char *str); // wyslanie surowego tekstu do modemu przez DMA
void Clear_Modem_Buffer(sim7000e_t *sim); // zerowanie bufora odbiorczego modemu
void Modem_Clear_UART_Errors(sim7000e_t *sim); // czyszczenie flag bledow UART (OR/NE/FE/PE)

uint8_t Modem_Wait_For_Response(sim7000e_t *sim, const char *expected, uint32_t timeout_ms); // oczekiwanie na okreslony fragment tekstu w odpowiedzi modemu

uint8_t Modem_Send_Command(sim7000e_t *sim, const char *cmd, const char *expected, uint32_t timeout_ms); // wyslanie komendy AT i oczekiwanie na odpowiedz

uint8_t Modem_Try_AT(sim7000e_t *sim, uint8_t attempts); // wielokrotna proba komunikacji AT bez ingerencji w PWRKEY

void Fatal_Error(sim7000e_t *sim, const char *msg); // zatrzymanie programu w przypadku bledu krytycznego

#include "Modem_GPS.h"

#endif /* INC_MODEM_CORE_H_ */
