#include <Arduino.h>

#pragma	once


uint16_t x_ch[10] = {10, 37, 64, 91, 132, 159, 186, 228, 255, 282}; // positions des chiffres et des boutons d'incrémentation attachés


// ***************** bmp565_header *********************************************************************
// pour obtenir ces valeurs simplement, ouvrir une image bmp565 320x240 (ok) avec l'éditeur Hexa ImHex (Linux)
// sélectionner la partie entête, puis File/export/Text Formatted Bytes/C++ Array
// ce qui est vachement pratique !
const uint8_t bmp565_header[] PROGMEM = 
{
    0x42, 0x4D, 0x8A, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0x00, 0x00, 0x00, 0x7C, 0x00, 
    0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00, 
    0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x23, 0x2E, 0x00, 0x00, 0x23, 0x2E, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x47, 0x52, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
};
// soit 138 octet
//*******************************************************************************************************


class TOUCH_BOUTON
{
    protected:
        uint8_t dx;
        uint8_t dy;
        uint8_t dr; // rayon de courbure des angles

    public:
        uint16_t x0;
        uint16_t y0;
        uint16_t couleur;

        String label;
        boolean cliked;
        boolean selected;

        uint8_t read_dx();
        uint8_t read_dy();

        TOUCH_BOUTON(); // constructeur

        void init(uint16_t x_i, uint16_t y_i, uint8_t dx_i, uint8_t dy_i, uint8_t dr_i, uint16_t couleur_i);
        void affiche(uint16_t coul_txt, uint16_t coul_fill_select, uint8_t n_font);

    private:

};



/** ***************************************************************************************
	CLASS CHF_PAD  // boutons invisibles pour incrémenter/décrémenter les chiffres de la fréquence
********************************************************************************************/
class CHF_PAD
{
    protected:
    
    public:
        uint8_t x0;
        uint8_t y0;

        TOUCH_BOUTON bt_pad_H[10]; // boutons dans le haut de chaque chiffre servant à l'incrémenter
        TOUCH_BOUTON bt_pad_L[10]; // boutons dans le BAS de chaque chiffre servant à le décrémenter
        
        CHF_PAD(); // constructeur

        void init();
        //uint8_t test_clic();

    private:
   
};

    void init_sprites();
    void init_variables_globales();
    void printTouchToDisplay();
    void init_1_bouton(uint8_t n_font, uint16_t xi, uint16_t yi, uint8_t dx, uint8_t dy, String si, TOUCH_BOUTON *bouton_i);
    void affiche_box_FRQ(uint16_t couleur); // autour de la fréquence (gros chiffres)
    String formatage_frq(uint64_t frq_i);
    String supp_zeros(String s_i);
    void affiche_frequence(uint64_t frq);
    void encadre_chiffre(uint16_t x);
    void out_frequence();
    void trace_sinusoide();
    void calcul_Fmin_Fmax(uint64_t Fi);
    void balayage_freq(uint64_t F0);  // wobulation
    void boucle_affi_curseur();
    void affi_boutons_choix_MODULE();
    void init_boutons_choix_MODE();
    void GO();
    void affi_grille();
    void efface_bande_boutons();
    void efface_grand_cadre();
    
    void init_affichages();
    void affi_page_info();
    void init_SDcard();
    void affi_image_from_SD(String filename, uint16_t x0, uint16_t y0);
    void write_fichier_params();// sur la SDcard
    void TS_calibrate();
    String read_line_params(uint16_t line_num);
    int32_t extract_params(String ligne, String label);
    void read_params(); // lecture du fichier '/params.txt' en SD
    void affi_mode();
    void affi_freq_W_min_max(); // affiche verticalement
    void setup();
    void get_XY_touch();
    void test_clic_boutons(TOUCH_BOUTON *bouton_i);	
    int test_clic_boutons_inc_dec(); 
    void test_clic_bt_mode();
    void draw_AEC(uint16_t x0, uint16_t y0, uint16_t L, uint8_t sens);
    void test_clic_bouton_RAZ();
    void test_clic_bt_455k();
    void test_clic_bt_4M();
    void test_clic_bt_10_7M();
    void test_clic_bt_27M();
    void test_clic_bt_35M();
    void test_clic_bt_41M();
    void test_clic_bt_144M();
    void test_clic_bt_2400M();
    void test_clic_bts_preset();
    //void test_clic_bts_pas();
    void test_clic_bouton_TEST();
    void capture_ecran();
    void loop();