/** * @file main * */ /********************* * INCLUDES *********************/ #include #include #include "lvgl/lvgl.h" #include "lvgl/demos/lv_demos.h" /********************* * DEFINES *********************/ /********************** * TYPEDEFS **********************/ /********************** * STATIC PROTOTYPES **********************/ bool chauffeNormal = 0; bool chauffeConfort = 0; bool prechauffe = 0; bool enterPrgChauffe = 0; byte etat_Chauffe_CH_Sud = 1; byte etat_Chauffe_CH_Nord = 2; byte etat_Chauffe_CH_Etage = 3; byte etat_Chauffe_Salon = 2; static lv_style_t style_boutonChauffeNormal; static lv_style_t style_boutonChauffeConfort; static lv_style_t style_boutonPrechauffe; static lv_obj_t * text_etatCH; static lv_obj_t * text_CH_Sud; static lv_obj_t * text_CH_Nord; static lv_obj_t * text_CH_Etage; static lv_obj_t * text_Salon; static lv_obj_t * text_Etat_CH_Sud; static lv_obj_t * text_Etat_CH_Nord; static lv_obj_t * text_Etat_CH_Etage; static lv_obj_t * text_Etat_Salon; lv_obj_t * spinner; static lv_obj_t *screen_General1; static lv_obj_t *screen_MotdePasse_Initial1; static lv_obj_t *screen_MotdePasse_Erreur; /********************** * STATIC VARIABLES **********************/ static const wchar_t * title = L"LVGL port Windows CodeBlocks. https://lvgl.io | https://docs.lvgl.io"; /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ void scr_unloaded_delete_cb(lv_event_t * e) { lv_obj_t ** screen = lv_event_get_user_data(e); lv_obj_del(*screen); (*screen) = NULL; } static void event_handler_btn1(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * btnNormal = (lv_obj_t *) lv_event_get_target(e); lv_style_init(&style_boutonChauffeNormal); if(code == LV_EVENT_CLICKED) { if (chauffeNormal == false) { lv_obj_set_style_bg_color(btnNormal, lv_palette_main(LV_PALETTE_GREEN), 0); chauffeNormal = true; } else { lv_obj_set_style_bg_color(btnNormal, lv_palette_main(LV_PALETTE_BLUE), 0); chauffeNormal = false; } //lv_obj_add_style(btn1, &style_boutonChauffeNormal, 0); LV_LOG_USER("Button clicked "); } } static void textarea_event_handler(lv_event_t * e) { lv_obj_t * ta = lv_event_get_target(e); LV_UNUSED(ta); char*texte = lv_textarea_get_text(ta); LV_LOG_USER("Enter was pressed. The current text is: %s", texte); if (strcmp(texte,"2785")==0) { //create_screen_1(4,1,1,2,1); lv_scr_load(screen_General1); } else { create_screen_3(1); lv_scr_load(screen_MotdePasse_Erreur); } } static void btnm_event_handler(lv_event_t * e) { lv_obj_t * obj = lv_event_get_target(e); lv_obj_t * ta = lv_event_get_user_data(e); const char * txt = lv_buttonmatrix_get_button_text(obj, lv_buttonmatrix_get_selected_button(obj)); if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) lv_textarea_delete_char(ta); else if(lv_strcmp(txt, LV_SYMBOL_HOME) == 0) { lv_scr_load(screen_General1); } else if(lv_strcmp(txt, LV_SYMBOL_OK) == 0) lv_obj_send_event(ta, LV_EVENT_READY, NULL); else lv_textarea_add_text(ta, txt); } lv_obj_t * create_screen_2(bool ErrorMDP) { lv_obj_t * screen_MotdePasse = lv_obj_create(NULL); lv_obj_add_event_cb(screen_MotdePasse, scr_unloaded_delete_cb, LV_EVENT_SCREEN_UNLOADED, &screen_MotdePasse); /* BACKGROUND */ static lv_style_t style_backgroundMDP; lv_style_init(&style_backgroundMDP); lv_style_set_bg_color(&style_backgroundMDP, lv_palette_main(LV_PALETTE_RED)); lv_style_set_border_color(&style_backgroundMDP, lv_palette_lighten(LV_PALETTE_RED, 3)); lv_style_set_border_width(&style_backgroundMDP, 3); lv_obj_t * obj_backgroundMDP = lv_obj_create(screen_MotdePasse); lv_obj_add_style(obj_backgroundMDP, &style_backgroundMDP, 0); lv_obj_set_size(obj_backgroundMDP, 315, 235); /*Overwrite the background color locally*/ lv_obj_set_style_bg_color(obj_backgroundMDP, lv_palette_main(LV_PALETTE_INDIGO), LV_PART_MAIN); lv_obj_center(obj_backgroundMDP); /* ZONE TEXTE MOT DE PASSE */ lv_obj_t * pwd_label = lv_label_create(screen_MotdePasse); lv_obj_t * pwd_ta = lv_textarea_create(screen_MotdePasse); lv_textarea_set_text(pwd_ta, ""); lv_textarea_set_password_mode(pwd_ta, true); lv_textarea_set_one_line(pwd_ta, true); lv_obj_set_width(pwd_ta, lv_pct(70)); lv_obj_set_pos(pwd_ta, 55, 40); lv_obj_add_event_cb(pwd_ta, textarea_event_handler, LV_EVENT_READY, pwd_ta); lv_label_set_text(pwd_label, "Entrer mot de passe:"); lv_obj_set_style_text_color(pwd_label, lv_palette_main(LV_PALETTE_GREEN), LV_PART_MAIN); lv_obj_align_to(pwd_label, pwd_ta, LV_ALIGN_OUT_TOP_MID, 0, -5); if (ErrorMDP == 1) { lv_obj_t * text_errorMDP = lv_label_create(screen_MotdePasse); lv_label_set_text(text_errorMDP, "ERREUR! Reessayer"); lv_obj_set_style_text_color(text_errorMDP, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN); lv_obj_align(text_errorMDP, LV_ALIGN_OUT_TOP_MID, 50, -5); } static lv_style_t style_PasswordT; lv_style_init(&style_PasswordT); lv_style_set_text_font(&style_PasswordT, &lv_font_montserrat_16); lv_obj_add_style(pwd_label, &style_PasswordT, 0); static const char * clavier_num[] = { "1", "2", "3", "\n", "4", "5", "6", "\n", "7", "8", "9", "\n", LV_SYMBOL_BACKSPACE, LV_SYMBOL_HOME, LV_SYMBOL_OK, "" }; lv_obj_t * btnm = lv_buttonmatrix_create(screen_MotdePasse); lv_obj_set_size(btnm, 200, 150); lv_obj_align(btnm, LV_ALIGN_BOTTOM_MID, 0, -10); lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, pwd_ta); lv_obj_remove_flag(btnm, LV_OBJ_FLAG_CLICK_FOCUSABLE); /*To keep the text area focused on button clicks*/ lv_buttonmatrix_set_map(btnm, clavier_num); return screen_MotdePasse; } void create_screen_3(bool ErrorMDP) { screen_MotdePasse_Erreur = lv_obj_create(NULL); lv_obj_add_event_cb(screen_MotdePasse_Erreur, scr_unloaded_delete_cb, LV_EVENT_SCREEN_UNLOADED, &screen_MotdePasse_Erreur); /* BACKGROUND */ static lv_style_t style_backgroundMDP; lv_style_init(&style_backgroundMDP); lv_style_set_bg_color(&style_backgroundMDP, lv_palette_main(LV_PALETTE_RED)); lv_style_set_border_color(&style_backgroundMDP, lv_palette_lighten(LV_PALETTE_RED, 3)); lv_style_set_border_width(&style_backgroundMDP, 3); lv_obj_t * obj_backgroundMDP = lv_obj_create(screen_MotdePasse_Erreur); lv_obj_add_style(obj_backgroundMDP, &style_backgroundMDP, 0); lv_obj_set_size(obj_backgroundMDP, 315, 235); /*Overwrite the background color locally*/ lv_obj_set_style_bg_color(obj_backgroundMDP, lv_palette_main(LV_PALETTE_INDIGO), LV_PART_MAIN); lv_obj_center(obj_backgroundMDP); /* ZONE TEXTE MOT DE PASSE */ lv_obj_t * pwd_label = lv_label_create(screen_MotdePasse_Erreur); lv_obj_t * pwd_ta = lv_textarea_create(screen_MotdePasse_Erreur); lv_textarea_set_text(pwd_ta, ""); lv_textarea_set_password_mode(pwd_ta, true); lv_textarea_set_one_line(pwd_ta, true); lv_obj_set_width(pwd_ta, lv_pct(70)); lv_obj_set_pos(pwd_ta, 55, 40); lv_obj_add_event_cb(pwd_ta, textarea_event_handler, LV_EVENT_READY, pwd_ta); lv_label_set_text(pwd_label, "Entrer mot de passe:"); lv_obj_set_style_text_color(pwd_label, lv_palette_main(LV_PALETTE_GREEN), LV_PART_MAIN); lv_obj_align_to(pwd_label, pwd_ta, LV_ALIGN_OUT_TOP_MID, 0, -5); if (ErrorMDP == 1) { lv_obj_t * text_errorMDP = lv_label_create(screen_MotdePasse_Erreur); lv_label_set_text(text_errorMDP, "ERREUR! Reessayer"); lv_obj_set_style_text_color(text_errorMDP, lv_palette_main(LV_PALETTE_RED), LV_PART_MAIN); lv_obj_align(text_errorMDP, LV_ALIGN_TOP_MID, 30, 78); } static lv_style_t style_PasswordT; lv_style_init(&style_PasswordT); lv_style_set_text_font(&style_PasswordT, &lv_font_montserrat_16); lv_obj_add_style(pwd_label, &style_PasswordT, 0); static const char * clavier_num[] = { "1", "2", "3", "\n", "4", "5", "6", "\n", "7", "8", "9", "\n", LV_SYMBOL_BACKSPACE, LV_SYMBOL_HOME, LV_SYMBOL_OK, "" }; lv_obj_t * btnm = lv_buttonmatrix_create(screen_MotdePasse_Erreur); lv_obj_set_size(btnm, 200, 150); lv_obj_align(btnm, LV_ALIGN_BOTTOM_MID, 0, -10); lv_obj_add_event_cb(btnm, btnm_event_handler, LV_EVENT_VALUE_CHANGED, pwd_ta); lv_obj_remove_flag(btnm, LV_OBJ_FLAG_CLICK_FOCUSABLE); /*To keep the text area focused on button clicks*/ lv_buttonmatrix_set_map(btnm, clavier_num); } static void choix_PrgChauffe(lv_event_t * e) { lv_event_code_t code = lv_event_get_code(e); lv_obj_t * choix = ( lv_obj_t *) lv_event_get_target(e); if(code == LV_EVENT_VALUE_CHANGED) { char buf[32]; lv_dropdown_get_selected_str(choix, buf, sizeof(buf)); LV_LOG_USER("Option: %s", buf); /*Create a spinner*/ if (enterPrgChauffe != 1) {spinner = lv_spinner_create(screen_General1);} lv_obj_set_size(spinner, 30, 30); lv_obj_align(spinner, LV_ALIGN_CENTER, 120, 80); lv_spinner_set_anim_params(spinner, 1000, 200); lv_arc_set_bg_angles(spinner, 0, 0); static lv_style_t style_spinner; lv_style_init(&style_spinner); lv_style_set_arc_color(&style_spinner, lv_palette_main(LV_PALETTE_LIME)); lv_style_set_arc_width(&style_spinner, 5); lv_obj_add_style(spinner, &style_spinner, LV_PART_INDICATOR); enterPrgChauffe = 1; if (strcmp(buf,"Confort")==0) { screen_MotdePasse_Initial1 = create_screen_2(0); lv_scr_load(screen_MotdePasse_Initial1); } else if (strcmp(buf,"Prechauffe")==0) { etat_Chauffe_CH_Sud = 2; etat_Chauffe_CH_Etage = 3; updateStatus_Chauffe(); } else if (strcmp(buf,"Off")==0) { etat_Chauffe_CH_Sud = 1; etat_Chauffe_CH_Etage = 1; etat_Chauffe_Salon = 1; etat_Chauffe_CH_Nord = 1; updateStatus_Chauffe(); } else if (strcmp(buf,"Normal")==0) { etat_Chauffe_CH_Sud = 3; etat_Chauffe_CH_Etage = 2; etat_Chauffe_Salon = 1; etat_Chauffe_CH_Nord = 2; updateStatus_Chauffe(); } else { printf("ELSE ERROR\n"); //printf(buf); } } } void updateStatus_Chauffe() { /* ETAT DES CHAUFFAGES */ static lv_style_t style_chauffage; lv_style_init(&style_chauffage); text_etatCH = lv_label_create(screen_General1); lv_style_set_text_font(&style_chauffage, &lv_font_montserrat_16); lv_obj_add_style(text_etatCH, &style_chauffage, 0); lv_label_set_long_mode(text_etatCH, LV_LABEL_LONG_WRAP); // Breaks the long lines lv_label_set_text(text_etatCH, "Etat chauffages:"); lv_obj_set_width(text_etatCH, 150); lv_obj_set_style_text_align(text_etatCH, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_etatCH, LV_ALIGN_CENTER, -80, -70); static lv_style_t style_chauffageON; lv_style_init(&style_chauffageON); lv_style_set_text_color(&style_chauffageON, lv_palette_main(LV_PALETTE_ORANGE)); static lv_style_t style_chauffageON_chauffe; lv_style_init(&style_chauffageON_chauffe); lv_style_set_text_color(&style_chauffageON_chauffe, lv_palette_main(LV_PALETTE_RED)); static lv_style_t style_chauffageOFF; lv_style_init(&style_chauffageOFF); lv_style_set_text_color(&style_chauffageOFF, lv_palette_main(LV_PALETTE_GREEN)); //Chambre Sud lv_label_set_text(text_CH_Sud, "Chambre Sud:"); lv_obj_set_style_text_align(text_CH_Sud, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_CH_Sud, LV_ALIGN_CENTER, -105, -40); if (etat_Chauffe_CH_Sud == 1) { lv_label_set_text(text_Etat_CH_Sud, "OFF"); lv_obj_add_style(text_Etat_CH_Sud, &style_chauffageOFF, 0); lv_obj_set_style_text_align(text_Etat_CH_Sud, LV_TEXT_ALIGN_CENTER, 0); } else if (etat_Chauffe_CH_Sud == 2) { lv_label_set_text(text_Etat_CH_Sud, "ON"); lv_obj_add_style(text_Etat_CH_Sud, &style_chauffageON, 0); lv_obj_set_style_text_align(text_Etat_CH_Sud, LV_TEXT_ALIGN_CENTER, 0); } else { lv_label_set_text(text_Etat_CH_Sud, LV_SYMBOL_CHARGE); lv_obj_add_style(text_Etat_CH_Sud, &style_chauffageON_chauffe, 0); lv_obj_set_style_text_align(text_Etat_CH_Sud, LV_TEXT_ALIGN_CENTER, 0); } lv_obj_align(text_Etat_CH_Sud, LV_ALIGN_CENTER, -22, -40); //Chambre Nord lv_label_set_text(text_CH_Nord, "Chambre Nord:"); lv_obj_set_style_text_align(text_CH_Nord, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_CH_Nord, LV_ALIGN_CENTER, -102, -25); if (etat_Chauffe_CH_Nord == 1) { lv_label_set_text(text_Etat_CH_Nord, "OFF"); lv_obj_add_style(text_Etat_CH_Nord, &style_chauffageOFF, 0); lv_obj_set_style_text_align(text_Etat_CH_Nord, LV_TEXT_ALIGN_CENTER, 0); } else if (etat_Chauffe_CH_Nord == 2) { lv_label_set_text(text_Etat_CH_Nord, "ON"); lv_obj_add_style(text_Etat_CH_Nord, &style_chauffageON, 0); lv_obj_set_style_text_align(text_Etat_CH_Nord, LV_TEXT_ALIGN_CENTER, 0); } else { lv_label_set_text(text_Etat_CH_Nord, LV_SYMBOL_CHARGE); lv_obj_add_style(text_Etat_CH_Nord, &style_chauffageON_chauffe, 0); lv_obj_set_style_text_align(text_Etat_CH_Nord, LV_TEXT_ALIGN_CENTER, 0); } lv_obj_align(text_Etat_CH_Nord, LV_ALIGN_CENTER, -22, -25); //Chambre étage lv_label_set_text(text_CH_Etage, "Chambre etage:"); lv_obj_set_style_text_align(text_CH_Etage, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_CH_Etage, LV_ALIGN_CENTER, -99, -10); if (etat_Chauffe_CH_Etage == 1) { lv_label_set_text(text_Etat_CH_Etage, "OFF"); lv_obj_add_style(text_Etat_CH_Etage, &style_chauffageOFF, 0); lv_obj_set_style_text_align(text_Etat_CH_Etage, LV_TEXT_ALIGN_CENTER, 0); } else if (etat_Chauffe_CH_Etage == 2) { lv_label_set_text(text_Etat_CH_Etage, "ON"); lv_obj_add_style(text_Etat_CH_Etage, &style_chauffageON, 0); lv_obj_set_style_text_align(text_Etat_CH_Etage, LV_TEXT_ALIGN_CENTER, 0); } else { lv_label_set_text(text_Etat_CH_Etage, LV_SYMBOL_CHARGE); lv_obj_add_style(text_Etat_CH_Etage, &style_chauffageON_chauffe, 0); lv_obj_set_style_text_align(text_Etat_CH_Etage, LV_TEXT_ALIGN_CENTER, 0); } lv_obj_align(text_Etat_CH_Etage, LV_ALIGN_CENTER, -22, -10); //Salon lv_label_set_text(text_Salon, "Salon:"); lv_obj_set_style_text_align(text_Salon, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_Salon, LV_ALIGN_CENTER, -135, 5); if (etat_Chauffe_Salon == 1) { lv_label_set_text(text_Etat_Salon, "OFF"); lv_obj_add_style(text_Etat_Salon, &style_chauffageOFF, 0); lv_obj_set_style_text_align(text_Etat_Salon, LV_TEXT_ALIGN_CENTER, 0); } else if (etat_Chauffe_Salon == 2) { lv_label_set_text(text_Etat_Salon, "ON"); lv_obj_add_style(text_Etat_Salon, &style_chauffageON, 0); lv_obj_set_style_text_align(text_Etat_Salon, LV_TEXT_ALIGN_CENTER, 0); } else { lv_label_set_text(text_Etat_Salon, LV_SYMBOL_CHARGE); lv_obj_add_style(text_Etat_Salon, &style_chauffageON_chauffe, 0); lv_obj_set_style_text_align(text_Etat_Salon, LV_TEXT_ALIGN_CENTER, 0); } lv_obj_align(text_Etat_Salon, LV_ALIGN_CENTER, -22, 5); } void create_screen_1(byte etat_prgChauffe) { screen_General1 = lv_obj_create(NULL); text_CH_Sud = lv_label_create(screen_General1); text_CH_Nord = lv_label_create(screen_General1); text_CH_Etage = lv_label_create(screen_General1); text_Salon = lv_label_create(screen_General1); text_Etat_CH_Sud = lv_label_create(screen_General1); text_Etat_CH_Nord = lv_label_create(screen_General1); text_Etat_CH_Etage = lv_label_create(screen_General1); text_Etat_Salon = lv_label_create(screen_General1); //Set background color lv_obj_set_style_bg_color(screen_General1, lv_color_hex(0x003a57), LV_PART_MAIN); /* TITRE ECRAN */ static lv_style_t style_G; lv_style_init(&style_G); lv_obj_t * text_label = lv_label_create(screen_General1); lv_style_set_text_font(&style_G, &lv_font_montserrat_20); lv_obj_add_style(text_label, &style_G, 0); lv_label_set_long_mode(text_label, LV_LABEL_LONG_WRAP); // Breaks the long lines lv_label_set_text(text_label, "Gestion centralisee chauffage"); lv_obj_set_width(text_label, 320); lv_obj_set_style_text_align(text_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_label, LV_ALIGN_CENTER, 0, -110); updateStatus_Chauffe(); /* LISTE PROGRAMME CHAUFFE */ lv_obj_t * text_ActivTTChauffages = lv_label_create(screen_General1); lv_label_set_text(text_ActivTTChauffages, "Programme chauffe:"); lv_obj_set_style_text_align(text_ActivTTChauffages, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_ActivTTChauffages, LV_ALIGN_CENTER, 82, -60); //Normal lv_obj_t * liste_Prg_Chauffe = lv_dropdown_create(screen_General1); if (etat_prgChauffe == 1) { lv_dropdown_set_options(liste_Prg_Chauffe, "Normal\n" "Prechauffe\n" "Confort\n" "Off"); } else if (etat_prgChauffe == 2) { lv_dropdown_set_options(liste_Prg_Chauffe, "Prechauffe\n" "Normal\n" "Confort\n" "Off"); } else if (etat_prgChauffe == 3) { lv_dropdown_set_options(liste_Prg_Chauffe, "Off\n" "Normal\n" "Prechauffe\n" "Confort"); } else { lv_dropdown_set_options(liste_Prg_Chauffe, "Confort\n" "Prechauffe\n" "Normal\n" "Off"); } lv_obj_align(liste_Prg_Chauffe, LV_ALIGN_CENTER, 85, -30); lv_obj_add_event_cb(liste_Prg_Chauffe, choix_PrgChauffe, LV_EVENT_ALL, NULL); /* AFFICHAGE HEURE */ lv_obj_t * text_Heure1 = lv_label_create(screen_General1); lv_label_set_text(text_Heure1, "Il est:"); lv_obj_set_style_text_align(text_Heure1, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(text_Heure1, LV_ALIGN_CENTER, -80, 80); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) { /*Initialize LVGL*/ lv_init(); /*Initialize the HAL for LVGL*/ lv_display_t * display = lv_windows_create_display(title, 350, 300, 100, FALSE, FALSE); lv_windows_acquire_pointer_indev(display); /*Output prompt information to the console, you can also use printf() to print directly*/ LV_LOG_USER("LVGL initialization completed!"); create_screen_1(1); updateStatus_Chauffe(); lv_scr_load(screen_General1); while(1) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ lv_task_handler(); usleep(5000); /*Just to let the system breath*/ } return 0; }