#pragma once #include "driver/uart.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/queue.h" #include "freertos/task.h" #include "pins.h" #include "servergprs.h" typedef struct { SemaphoreHandle_t done; char response[256]; bool success; } sim800_cmd_t; typedef enum { MODEM_STATE_OFF = 0, MODEM_STATE_INIT, MODEM_STATE_READY, MODEM_STATE_REGISTERING, MODEM_STATE_REGISTERED, MODEM_STATE_SMS_READY, MODEM_STATE_CALL_ACTIVE, MODEM_STATE_GPRS_CONNECTING, MODEM_STATE_GPRS_UP, MODEM_STATE_TCP_CONNECTING, MODEM_STATE_TCP_CONNECTED, MODEM_STATE_ERROR } modem_state_t; typedef struct { modem_state_t state; bool in_call; bool gprs_active; bool need_gprs_restart; int signal; int network_registered; int last_rssi; int last_ber; bool tcp_connected; char tcp_host[64]; int tcp_port; SemaphoreHandle_t state_mutex; } modem_t; typedef enum { EV_NONE = 0, EV_MODEM_OK, EV_MODEM_ERROR, EV_NETWORK_REG_OK, EV_NETWORK_LOST, EV_INCOMING_CALL, EV_CALL_ENDED, EV_SMS_RECEIVED, EV_GPRS_UP, EV_GPRS_DOWN } modem_event_t; void print_state(); void sim800_uart_init(void); void modem_update_flags(void); void modem_set_state(modem_state_t new_state); void modem_handle_event(modem_event_t ev); bool modem_start_gprs(void); void sim800_csq_task(void *arg); void sim800_task(void *arg); void sim800_handle_line(char *line); void sim800_parse(char *data); void sim800_send(const char *cmd); bool sim800_command(const char *cmd, uint32_t timeout_ms); void init_modem(void *arg); bool sim800_send_sms(const char *number, const char *msg); bool sim800_call(const char *number); bool sim800_hangup(void); bool sim800_answer(void); bool sim800_tcp_connect(const char *host, int port); bool sim800_tcp_send(const void *data, int len); bool sim800_tcp_close(void);