// ********************************************************************************************************************************************************************************** // Fichier ECRAN.C // // Contient toutes les fonctions liées à l'écran tactile. // ********************************************************************************************************************************************************************************** // Include : #include "main.h" // Prototypes : int8_t set_luminosite_ecran(uint16_t luminosite); void gestion_ecran(void); int8_t init_ecran(void); // Variables globales : struct Struct_ecran ecran; //================================================================================================================================================================== // Fonction : Met à jour le niveau de luminosité de l'écran // Reçoit : Le niveau de luminosité attendu (de 0 à 100%), en centièmes de pourcent. // Renvoit : 0 si aucune erreur, -1 si une erreur a été détectée //================================================================================================================================================================== int8_t set_luminosite_ecran(uint16_t luminosite) { if (luminosite > ECRAN_CONSIGNE_MAX) return(-1); if (luminosite == 0) { if (ecran.sequenceur.etat != ETAT_SEQUENCEUR_ECRAN_REPOS_ETEINT) ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_DEMANDE_EXTINCTION; } else { if (ecran.sequenceur.etat != ETAT_SEQUENCEUR_ECRAN_REPOS_ALLUME) ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_DEMANDE_ALLUMAGE; else // Si on est déjà allumé, uniquement envoi de la consigne au Compagnon pour mise à jour de la consigne de backlight (reste allumé mais à une autre consigne) { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(ecran.consigne_backlight, 0); else c_bus_down_commande_cde_backlight(ecran.consigne_backlight, ecran.consigne_leds); } } return(0); } //================================================================================================================================================================== // Fonction : Fonction de plus haut niveau de gestion de l'écran // Reçoit : Rien // Renvoit : Rien //================================================================================================================================================================== void gestion_ecran(void) { char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; switch(ecran.sequenceur.etat) { //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_INIT : { if ((ecran.sequenceur.compteur == 0) && (c_bus.sequenceur.etat != ETAT_SEQUENCEUR_C_BUS_INIT)) { if (ecran.consigne_backlight == 0) ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_DEMANDE_EXTINCTION; else ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_DEMANDE_ALLUMAGE; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_DEMANDE_EXTINCTION : { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(0, 0); else c_bus_down_commande_cde_backlight(0, ecran.consigne_leds); ecran.sequenceur.compteur = ECRAN_TEMPO_EXTINCTION_BACKLIGHT_LVDS; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_BACKLIGHT; break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_BACKLIGHT : { if (ecran.sequenceur.compteur == 0) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_pdown_hdmi_cmd_n, OFF); // Coupure de la commande du HDMI et donc du LVDS. 0 est l'adresse de ShipBase ecran.sequenceur.compteur = ECRAN_TEMPO_EXTINCTION_LVDS_VGX; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_LVDS; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_LVDS : { if (ecran.sequenceur.compteur == 0) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_do_lcd_en_vgx, OFF); // .. puis coupure de la commande de VGx. 0 est l'adresse de ShipBAse ecran.sequenceur.compteur = ECRAN_TEMPO_EXTINCTION_VGX_VDD; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_VGX; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ATTENTE_EXTINCTION_VGX : { if (ecran.sequenceur.compteur == 0) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_do_lcd_en_vdd, OFF); // Coupure immédiate de la commande de VDD. 0 est l'adresse de ShipBase ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_REPOS_ETEINT; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_REPOS_ETEINT : { break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_DEMANDE_ALLUMAGE : { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_do_lcd_en_vdd, ON); // Activation immédiate de la commande de VDD. 0 est l'adresse de ShipBase ecran.sequenceur.compteur = ECRAN_TEMPO_ALIMENTATION_VDD_LVDS; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_VDD; break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_VDD : { if (ecran.sequenceur.compteur == 0) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_pdown_hdmi_cmd_n, ON); // Activation de la commande du HDMI qui émet alors du LVDS. 0 est l'adresse de ShipBase ecran.sequenceur.compteur = ECRAN_TEMPO_ALIMENTATION_LVDS_VGX; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_LVDS; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_LVDS : { if (ecran.sequenceur.compteur == 0) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.sortie_gpio_cm_do_lcd_en_vgx, ON); // Activation immédiate de la commande de VGx. 0 est l'adresse de ShipBase ecran.sequenceur.compteur = ECRAN_TEMPO_ALIMENTATION_VGX_BACKLIGHT; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_VGX; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_ALLUMAGE_ATTENTE_VGX : { if (ecran.sequenceur.compteur == 0) { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(ecran.consigne_backlight, 0); else c_bus_down_commande_cde_backlight(ecran.consigne_backlight, ecran.consigne_leds); ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_REPOS_ALLUME; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_ECRAN_REPOS_ALLUME : { break; } //-------------------------------------------------------- default : { sprintf(tmp, "L'état du séquenceur Ecran est inconnu [%i]. Il est repositionné au REPOS", ecran.sequenceur.etat); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_INIT; break; } } } //================================================================================================================================================================== // Fonction : Initialise les fonctions de l'écran // Reçoit : Rien // Renvoit : 0 si aucune erreur, -1 si une erreur a été détectée //================================================================================================================================================================== int8_t init_ecran(void) { ecran.sequenceur.compteur = ECRAN_TEMPO_INIT; ecran.sequenceur.etat = ETAT_SEQUENCEUR_ECRAN_INIT; // Ajustement des variables selon la génération de ShipBase en cours : if (systeme.generation_shipbase == GENERATION_SHIPBASE_V1) { ecran.sortie_gpio_cm_pdown_hdmi_cmd_n = CM3P_Pdown_HDMI_CMD_N; ecran.sortie_gpio_cm_do_lcd_en_vgx = CM3P_DO_LCD_EN_VGx; ecran.sortie_gpio_cm_do_lcd_en_vdd = CM3P_DO_LCD_EN_VDD; } else { ecran.sortie_gpio_cm_pdown_hdmi_cmd_n = CM4_Pdown_HDMI_CMD_N; ecran.sortie_gpio_cm_do_lcd_en_vgx = CM4_DO_EN_LCD_VGx; ecran.sortie_gpio_cm_do_lcd_en_vdd = CM4_DO_EN_LCD_VDD; } return(0); }