Chrono-Cross  1.1
BTS SN-IR La Salle Avignon 2018
Signaux | Fonctions membres publiques | Connecteurs privés | Fonctions membres privées | Attributs privés
Référence de la classe ChronoCrossClassement

#include <chronocrossclassement.h>

Graphe de collaboration de ChronoCrossClassement:
Collaboration graph
[légende]

Liste de tous les membres

Signaux

void courseTerminee (QString numero)
void courseDemarree (QString numero)
void tempsArrivee (QString ordre, QString temps)

Fonctions membres publiques

 ChronoCrossClassement (QWidget *parent=0)
 Constructeur.
 ~ChronoCrossClassement ()
 Destructeur.

Connecteurs privés

void quitter ()
 Ferme l'application principale.
void chargerInscritsCourse ()
 Charge la liste des inscrits pour la course sélectionnée.
void demarrerCourse ()
 Démarre une course.
void topDepart ()
 Démarre une course logiciellement.
void finaliserDepartCourse (QString numero)
 Affiche le nombre d'arrivées et de classés.
void finaliserFinCourse (QString numero)
 Termine la course.
void terminerCourse ()
 Termine une course.
void enregistrerResultat ()
 Enregistre les resultats dans la base de donnees.
void enregistrerArriveeCoureur (QString ordre, QString temps)
 Enregistre l'arrivée d'un coureur.
void onReadyRead ()
 Décode les trames reçus.
void actualiserMessage (QString message)
void numeroterDossard (int l, int c)
 Classe les coureurs.
void selectionnerCourse ()
 Sélectionne une course à éditer.

Fonctions membres privées

void chargerListeManifestation ()
 Charge la liste des manifestations.
void chargerListeCourses ()
 Charge la liste des courses.
void initialiserBD ()
 Initialise la base de donnees.
void initialiserPort ()
 Initialise le port.
char verifierAcquittement (QString trame)
 Vérifie l'acquittement de la trame.
unsigned short calculerChecksum (QString data)
 Calcule le cheksum.
void envoyer (QString &trame)
 Envoie une trame.
void effacerTableTemps ()
 Efface les temps dans le tableau.
void afficherTableTemps ()
 Affiche les temps dans le tableau.
QString getIdInscrit (QString dossard)
 Obtiens l'idInscrit.
bool estInscrit (QString dossard)
 Vérifie que le dossard est inscrit à la course.

Attributs privés

Ui::ChronoCrossClassement * ui
 relation vers la classe IHM
BaseDeDonneesbd
 association vers la classe BaseDeDonnees
QextSerialPort * port
 connexion au port
QByteArray donnees
 les données correspondant au trame
bool displayEvent
QStringList manifestation
 la manifestation à la date actuelle
QVector< QStringList > courses
 la liste des courses pour une manifestation
QVector< QStringList > inscrits
 la liste des inscrits pour la course
QVector< QString > arrivees
 récupere le temps et affiche le nombre d'arrivée
QVector< QString > dossards
 récupere les dossards
QString numeroCourse
 récupere le numero de la course

Documentation des constructeurs et destructeur

ChronoCrossClassement::ChronoCrossClassement ( QWidget *  parent = 0) [explicit]
Paramètres:
parent

Références chargerListeCourses(), chargerListeManifestation(), demarrerCourse(), enregistrerResultat(), initialiserBD(), initialiserPort(), numeroCourse, port, selectionnerCourse(), terminerCourse(), topDepart(), et ui.

                                                            :
    QMainWindow(parent),
    ui(new Ui::ChronoCrossClassement)
{
    ui->setupUi(this);
    ui->comboBoxCourses->setEnabled(false);
    ui->pushButtonDemarrageCourse->setEnabled(false);
    ui->pushButtonTopDepart->setEnabled(false);
    ui->pushButtonFinCourse->setEnabled(false);
    ui->pushButtonEnregistrementResultats->setEnabled(false);
    QStringList header; // nom des colonnes
    header << "Classement" << "Dossard" << "Temps";

    // On fixe le nombre de colonnes
    ui->tableTemps->setColumnCount(header.size());
    // On applique les noms des colonnes
    ui->tableTemps->setHorizontalHeaderLabels(header);

    // on cache les numéros de ligne
    ui->tableTemps->verticalHeader()->setHidden(true);

    QHeaderView * headerView = ui->tableTemps->horizontalHeader();
    // on redimensionne automatiquement la colonne pour occuper l'espace disponible
    #if QT_VERSION >= 0x050000
    headerView->setSectionResizeMode(QHeaderView::Stretch);
    #else
    headerView->setResizeMode(QHeaderView::Stretch);
    #endif

    connect(ui->comboBoxCourses, SIGNAL(currentIndexChanged(int)), this, SLOT(selectionnerCourse()));
    connect(ui->pushButtonDemarrageCourse,SIGNAL(clicked()),this,SLOT(demarrerCourse()));
    connect(ui->pushButtonTopDepart,SIGNAL(clicked()),this,SLOT(topDepart()));
    connect(ui->pushButtonEnregistrementResultats,SIGNAL(clicked()),this,SLOT(enregistrerResultat()));
    connect(ui->pushButtonFinCourse,SIGNAL(clicked()),this,SLOT(terminerCourse()));

    // Initialisation
    initialiserBD();

    port = NULL;
    initialiserPort();

    chargerListeManifestation();
    chargerListeCourses();
    numeroCourse = "";
}

Documentation des fonctions membres

void ChronoCrossClassement::actualiserMessage ( QString  message) [private, slot]

Référencé par envoyer(), et onReadyRead().

{
    qDebug() << message;
}

Affiche les résultats dans le tableau.

Références arrivees, dossards, effacerTableTemps(), numeroterDossard(), et ui.

Référencé par enregistrerArriveeCoureur().

{
    effacerTableTemps();

    QString temps;
    QString dossard;
    QTime tempsCoureur;
    QString nomprenom;

    disconnect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));

    for(int l = 0; l < arrivees.count(); l++)
    {
        temps = arrivees.at(l);
        temps.chop(2); // enleve les 2 zéros inutilisés
        if(temps.count(":") == 2)
            tempsCoureur = QTime::fromString(temps, "h:m:s.zzz");
        else if(temps.count(":") == 1)
            tempsCoureur = QTime::fromString(temps, "m:s.zzz");
        else
            tempsCoureur = QTime::fromString(temps, "s.zzz");

        temps = tempsCoureur.toString("hh:mm:ss");

        dossard = dossards.at(l);
        //qDebug() << Q_FUNC_INFO << l << dossard << temps;
        QTableWidgetItem *elementClassement = new QTableWidgetItem(QString::number(l+1));
        QTableWidgetItem *elementDossard = new QTableWidgetItem(dossard);
        QTableWidgetItem *elementTemps = new QTableWidgetItem(temps);
        QTableWidgetItem *elementNomPrenom = new QTableWidgetItem(nomprenom);
        ui->tableTemps->insertRow(l);
        // propriétés
        elementClassement->setFlags(Qt::ItemIsEnabled);
        elementClassement->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        elementTemps->setFlags(Qt::ItemIsEnabled);
        elementTemps->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        elementDossard->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable);
        elementDossard->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
        elementNomPrenom->setFlags(Qt::ItemIsEnabled);
        elementNomPrenom->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter);

        ui->tableTemps->setItem(l, 0, elementClassement); // l : ligne (row) et c : colonne
        ui->tableTemps->setItem(l, 1, elementDossard);
        ui->tableTemps->setItem(l, 2, elementTemps);
        ui->tableTemps->setItem(l, 3, elementNomPrenom);
    }

    connect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
}
ChronoCrossClassement::calculerChecksum ( QString  data) [private]

Calcule le checksum.

Référencé par envoyer().

{
   unsigned short checksum = 0;
   int i = 0;

   if(data.startsWith("#"))
       i = 1;
   for(;i<data.length();i++)
      checksum += data[i].toLatin1();

   return checksum;
}

Charge les inscrits à la course.

Références bd, COURSE_ID, courses, inscrits, BaseDeDonnees::recuperer(), et ui.

Référencé par chargerListeCourses().

{
    if(ui->comboBoxCourses->currentIndex() > 0)
    {
        qDebug() << Q_FUNC_INFO << QString::fromUtf8("Course sélectionnée : ") << courses.at((ui->comboBoxCourses->currentIndex()-1));

        QString requete;
        QStringList course;
        course =  courses.at((ui->comboBoxCourses->currentIndex()-1));
        QString idCourseActuelle = course.at(COURSE_ID);
        bool retour;

        inscrits.clear();

        requete = "SELECT idInscrit, NumeroDossard FROM Inscrit WHERE idCourse = " + idCourseActuelle ;
        retour = bd->recuperer(requete, inscrits);

        if(retour != false)
        {
            //qDebug() << Q_FUNC_INFO << inscrits;
            //qDebug() << Q_FUNC_INFO << inscrits.count();
            ui->labelNbCoureurs->setText("Nb coureurs : " + QString::number(inscrits.count()));
        }
        else
        {
            qDebug() << Q_FUNC_INFO << QString::fromUtf8("Requête incorrecte") << requete;
            ui->labelNbCoureurs->setText("Nb coureurs : --");
        }
    }
    else
    {
        qDebug() << Q_FUNC_INFO << QString::fromUtf8("Aucune course sélectionnée");
        ui->labelNbCoureurs->setText("Nb coureurs : --");
    }
}

Références bd, chargerInscritsCourse(), COURSE_DISTANCE, COURSE_HEUREDEPART, COURSE_NOM, courses, manifestation, BaseDeDonnees::recuperer(), et ui.

Référencé par ChronoCrossClassement().

{
    QString requete;
    QStringList course;
    bool retour;

    if(manifestation.isEmpty())
        return;

    requete = "SELECT * FROM Course WHERE idManifestation = " + manifestation.at(0) ;
    qDebug() << Q_FUNC_INFO << requete;
    retour = bd->recuperer(requete, courses);
    if(retour != false)
    {
        ui->comboBoxCourses->addItem("");
        for(int i=0; i < courses.size(); i++)
        {
            course = courses.at(i);
            qDebug() << Q_FUNC_INFO << QString::fromUtf8("Course : ") << course;
            ui->comboBoxCourses->addItem(course.at(COURSE_NOM) + " - " + course.at(COURSE_DISTANCE) + " m - " + course.at(COURSE_HEUREDEPART));
        }
    }
    else
    {
        QMessageBox::critical(0, QString::fromUtf8("Chrono-Cross"), QString::fromUtf8("Aucune course !"));
    }
    connect(ui->comboBoxCourses, SIGNAL(currentIndexChanged(int)), this, SLOT(chargerInscritsCourse()));
}

Charge la manifestation du jour.

Références bd, manifestation, BaseDeDonnees::recuperer(), et ui.

Référencé par ChronoCrossClassement().

{
    QString requete;
    bool retour;

    // Récupère la manifestation de la journée dans un QStringList
    requete = "SELECT * FROM Manifestation WHERE Manifestation.Date = date(now()) LIMIT 1;";
    // Test
    //requete = "SELECT * FROM Manifestation ";
    qDebug() << Q_FUNC_INFO << requete;
    retour = bd->recuperer(requete, manifestation);
    if(retour != false)
    {
        qDebug() << Q_FUNC_INFO << QString::fromUtf8("Manifestation : ") << manifestation;
        ui->labelManifestationInformations->setText(manifestation.at(1));
        ui->comboBoxCourses->setEnabled(true);
    }
    else
    {
        ui->comboBoxCourses->setEnabled(false);
        QMessageBox::critical(0, QString::fromUtf8("Chrono-Cross"), QString::fromUtf8("Aucune manifestation !"));
    }
}
void ChronoCrossClassement::courseDemarree ( QString  numero) [signal]

Référencé par demarrerCourse(), onReadyRead(), et topDepart().

void ChronoCrossClassement::courseTerminee ( QString  numero) [signal]

Référencé par finaliserDepartCourse(), et onReadyRead().

Demarre la course.

Références courseDemarree(), envoyer(), finaliserDepartCourse(), numeroterDossard(), et ui.

Référencé par ChronoCrossClassement().

{
    // 0 -> Mode PTB
    // 5 -> Mode CLOCK
    QString * chaine = new QString("#WP 120 5");
    envoyer(*chaine);
    usleep(100000);

    chaine = new QString("#WC 007 02 00:00 00/00/01");
    envoyer(*chaine);

    chaine = new QString("#RP 003");
    envoyer(*chaine);

    connect(this, SIGNAL(courseDemarree(QString)), this, SLOT(finaliserDepartCourse(QString)));
    connect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
}

Efface les résultats du tableau.

Références numeroterDossard(), et ui.

Référencé par afficherTableTemps(), et finaliserDepartCourse().

{
    disconnect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
    int nb = ui->tableTemps->rowCount();
    // on efface les lignes du tableau une par une
    for(int i = 0; i < nb; i++)
    {
        ui->tableTemps->removeRow(0);
    }
    connect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
}
ChronoCrossClassement::enregistrerArriveeCoureur ( QString  ordre,
QString  temps 
) [private, slot]

Enregistre l'arrivée des coureurs.

Références afficherTableTemps(), arrivees, dossards, numeroCourse, et ui.

Référencé par finaliserDepartCourse().

{
    Q_UNUSED(ordre)

    if(!numeroCourse.isEmpty())
    {
        qDebug() << Q_FUNC_INFO << temps;
        arrivees.push_back(temps);
        dossards.push_back("");

        ui->labelNbArrivees->setText(QString::fromUtf8("Nb Arrivées : ") + QString::number(arrivees.count()));
        ui->labelClasses->setText(QString::fromUtf8("Nb Classés : ") + QString::number(dossards.count()-dossards.count("")));
        afficherTableTemps();
    }
}

Références arrivees, bd, dossards, BaseDeDonnees::executer(), getIdInscrit(), et numeroCourse.

Référencé par ChronoCrossClassement().

{
    if(!numeroCourse.isEmpty())
    {
        QString temps;
        QString dossard;
        QString idInscrit;

        for(int l = 0; l < arrivees.count(); l++)
        {
            temps = arrivees.at(l);
            dossard = dossards.at(l);
            idInscrit = getIdInscrit(dossard);
            if(!idInscrit.isEmpty() && !dossard.isEmpty())
            {
                QString requete = "INSERT INTO Arrivee(idInscrit,Temps) VALUES('" + idInscrit + "','" + temps + "')";
                qDebug() << Q_FUNC_INFO << requete;
                bool retour = bd->executer(requete);
            }
        }
    }
}
ChronoCrossClassement::envoyer ( QString &  trame) [private]

Envoie la trame.

Références actualiserMessage(), calculerChecksum(), et port.

Référencé par demarrerCourse(), terminerCourse(), et topDepart().

{
    unsigned short checksum = 0;

    checksum = calculerChecksum(trame);
    trame += QString("\t%1").arg(checksum, 4, 16, QChar('0')).toUpper();

    qDebug() << Q_FUNC_INFO << trame;
    actualiserMessage(QString::fromUtf8("Trame envoyée : %1").arg(trame));

    trame += "\r\n";

    if (port != NULL && port->isOpen())
    {
        port->write(trame.toLatin1());
    }
}
ChronoCrossClassement::estInscrit ( QString  dossard) [private]

Vérifie l'inscription à la course.

Références inscrits.

{
    for(int i = 0; i < inscrits.count(); i++)
    {
        if(inscrits.at(i).at(1) == dossard)
            return true;
    }
    return false;
}
ChronoCrossClassement::finaliserDepartCourse ( QString  numero) [private, slot]

Références arrivees, courseTerminee(), dossards, effacerTableTemps(), enregistrerArriveeCoureur(), finaliserFinCourse(), numeroCourse, tempsArrivee(), et ui.

Référencé par demarrerCourse(), et topDepart().

{
    if(numeroCourse.isEmpty())
    {
        qDebug() << Q_FUNC_INFO << "numéro course : " << numero;
        numeroCourse = numero;
        arrivees.clear();
        dossards.clear();

        effacerTableTemps();
        ui->labelNbArrivees->setText(QString::fromUtf8("Nb Arrivées : ") + QString::number(arrivees.count()));
        ui->labelClasses->setText(QString::fromUtf8("Nb Classés : ")+ QString::number(dossards.count()-dossards.count("")));
        ui->comboBoxCourses->setEnabled(false);
        ui->pushButtonDemarrageCourse->setEnabled(false);
        ui->pushButtonTopDepart->setEnabled(false);
        ui->pushButtonFinCourse->setEnabled(true);
        ui->pushButtonEnregistrementResultats->setEnabled(true);
        connect(this, SIGNAL(tempsArrivee(QString,QString)), this, SLOT(enregistrerArriveeCoureur(QString,QString)));
        connect(this, SIGNAL(courseTerminee(QString)), this, SLOT(finaliserFinCourse(QString)));
    }
}
ChronoCrossClassement::finaliserFinCourse ( QString  numero) [private, slot]

Enregistre les données dans la base de donnees.

Références arrivees, dossards, numeroCourse, numeroterDossard(), et ui.

Référencé par finaliserDepartCourse().

{
     qDebug() << Q_FUNC_INFO << "numéro course : " << numero;
        // réinitialisation pour prochaine course
        numeroCourse = "";
        arrivees.clear();
        dossards.clear();

        ui->comboBoxCourses->setEnabled(true);
        ui->pushButtonDemarrageCourse->setEnabled(true);
        ui->pushButtonTopDepart->setEnabled(true);
        ui->pushButtonFinCourse->setEnabled(false);
        ui->pushButtonEnregistrementResultats->setEnabled(false);
        disconnect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
}
ChronoCrossClassement::getIdInscrit ( QString  dossard) [private]

Obtient l'idInscrit.

Références inscrits.

Référencé par enregistrerResultat().

{
    for(int i = 0; i < inscrits.count(); i++)
    {
        if(inscrits.at(i).at(1) == dossard)
            return inscrits.at(i).at(0);
    }
    return QString("");
}

Références bd, BaseDeDonnees::connecter(), et BaseDeDonnees::getInstance().

Référencé par ChronoCrossClassement().

{
    // Connexion à la base de données
    bd = BaseDeDonnees::getInstance();
    bool connexion = bd->connecter();
    if(!connexion)
    {
        QMessageBox::critical(0, QString::fromUtf8("Chrono-Cross"), QString::fromUtf8("Impossible de se connecter à la base de données !"));
    }
}

Références displayEvent, NOM_PORT, onReadyRead(), et port.

Référencé par ChronoCrossClassement().

{
    if(port != NULL && port->isOpen())
    {
        port->close();
        disconnect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    }

    port = new QextSerialPort(NOM_PORT, QextSerialPort::EventDriven);
    port->setBaudRate(BAUD9600);
    port->setFlowControl(FLOW_OFF);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_1);
    //port->setTimeout(500);
    displayEvent = false;

    if(port->open(QIODevice::ReadWrite) == true)
    {
        connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    }
    if(!port->isOpen())
    {
        QMessageBox::critical(0, QString::fromUtf8("Chrono-Cross"), QString::fromUtf8("Impossible d'ouvrir le port !"));
    }
}
ChronoCrossClassement::numeroterDossard ( int  l,
int  c 
) [private, slot]
A faire:
vérifier si le numéro de dossard est valide

Références dossards, et ui.

Référencé par afficherTableTemps(), demarrerCourse(), effacerTableTemps(), finaliserFinCourse(), et topDepart().

{
    QTableWidgetItem *elementDossard;

    // récupère l'élément Dossard dans le TableWidget
    elementDossard = ui->tableTemps->item(l, c);

    // remplace le numéro de dossard saisi dans le QVector
    dossards.replace(l, elementDossard->data(0).toString());
    qDebug() << Q_FUNC_INFO << elementDossard->data(0).toString() <<
dossards;

    ui->labelClasses->setText(QString::fromUtf8("Nb Classés : ") + QString::number(dossards.count()-dossards.count("")));
}

Références actualiserMessage(), courseDemarree(), courseTerminee(), donnees, numeroCourse, port, tempsArrivee(), et verifierAcquittement().

Référencé par initialiserPort().

{
    while(port->bytesAvailable())
    {
        donnees += port->readAll();
        usleep(100000); // cf. timeout
    }

    if(donnees.contains("\r\n"))
    {
        QString trameRecue = QString(donnees.data());
        QStringList trames = trameRecue.split("\r\n");
        QStringList champs;
        char etatAcquittement;

        qDebug() << Q_FUNC_INFO << "trame(s) recue(s) =" << trames;

        /* Liste des trames reçues :

          - "AK X" acquittement avec : X = 'C' accepted, 'F' rejected, 'R' not supported
          - "TS 00:00:00 00/00/01" synchro
          - "&P 003 XX 90 00:00:00 0" paramètre 003 (demande du numéro de course) XX = le numéro de course
          - "TN 1 2     3.71300  365" temps
          - "CL XX" close course XX = le numéro de course terminée

         */

        //qDebug() << Q_FUNC_INFO << trameRecue.split("\r\n");
        for(int i =0;i<trames.size();i++)
        {
            if(!trames.at(i).isEmpty())
            {                
                if(trames.at(i).startsWith("AK")) // trame acquittement ?
                {
                    etatAcquittement = verifierAcquittement(trames.at(i));
                    if(etatAcquittement == 'C')
                    {
                        //actualiserMessage(QString::fromUtf8("Mini-Display HL 975 : <font color=\"green\">ok</font>"));
                        continue;
                    }
                    if(etatAcquittement == 'R')
                    {
                        actualiserMessage(QString::fromUtf8("Mini-Display HL 975 : erreur !"));
                        continue;
                    }
                }
                else if(trames.at(i).startsWith("TS")) // trame synchro ?
                {

                }
                else if(trames.at(i).startsWith("&P")) // trame paramètre ?
                {
                    // "&P 003 XX YY 00:00:00 0" paramètre 003 (demande du numéro de course) XX = le numéro de course
                    /*
                        X = Run number (00-99). 00 = no run open -> index 2
                        Y = Number of the next Run(00-99) -> index 3
                     */

                    champs = trames.at(i).split(" ", QString::SkipEmptyParts);
                    //qDebug() << Q_FUNC_INFO << "numéro course demarree : " << champs.at(3);
                    emit courseDemarree(champs.at(3));
                }
                else if(trames.at(i).startsWith("TN")) // trame temps ?
                {
                    /*
                        Time (TN) : TN SSSS CC HH:MM:SS.FFFFF DDDDD

                    S = Sequential number (0 - 9999) -> ordre arrivée
                    C = Channel number (1 - 99) in case of manual entry (M1 - M4) -> numéro cellule détection (1 = départ et 2 = arrivée)
                    H = Hours (0 - 23)
                    M = Minutes (0 - 59)
                    S = Seconds (0 - 59)
                    F = decimal part (0 - 99999)
                    D = Days (0 - 32767) counting from 01.01.2000 -> non utilisé

                    */
                    //    "TN         1  1        4.30700   365"
                    // -> "TN", "1", "1", "4.30700", "365       05FE"
                    champs = trames.at(i).split(" ", QString::SkipEmptyParts);
                    //qDebug() << Q_FUNC_INFO << champs;
                    // temps à l'arrivée ?
                    if(champs.at(2) == "2")
                    {
                        //qDebug() << Q_FUNC_INFO << champs.at(3);
                        emit tempsArrivee(champs.at(1), champs.at(3));
                    }
                }
                else if(trames.at(i).startsWith("CL")) // trame course terminée ?
                {
                    /*
                        Closing of a Run (CL) : CL RR
                        R = Run number (1 - 99)

                        "CL 06  0115"
                     */
                    champs = trames.at(i).split("\t");
                    champs = champs.at(0).split(" ", QString::SkipEmptyParts);
                    //qDebug() << Q_FUNC_INFO << "numéro course terminee : " << champs.at(1) << numeroCourse;
                    if(!numeroCourse.isEmpty())
                    {
                        qDebug() << Q_FUNC_INFO << "signaler course terminee : " << champs.at(1) << numeroCourse;
                        emit courseTerminee(champs.at(1));
                    }

                }
                else // autre trame
                {
                    actualiserMessage(QString::fromUtf8("Mini-Display HL 975 : %1 (non géré)").arg(trames.at(i)));
                }
            }
        }
        donnees.clear();
    }
}
ChronoCrossClassement::quitter ( ) [private, slot]

Quitte l'application.

{    
    // on ferme la fenêtre
    close();    
}

Références ui.

Référencé par ChronoCrossClassement().

{
    QStringList course;

    int index = ui->comboBoxCourses->currentIndex();
    switch(index)
    {
    case 0:
        //disconnect(ui->comboBoxCourses, SIGNAL(currentIndexChanged(int)), this, SLOT(selectionnerCourse()));
        ui->pushButtonDemarrageCourse->setEnabled(false);
        ui->pushButtonTopDepart->setEnabled(false);
        ui->pushButtonFinCourse->setEnabled(false);
        ui->pushButtonEnregistrementResultats->setEnabled(false);
        //connect(ui->comboBoxCourses, SIGNAL(currentIndexChanged(int)), this, SLOT(selectionnerCourse()));
        break;
    default:
        if(index > 0)
        {
            ui->pushButtonDemarrageCourse->setEnabled(true);
            ui->pushButtonTopDepart->setEnabled(true);
            ui->pushButtonFinCourse->setEnabled(false);
            ui->pushButtonEnregistrementResultats->setEnabled(false);
            //course = courses.at(index-1);
        }
        break;
    }
}
void ChronoCrossClassement::tempsArrivee ( QString  ordre,
QString  temps 
) [signal]

Référencé par finaliserDepartCourse(), et onReadyRead().

Termine la course.

Références envoyer().

Référencé par ChronoCrossClassement().

{
     QString * chaine = new QString("#WC 001");
     envoyer(*chaine);
     usleep(100000);

     QString heure = QDateTime::currentDateTime().toString("hh:mm");
     QString date = QDateTime::currentDateTime().toString("dd/MM/yy");

     // En mode CLOCK, on affiche l'heure actuelle
     chaine = new QString("#WC 007 02 "+heure+" "+date);
     envoyer(*chaine);
     // synchro
     chaine = new QString("#WC 008 01");
     envoyer(*chaine);
}
ChronoCrossClassement::topDepart ( ) [private, slot]

Demarre la course logiciellement.

Références courseDemarree(), envoyer(), finaliserDepartCourse(), numeroterDossard(), et ui.

Référencé par ChronoCrossClassement().

{
    // 0 -> Mode PTB
    // 5 -> Mode CLOCK
    QString * chaine = new QString("#WP 120 5");
    envoyer(*chaine);
    usleep(100000);

    chaine = new QString("#WC 007 02 00:00 00/00/01");
    envoyer(*chaine);

    chaine = new QString("#RP 003");
    envoyer(*chaine);

    chaine = new QString("#WC 008 01");
    envoyer(*chaine);

    connect(this, SIGNAL(courseDemarree(QString)), this, SLOT(finaliserDepartCourse(QString)));
    connect(ui->tableTemps, SIGNAL(cellChanged(int,int)), this,SLOT(numeroterDossard(int,int)));
}
ChronoCrossClassement::verifierAcquittement ( QString  trame) [private]

Verifie l'acquittement.

Référencé par onReadyRead().

{
    /*
        Type de trame d'acquittement : cf. http://www.reliableracing.com/downloads/THCOM08.pdf page 15
        AK X
        Avec : X = 'C' accepted, 'F' rejected, 'R' not supported
    */
    if(trame.startsWith("AK C"))
            return 'C';
    else if(trame.startsWith("AK F"))
            return 'F';
    else if(trame.startsWith("AK R"))
            return 'R';
    else
            return 'N'; // ce n'est pas une trame d'acquittement
}

Documentation des données membres

QVector<QString> ChronoCrossClassement::arrivees [private]
QVector<QStringList> ChronoCrossClassement::courses [private]

Référencé par initialiserPort().

QByteArray ChronoCrossClassement::donnees [private]

Référencé par onReadyRead().

QVector<QString> ChronoCrossClassement::dossards [private]
QVector<QStringList> ChronoCrossClassement::inscrits [private]
QStringList ChronoCrossClassement::manifestation [private]
QextSerialPort* ChronoCrossClassement::port [private]
Ui::ChronoCrossClassement* ChronoCrossClassement::ui [private]

La documentation de cette classe a été générée à partir des fichiers suivants :
 Tout Classes Fichiers Fonctions Variables Macros