Ignore:
Timestamp:
Feb 24, 2012, 12:37:36 PM (12 years ago)
Author:
frichard
Message:

-Alignement des antennes
-Version 0.0.9 de libindi

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BAORadio/libindi/libindi/drivers/telescope/BAO.cpp

    r619 r642  
    1111
    1212#include "BAO.h"
     13#include "../communs/alt2motor.h"
    1314
    1415
     
    2223const char *OPTIONS_GROUP  = "Options";                 // Options Group
    2324
    24 /* Handy Macros */
    25 //#define currentRA     EquatorialCoordsRN[0].value
    26 //#define currentDEC    EquatorialCoordsRN[1].value
    27 #define targetRA        EquatorialCoordsWN[0].value
    28 #define targetDEC       EquatorialCoordsWN[1].value
     25
     26#define targetRA    EquatorialCoordsWN[0].value
     27#define targetDEC   EquatorialCoordsWN[1].value
    2928
    3029
     
    3433
    3534
     35
    3636/**************************************************************************************
    3737** Initialisation de la classe BAO
     38**
    3839***************************************************************************************/
    3940
     
    4243    init_properties();
    4344
    44     // télescope en état IDLE
    45     ConnectSP.s    = IPS_IDLE;
     45    // Le bouton connect de la boîte de dialogue d'indi8BAO
     46    // est dans l'état IDLE au démarrage
     47
     48    ConnectSP.s           = IPS_IDLE;
    4649
    4750    // derniÚre actualisation
    48     lastRA         = 0.0;
    49     lastDEC        = 0.0;
    50     JJAnc          = 0.0;
    51 
    52     currentSet     =  0;
    53     lastSet        = -1;
    54     SocketsNumber  =  1;
    55     TrackingMode   =  1;
    56 
    57     // délais en sec entre deux actualisations de la
    58     // position dans les modes transit et tracking
    59 
    60     ActualisationTM1 = 15.0 * 60.0;
    61     ActualisationTM2 = 5.0;
    62 
    63     UpdateGoto      = true;
    64     InitThreadOK    = false;
    65     ActualisationPosition = false;
    66     Abort           = false;
    67     Park            = false;
    68     Suivi           = false;
    69     Exit            = false;
     51
     52    lastRA                = 0.0;
     53    lastDEC               = 0.0;
     54    JJAnc                 = 0.0;
     55
     56    // Variables d'état
     57
     58    currentSet            =  0;         // Variables internes d'Indi, ne pas toucher
     59    lastSet               = -1;         // Variable interne d'Indi, ne pas toucher
     60
     61    // Nombre d'antennes connectées
     62
     63    SocketsNumber         =  1;
     64
     65    // Le mode tracking est activé par défaut
     66
     67    TrackingMode          =  1;
     68
     69    // délais en sec entre deux actualisations
     70    // dans les modes transit et tracking
     71
     72    ActualisationTMTransit  = 15.0 * 60.0;    // Délai entre 2 actualisations dans le mode transit
     73    ActualisationTMTracking = 5.0;            //                "                 "        tracking
     74
     75    // cette variable vaut "true" lorsque le thread de l'aplication a été initialisé
     76
     77    InitThreadOK          = false;
     78
     79    // UpdatedGoto = true lorsque le dernier goto a bien été réalisé jusqu'au bout
     80
     81    UpdatedGoto           = true;
     82
     83    // RealisationGoto = true lorsque les étapes nécessaires à la réalisation d'un goto
     84    // sont en cours d'execution
     85
     86    RealisationGoto       = false;
     87
     88    // vaut true si l'utilisateur demande l'annulation du mouvement en cours
     89
     90    Abort                 = false;
     91
     92    // vaut true si l'utilisateur demande de mettre les antennes en mode park
     93
     94    Park                  = false;
     95
     96    // vaut true un objet est actuellement suivi par les antennes
     97
     98    Suivi                 = false;
     99
     100    // vaut true si l'utilisateur demande à sortir de l'application -> permet de fermer le thread
     101
     102    Exit                  = false;
     103   
     104    Pression              = 1013.0;
     105   
     106    Temp                  = 10.0;
    70107
    71108
    72109    // initialisation des sockets (Antennes)
    73    
     110
    74111    for (int i=0; i<MAXHOSTNAME; i++)
    75112    {
    76         Sockets[i].Connected = false;
    77         Sockets[i].IP = "";
    78                
    79         Sockets[i].Delta.x = 0.0;
    80         Sockets[i].Delta.y = 0.0;
     113        Sockets[i].Connected         = false;
     114        Sockets[i].IP                = "";
     115        Sockets[i].TargetPosition.x  = 0.0;
     116        Sockets[i].TargetPosition.y  = 0.0;
     117        Sockets[i].AlignementAntenne = new Alignement();
     118
     119        if (Sockets[i].AlignementAntenne) Sockets[i].AlignementAntenne->InitAlignement();
    81120    }
    82121
    83122    // initialisations supplémentaires
    84    
     123
    85124    InitAntennes();
    86125
    87126    // Numéro de version
    88    
    89     IDLog("Initilizing from BAO device...\n");
    90     IDLog("Driver Version: 2011-12-02\n");
     127
     128    IDLog("Indi server BAORadio...\n");
     129    IDLog("Driver Version: 23-02-2012\n");
    91130
    92131    //connect_telescope();
     
    94133
    95134
     135
    96136/**************************************************************************************
    97137** Destructeur
    98 ** Lorsque l'on lance indi_BAO depuis indiserver dans un terminal
    99 ** Le destructeur ne semble jamais être atteint lorsque l'on sort... A vérifier
    100 ***************************************************************************************/
     138**
     139***************************************************************************************/
     140
    101141BAO::~BAO()
    102142{
     143    //On informe le thread que nous allons sortir
     144
    103145    Exit = true;
     146
     147    // On lui laisse une seconde pour qu'il se termine
     148
    104149    sleep(1);
    105     pthread_join (th1, NULL);
    106 }
     150
     151    // destruction du thread
     152
     153    pthread_join(th1, NULL);
     154
     155    // destruction des objets AlignementAntennes
     156
     157    for (int i=0; i<MAXHOSTNAME; i++)
     158    {
     159        delete Sockets[i].AlignementAntenne;
     160    }
     161
     162    // Petit message à l'attention de l'utilisateur
     163    // permet de savoir si le destructeur est bien atteint
     164
     165    IDLog("Sortie de indi_BAO\n");
     166}
     167
    107168
    108169
    109170/************************************************************************************
    110 * Initialisation des paramÚtres des antennes
    111 *
     171** Initialisation des paramÚtres des antennes
     172**
    112173************************************************************************************/
     174
    113175void BAO::InitAntennes()
    114176{
     
    121183        Sockets[i].etape              = 0;
    122184
    123         Sockets[i].ack_status = false;
    124         Sockets[i].ack_pos    = false;
    125         Sockets[i].ack_park   = false;
    126         Sockets[i].ack_abort  = false;
    127         Sockets[i].ack_goto   = false;
    128 
    129         Sockets[i].PosValides = false;
    130         Sockets[i].GotoOk     = false;
    131     }
    132 }
     185        Sockets[i].ack_status         = false;
     186        Sockets[i].ack_pos            = false;
     187        Sockets[i].ack_park           = false;
     188        Sockets[i].ack_abort          = false;
     189        Sockets[i].ack_goto           = false;
     190
     191        Sockets[i].PosValides         = false;
     192        Sockets[i].GotoOk             = false;
     193    }
     194}
     195
    133196
    134197
    135198/**************************************************************************************
    136199** Initialisation des boutons et des zones d'affichage dans la boîte de dialogue INDI
     200** se référer à la documentation d'INDI
     201**
    137202***************************************************************************************/
    138203
     
    149214    IUFillSwitchVector(&OnCoordSetSP, OnCoordSetS, NARRAY(OnCoordSetS), mydev, "ON_COORD_SET", "On Set", BASIC_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
    150215
     216    // Alignment Set
     217    IUFillSwitch(&AlignmentS[0], "SIMPLE", "Simple", ISS_ON);
     218    IUFillSwitch(&AlignmentS[1], "AFFINE", "Affine", ISS_OFF);
     219    IUFillSwitch(&AlignmentS[2], "TAKI", "Taki", ISS_OFF);
     220    IUFillSwitchVector(&AlignmentSP, AlignmentS, NARRAY(AlignmentS), mydev, "ALIGNMENT_SET", "Alignment", BASIC_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE);
     221
    151222    // Abort
    152223    IUFillSwitch(&AbortSlewS[0], "ABORT", "Abort", ISS_OFF);
     
    171242    IUFillNumberVector(&GeographicCoordsWNP, GeographicCoordsWN, NARRAY(GeographicCoordsWN), mydev, "GEOGRAPHIC_COORD" , "Geographic coords", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE);
    172243
     244     // Pression température - SET
     245    IUFillNumber(&PressionTempWN[0], "Pression", "Pression mb", "%10.6m",  0., 1500., 0., 0.);
     246    IUFillNumber(&PressionTempWN[1], "Temperature", "Temperature °c", "%10.6m", -50., +50., 0., 0.);
     247    IUFillNumberVector(&PressionTempWNP, PressionTempWN, NARRAY(PressionTempWN), mydev, "PRESSION_DATA" , "Pression, Temperature", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE);
     248
    173249    // Actualisation - SET
    174     IUFillNumber(&ActualisationN1[0], "DELAY", "Transit mode delay (Sec)", "%10.6m",  0., 3600., 0., 0.);
     250    IUFillNumber(&ActualisationN1[0], "DELAY", "Transit delay (s)", "%10.6m",  0., 3600., 0., 0.);
    175251    IUFillNumberVector(&ActualisationNP1, ActualisationN1, NARRAY(ActualisationN1), mydev, "DELAY1" , "", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE);
    176252
    177     IUFillNumber(&ActualisationN2[0], "DELAY", "Tracking mode delay (Sec)", "%10.6m",  0., 3600., 0., 0.);
     253    IUFillNumber(&ActualisationN2[0], "DELAY", "Tracking delay (s)", "%10.6m",  0., 3600., 0., 0.);
    178254    IUFillNumberVector(&ActualisationNP2, ActualisationN2, NARRAY(ActualisationN2), mydev, "DELAY2" , "", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE);
    179255}
     
    182258/**************************************************************************************
    183259** Initialisation de la boîte de dialogue INDI (suite)
     260** Vider tous les vecteurs
     261**
    184262***************************************************************************************/
    185263
     
    195273    IDDefNumber(&EquatorialCoordsWNP, NULL);
    196274    IDDefNumber(&GeographicCoordsWNP, NULL);
     275    IDDefNumber(&PressionTempWNP, NULL);
    197276    IDDefSwitch(&OnCoordSetSP, NULL);
     277    IDDefSwitch(&AlignmentSP, NULL);
    198278    IDDefSwitch(&AbortSlewSP, NULL);
    199279    IDDefSwitch(&ParkSP, NULL);
     
    207287/**************************************************************************************
    208288** Initialisation des vecteurs INDI
     289** ParamÚtres par défaut
     290**
    209291***************************************************************************************/
    210292
     
    213295    ConnectSP.s                 = IPS_IDLE;
    214296    OnCoordSetSP.s              = IPS_IDLE;
     297    AlignmentSP.s               = IPS_IDLE;
    215298    AbortSlewSP.s               = IPS_IDLE;
    216299    ParkSP.s                    = IPS_IDLE;
    217300    ObjectTP.s                  = IPS_IDLE;
    218301    EquatorialCoordsWNP.s       = IPS_IDLE;
     302    PressionTempWNP.s           = IPS_IDLE;
    219303    GeographicCoordsWNP.s       = IPS_IDLE;
    220304    ActualisationNP1.s          = IPS_IDLE;
     
    222306
    223307    IUResetSwitch(&OnCoordSetSP);
     308    IUResetSwitch(&AlignmentSP);
    224309    IUResetSwitch(&AbortSlewSP);
    225310    IUResetSwitch(&ParkSP);
    226311
    227312    OnCoordSetS[0].s = ISS_ON;
     313    AlignmentS[0].s = ISS_ON;
    228314    ConnectS[0].s = ISS_OFF;
    229315    ConnectS[1].s = ISS_ON;
     
    231317    IDSetSwitch(&ConnectSP, NULL);
    232318    IDSetSwitch(&OnCoordSetSP, NULL);
     319    IDSetSwitch(&AlignmentSP, NULL);
    233320    IDSetSwitch(&AbortSlewSP, NULL);
    234321    IDSetSwitch(&ParkSP, NULL);
    235322    IDSetText(&ObjectTP, NULL);
    236323    IDSetNumber(&EquatorialCoordsWNP, NULL);
     324    IDSetNumber(&PressionTempWNP, NULL);
    237325    IDSetNumber(&GeographicCoordsWNP, NULL);
    238326    IDSetNumber(&ActualisationNP1, NULL);
     
    241329
    242330
     331
    243332/**************************************************************************************
    244333** En cas de changement de texte dans la boîte de dialogue (par exemple : changement du
    245 ** nom de l'objet) alors suivre l'objet... 
     334** nom de l'objet) alors suivre l'objet...
    246335** Cette fonction n'est pas encore utilisée
     336** TODO: faut-il pouvoir modifier le nom de l'objet depuis la boîte ?
     337** pas sûr que cela soit utile: kstars et BAOcontrol permettent de faire cela
     338**
    247339***************************************************************************************/
    248340
     
    275367
    276368
     369
    277370/**************************************************************************************
    278371** En cas de changement d'une valeur numérique dans la boîte de dialogue Indi
     
    285378
    286379    // Ignore if not ours
     380
    287381    if (strcmp (dev, mydev))
    288382        return;
    289383
     384    // Si pas de connexion -> on sort
     385
    290386    if (is_connected() == false)
    291387    {
    292388        IDMessage(mydev, "Error ! BAO is offline. Please connect before issuing any commands.");
     389
    293390        reset_all_properties();
     391
    294392        return;
    295393    }
     
    299397    // Geographic  Coords
    300398    // ===================================
     399
    301400    if (!strcmp (name, GeographicCoordsWNP.name))
    302401    {
    303         int i=0, nset=0, error_code=0;
    304 
    305         Latitude=0.0;
    306         Longitude=0.0;
    307 
    308         for (nset = i = 0; i < n; i++)
    309         {
     402        // l'utilisateur a modifié un les coordonnées géographiques de la boite indi
     403
     404        int i = 0, nset = 0;
     405
     406        // En cas d'erreur, on doit pouvoir sortir avec des paramÚtres par défaut
     407        //ici la latitude et la longitude vondront 0.0
     408
     409        Latitude  = 0.0;
     410        Longitude = 0.0;
     411
     412        // pour ce vecteur, on sait qu'il y a n éléments possibles
     413        // Exemple pour la rubrique coordonnées géographique de la boîte indi
     414        // il y a deux éléments : la longtude et la latitude
     415        // pour la rubrique alignement, il y aen a trois par exemple :
     416        // simple, affine et taki
     417
     418        for (i = 0; i < n; i++)
     419        {
     420            // pour chacun d'entre eux, on regarde si le nom passé en argument de la fonction (*name)
     421            // correspond bien à l'un des éléments du vecteur GeographicCoordsWNP
     422
    310423            INumber *eqp = IUFindNumber (&GeographicCoordsWNP, names[i]);
     424
    311425            if (eqp == &GeographicCoordsWN[0])
    312426            {
     427                //ici on a identifié la zone latitude de la boîte de dialogue
     428                // Value[i] contient la chaine de caractÚre correspondante dans la boîte
     429                // C'est la valeur saisie par l'utilisateur
     430
    313431                Latitude = values[i];
     432
     433                // On doit vérifier que la latitude est dans un intervalle correct
     434
    314435                nset += Latitude >= -90.0 && Latitude <= 90.0;
     436
     437                // on convertit en radians
    315438
    316439                Latitude *= Pidiv180;
     
    318441            else if (eqp == &GeographicCoordsWN[1])
    319442            {
     443                // ici on a identifié une modification dans la rubrique longitude
     444
    320445                Longitude = values[i];
     446
     447                // dans l'intervalle ?
     448
    321449                nset += Longitude >= 0.0 && Longitude <= 360.0;
     450
     451                // en radians
    322452
    323453                Longitude *= -Pidiv180;
     
    332462            //IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude);
    333463
     464            //nset vaut 2, on sommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs
     465            // saisies par l'utilisateur
     466            // voir le code plus haut pour comprendre...
     467
     468            // On change la couleur de la "diode" de la rubrique coordonnées géographiques de la boîte
     469            // en vert
     470
    334471            GeographicCoordsWNP.s = IPS_OK;
     472
     473            // pas de message d'erreur dans la boîte
     474
    335475            IDSetNumber(&GeographicCoordsWNP, NULL);
    336476        }
    337477        else
    338478        {
     479            // quelque chose cloche
     480            // peut-être l'une des veleurs saisies par l'utilisateur n'est-elle pas dans
     481            // le bon intervalle ? ex : lat = 150°
     482
     483            // on change la couleur de la diode
     484
    339485            GeographicCoordsWNP.s = IPS_ALERT;
     486
     487            // on affiche un message d'erreur
     488
    340489            IDSetNumber(&GeographicCoordsWNP, "Latitude or Longitude missing or invalid");
    341490
    342             Latitude=0.0;
    343             Longitude=0.0;
    344         }
     491            // on fixe arbitrairement les valeurs à 0
     492
     493            Latitude  = 0.0;
     494            Longitude = 0.0;
     495        }
     496
     497        // c'est bon. On peut donc transmettre les nouvelles valeurs à la classe astro
     498        // qui utilisera ces informations pur calculer l'azimut des objets et le tsl en particulier...
    345499
    346500        DefinirLongitudeLatitude(Longitude, Latitude);
     
    355509    if (!strcmp (name, EquatorialCoordsWNP.name))
    356510    {
    357         int i=0, nset=0, error_code=0;
    358         double newRA =0, newDEC =0;
    359 
    360         for (nset = i = 0; i < n; i++)
     511        int i = 0, nset = 0;
     512
     513        double newRA =0.0, newDEC =0.0;
     514
     515        // nous avons le même principe de fonctionnement que pour les coordonnées géographiques
     516
     517        for (i = 0; i < n; i++)
    361518        {
    362519            INumber *eqp = IUFindNumber (&EquatorialCoordsWNP, names[i]);
     520
    363521            if (eqp == &EquatorialCoordsWN[0])
    364522            {
     523                // on a compris que l'utilisateur avait changé l'ascension droite de l'objet
     524
     525                // on affecte la nouvelle valeur à newRA
     526
    365527                newRA = values[i];
     528
     529                // Est-ce que cette valeur est dans le bon intervalle ?
     530
    366531                nset += newRA >= 0 && newRA <= 24.0;
    367532            }
    368533            else if (eqp == &EquatorialCoordsWN[1])
    369534            {
     535                //même chose pour la déclinaison
    370536                newDEC = values[i];
     537
    371538                nset += newDEC >= -90.0 && newDEC <= 90.0;
    372539            }
     
    375542
    376543        // si les coordonnées de l'objet sont correctes
     544
    377545        if (nset == 2)
    378546        {
     
    380548            double targetAZ, targetAlt;
    381549
     550            // On garde une trace des nouvelles coordonnées saisies par l'utilisateur
     551
    382552            targetRA  = newRA;
    383553            targetDEC = newDEC;
    384554
     555            // on les affiches dans les logs
     556
    385557            fs_sexa(RAStr, newRA, 2, 3600);
    386558            fs_sexa(DecStr, newDEC, 2, 3600);
     
    392564
    393565            ADDEC2Motor(newRA, newDEC);
     566
     567            // on déclenche le goto
    394568
    395569            if (process_coords() == false)
    396570            {
    397571                EquatorialCoordsWNP.s = IPS_ALERT;
     572
    398573                IDSetNumber(&EquatorialCoordsWNP, NULL);
    399574            }
     
    402577        {
    403578            EquatorialCoordsWNP.s = IPS_ALERT;
     579
    404580            IDSetNumber(&EquatorialCoordsWNP, "Error ! RA or Dec missing or invalid");
    405581        }
     
    407583        return;
    408584    }
     585   
     586   
     587    // ===================================
     588    // Pression, Temperature
     589    // ===================================
     590    if (!strcmp (name, PressionTempWNP.name))
     591    {
     592        int i = 0, nset = 0;
     593
     594        double newPression =0.0, newTemperature =0.0;
     595
     596        // nous avons le même principe de fonctionnement que pour les coordonnées géographiques
     597
     598        for (i = 0; i < n; i++)
     599        {
     600            INumber *eqp = IUFindNumber (&PressionTempWNP, names[i]);
     601
     602            if (eqp == &PressionTempWN[0])
     603            {
     604                // on a compris que l'utilisateur avait changé l'ascension droite de l'objet
     605
     606                // on affecte la nouvelle valeur à newRA
     607
     608                newPression = values[i];
     609
     610                // Est-ce que cette valeur est dans le bon intervalle ?
     611
     612                nset += newPression >= 0.0 && newPression <= 1500.0;
     613            }
     614            else if (eqp == &PressionTempWN[1])
     615            {
     616                //même chose pour la déclinaison
     617                newTemperature = values[i];
     618
     619                nset += newTemperature >= -50.0 && newTemperature <= 50.0;
     620            }
     621        }
     622
     623
     624        // si les coordonnées de l'objet sont correctes
     625
     626        if (nset == 2)
     627        { 
     628            PressionTempWNP.s = IPS_OK;
     629
     630            IDSetNumber(&PressionTempWNP, NULL);
     631                   
     632            Pression = newPression;
     633            Temp = newTemperature;
     634        }
     635        else
     636        {
     637            PressionTempWNP.s = IPS_ALERT;
     638
     639            IDSetNumber(&PressionTempWNP, "Error ! Bad values for pression or temperature");
     640        }
     641
     642        return;
     643    }
     644
    409645
    410646    // ===================================
     
    413649    if (!strcmp (name, ActualisationNP1.name))
    414650    {
    415         int i=0, nset=0, error_code=0;
    416         double newAct1 =0;
    417 
    418         for (nset = i = 0; i < n; i++)
     651        // on a ici exactement le même fonctionnement que précédement
     652        // on régle ici les valeurs des delais entre deux actualisations
     653        // de la position en mode transit et tracking
     654        // retourne un message d'erreur si les durées ne sont pas exprimées
     655        // dans un intervalle > 0.0 et < 3600
     656
     657        double newAct1 = 1.0;
     658
     659        for (int i = 0; i < n; i++)
    419660        {
    420661            INumber *eqp = IUFindNumber (&ActualisationNP1, names[i]);
     662
    421663            if (eqp == &ActualisationN1[0])
    422664            {
    423665                newAct1 = values[i];
    424666
    425                 if (newAct1 >= 0.0 && newAct1 <= 3600.0)
     667                if ( newAct1 >= 0.0 && newAct1 <= 3600.0 )
    426668                {
    427                     ActualisationTM1 = newAct1;
     669                    ActualisationTMTransit = newAct1;
    428670
    429671                    ActualisationNP1.s = IPS_OK;
     672
    430673                    IDSetNumber(&ActualisationNP1, NULL);
    431674                }
     
    433676                {
    434677                    ActualisationNP1.s = IPS_ALERT;
     678
    435679                    IDSetNumber(&ActualisationNP1, "Error ! Delay invalid");
    436680                }
     
    441685    if (!strcmp (name, ActualisationNP2.name))
    442686    {
    443         int i=0, nset=0, error_code=0;
    444         double newAct2 =0;
    445 
    446         for (nset = i = 0; i < n; i++)
     687        double newAct2 = 1.0;
     688
     689        for (int i = 0; i < n; i++)
    447690        {
    448691            INumber *eqp = IUFindNumber (&ActualisationNP2, names[i]);
     692
    449693            if (eqp == &ActualisationN2[0])
    450694            {
    451695                newAct2 = values[i];
    452696
    453                 if (newAct2 >= 0.0 && newAct2 <= 3600.0)
     697                if ( newAct2 >= 0.0 && newAct2 <= 3600.0 )
    454698                {
    455                     ActualisationTM2 = newAct2;
     699                    ActualisationTMTracking = newAct2;
    456700
    457701                    ActualisationNP2.s = IPS_OK;
     702
    458703                    IDSetNumber(&ActualisationNP2, NULL);
    459704                }
     
    469714
    470715
     716
    471717/**************************************************************************************
    472718** L'utilisateur clique sur l'un des boutons de la boîte Indi
     719**
    473720***************************************************************************************/
    474721
     
    513760
    514761    // ===================================
     762    // Alignment Set
     763    // ===================================
     764    if (!strcmp(name, AlignmentSP.name))
     765    {
     766        if (IUUpdateSwitch(&AlignmentSP, states, names, n) < 0)
     767            return;
     768
     769        currentSet = get_switch_index(&AlignmentSP);
     770        AlignmentSP.s = IPS_OK;
     771        IDSetSwitch(&AlignmentSP, NULL);
     772
     773        for (int i=0; i<MAXALIGNEMENTANTENNE; i++)
     774        {
     775            switch (currentSet)
     776            {
     777            case 1 :
     778                Sockets[i].AlignementAntenne->MethodeAlignement = SIMPLE;
     779                break;
     780            case 2 :
     781                Sockets[i].AlignementAntenne->MethodeAlignement = AFFINE;
     782                break;
     783            case 3 :
     784                Sockets[i].AlignementAntenne->MethodeAlignement = TAKI;
     785                break;
     786            }
     787        }
     788
     789        return;
     790    }
     791
     792    // ===================================
    515793    // Abort slew
    516794    // ===================================
    517795    if (!strcmp (name, AbortSlewSP.name))
    518796    {
    519         Abort=true;
     797        Abort = true;
    520798
    521799        IUResetSwitch(&AbortSlewSP);
     
    568846** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept
    569847** qui est bloquante.
     848**
    570849***************************************************************************************/
    571850
     
    590869            IDLog("\n");*/
    591870        }
    592        
    593         sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier 
     871
     872        sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier
    594873    }
    595874    while (!Exit);
     
    617896** Le retour de la commande P est POSITION/valeur_az/valeur_alt/
    618897** ExtractPosition retourne donc Valeur_az et Valeur_alt
     898**
    619899***************************************************************************************/
    620900
     
    633913        if (pos != string::npos)
    634914        {
    635             result->x = atol(str2.substr(0, pos).c_str());
    636 
    637             result->y = atol(str2.substr(pos + 1).c_str());
    638            
    639             return true;
    640         }       
    641     } 
     915            result->x = atol( str2.substr(0, pos).c_str() );
     916
     917            result->y = atol( str2.substr(pos + 1).c_str() );
     918
     919            return true;
     920        }
     921    }
    642922
    643923    IDLog((str +" failed !\n").c_str());
     
    649929
    650930/************************************************************************************
    651 * cette procédure convertit les coordonnées équatoriales de l'objet visé
    652 * en unités de codeurs des paraboles (nb de tours des deux axes moteurs depuis la position PARK)
     931** Cette procédure, aprÚs avoir appliqué la matrice de rotation aux coordonnées
     932** visées par l'utilisateur, convertit les coordonnées équatoriales de l'objet visé
     933** en unités de codeurs des paraboles
     934** (càd en nb de tours des deux axes moteurs depuis la position PARK)
     935**
    653936************************************************************************************/
    654937
     
    657940    double targetAz;
    658941    double targetAlt;
     942    double newRA2  = newRA * 15.0 * Pidiv180;
     943    double newDEC2 = newDEC * Pidiv180;
    659944    char AzStr[32];
    660945    char AltStr[32];
    661 
    662 
    663     // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation)
    664 
    665     Azimut( newRA * 15.0 * Pidiv180, newDEC * Pidiv180, &targetAz, &targetAlt);
    666    
    667     // Correction de la réfraction atmosphérique
    668    
    669     targetAlt = RefractionAtmospherique(targetAlt);
    670 
    671     // Petit calcul pour faire en sorte que le sud soit à 0° d'azimut
    672 
    673     targetAz = VerifAngle( targetAz + Pi );
    674 
    675     // On convertit les angles précédents en degrés
    676 
    677     targetAlt *= N180divPi;
    678     targetAz  *= N180divPi;
    679 
    680     // Affichage dans les logs
    681 
    682     fs_sexa(AzStr, targetAz, 2, 3600);
    683     fs_sexa(AltStr, targetAlt, 2, 3600);
    684 
    685     IDLog("Horizontal coords : Az = %s     Alt = %s\n", AzStr, AltStr);
    686 
    687 
    688     //Conversion des deux angles en pas codeurs
    689 
    690     if ( targetAlt < 30.0 )
    691     {
    692         // L'objet est trop bas (<30°). On annule le suivi...
    693 
    694         IDSetSwitch(&OnCoordSetSP, "Erreur ! L objet suivi est situe a moins de 30° au-dessus de l horizon. Goto annule.");
    695 
    696         Suivi = false;
    697 
    698         ActualisationPosition = false;
    699 
    700         InitAntennes();
    701     }
    702     else
    703     {
    704         // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger
    705         // la hauteur en appliquant hauteur=180°-hauteur
    706 
    707         if (targetAlt > 90.0)
    708         {
    709             targetAlt = 180.0 - targetAlt;
    710             targetAz += 180.0;
    711         }
    712 
    713         // On applique la formule de Marc pour convertir la hauteur en nombre de pas codeur alt
    714 
    715         double I0 = 81.0;
    716         double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 );
    717 
    718         double Codalt = (sqrt(I2) - I0) / 0.078947;
    719 
    720 
    721         TargetPosition.y = (int) Arrondi(Codalt);
    722 
    723         //4000 pas pour 360° sur l'axe az
    724 
    725         TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0);
    726 
    727         IDLog("Nbre de pas codeurs Az = %i        Alt = %i\n", TargetPosition.x, TargetPosition.y);
    728     }
    729 }
    730 
    731 
    732 /**************************************************************************************
    733 ** Le fichier file existe-t-il et n'est-il pas vide ?
    734 **************************************************************************************/
    735 
    736 bool BAO::is_readable( const std::string & file )
    737 {
    738     std::ifstream fichier( file.c_str() );
    739     if (fichier.fail()) return false;
    740    
    741     // sauvegarder la position courante
    742     long pos = fichier.tellg();
    743     // se placer en fin de fichier
    744     fichier.seekg( 0 , std::ios_base::end );
    745     // récupérer la nouvelle position = la taille du fichier
    746     long size = fichier.tellg() ;
    747     // restaurer la position initiale du fichier
    748     fichier.seekg( pos,  std::ios_base::beg ) ;
    749     return size ;
    750 }
    751 
    752 
    753 /**************************************************************************************
    754 ** Chargement des paramÚtres d'alignement des antennes
    755 **************************************************************************************/
    756 
    757 bool BAO::ChargementParametresAlignement(string fileName)
    758 {
    759     string value;
    760    
    761     stringstream os;
    762    
    763     char *delta_az = NULL;
    764    
    765     char *delta_ha = NULL;
    766        
    767     if (!is_readable(fileName)) return false;
    768      
    769     //IDLog("Chargement du fichier d alignement des antennes %s\n", fileName.c_str());
    770      
    771     //Chargement des corrections des antennes
    772    
     946    Coord result, vect;
     947
     948    // Pour toutes les antennes connectées
     949
    773950    for (int i=0; i<SocketsNumber; i++)
    774951    {
     952        // On vérifie qu'elles sont encore connectées
     953
    775954        if (Sockets[i].Connected)
    776955        {
    777             os << "Alignement antenne ip x.x.x." << Sockets[i].IP.substr(Sockets[i].IP.rfind(".")+1);
    778 
    779             value="delta_az";
    780 
    781             if (readINI((char*)os.str().c_str(), (char*)value.c_str(), &delta_az,  (char*)fileName.c_str()))
    782 
    783             value="delta_ha";
    784 
    785             if (readINI((char*)os.str().c_str(), (char*)value.c_str(), &delta_ha,  (char*)fileName.c_str()))
    786 
    787             if (delta_az && delta_ha)
     956            newRA = newRA2;
     957            newDEC = newDEC2;
     958         
     959            // Dans les modes d'alignement AFFINE et TAKI, on applique la matrice de correction
     960            // sur les coordonnées horaires de l'objet visé
     961
     962            // il faut vérifier auparavent que la matrice de rotation est disponible
     963            // pour l'antenne i
     964
     965            if  (Sockets[i].AlignementAntenne->Matrice_ok)
    788966            {
    789                // Si les corrections de l'antenne i ont été modifiées depuis le démarrage du programme
    790                // -> on les applique...
    791                if (Sockets[i].Delta.x != atol(delta_az) || Sockets[i].Delta.y != atol(delta_ha))
    792                {
    793                   Sockets[i].Delta.x = atol(delta_az);
    794 
    795                   Sockets[i].Delta.y = atol(delta_ha);
    796 
    797                   IDLog("Correction antenne ip %s  deltaAz=%i   deltaHa=%i\n", Sockets[i].IP.c_str(), Sockets[i].Delta.x, Sockets[i].Delta.y);
    798                }
     967                // On est bien dans le cas de l'allignement AFFINE ou Taki
     968
     969                if (Sockets[i].AlignementAntenne->MethodeAlignement ==  AFFINE ||
     970                        Sockets[i].AlignementAntenne->MethodeAlignement ==  TAKI)
     971                {
     972                    // On crée un vecteur avec pour coordonnées
     973                    // x = Angle horaire de l'objet visé
     974                    // y = déclainaison de l'objet
     975                    // z = 1.0
     976                    // Voir la documentation pour plus d'explications sur le calcul affine/taki
     977
     978                    vect.x = VerifAngle( newRA2 - GetTSL() );
     979                    vect.y = newDEC2;
     980                    vect.z = 1.0;
     981
     982                    // Message pour l'utilisateur et les logs
     983
     984                    IDLog("Application de la matrice AFFINE/TAKI\nCoordonnees initiales: AD = %s  Dec = %s\n", DHMS(newRA2*N180divPi, true ).c_str(),
     985                          DHMS(newDEC2*N180divPi, false ).c_str());
     986
     987                    // On applique la matrice de transformation
     988
     989                    switch (Sockets[i].AlignementAntenne->MethodeAlignement)
     990                    {
     991                    case AFFINE :
     992                        Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionAffine(&result, vect);
     993                        break;
     994                    case TAKI   :
     995                        Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionTaki( &result, vect);
     996                        break;
     997                    }
     998
     999                    // On récupÚre les nouvelles coordonnées. z ne nous intéresse pas
     1000
     1001                    newRA  = VerifAngle(result.x+GetTSL());
     1002                    newDEC = result.y;
     1003
     1004                    IDLog("Coordonnees finales: AD = %s  Dec = %s\n", DHMS(newRA*N180divPi, true ).c_str(),
     1005                          DHMS(newDEC*N180divPi, false ).c_str());
     1006                }               
    7991007            }
    800 
    801             if (delta_az) {
    802                 delete [] delta_az;
    803                 delta_az=NULL;
     1008            else
     1009            {
     1010                if (Sockets[i].AlignementAntenne->AlignementEnCours)
     1011                {
     1012                    // Si la matrice n'est pas prête, c'est que la procédure d'alignement de l'antenne i n'est pas encore achevée.
     1013                    // On se contente ici d'appliquer des deltas en ascension droite et en déclinaison. Ces deltas sont envoyés de BAOcontrol
     1014                    // au driver indi_BAO par l'intermédiaire du fichier AlignementAntennes.cfg
     1015                    // Consultez la documentation pour comprendre le principe de fonctionnement de l'alignement et de la communication
     1016                    // entre les deux programmes
     1017
     1018                    newRA  = VerifAngle(newRA2  + Sockets[i].AlignementAntenne->delta_ad[Sockets[i].AlignementAntenne->nbrcorrections] * PasDeltaAD);
     1019                    newDEC = newDEC2 + Sockets[i].AlignementAntenne->delta_de[Sockets[i].AlignementAntenne->nbrcorrections] * PasDeltaDe;
     1020
     1021                    IDLog("Alignement en cours.\nDelta RA=%i  delta Dec=%i\n", Sockets[i].AlignementAntenne->delta_ad[Sockets[i].AlignementAntenne->nbrcorrections], Sockets[i].AlignementAntenne->delta_de[Sockets[i].AlignementAntenne->nbrcorrections]);
     1022                    IDLog("Nouvelles Coordonnées AD =%s  Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str());               
     1023                }
    8041024            }
    805 
    806             if (delta_ha) {
    807                 delete [] delta_ha;
    808                 delta_ha=NULL;
     1025                   IDLog("Nouvelles Coordonnées AD =%s  Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str());               
     1026
     1027
     1028            // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation)
     1029
     1030            Azimut( newRA, newDEC, &targetAz, &targetAlt);
     1031
     1032            // Si la méthode d'alignement est la méthode SIMPLE, alors on doit cette fois-ci appliquer la matrice
     1033            // de correction au coordonnées horizontales et non aux coordonnées horaires comme ce que nous
     1034            // avons vu plus haut
     1035
     1036            if  (Sockets[i].AlignementAntenne->Matrice_ok && Sockets[i].AlignementAntenne->MethodeAlignement == SIMPLE)
     1037            {
     1038                // AprÚs s'être assurer que nous utilisons la méthode SIMPLE et que la matrice de rotation est ok
     1039
     1040                IDLog("Application de la matrice SIMPLE\nCoordonnees initiales: Azi = %s  Haut = %s\n", DHMS(targetAz*N180divPi, false ).c_str(),
     1041                      DHMS(targetAlt*N180divPi, false ).c_str());
     1042
     1043                // On constitue un vecteur vect
     1044                // Les coordonnées du vecteur correspondont à la position
     1045                // d'un point sur une sphÚre de rayon 1
     1046                // avec une latitude = targetAlt et une longitude=targetAz
     1047                // on reconnait bien les formules de passage des coordonnées
     1048                // sphériques aux coordonnées rectangulaires
     1049               
     1050               
     1051
     1052                vect.x = cos(targetAz) * cos(targetAlt);
     1053                vect.y = sin(targetAz) * cos(targetAlt);
     1054                vect.z = sin(targetAlt);
     1055
     1056
     1057                // Application de la matrice SIMPLE
     1058               
     1059                Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionSimple(&result, vect);
     1060
     1061
     1062                // Là on doit repasser des coordonnées rectangulaires
     1063                // aux coordonnées sphériques
     1064
     1065                if (result.x != 0.0)
     1066                {
     1067                    targetAz = atan( result.y / result.x );
     1068                   
     1069                    if (result.x < 0) targetAz+=Pi;
     1070                }
     1071                else targetAz = Pidiv2;
     1072
     1073                targetAz  = VerifAngle(targetAz);
     1074
     1075                targetAlt = asin(result.z);
     1076
     1077
     1078                IDLog("Coordonnees finales: Azi = %s  Haut = %s\n", DHMS(targetAz*N180divPi, false ).c_str(),
     1079                      DHMS(targetAlt*N180divPi, false ).c_str());
    8091080            }
    8101081
    811             os.str("");
    812         }
    813     }
    814    
    815     return true;
    816 }
     1082            // Application du delta en azimut (préalablement réglé sur la polaire)
     1083            // Correspond à la variable AlignementAntenne->delta_az_polar
     1084            // Ne s'applique que pour les alignements AFFINE et TAKI
     1085
     1086            if (Sockets[i].AlignementAntenne->MethodeAlignement != SIMPLE) targetAz += Sockets[i].AlignementAntenne->delta_az_polar * PasDeltaAD;
     1087
     1088            // Correction de la réfraction atmosphérique
     1089
     1090            targetAlt = RefractionAtmospherique(targetAlt);
     1091
     1092            // On ajoute Pi pour que le sud soit à 0° d'azimut
     1093
     1094            targetAz = VerifAngle( targetAz + Pi );
     1095
     1096            // On convertit les angles précédents en degrés
     1097
     1098            targetAlt *= N180divPi;
     1099            targetAz  *= N180divPi;
     1100
     1101            // Affichage dans les logs
     1102
     1103            fs_sexa(AzStr, targetAz, 2, 3600);
     1104            fs_sexa(AltStr, targetAlt, 2, 3600);
     1105
     1106            IDLog("Coordonnees horizontales finales: Azi = %s  Haut= %s\n", AzStr, AltStr);
     1107
     1108
     1109            //Conversion des deux angles en pas codeurs
     1110
     1111            if ( targetAlt < HAUTMIN )
     1112            {
     1113                // L'objet est trop bas ( < 30°). On annule le suivi...
     1114
     1115                IDSetSwitch(&OnCoordSetSP, "Erreur ! L objet suivi est situe a moins de 30 deg au-dessus de l horizon. Goto annule.");
     1116
     1117                Suivi = false;
     1118
     1119                RealisationGoto = false;
     1120
     1121                InitAntennes();
     1122
     1123                return;
     1124            }
     1125            else
     1126            {
     1127                // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger
     1128                // la hauteur en appliquant hauteur=180°-hauteur
     1129
     1130                if (targetAlt > 90.0)
     1131                {
     1132                    targetAlt = 180.0 - targetAlt;
     1133                    targetAz += 180.0;
     1134                }
     1135
     1136                // On applique la formule de Marc pour convertir la hauteur en nombre de pas codeur alt
     1137
     1138                Sockets[i].TargetPosition.y = (int) Arrondi( Alt2Motor( targetAlt ) );
     1139
     1140                //4000 pas pour 360° sur l'axe az
     1141
     1142                Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0);
     1143               
     1144                // Message de debug
     1145
     1146                IDLog("Nbre de pas codeurs Az = %i        Alt = %i\n", Sockets[i].TargetPosition.x, Sockets[i].TargetPosition.y);
     1147            }
     1148        }
     1149    }
     1150}
     1151
    8171152
    8181153
    8191154/************************************************************************************
    820 * Retourne le nombre d'antennes connectées
    821 * 
     1155* Retourne le nombre d'antennes actuellement connectées
     1156*
    8221157************************************************************************************/
    8231158
     
    8301165    return num;
    8311166}
     1167
    8321168
    8331169
     
    8391175void BAO::DeconnecterSocket(int num)
    8401176{
    841     IDLog("Deconnexion de l antenne : %s\n", Sockets[num].IP.c_str());
     1177    if (Sockets[num].Connected) IDLog("Deconnexion de l antenne : %s\n", Sockets[num].IP.c_str());
    8421178    Sockets[num].new_sock.shutdown();
    8431179    Sockets[num].Connected = false;
    8441180    Sockets[num].IP = "";
    8451181}
     1182
     1183
    8461184
    8471185
     
    8771215        gettimeofday(&tv, &tz);
    8781216
    879         double Annee=(double)(date.tm_year+1900);
    880         double Mois=(double)(date.tm_mon+1);
    881         double Jour=(double)date.tm_mday;
    882         double Heu=(double)date.tm_hour;
    883         double Min=(double)date.tm_min;
    884         double Sec=(double)date.tm_sec+tv.tv_usec/1.0E6;
    885         double UTCP=0.0;//(double)date.tm_isdst;
     1217        double Annee = (double)(date.tm_year + 1900);
     1218        double Mois  = (double)(date.tm_mon + 1);
     1219        double Jour  = (double)date.tm_mday;
     1220        double Heu   = (double)date.tm_hour;
     1221        double Min   = (double)date.tm_min;
     1222        double Sec   = (double)date.tm_sec+tv.tv_usec/1.0E6;
     1223        double UTCP  = 0.0;//(double)date.tm_isdst;
    8861224
    8871225        // On transmet la date et l'heure à la classe Astro
     
    8921230
    8931231        CalculTSL();
    894     }
    895    
    896     // On chargement les paramÚtres de corrections des antennes toutes les secondes
    897    
    898     if ( compt%1000 == 0 ) ChargementParametresAlignement("/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg");
     1232       
     1233       
     1234        // On charge les paramÚtres de correction des antennes toutes les demi-secondes
     1235
     1236        if ( compt%500 == 0  && tv.tv_usec/1.0E6 > 0.5 )
     1237        {
     1238            for (int i=1; i<SocketsNumber; i++)
     1239            {
     1240                if (Sockets[i].Connected)
     1241                {
     1242                    // Si l'antenne i est connectée, on charge les paramÚtres
     1243                    Sockets[i].AlignementAntenne->TransmettreParametresClasseAstro(Annee, Mois, Jour, Heu, Min, Sec, Longitude, Latitude, Pression, Temp);         
     1244                   
     1245                    Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180);
     1246                }
     1247            }
     1248        }
     1249    }
     1250
    8991251
    9001252
     
    9461298                        // on garde en stock la deuxiÚme partie de la trame
    9471299                        // pour un traitement ultérieur
     1300
    9481301                        buffereponse = reponse.substr(pos + 1);
    9491302
    9501303                        // Partie traitée
     1304
    9511305                        reponse = reponse.substr(0, pos);
    952                        
    953                         IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str());
     1306
     1307                        // on l'affiche dans le log
     1308
     1309                        IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str());
    9541310
    9551311                        // On vérifie ici les acknowledges
     1312
    9561313                        if ((reponse.find("ACK") != string::npos) && (reponse.find("NACK") == string::npos))
    9571314                        {
    9581315                            if (reponse.find("POSITION")  != string::npos)
    9591316                            {
    960                                 Sockets[i].ack_pos=true;
     1317                                Sockets[i].ack_pos   = true;
    9611318                            }
    9621319                            else if (reponse.find("GOTO") != string::npos)
    9631320                            {
    964                                 Sockets[i].ack_goto=true;
     1321                                Sockets[i].ack_goto  = true;
    9651322                            }
    9661323                            else if (reponse.find("PARK") != string::npos)
    9671324                            {
    968                                 Sockets[i].ack_park=true;
     1325                                Sockets[i].ack_park  = true;
    9691326                            }
    9701327                            else if (reponse.find("ABORT")!= string::npos)
    9711328                            {
    972                                 Sockets[i].ack_abort=true;
     1329                                Sockets[i].ack_abort = true;
    9731330                            }
    9741331                        }
    9751332                        else
    9761333                        {
    977                             //réponse à la requête POSITION
     1334                            // Réponse à la requête POSITION
    9781335
    9791336                            if (reponse.find("POSITION") != string::npos)
    9801337                            {
     1338                                // Il y a une erreur signalée par le microcontroleur
     1339
    9811340                                if (reponse.find("NACK") != string::npos)
    9821341                                {
    983                                     //problÚme concernant la commande P
     1342                                    // ProblÚme concernant la commande P
     1343                                    // On affiche dans la boîte indi un voyant de couleur rouge
     1344                                    // et on affiche un message d'erreur
     1345
    9841346                                    OnCoordSetSP.s = IPS_ALERT;
     1347
    9851348                                    IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : position de l antenne inconnue !\n",
    9861349                                                Sockets[i].IP.c_str());
     1350
     1351                                    // La position de l'antenne st donc inconnue
     1352
    9871353                                    Sockets[i].PosValides = false;
    988                                     // Si la position de l'antenne est inconnue, on déconnecte l'antenne
     1354
     1355                                    // On déconnecte l'antenne
     1356
    9891357                                    Sockets[i].Connected  = false;
    9901358                                }
    9911359                                else if (Sockets[i].ack_pos)
    992                                 {                             
    993                                     if ( Sockets[i].PosValides = (ExtractPosition(reponse, &Sockets[i].Pos) == true) )
    994                                     {
    995                                       OnCoordSetSP.s = IPS_OK;
    996                                       IDSetSwitch(&OnCoordSetSP, "Antenne %s : POSITION OK  (x=%i, y=%i)\n",
    997                                                 Sockets[i].IP.c_str(), Sockets[i].Pos.x, Sockets[i].Pos.y);
    998                                     }
    999                                     else
    1000                                     {
    1001                                       OnCoordSetSP.s = IPS_ALERT;
    1002                                       IDSetSwitch(&OnCoordSetSP, "Antenne %s : La position n est pas valide !\n",
    1003                                                 Sockets[i].IP.c_str());
    1004                                     }
    1005                                      
     1360                                {
     1361                                    // La position devrait être valide si on arrive ici...
     1362
     1363                                    if ( Sockets[i].PosValides = (ExtractPosition(reponse, &Sockets[i].Pos) == true) )
     1364                                    {
     1365                                        // La fonction extractPositon confirme que les positions transmises
     1366                                        // par le microcontrÃŽleur sont valides
     1367
     1368                                        OnCoordSetSP.s = IPS_OK;
     1369
     1370                                        // message dans les logs
     1371
     1372                                        IDSetSwitch(&OnCoordSetSP, "Antenne %s : POSITION OK  (x=%i, y=%i)\n",
     1373                                                    Sockets[i].IP.c_str(), Sockets[i].Pos.x, Sockets[i].Pos.y);
     1374                                    }
     1375                                    else
     1376                                    {
     1377                                        // Erreur repérée par la fonction ExtractPosition
     1378
     1379                                        OnCoordSetSP.s = IPS_ALERT;
     1380
     1381                                        // On en informe l'utilisateur
     1382
     1383                                        IDSetSwitch(&OnCoordSetSP, "Antenne %s : La position n est pas valide !\n",
     1384                                                    Sockets[i].IP.c_str());
     1385                                    }
    10061386                                }
    10071387                            }
     
    10131393                                if (reponse.find("NACK") != string::npos)
    10141394                                {
     1395                                    // Une erreur  est retournée par le microcontroleur concernant la commande Park
     1396                                    // On affiche le voyant Park en rouge dans la boîte indi...
     1397
    10151398                                    ParkSP.s = IPS_ALERT;
     1399
     1400                                    // ... et on affiche un message d'erreur
     1401
    10161402                                    IDSetSwitch(&ParkSP, "ALERTE antenne %s : erreur PARK !\n", Sockets[i].IP.c_str());
    10171403                                }
    10181404                                else if (Sockets[i].ack_park && reponse.find("OK")!=string::npos)
    10191405                                {
     1406                                    // PARK ok !
     1407
    10201408                                    ParkSP.s = IPS_OK;
     1409
    10211410                                    IDSetSwitch(&ParkSP, "Antenne %s : PARK OK\n",  Sockets[i].IP.c_str());
    10221411                                }
     
    10291418                                if (reponse.find("NACK") != string::npos)
    10301419                                {
     1420                                    // Une erreur  est retournée par le microcontroleur concernant la commande Abort
     1421                                    // On affiche le voyant Park en rouge dans la boîte indi...
     1422
    10311423                                    AbortSlewSP.s = IPS_ALERT;
     1424
     1425                                    // ... et on affiche un message d'erreur
     1426
    10321427                                    IDSetSwitch(&AbortSlewSP, "ALERTE antenne %s : erreur ABORT !\n",  Sockets[i].IP.c_str());
    10331428                                }
    10341429                                else if (Sockets[i].ack_abort && reponse.find("OK")!=string::npos)
    10351430                                {
     1431                                    // OK !
     1432
    10361433                                    AbortSlewSP.s = IPS_OK;
     1434
    10371435                                    IDSetSwitch(&AbortSlewSP, "Antenne %s : ABORT OK\n",  Sockets[i].IP.c_str());
    10381436                                }
    1039 
    10401437                            }
    10411438
     
    10461443                                if (reponse.find("NACK") != string::npos)
    10471444                                {
     1445                                    // Une erreur  est retournée par le microcontroleur concernant la commande Goto
     1446                                    // On affiche le voyant Park en rouge dans la boîte indi...
     1447
    10481448                                    OnCoordSetSP.s = IPS_ALERT;
     1449
     1450                                    // Message d'erreur
     1451
    10491452                                    IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : Erreur GOTO !\n",  Sockets[i].IP.c_str());
     1453
     1454                                    // On déconnecte l'antenne. Elle ne semble pas en mesure d'executer les ordres goto
     1455
    10501456                                    DeconnecterSocket(i);
    10511457                                }
     
    10611467                                        Sockets[i].GotoOk = true;
    10621468
     1469                                        // Voyant en vert dans la boîte Indi
     1470
     1471                                        OnCoordSetSP.s = IPS_OK;
     1472
    10631473                                        // Message pour l'utilisateur
    1064                                        
    1065                                         OnCoordSetSP.s = IPS_OK;
     1474
    10661475                                        IDSetSwitch(&OnCoordSetSP, "Antenne %s : GOTO OK.\n",  Sockets[i].IP.c_str());
    10671476
    10681477                                        // Fin du Goto pour toutes les antennes ?
    1069 
    1070                                         int num=0;
     1478                                        // On compte les antennes connectées qui ont réalisé le dernier ordre goto
     1479
     1480                                        int num = 0;
    10711481
    10721482                                        for (int j=1; j<SocketsNumber; j++)
    1073                                         {
    1074                                           if (Sockets[j].Connected)
     1483                                        {
     1484                                            if (Sockets[j].Connected)
    10751485                                            {
    10761486                                                if (Sockets[j].GotoOk) num++;
    10771487                                            }
    1078                                         }
     1488                                        }
     1489
     1490                                        // Si le nombre d'antennes connectées est >0
     1491                                        // et que toutes les antennes connectées ont
     1492                                        // réalisé le goto alors...
    10791493
    10801494                                        if ((num == AntennesConnectees()) && (num>0))
    10811495                                        {
    1082                                             // C'est bon ! Tout marche bien...
     1496                                            // C'est bon ! Tout marche bien...
    10831497                                            // On actualise l'AR et la dec dans la boîte de dialogue
    10841498
     
    10861500                                            lastDEC = targetDEC;
    10871501
    1088                                             // On a fini le mouvement. On attend le prochain goto...
    1089 
    1090                                             ActualisationPosition=false;
     1502                                            // On a fini le mouvement. Il n'y a donc plus d'étape à faire
     1503                                            // dans le processus de réalisation d'un goto
     1504                                            // RealisationGoto vaut donc false
     1505
     1506                                            RealisationGoto = false;
    10911507
    10921508                                            // Réinitialisation des paramÚtres des antennes en vue d'un prochain goto
     
    10951511
    10961512                                            // On dessine les voyants de la boîte de dialogue en vert
     1513
    10971514                                            OnCoordSetSP.s = IPS_OK;
    10981515                                            EquatorialCoordsWNP.s = IPS_OK;
     
    11001517
    11011518                                            // Confirmation dans la boîte de dialogue que toutes
    1102                                             // les antennes sont OK         
    1103                                             OnCoordSetSP.s = IPS_OK;
     1519                                            // les antennes sont OK
     1520
    11041521                                            IDSetSwitch(&OnCoordSetSP, "GOTO OK !");
    1105                                            
    1106                                             UpdateGoto=true;
    1107                                         }                                       
     1522
     1523                                            UpdatedGoto = true;
     1524                                        }
    11081525                                    }
    11091526                                }
     
    11131530                        // On passe à la trame suivante si memreponse n'est pas vide
    11141531
    1115                         reponse=buffereponse;
    1116                         pos=reponse.find("\n");
     1532                        reponse = buffereponse;
     1533                        pos     = reponse.find("\n");
    11171534                    }
    11181535                }
    11191536                catch (SocketException& e) //Aïe
    11201537                {
     1538                    // Une exception concerne le socket i
     1539
     1540                    // On déconnecte l'antenne pour plus de sécurité
     1541
    11211542                    DeconnecterSocket(i);
    11221543
     
    11411562            // pour réaliser un goto
    11421563
    1143             ActualisationPosition = false;
     1564            RealisationGoto = false;
    11441565
    11451566            // On envoie l'ordre ABORT à toutes les antennes
     
    11531574            }
    11541575
     1576            // Message à destination de l'utilisateur et des logs
     1577
    11551578            IDSetSwitch(&OnCoordSetSP, "ABORT OK !");
    11561579
     
    11611584            //Pour permettre de refaire un abort
    11621585
    1163             Abort=false;
     1586            Abort = false;
    11641587        }
    11651588
     
    11761599            // pour réaliser un goto
    11771600
    1178             ActualisationPosition = false;
     1601            RealisationGoto = false;
    11791602
    11801603            // On envoie l'ordre PARK à toutes les antennes
     
    11961619            //Pour permettre de refaire un park
    11971620
    1198             Park=false;
     1621            Park = false;
    11991622        }
    12001623
     
    12031626        // Gestion du suivi
    12041627
    1205         if ((Suivi) && (UpdateGoto))
     1628        if ((Suivi) && (UpdatedGoto))
    12061629        {
    12071630            // Délais entre deux actualisations
    12081631
    1209             double delai=ActualisationTM1 / 3600.0 / 24.0;   // Actualisation toutes les 15 minutes en mode transit
    1210 
    1211             if (TrackingMode==2) delai=ActualisationTM2 / 3600.0 / 24.0;   //et 5 secs en mode tracking
     1632            double delai = ActualisationTMTransit / 3600.0 / 24.0;   // Actualisation toutes les 15 minutes en mode transit (par défaut)
     1633
     1634            if (TrackingMode == 2) delai = ActualisationTMTracking / 3600.0 / 24.0;   //et 5 secs en mode tracking (par défaut)
    12121635
    12131636
     
    12161639            if (GetJJ() - JJAnc > delai)
    12171640            {
    1218                 UpdateGoto = false;
     1641                // Cette variable vaudra true lorsque le goto aura été réalisé
     1642
     1643                UpdatedGoto = false;
    12191644
    12201645                // Conversion des coordonnées en pas moteur
     
    12261651                InitAntennes();
    12271652
    1228                 ActualisationPosition = true;
     1653                // On lance le processus d'actualisation du goto
     1654
     1655                RealisationGoto = true;
    12291656
    12301657                // On sauvegarde la date
     
    12431670                    if (Suivi) IDLog("Arrêt du suivi !");
    12441671
    1245                     ActualisationPosition=false;
     1672                    RealisationGoto=false;
    12461673
    12471674                    Suivi=false;
     
    12541681
    12551682
    1256         // Exécution de la procédure complÚte de lecture de la position de l'antenne
    1257         // puis envoi d'une commande Goto
    1258 
    1259         if (ActualisationPosition)
     1683        // Exécution de la procédure complÚte d'un goto :
     1684        // 1Úre étape : envoi de la commande POSITION à toutes les antennes
     1685        // 2Úme étape : Vérification de l'acknowledge de la commande POSITION pour chaque antenne
     1686        // 3Úme étape : Les positions retournées par les antennes sont-elles valides ?
     1687        // 4Úme étape : Si oui, envoie de la commande goto à toutes les antennes
     1688        // 5Úme étape : est-ce que toutes les antennes ont envoyé l'acknowledge de la commande goto ?
     1689        // 6Úme étape : les antennes ont toutes répondu GOTO OK !
     1690
     1691        if (RealisationGoto)
    12601692        {
    12611693            for (int i=1; i<SocketsNumber; i++)
    12621694            {
     1695                // On ne parle qu'aux antennes connectées
     1696
    12631697                if (Sockets[i].Connected)
    12641698                {
     1699                    // En fonction de l'étage de la réalisation d'un goto par l'antenne i
     1700
    12651701                    switch (Sockets[i].etape)
    12661702                    {
    12671703
    1268                         //Envoi de la commande POS
     1704                        // Envoi de la commande POS
    12691705
    12701706                    case 0 :
    12711707                    {
     1708                        // On doit intialiser l'acknowledge à false
     1709
    12721710                        Sockets[i].ack_pos    = false;
     1711
     1712                        // et considérer que la position de l'antenne n'est pas valide
     1713
    12731714                        Sockets[i].PosValides = false;
    12741715
     1716                        // avant d'envoyer l'ordre POSITION
     1717
    12751718                        if (!POSITION(i)) Sockets[i].sendalertes++;
     1719
     1720                        // On passe à l'étage suivante
    12761721
    12771722                        Sockets[i].etape++;
     
    12861731                        if (Sockets[i].ack_pos)
    12871732                        {
    1288                             // tout marche bien
     1733                            // tout marche bien. On a bien reçu l'acknowledge de l'antenne i
     1734
     1735                            // Il n'y a donc aucune attente supplémentaire pour recevoir la réponse
    12891736                            Sockets[i].AttenteExecution = 0;
     1737
     1738                            // Pas d'anomalie à consigner
    12901739                            Sockets[i].AnomaliesExecution = 0;
     1740
     1741                            // On passe à l'étape suivante
    12911742                            Sockets[i].etape++;
    1292                             i--; //permet de revenir sur ce même socket malgré la boucle
    1293                             // -> plus rapide
     1743
     1744                            //permet de rester sur le même socket malgré la boucle -> plus rapide
     1745                            i--;
    12941746                        }
    12951747                        else
    12961748                        {
    1297                             // on réitÚre l'ordre précédent si rien ne se passe
     1749                            // On réitÚre l'ordre précédent si rien ne se passe
    12981750
    12991751                            // On garde une trace de l'anomalie
     1752
    13001753                            Sockets[i].AttenteExecution++;
    13011754
    13021755                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    13031756                            {
    1304                                 // on recommence depuis le début
     1757                                // on recommence depuis le début.
     1758                                // Peut-être que l'antenne n'a pas reçu l'ordre ?
    13051759                                Sockets[i].etape = 0;
    13061760                                Sockets[i].AttenteExecution = 0;
     1761
     1762                                // Pas de réponse. On consigne une erreur grave
    13071763                                Sockets[i].AnomaliesExecution++;
    13081764                            }
    13091765
    1310                             // Toujours rien -> plus sérieux : il faut déconnecter l'antenne
     1766                            // Les erreurs graves s'accumulent. Pas de réponse aprÚs plusieurs minutes
     1767                            // Il faut déconnecter l'antenne
    13111768                            if (Sockets[i].AnomaliesExecution > MAXANOMALIES)
    13121769                            {
    1313                                 OnCoordSetSP.s = IPS_ALERT;
     1770                                //Voyant en rouge dans la boîte Indi
     1771
     1772                                OnCoordSetSP.s = IPS_ALERT;
     1773
     1774                                //Message à l'attentnio de l'utilisateur
    13141775                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre POSITION. \
    1315     Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1776Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1777
     1778                                // On déconnecte l'antenne
    13161779                                DeconnecterSocket(i);
    13171780                            }
     
    13271790                        if (Sockets[i].PosValides)
    13281791                        {
     1792                            // Tout vas bien
     1793                            // On ne consigne aucune anomalie
    13291794                            Sockets[i].AttenteExecution = 0;
    13301795                            Sockets[i].AnomaliesExecution = 0;
    1331                             Sockets[i].etape++; // on passe à l'étape suivante
     1796
     1797                            //On passe à l'étape suivante
     1798                            Sockets[i].etape++;
    13321799                        }
    13331800                        else
    13341801                        {
    13351802                            // on réitÚre l'ordre précédent si rien ne se passe
     1803
    13361804                            Sockets[i].AttenteExecution++;
    13371805
    13381806                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    13391807                            {
    1340                                 // on attend encore la réponse posvalides                               
     1808                                // on attend encore la réponse posvalides
     1809
    13411810                                Sockets[i].etape = 2;
    13421811                                Sockets[i].AttenteExecution = 0;
     1812
     1813                                // On consigne une erreur grave. L'antenne tarde à répondre
    13431814                                Sockets[i].AnomaliesExecution++;
    13441815                            }
    13451816
     1817                            // Aucune réponse de l'antenne depuis plusieurs minutes
     1818                            // On la déconnecte
    13461819                            if (Sockets[i].AnomaliesExecution > MAXANOMALIES)
    13471820                            {
    1348                                 OnCoordSetSP.s = IPS_ALERT;
     1821                                // Voyant en rouge
     1822
     1823                                OnCoordSetSP.s = IPS_ALERT;
     1824
     1825                                //Message d'erreur
    13491826                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : la position retournee n est pas valide. \
    1350     Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1827Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1828
     1829                                //Déconnexion de l'antenne
    13511830                                DeconnecterSocket(i);
    13521831                            }
     
    13541833                    }
    13551834                    break;
     1835
     1836
     1837
     1838                    // On peut remarquer qu'il n'y a pas de case 3 ici...
     1839                    // L'envoie de la commande goto se fait portant pendant l'étape 3 en dehors du switch
     1840                    // Voir le code plus loin...
    13561841
    13571842
     
    13731858                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    13741859                            {
    1375                                 // On prolonge l'attente                                
     1860                                // On prolonge l'attente pour recevoir l'acknowledge du goto
    13761861                                Sockets[i].etape = 4;
    13771862                                Sockets[i].AttenteExecution = 0;
     
    13811866                            if (Sockets[i].AnomaliesExecution > MAXANOMALIES)
    13821867                            {
    1383                                 OnCoordSetSP.s = IPS_ALERT;
    1384                                 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre GOTO. \
    1385     Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1868                                OnCoordSetSP.s = IPS_ALERT;
     1869
     1870                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre GOTO. Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1871
    13861872                                DeconnecterSocket(i);
    13871873                            }
     
    13971883                        if (Sockets[i].GotoOk)
    13981884                        {
     1885                            // On a bien reçu Goto Ok pour l'antenne i !
     1886
    13991887                            Sockets[i].AttenteExecution = 0;
    14001888                            Sockets[i].AnomaliesExecution = 0;
     1889
     1890                            //On passe à l'étape suivante
    14011891                            Sockets[i].etape++;
    14021892                        }
     
    14081898                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    14091899                            {
    1410                                 // On prolonge l'attente
    1411                                
     1900                                // On prolonge l'attente afin de recevoit un GOTO OK
     1901
    14121902                                Sockets[i].etape = 5;
    14131903                                Sockets[i].AttenteExecution = 0;
     
    14151905                            }
    14161906
    1417                             // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes   
     1907                            // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes
    14181908                            if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO)
    14191909                            {
    1420                                 OnCoordSetSP.s = IPS_ALERT;
    1421                                 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : l antenne n a pas renvoye GOTO/OK. \
    1422     Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1910                                // Alerte sur une antenne
     1911                                OnCoordSetSP.s = IPS_ALERT;
     1912
     1913                                // Message d'erreur
     1914                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : l antenne n a pas renvoye GOTO/OK. Deconnexion de l antenne.", Sockets[i].IP.c_str());
     1915
     1916                                //Déconnexion de l'antenne
    14231917                                DeconnecterSocket(i);
    14241918                            }
     
    14331927
    14341928        ///////////////////////////////////////
    1435         //On attend que toutes les antennes soient prêtes pour lancer l'ordre Goto -> meilleure synchronisation
    1436 
    1437         int num=0;
     1929        // Traitement de l'étape 3 de la réalisation d'un goto
     1930        // On place cette partie du traitement en dehors du switch et de la boucle
     1931        // pour pouvoir envoyer les ordres gotos à toutes les antennes lorsque l'on a la confirmation
     1932        // qu'elles sont toutes prêtes à executer cet ordre (être à l'étape 3 pour un socket)
     1933        // -> meilleure synchronisation
     1934
     1935        // On compte les antennes rendues à l'étape 3 et qui attendent
     1936
     1937        int num = 0;
    14381938
    14391939        for (int i=1; i<SocketsNumber; i++)
    14401940        {
     1941            // Uniquement les antennes connectées
     1942
    14411943            if (Sockets[i].Connected)
    14421944            {
    1443                 if (Sockets[i].etape == 3) num++; //fin de la procédure ActualisationPosition.
    1444                 // num antennes sont prêtes à recevoir l'ordre GOTO
     1945                if (Sockets[i].etape == 3) num++; // num antennes sont prêtes à recevoir l'ordre GOTO
    14451946            }
    14461947        }
     1948
     1949        // Toutes les antennes connectées sont prêtes à recevoir l'ordre goto
    14471950
    14481951        if ((num == AntennesConnectees()) && (num>0))
     
    14521955                if (Sockets[i].Connected)
    14531956                {
     1957                    // On envoie l'ordre
     1958
    14541959                    Sockets[i].ack_goto = false;
    14551960                    Sockets[i].AttenteExecution = 0;
    14561961                    Sockets[i].AnomaliesExecution = 0;
    14571962
    1458                     if (!GOTO(i, TargetPosition.x - Sockets[i].Pos.x - Sockets[i].Delta.x, TargetPosition.y - Sockets[i].Pos.y - Sockets[i].Delta.y)) Sockets[i].sendalertes++;
     1963                    if (!GOTO(i, Sockets[i].TargetPosition.x - Sockets[i].Pos.x, Sockets[i].TargetPosition.y - Sockets[i].Pos.y )) Sockets[i].sendalertes++;
    14591964
    14601965                    Sockets[i].etape++;
     
    14641969
    14651970        ///////////////////////////////////////
    1466         // Détection d'anomalies sur la socket. Déconnexion du micro-cont ?
     1971        // Opération garbage
     1972        // Détection d'anomalies sur le socket i.
     1973        // Ce n'est pas normal ici. Il faut déconnecte l'antenne
    14671974
    14681975        for (int i=1; i<SocketsNumber; i++)
     
    14721979                if (Sockets[i].sendalertes > 0)
    14731980                {
    1474                     OnCoordSetSP.s = IPS_ALERT;
     1981                    // Alarme dans la boîte Indi
     1982
     1983                    OnCoordSetSP.s = IPS_ALERT;
     1984
     1985                    // Erreur dans les logs
     1986
    14751987                    IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : deconnexion de l antenne.", Sockets[i].IP.c_str());
     1988
     1989                    // Déconnexion antenne
    14761990
    14771991                    DeconnecterSocket(i);
     
    14801994        }
    14811995    }
    1482    
     1996
    14831997    //incrémentation du compteur
     1998
    14841999    compt++;
    14852000}
     
    15112026        InitAntennes();
    15122027
     2028        // On garde la trace du début du Goto pour enchainer les actualisations
     2029
    15132030        JJAnc = GetJJ();
    1514        
    1515         ADDEC2Motor(targetRA, targetDEC);
     2031
     2032        // Conversion des coordonnées horaires en pas moteur
     2033
     2034        ADDEC2Motor(targetRA, targetDEC);
     2035
     2036        // Mode transit activé
    15162037
    15172038        TrackingMode = 1;
    15182039
     2040        // On suit un objet
     2041
    15192042        Suivi = true;
    15202043
    1521         UpdateGoto = false;
    1522 
    1523         ActualisationPosition = true;
     2044        // Aucun goto n'a été encore réalisé
     2045
     2046        UpdatedGoto = false;
     2047
     2048        // Mais on se lance dans la réalisation d'un goto
     2049
     2050        RealisationGoto = true;
    15242051
    15252052        break;
     
    15392066        InitAntennes();
    15402067
    1541         JJAnc=GetJJ();
    1542        
    1543         ADDEC2Motor(targetRA, targetDEC);
     2068        JJAnc = GetJJ();
     2069
     2070        ADDEC2Motor(targetRA, targetDEC);
    15442071
    15452072        TrackingMode = 2;
     
    15472074        Suivi = true;
    15482075
    1549         UpdateGoto = false;
    1550 
    1551         ActualisationPosition = true;       
     2076        UpdatedGoto = false;
     2077
     2078        RealisationGoto = true;
    15522079
    15532080        break;
     
    15812108
    15822109        // On lance le thread !
    1583 
    1584         Exit=false;
     2110        // Exit ne faudra true que lorsque sera venu le moment de sortir !
     2111
     2112        Exit = false;
     2113
     2114        // Création du thread
    15852115
    15862116        if (pthread_create (&th1, NULL, (void*(*)(void*))LancementThread, this) < 0)
     
    15922122
    15932123    case ISS_OFF:
    1594 
    1595         // On sort du thread
    1596 
    1597         Exit = true;
    1598         sleep(1);
    1599         pthread_join (th1, NULL);
    1600         InitThreadOK = false;
    16012124
    16022125        // Etat des voyants
     
    16212144        SocketsNumber = 1;
    16222145
     2146        // On sort du thread
     2147
     2148        // On dit au thread de sortir de la boucle
     2149
     2150        Exit = true;
     2151
     2152        // Désactiver la boucle de traitement des messages des ISPOLL
     2153
     2154        InitThreadOK = false;
     2155
     2156        // On laisse 1 s au thread pour sortir de la boucle
     2157
     2158        sleep(1);
     2159
     2160        // On détruit le thread
     2161
     2162        pthread_join (th1, NULL);
     2163
     2164        // on sort du programme
     2165
     2166        exit(EXIT_SUCCESS);
     2167
    16232168        break;
    16242169    }
     
    16302175/**************************************************************************************
    16312176**  Envoie une commande sur le socket numsocket
     2177**
    16322178***************************************************************************************/
    16332179
     
    16392185    {
    16402186        sprintf(chaine, "%s%s\n", Commande, Params);
    1641        
    1642         Sockets[numsocket].new_sock << chaine;
    1643        
    1644         IDLog("Commande envoyee a %s: %s", Sockets[numsocket].IP.c_str(), chaine);
     2187
     2188        Sockets[numsocket].new_sock << chaine;
     2189
     2190        IDLog("Commande envoyee a %s: %s", Sockets[numsocket].IP.c_str(), chaine);
    16452191    }
    16462192    catch (SocketException& e)
    16472193    {
     2194        // Consignation d'une anomalie sur le socket
     2195
    16482196        DeconnecterSocket(numsocket);
    16492197
     
    16612209/**************************************************************************************
    16622210** Commande POSITION
     2211**
    16632212***************************************************************************************/
    16642213
     
    16702219/**************************************************************************************
    16712220** Commande PARK
     2221**
    16722222***************************************************************************************/
    16732223
     
    16792229/**************************************************************************************
    16802230** Commande ABORT
     2231**
    16812232***************************************************************************************/
    16822233
     
    16892240/**************************************************************************************
    16902241** Commande GOTO
     2242**
    16912243***************************************************************************************/
    16922244
     
    17002252    sensAz  = 1;
    17012253
     2254    // gestion des signes des deltas
     2255
    17022256    if ( deltaAz < 0 )
    17032257    {
     
    17132267
    17142268    // Vérification du nombre de pas à faire au niveau de l'axe azimut
    1715     // Rappel : un tour complet autour de l'axe az fait 4000 pas codeur (#define NBREPASCODEURSAZ dans BAO.h)
    1716 
    1717     // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas alors
     2269    // Rappel : un tour complet autour de l'axe az fait 4000 pas codeur (voir #define NBREPASCODEURSAZ dans BAO.h)
     2270
     2271    // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas codeur alors
    17182272    // on fait le trajet dans le sens inverse pour aller plus vite
    17192273
     
    17302284    {
    17312285        deltaAz = NBREPASCODEURSAZ - deltaAz;
     2286
    17322287        sensAz = 1 - sensAz;
    17332288    }
     
    17352290    //on envoie les coordonnées au driver
    17362291
    1737     if (sensAz == 1 )  sensAz='f'; else sensAz='b';
    1738    
    1739     if (sensAlt == 1 ) sensAlt='f'; else sensAlt='b';
     2292    (sensAz == 1 ) ? sensAz='f' : sensAz='b';
     2293
     2294    (sensAlt == 1 ) ? sensAlt='f': sensAlt='b';
    17402295
    17412296    sprintf(Params, "%c%04i%c%04i", sensAz, deltaAz, sensAlt, deltaAlt);
     
    18382393
    18392394
    1840 /**************************************************************************************
    1841 **
    1842 ***************************************************************************************/
    1843 void BAO::get_initial_data()
    1844 {
    1845     //  IDSetNumber (&EquatorialCoordsRNP, NULL);
    1846 }
    1847 
    1848 /**************************************************************************************
    1849 **
    1850 ***************************************************************************************/
    1851 void BAO::slew_error(int slewCode)
    1852 {
    1853     OnCoordSetSP.s = IPS_IDLE;
    1854 
    1855     if (slewCode == 1)
    1856         IDSetSwitch (&OnCoordSetSP, "Object below horizon.");
    1857     else if (slewCode == 2)
    1858         IDSetSwitch (&OnCoordSetSP, "Object below the minimum elevation limit.");
    1859     else
    1860         IDSetSwitch (&OnCoordSetSP, "Slew failed.");
    1861 }
    18622395
    18632396/**************************************************************************************
     
    19292462
    19302463
     2464
Note: See TracChangeset for help on using the changeset viewer.