Files
shipheart-appli/sources/usb.c
T

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);
}