238 lines
8.4 KiB
C
238 lines
8.4 KiB
C
// **********************************************************************************************************************************************************************************
|
|
// 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);
|
|
} |