#pragma once

#include "main.h"
#include "stm32h743xx.h"
#include <stdint.h>

/* Includes ------------------------------------------------------------------*/

/**
 Protezione dal cambiamento e dall'uso non raccomandato.
 Membri interni della struttura. Rende il membro solo lettura e genera un
 warning se usato da codice esterno.
 */
#define __rdon const
#define __rdwr
#define __prv8 __attribute__(( deprecated("Questo campo è PRIVATO. Non usarlo. Usa i metodi adatti alla manipolazione o controlla la tua implementazione"))) const

/**
 Protezione dal linking esterno.
 Funzioni e variabili globali in un file .c.	Limita la funzione/variabile al solo
 file in cui è definita (visibilità "privata" al file).
 */
#define READONLY const
#define PUBLIC
#define PRIVATE static

/// Variabile esterna condivisa con una Interrupt Service Routine.
#define EXT_ISR_VAR extern volatile
/// Dichiarazione della variabile nel file di definizione (es. .c).
#define ISR_VAR volatile
/// Variabile globale condivisa ma non usata negli interrupt
#define EXT_GLOBAL extern

/// MY DEBUG 1 = debug | 0 = no my debug
#define MY_DEBUG 1
#define NO_HAL_IT 0		// 0 disable 1 enable

// ====== USART ================

/**
 * @brief Inizializza la periferica USART3.
 * @note  Questa implementazione assume PD8=TX, PD9=RX (AF7).
 * @param pclk_freq La frequenza del clock della periferica (PCLK1 per USART3).
 * @param baudRate Il baud rate desiderato (es. 115200).
 */
PUBLIC void Pansi_USART3_Init(uint32_t pclk_freq, uint32_t baudRate);

/**
 * @brief Invia un singolo carattere su USART3 (bloccante).
 * @param c Il carattere da inviare.
 */
PUBLIC void Pansi_USART3_SendChar(char c);

/**
 * @brief Invia una stringa (terminata da null) su USART3.
 * @param str La stringa da inviare.
 */
PUBLIC void Pansi_USART3_SendString(const char *str);

/**
 * @brief Riceve un singolo carattere da USART3 (bloccante).
 * @return Il carattere ricevuto.
 */
PUBLIC char Pansi_USART3_ReceiveChar(void);
// ====== END USART ============

// ====== TIM6 =================

// ====== END TIM6 =============

/**
 * @brief Funzione di Accensione onBoard
 *
 * Permette di far accendere e spegnere contemporaneamente tutti i leg
 * presenti sulla board.
 */
void MOTD_init(void);

