// ********************************************************************************************************************************************************************************** // Fichier USB.C // // Contient toutes les fonctions liées aux ports USB // ********************************************************************************************************************************************************************************** // Include : #include "main.h" // Prototypes : int8_t init_usb(void); void gestion_usb(void); // Variables globales : struct Struct_usb usb; uint16_t test; //********************************************************************************************************************************************************************************** // Fonction : Gestion des ports USB // Reçoit : Rien // Retourne : Rien //********************************************************************************************************************************************************************************** void gestion_usb(void) { uint8_t i; char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; switch(usb.sequenceur.etat) { //-------------------------------------------------------- case ETAT_SEQUENCEUR_USB_INIT : { if (usb.sequenceur.compteur == 0) { usb.sequenceur.etat = ETAT_SEQUENCEUR_USB_REPOS; } break; } //-------------------------------------------------------- case ETAT_SEQUENCEUR_USB_REPOS : { if (usb.sequenceur.compteur == 0) { usb.sequenceur.compteur = USB_PERIODE_SURVEILLANCE; //--------------------------------------------- // Recherche des éventuels défauts : for (i = 0; i < USB_MAX_NOMBRE_PORTS; i ++) { if (usb.ports[i].flag_validite == FALSE) continue; if ((usb.ports[i].defaut == USB_ETAT_PORT_OK) && (lecture_entree(TYPE_ENTREES_GPIO, 0, usb.ports[i].no_entree_defaut, TRUE) == ON)) // 0 est l'adresse de ShipBase { usb.ports[i].defaut = USB_ETAT_PORT_DEFAUT; sprintf(tmp, "Le port USB n° %i vient de passer en défaut", (i+1)); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); enregistrement_historique(TYPE_SOURCE_HISTORIQUE_USB, USB_PASSAGE_DEFAUT, (i+1), 0, NULL); } if ((usb.ports[i].defaut == USB_ETAT_PORT_DEFAUT) && (lecture_entree(TYPE_ENTREES_GPIO, 0, usb.ports[i].no_entree_defaut, TRUE) == OFF)) // 0 est l'adresse de ShipBase { usb.ports[i].defaut = USB_ETAT_PORT_OK; sprintf(tmp, "Le défaut sur le port USB n° %i vient de disparaitre", (i+1)); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_WARNING); enregistrement_historique(TYPE_SOURCE_HISTORIQUE_USB, USB_PASSAGE_OK, (i+1), 0, NULL); } } //------------------------------------------------ // Ports avant - Lien avec le circuit de commande: if (usb.no_circuit_usb_avant != -1) { // Etat des ports : circuits.circuits[usb.no_circuit_usb_avant].etat = (usb.ports[USB_FACE_AVANT_HAUT].defaut << 2) | (usb.ports[USB_FACE_AVANT_MILIEU].defaut << 1) | (usb.ports[USB_FACE_AVANT_BAS].defaut); // Commande de l'alimentation : if (circuits.circuits[usb.no_circuit_usb_avant].variables[CIRCUIT_VARIABLE_CONSIGNE].valeur_courante == OFF) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, usb.sortie_gpio_cm_do_usb_avant_pwr_en, OFF); // Coupure de l'alimentation des ports. 0 est l'adresse de ShipBase } else ecriture_sortie(TYPE_SORTIE_GPIO, 0, usb.sortie_gpio_cm_do_usb_avant_pwr_en, ON); // Commande de l'alimentation des ports. 0 est l'adresse de ShipBase } //------------------------------------------------ // Port arrière - Lien avec le circuit de commande: if ((usb.ports[USB_FACE_ARRIERE].flag_validite) && (usb.no_circuit_usb_arriere != -1)) { // Etat des ports : circuits.circuits[usb.no_circuit_usb_arriere].etat = usb.ports[USB_FACE_ARRIERE].defaut; // Commande de l'alimentation : if (circuits.circuits[usb.no_circuit_usb_arriere].variables[CIRCUIT_VARIABLE_CONSIGNE].valeur_courante == OFF) { ecriture_sortie(TYPE_SORTIE_GPIO, 0, usb.sortie_gpio_cm_do_usb_arriere_pwr_en, OFF); // Coupure de l'alimentation des ports. 0 est l'adresse de ShipBase } else ecriture_sortie(TYPE_SORTIE_GPIO, 0, usb.sortie_gpio_cm_do_usb_arriere_pwr_en, ON); // Commande de l'alimentation des ports. 0 est l'adresse de ShipBase } } break; } //-------------------------------------------------------- default : { sprintf(tmp, "L'état du séquenceur Usb est inconnu [%i]. Il est repositionné au REPOS", usb.sequenceur.etat); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); usb.sequenceur.etat = ETAT_SEQUENCEUR_USB_REPOS; break; } } } //********************************************************************************************************************************************************************************** // Fonction : Init des ports USB // Reçoit : Rien // Retourne : 0 si aucune erreur, -1 sinon //********************************************************************************************************************************************************************************** int8_t init_usb(void) { uint8_t i; if (systeme.generation_shipbase == GENERATION_SHIPBASE_V1) { // Init des paramètres de chaque port : for (i = 0; i < USB_MAX_NOMBRE_PORTS; i ++) { switch(i) { case USB_FACE_AVANT_HAUT : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM3P_DI_USB3_ALERT_N; // Attention : on a gardé le références du schéma qui sont inversées (ici, c'est le port du HAUT) break; } case USB_FACE_AVANT_MILIEU : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM3P_DI_USB2_ALERT_N; break; } case USB_FACE_AVANT_BAS : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM3P_DI_USB1_ALERT_N; // Attention : on a gardé le références du schéma qui sont inversées (ici, c'est le port du BAS) break; } case USB_FACE_ARRIERE : { usb.ports[i].flag_validite = FALSE; usb.ports[i].no_entree_defaut = 0; break; } default : { usb.ports[i].flag_validite = FALSE; usb.ports[i].no_entree_defaut = 0; break; } } } // Affectation des sorties d'activation des ports : usb.sortie_gpio_cm_do_usb_avant_pwr_en = CM3P_DO_USB_AVANT_PWR_EN; usb.sortie_gpio_cm_do_usb_arriere_pwr_en = 0; } else // V2 & V3 { // Init des paramètres de chaque port : for (i = 0; i < USB_MAX_NOMBRE_PORTS; i ++) { switch(i) { case USB_FACE_AVANT_HAUT : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM4_DI_USB_HAUT_ALERT_N; break; } case USB_FACE_AVANT_MILIEU : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM4_DI_USB_MILIEU_ALERT_N; break; } case USB_FACE_AVANT_BAS : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM4_DI_USB_BAS_ALERT_N; break; } case USB_FACE_ARRIERE : { usb.ports[i].flag_validite = TRUE; usb.ports[i].no_entree_defaut = CM4_DI_USB_ARRIERE_ALERT_N; break; } default : { usb.ports[i].flag_validite = FALSE; usb.ports[i].no_entree_defaut = 0; break; } } } // Affectation des sorties d'activation des ports : usb.sortie_gpio_cm_do_usb_avant_pwr_en = CM4_DO_USB_AVANT_PWR_EN; usb.sortie_gpio_cm_do_usb_arriere_pwr_en = CM4_DO_USB_ARRIERE_PWR_EN; } // Variables générales : usb.sequenceur.compteur = USB_TEMPO_INIT; usb.sequenceur.etat = ETAT_SEQUENCEUR_USB_INIT; // Note importante : // Les valeurs de 'usbb.no_circuit_usb_avant' et 'usb.no_circuit_usb_arriere' ont DEJA été mises à jour dans 'bdd_init.c' dans la partie CIRCUITS. // Il ne faut donc surtout pas les initialiser (à -1 par exemple) ici...! // Affichage du message de débug : affichage_debug(__FILE__, __LINE__, "Initialisation des ports USB\t: OK", TYPE_MESSAGE_DEBUG_OK); return(0); }