Changeset 648 for BAORadio


Ignore:
Timestamp:
Mar 7, 2012, 6:19:29 PM (12 years ago)
Author:
frichard
Message:

Méthode d'alignement TAKI et AFFINE

Location:
BAORadio/libindi/libindi
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • BAORadio/libindi/libindi/BAOControl/baocontrol.cpp

    r642 r648  
    2727    ChoixCouleurs=1;
    2828
    29     //Affichage de la version du porgramme
     29    // Affichage de la version du programme
    3030
    3131    AfficherLog("\n\n\n\n\n \
     
    6666    client_socket          = NULL;
    6767
    68     // chaines de caractÚres et tableaux
     68    // chaînes de caractÚres et tableaux
    6969
    7070    LatitudeChar           = "";
     
    7878
    7979
    80     //on initalise aussi les structures
     80    // on initialise aussi les structures
    8181
    8282    for (int i=0; i<MAXANTENNES; i++)
     
    147147    }
    148148
    149 
    150149    // Ouverture du socket avec indi_BAO
    151150
     
    218217
    219218
    220     // crée une fenêtre
     219    // création d'une fenêtre
    221220
    222221    w = XCreateSimpleWindow(d, RootWindow(d, DefaultScreen(d)),
     
    226225
    227226
    228     // Création du double buffer
     227    // Création d'un double buffer (pour éviter le scintillement de l'écran
     228    // lors de l'actualisation de la fenêtre.)
    229229
    230230    db = XCreatePixmap(d, w, larg_fenetre, haut_fenetre, DefaultDepth(d, DefaultScreen(d)));
     
    265265/**************************************************************************************
    266266** Dessine les éléments dans la fenêtre graphique
     267**
    267268***************************************************************************************/
    268269
     
    295296    // on évite les affichages de l'heure du genre 12:56:60 ou 24:00:00
    296297
    297     if (s==60) {
     298    if (s == 60) {
    298299        s = 0;
    299300        mi++;
     
    350351            }
    351352
    352             XFillArc(d, db ,color, 10+i*30, 20+j*30, 15, 15, 0, 360*64);
    353 
    354             XDrawArc(d, db ,noir,  10+i*30, 20+j*30, 15, 15, 0, 360*64);
     353            XFillArc(d, db ,color, 10 + i * 30, 20 + j * 30, 15, 15, 0, 360 * 64);
     354
     355            XDrawArc(d, db ,noir,  10 + i * 30, 20 + j * 30, 15, 15, 0, 360 * 64);
    355356        }
    356357    }
     
    374375
    375376    // On n'affiche la fenêtre graphique que lorsque tous les éléments ont été dessinés à l'intérieur
    376     // On évite ainsi le scientillement de la fenêtre...
     377    // On évite ainsi le scintillement de la fenêtre...
    377378
    378379    XCopyArea(d, db, w, noir, 0, 0, larg_fenetre, haut_fenetre, 0, 0);
    379380
    380381
    381     // On force le rafraichissement de l'écran
     382    // On force le rafraîchissement de l'écran
    382383
    383384    XFlush(d);
     
    439440            reponse = reponse.substr(reponse.find("message") + 9);
    440441
    441             //(on en garde une trace)
     442            // (on en garde une trace)
    442443
    443444            memreponse = reponse;
     
    481482
    482483            // erreur sur une antenne -> on change son état dans la fenêtre
    483             // on trouve les erreurs dans les messages d'indi_BAO forumulée
    484             // de la façon suivnate: "ALERTE antenne" ou bien "Erreur sur l antenne"
     484            // on trouve les erreurs dans les messages d'indi_BAO formulée
     485            // de la façon suivante: "ALERTE antenne" ou bien "Erreur sur l antenne"
    485486
    486487            if  ((reponse.find("ALERTE antenne ") != string::npos) ||
     
    531532/**************************************************************************************
    532533** Est-ce que la réponse du pilote indi_BAO est conforme à ce que l'on attendait ?
    533 ** Retourne true si c'est bonne
     534**
    534535**
    535536***************************************************************************************/
     
    557558            duree++;
    558559        }
    559         while (reponse.length() == 0 && duree < 20 ); // on attend un message pendant 10 ms max
     560        while (reponse.length() == 0 && duree < MAX_DELAI_REPONSE ); // on attend un message pendant 10 ms max
    560561
    561562        // on ajoute tous les messages reçus dans memmreponse
     
    644645
    645646    // Tant que l'utilisateur n'a pas tapé la commande 'exit'
     647
    646648    while (NoExit)
    647649    {
     
    655657
    656658
    657         // Faut-il executer un fichier de mouvements ?
     659        // Faut-il exécuter un fichier de mouvements ?
    658660
    659661        if (run && numobjets > 1 && runnum < numobjets)
     
    664666            if ( JJ >= objets[runnum].JJ && !objets[runnum].exec )
    665667            {
    666                 // petit message pour l'utilisateur au début de l'execution du tout premier mouvement
     668                // petit message pour l'utilisateur au début de l'exécution du tout premier mouvement
    667669
    668670                if ( runnum == 1 ) AfficherLog("Début de l'exécution du fichier de mouvements\n\n", true);
     
    703705                    cout << ">";
    704706
    705                     // on réinitiale toutes les variables impliquées dans la commande run
     707                    // on réinitialise toutes les variables impliquées dans la commande run
    706708
    707709                    run         = false;
     
    709711                    numobjets   = 1;
    710712
    711                     // On sort du programme dans le cas BAOControl -r fileName
     713                    // On sort du programme dans le cas de BAOControl -r fileName
    712714
    713715                    NoExit = !exitrun;
     
    722724        }
    723725
    724         // on lit et affiche la réponse des microcontrolleurs
     726        // on lit et affiche la réponse des micro-contrÃŽleurs
    725727
    726728        LireReponse();
     
    734736            gettimeofday(&tv, NULL);
    735737
    736             // on ne sauvegarde les paramÚtres des alignements que si l'horloge du systÚme vient juste
    737             // de changer de seconde. Cela evite les conflits avec le pilote indi_BAO qui cherche
     738            // On ne sauvegarde les paramÚtres des alignements que si l'horloge du systÚme vient juste
     739            // de changer de seconde. Cela permet d'éviter les conflits d'accÚs avec le pilote indi_BAO qui cherche
    738740            // quant à lui à charger ce même fichier en fin de seconde...
    739741
    740             if (tv.tv_usec/1.0E6>0.0 && tv.tv_usec/1.0E6<0.1)
     742            if (tv.tv_usec/1.0E6 > 0.0 && tv.tv_usec/1.0E6 < 0.1)
    741743            {
    742                 for (int i=0; i<numAntennes; i++) if (Antennes[i].ok == 1) Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg");
     744                for (int i=0; i<numAntennes; i++) if (Antennes[i].ok == 1)
     745                    {
     746                        if (MethodeAlignement == SIMPLE )
     747                        {
     748                            Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg");
     749                        }
     750                        else
     751                        {
     752                            Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg");
     753                        }
     754                    }
     755
    743756            }
    744757        }
     
    781794    size_t pos = chaine.find(commande);
    782795
    783     // si la commande est présente dans chaine, on continue
     796    // si la commande est présente dans chaîne, on continue
    784797
    785798    if (pos != string::npos)
     
    820833            // on prend tout d'un bloc aprÚs la commande -> chaine 1
    821834            // utile pour une commande du type "goto m 42" qui doit retourner "m 42" dans une
    822             // même chaine
     835            // même chaîne
    823836
    824837            *chaine1 = chaine;
     
    833846/**************************************************************************************
    834847** Envoie la longitude et la latitude du lieu d'observation au pilote indi_BAO
     848** sous la forme de vecteurs xml
     849** (voir les particularités des drivers développés sous Indi)
    835850**
    836851***************************************************************************************/
     
    839854{
    840855    // la communication avec le pilote indi_BAO
    841     // se fait par l'envoi de fichiers xml
     856    // se fait par l'envoi de trames au format xml
    842857
    843858    try
     
    980995
    981996/**************************************************************************************
    982 ** Envoie les paramÚtres delaitransit et delaitracking au pilote indi_BAO
    983 ** Ces paramÚtres définissent la durée (en sec) entre deux actualisations
    984 ** dans les modes tracking et transit
     997** Envoie la méthode d'alignement au pilote indi_bao
     998** Ce paramÚtre peut être SIMPLE, AFFINE ou TAKI
    985999**
    9861000***************************************************************************************/
     
    10001014        *client_socket << "</oneSwitch>";
    10011015        *client_socket << "<oneSwitch name=\"TAKI\">";
    1002         (MethodeAlignement == TAKI) ? *client_socket << "On" : *client_socket << "Off";
     1016        (MethodeAlignement == TAKI)   ? *client_socket << "On" : *client_socket << "Off";
    10031017        *client_socket << "</oneSwitch>";
    10041018        *client_socket << "</newSwitchVector>";
     
    10981112
    10991113/**************************************************************************************
    1100 ** Diriger l'antenne vers les coordonnées ar et dec et suivre l'objet
    1101 ** en activant le mode transit ou tracking.
     1114** Dirige l'antenne vers les coordonnées ar et dec et suit l'objet  en activant le mode
     1115** transit ou tracking.
    11021116**
    11031117** si J2000 == true, cela signifie que les coordonnées ar et dec sont données dans le
    11041118** le systÚme de coordonnées J2000 (écliptique et équinoxe du 1 janvier 2000 à 0 h TU)
    11051119** Des calculs supplémentaires (précession, nutation, aberration) sont alors réalisés
    1106 ** pour ramener les coordonnées ad et dec à l'écliptique et l'équinoxe de la date de
     1120** pour ramener les coordonnées horaires à l'écliptique et l'équinoxe de la date de
    11071121** l'observation.
    11081122**
     
    11241138
    11251139    arf  = ( ar1  + ar2 / 60.0  + ar3 / 3600.0 ) * 15.0 * Pidiv180;
     1140
    11261141    decf = ( fabs(dec1) + dec2 / 60.0 + dec3 / 3600.0 ) * Pidiv180;
    11271142
    11281143    if (dec[0] == '-') decf = -decf;
    11291144
    1130     // calculs pupplémentaires pour se ramener
     1145    // Calculs supplémentaires pour ramener les coordonnées horaires
    11311146    // à l'époque de l'observation
    11321147
     
    11571172        *client_socket << "<newSwitchVector device=\"BAO\" name=\"ON_COORD_SET\">";
    11581173        *client_socket << "<oneSwitch name=\"TRANSIT\">";
    1159         if (Transit) *client_socket << "On";
    1160         else *client_socket << "Off";
     1174        (Transit) ? *client_socket << "On" : *client_socket << "Off";
    11611175        *client_socket << "</oneSwitch>";
    11621176
    11631177        *client_socket << "<oneSwitch name=\"TRACKING\">";
    1164         if (Transit)  *client_socket << "Off";
    1165         else *client_socket << "On";
     1178        (Transit) ? *client_socket << "Off" : *client_socket << "On";
    11661179        *client_socket << "</oneSwitch>";
    11671180        *client_socket << "</newSwitchVector>";
     
    12071220/**************************************************************************************
    12081221** Se connecte ou se déconnecte au pilote indi_BAO
     1222**
    12091223***************************************************************************************/
    12101224
     
    12151229        *client_socket << "<newSwitchVector device=\"BAO\" name=\"CONNECTION\">";
    12161230
    1217         if (connect) *client_socket << "<oneSwitch name=\"CONNECT\">";
    1218         else *client_socket << "<oneSwitch name=\"DISCONNECT\">";
     1231        (connect) ? *client_socket << "<oneSwitch name=\"CONNECT\">" : *client_socket << "<oneSwitch name=\"DISCONNECT\">";
    12191232
    12201233        *client_socket << "On";
     
    12531266        AfficherLog("La connexion a été établie avec le pilote indi_BAO.\n\n", true);
    12541267
     1268        // Au moment de la connexion avec le driver indi_BAO
     1269        // On transmet les paramÚtres du lieu de l'observation, le mode de suivi
     1270        // ainsi que la méthode d'alignement utilisée
     1271
    12551272        usleep(500000);
    12561273
     
    12731290
    12741291/**************************************************************************************
    1275 ** Gestion du clavier en mode raw pour la procédure d'alignement
     1292** Gestion du clavier en mode raw pendant la procédure d'alignement
    12761293** Cela permet de ne pas avoir à taper sur la touche 'entrée' aprÚs avoir appuyé sur
    12771294** une flÚche de direction
     1295**
    12781296***************************************************************************************/
    12791297
     
    13081326** Le principe consiste à utiliser des étoiles comme point de repÚre pour la calibration
    13091327** des antennes : on compare la position calculée de chaque objet avec la position
    1310 ** effectivement mesurée lors de la procédure d'alignement. On en tire alors une matrice
     1328** effectivement mesurée lors de la procédure d'alignement. On en tire une matrice
    13111329** de rotation qui doit corriger les défauts d'alignement de l'antenne (le 0 pas codeur
    13121330** pas  parfaitement dirigé vers le sud et un axe de rotation az pas forcément
    13131331** perpendiculaire au sol...)
     1332**
    13141333***************************************************************************************/
    13151334
     
    13481367    {
    13491368        // L'alignement de l'antenne 'num' est en cours. Il ne faut pas calculer la
    1350         // matrice de correction tant que ce n'est pas fini..
     1369        // matrice de correction tant que ce n'est pas fini...
    13511370
    13521371        AfficherLog("Début de l'alignement de l'antenne.\n\n", true);
     
    13541373        // On charge les paramÚtres d'alignement existants s'ils existent
    13551374
    1356         Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", atol(ip.c_str()), num);
     1375        if ( MethodeAlignement == SIMPLE )
     1376        {
     1377            Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg", atol(ip.c_str()), num);
     1378        }
     1379        else
     1380        {
     1381            Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg", atol(ip.c_str()), num);
     1382        }
    13571383
    13581384        // l'antenne num est en cours d'alignement
     
    13621388        // Si on n'a pas encore effectué la premiÚre phase de l'alignement (viser la polaire) dans les méthode d'alignement AFFINE et TAKI
    13631389
    1364         if ( Antennes[num].AlignementAntenne->delta_az_polar == 0 && MethodeAlignement!=SIMPLE)
     1390        /*
     1391        if ( Antennes[num].AlignementAntenne->delta_az_polar == 0 && MethodeAlignement != SIMPLE)
    13651392        {
    13661393            cout << "Le radiotélescope va pointer l'étoile polaire.\n";
    1367             cout << "Agissez sur les touches Q et D pour centrer l'étoile dans le viseur...\n";
    1368             cout << "Appuyez sur A pour envoyer un ABORT à l'antenne.\n";
    1369             cout << "Puis, appuyez sur ESC pour valider...\n\n";
     1394            cout << "Agissez sur les touches Q et D pour centrer l'étoile dans le viseur...\n";
     1395             cout << "Appuyez sur S pour changer de vitesse et sur A pour envoyer un ABORT à l'antenne.\n";
     1396                        cout << "Appuyez sur G pour reprendre le suivi de l'objet aprÚs un ABORT ou un message d'erreur.\n";
     1397             cout << "Puis, appuyez sur ESC pour valider...\n\n";
    13701398
    13711399
     
    13981426                    ModificationAlignement=true;
    13991427                    AfficherLog("delta_az - 1\n", true);
    1400                    
     1428
    14011429                    break;
     1430                    //abort
    14021431                case 'a' :
    14031432                    Abort();
     
    14061435                    break;
    14071436
    1408                
     1437                    // vitesse 1x ou 10x
     1438                case 's' :
     1439                    (Vitesse == 1 ) ? Vitesse = 10 : Vitesse = 1;
     1440                    os << "Vitesse=" << Vitesse << "x\n\n";
     1441                    AfficherLog(&os,  true);
     1442
     1443                    break;
     1444
     1445                    // reprise du goto
     1446                case 'g' :
     1447                    AfficherLog("Reprise du GOTO.\n\n", true);
     1448                    Goto("02:31:49.6", "89:15:50.9", Transit, true);
     1449                    sleep(2);
     1450
     1451                    break;
     1452
     1453
    14091454                }
    14101455
    14111456            } while (c!=27);
    1412         }
     1457        } */
    14131458
    14141459
    14151460        AfficherLog("\n\n\nListe des étoiles brillantes situées à plus de 30° au-dessus de l'horizon :\n\n", true);
     1461
     1462        // Mise à jour  du temps sidéral local
    14161463
    14171464        UpdateTime();
     
    14281475            Etoiles[i].ha = RefractionAtmospherique(Etoiles[i].ha);
    14291476
    1430             // Sélectionner et afficher les étoiles > 30°
     1477            // Sélectionne et affiche les étoiles > 30°
     1478            // et donc la magnitude < MAGNITUDEMAXETOILESCALIBRATION
    14311479
    14321480            if ( Etoiles[i].selectionnee = ((Etoiles[i].ha > (HAUTMIN + 5.0) * Pidiv180) && (Etoiles[i].mag < MAGNITUDEMAXETOILESCALIBRATION)) )
     
    14421490            if (Etoiles[i].selectionnee)
    14431491            {
    1444                 for (int j=1; j<=Antennes[num].AlignementAntenne->nbrcorrections; j++)
     1492                for (int j=1; j <= Antennes[num].AlignementAntenne->nbrcorrections; j++)
    14451493                {
    14461494                    // Là, un point important: on ne prend pas en compte l'AD des objets dans le reste des calculs
    1447                     // Mais l'angle horaire de ces objets avec le méridien en retranchant le temps sidéral local
    1448                     // à l'ascension droite des objets. Voir les détails dans la documentation....
     1495                    // Mais l'angle horaire de ces objets avec le méridien. Voir les détails dans la documentation....
    14491496
    14501497                    double distances = DistanceAngulaireEntre2Points(
     
    14541501                                           Etoiles[i].de);
    14551502
    1456                     // Ici, on ne selectionne que des étoiles qui ne soont pas trop proches de positions ayant déjà servies à la calibration
     1503                    // Ici, on ne sélectionne que des étoiles qui ne sont pas trop proches de positions ayant déjà servies à la calibration
    14571504                    // de l'antenne et qui multiplierait les mesures sans amélioration de la précision
    14581505
     
    14731520                AfficherLog("(Tapez sur la touche f pour achever l'alignement de l'antenne et enregistrer les paramÚtres.)\n", true);
    14741521
    1475                 // activer le mode raw évite d'avoir à taper sur la touche entrée entre chaque pression
     1522                // activer le mode raw évite d'avoir à devoir taper sur la touche entrée entre chaque pression
    14761523                // sur le clavier
    14771524
     
    15011548                    // On sauvegarde les coordonnées de l'objet qui servira à la calibration de l'antenne num
    15021549
    1503                     Antennes[num].AlignementAntenne->ad[Antennes[num].AlignementAntenne->nbrcorrections]  = Etoiles[i].ad;
    1504                     Antennes[num].AlignementAntenne->de[Antennes[num].AlignementAntenne->nbrcorrections]  = Etoiles[i].de;
     1550                    Antennes[num].AlignementAntenne->ad[Antennes[num].AlignementAntenne->nbrcorrections] = Etoiles[i].ad;
     1551                    Antennes[num].AlignementAntenne->de[Antennes[num].AlignementAntenne->nbrcorrections] = Etoiles[i].de;
    15051552
    15061553                    do
     
    15681615                            break;
    15691616
     1617                            //abort
    15701618                        case 'a' :
    15711619                            Abort();
     
    15741622                            break;
    15751623
     1624                            // vitesse 1x ou 10x
    15761625                        case 's' :
    15771626                            (Vitesse == 1 ) ? Vitesse = 10 : Vitesse = 1;
     
    15811630                            break;
    15821631
     1632                            // reprise du goto
    15831633                        case 'g' :
    15841634                            AfficherLog("Reprise du GOTO.\n\n", true);
     
    15961646                case 'f':
    15971647                {
    1598                     // on sort de la boucle en cas d'appuie sur la touche f
     1648                    // on sort de la boucle lorsque l'utilisateur tape sur 'f'
     1649
    15991650                    i = numEtoiles;
    16001651                }
     
    16061657        AfficherLog("\nFin de la procédure d'alignement.\n\n", true);
    16071658
    1608         // On indique au reste du programme que la calibration sur l'antenne num est terminée
     1659        // On indique au reste du programme que la calibration sur l'antenne num est achevée
    16091660
    16101661        Antennes[num].AlignementAntenne->AlignementEnCours = false;
    16111662
    1612         ModificationAlignement=true;
     1663        ModificationAlignement = true;
    16131664    }
    16141665    else
     
    16251676
    16261677/**************************************************************************************
    1627 ** Lance l'executution d'un fichier de mouvements
     1678** Lance l'exécution d'un fichier de mouvements
    16281679**
    16291680***************************************************************************************/
     
    16371688    UpdateTime();
    16381689
    1639     if ( exec && numobjets>1 )
     1690    if ( exec && numobjets > 1 )
    16401691    {
    16411692        // Si le chargement du fichier s'est bien déroulé et qu'il y a plus d'un mouvement dedans
     
    16441695        {
    16451696            ErreurLog("Le fichier contient des dates qui sont toutes périmées. Exécution annulée.\n\n");
     1697
    16461698            NoExit = !exitrun;
    16471699
     
    16501702        else
    16511703        {
    1652             AfficherLog("Execution du fichier " + fichier + " en attente...\n\n", true);
     1704            AfficherLog("Exécution du fichier " + fichier + " en attente...\n\n", true);
    16531705            run = true;
    16541706        }
     
    16571709    {
    16581710        ErreurLog("\nLe fichier " + fichier + " contient des erreurs ou n'existe pas...\n\n\n");
     1711
    16591712        NoExit=!exitrun;
    16601713
     
    16701723** Décomposition et vérification des dates, heures, AD et déclinaisons
    16711724**
    1672 ** type = 0 -> chaine contient une déclinaison ou une latitude
    1673 ** type = 1 -> longitude
    1674 ** type = 2 -> AD ou heure
    1675 ** type = 3 -> date
     1725** type = 0 -> chaîne contient une déclinaison ou une latitude
     1726** type = 1 -> "        "      une longitude
     1727** type = 2 -> "        "      une AD ou une heure
     1728** type = 3 -> "        "      une date
    16761729**
    16771730** Exemple de Décomposition("15:23:12", 2, a, b, c) retourne a=15, b=23, c=12
    1678 ** si la chaine a un format incorrect, la fct retourne false
     1731** si la chaîne a un format incorrect, la fct retourne false
    16791732**
    16801733***************************************************************************************/
     
    16911744    (type == 3) ? car="/" : car=":";
    16921745
    1693     // Y a-t-il 2 caractÚres ':' ou '/' dans la chaine ?
     1746    // Y a-t-il 2 caractÚres ':' ou '/' dans la chaîne ?
    16941747    // C'est indispensable dans tous les cas
    16951748
     
    17161769    c = Arrondi(atof(s.c_str()) * 100.0) / 100.0;
    17171770
    1718     //vérification de la cohérence des infos contenues dans la chaine
     1771    //vérification de la cohérence des infos contenues dans la chaîne
    17191772
    17201773    if (type < 3 )
     
    17521805** identification des commandes entrées par l'utilisateur
    17531806** puis exécution des commandes
     1807** Chaine peut contenir par ex "goto betelgeuse", "goto 12:23:01 +22:53:00", "status" etc...
    17541808**
    17551809***************************************************************************************/
     
    18421896            {
    18431897                ErreurLog("Erreur goto : le format de la commande est goto AD DEC\n \
    1844                     L'AD doit être de la forme xx:yy:zz   (ex: 12:00:03 pour 12h 0m 3s)\n \
    1845                     La déclinaison doit être de la forme +/-xx:yy:zz (ex: -12:50:01.1 pour -12° 50' 01.1'')\n\n \
    1846                     Il est egalement possible de faire suivre la commande d'un nom d'un objet\n \
    1847                     Exemple goto M 31 ou encore goto ngc145.\n \
    1848                     Ne pas préciser dans ce cas J2000.\n\n");
     1898                 L'AD doit être de la forme xx:yy:zz  J2000 (ex: 12:00:03 pour 12h 0m 3s)\n \
     1899                 La déclinaison doit être de la forme +/-xx:yy:zz (ex: -12:50:01.1 pour -12° 50' 01.1'')\n \
     1900                 J2000 est un paramÚtre optionnel qui sert à indiquer que les coordonnées horaires\n \
     1901                 sont exprimées dans le repÚre du même nom.\n\n \
     1902                 Il est egalement possible de faire suivre la commande d'un nom d'un objet\n \
     1903                 Exemple goto M 31 ou encore goto ngc145.\n \
     1904                 Ne pas préciser dans ce cas J2000.\n\n");
    18491905            }
    18501906        }
     
    20472103
    20482104                Antennes[num].AlignementAntenne->InitAlignement();
     2105               
     2106                Antennes[num].AlignementAntenne->MethodeAlignement = MethodeAlignement;
    20492107
    20502108                ModificationAlignement = true;
     
    22802338    int rc;
    22812339
    2282     //initialsation des variables de retour
     2340    //initialisation des variables de retour
    22832341
    22842342    reponse.ar = "";
     
    24262484** Lecture d'un fichier ligne aprÚs ligne
    24272485** retourne -1 à la fin
     2486**
    24282487***************************************************************************************/
    24292488
     
    24802539
    24812540    /////////////////////////////////////////
    2482     // Rubrique Coodonnées géographiques
     2541    // Rubrique Coordonnées géographiques
    24832542
    24842543    section = "coordonnees geographiques";
     
    25382597    }
    25392598
     2599    /////////////////////////////////////////
     2600    // Port de connexion du serveur Indi
    25402601
    25412602    key = "port";
     
    25932654    }
    25942655
     2656    /////////////////////////////////////////
     2657    // Rubrique alignement
     2658
     2659    section = "alignement";
     2660
     2661    key = "methode_alignement";
     2662
     2663    if (readINI(section.c_str(), key.c_str(), &value, fileName.c_str()))
     2664    {
     2665        AfficherLog("methode d'alignement = " + (string)value + "\n", true);
     2666        switch (value[0])
     2667        {
     2668        case 's' :
     2669        case 'S' :
     2670            MethodeAlignement = SIMPLE;
     2671            break;
     2672
     2673        case 'a' :
     2674        case 'A' :
     2675            MethodeAlignement = AFFINE;
     2676            break;
     2677
     2678        case 't' :
     2679        case 'T' :
     2680            MethodeAlignement = TAKI;
     2681            break;
     2682        }
     2683
     2684        SAFEDELETE_TAB(value);
     2685    }
     2686    else
     2687    {
     2688        ErreurLog("Le paramÚtre methode_alignement est incorrect !\n");
     2689
     2690        return false;
     2691    }
     2692
     2693
    25952694
    25962695    /////////////////////////////////////////
     
    26092708    else
    26102709    {
    2611         ErreurLog("Le paramÚtre mode est incorrect !\n");
     2710        ErreurLog("Le paramÚtre mode suivi est incorrect !\n");
    26122711
    26132712        return false;
     
    29693068            SAFEDELETE_TAB(value);
    29703069
    2971             Etoiles[numEtoiles].ad = (a1 + a2/60.0 + a3/3600.0) * 15.0 * Pidiv180;
     3070            Etoiles[numEtoiles].ad = (a1 + a2 / 60.0 + a3 / 3600.0) * 15.0 * Pidiv180;
    29723071        }
    29733072        else
     
    29843083                && (Decomposition(value, 0, &a1, &a2, &a3)))
    29853084        {
    2986             Etoiles[numEtoiles].de = (fabs(a1) + a2/60.0 + a3/3600.0 ) * Pidiv180;
    2987 
    2988             if (value[0] == '-')  Etoiles[numEtoiles].de = -Etoiles[numEtoiles].de;
     3085            Etoiles[numEtoiles].de = (fabs(a1) + a2 / 60.0 + a3 / 3600.0 ) * Pidiv180;
     3086
     3087            if (value[0] == '-')  Etoiles[numEtoiles].de = - Etoiles[numEtoiles].de;
    29893088
    29903089            SAFEDELETE_TAB(value);
     
    30053104        if (readINI(section.c_str(), key.c_str(), &value, fileName.c_str()))
    30063105        {
    3007             Etoiles[numEtoiles].mag=(double)atof(value);
     3106            Etoiles[numEtoiles].mag = atof(value);
    30083107            SAFEDELETE_TAB(value);
    30093108        }
     
    30193118        // Passage du repÚre J2000 à l'écliptique et à l'équinoxe liée à la date de l'observation
    30203119
    3021         Precession(&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);
    3022         NutationEtoile(&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);
     3120        Precession        (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);
     3121        NutationEtoile    (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);
    30233122        AberrationAnnuelle(&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);
    30243123
     
    30933192
    30943193    // si on a utilisé l'option -r en ligne de commande
    3095     // alors on charge et on execute le fichier de mouvements
     3194    // alors on charge et on exécute le fichier de mouvements
    30963195
    30973196    if (argc == 3)
     
    31583257
    31593258    // sauvegarder la position courante
     3259
    31603260    long pos = fichier.tellg();
     3261
    31613262    // se placer en fin de fichier
     3263
    31623264    fichier.seekg( 0 , ios_base::end );
     3265
    31633266    // récupérer la nouvelle position = la taille du fichier
     3267
    31643268    long size = fichier.tellg();
     3269
    31653270    return (size > 0);
    31663271}
  • BAORadio/libindi/libindi/BAOControl/baocontrol.h

    r642 r648  
    4141    double ha;                          // hauteur au-dessus de l'horizon (en rad)
    4242    double mag;                         // magnitude
    43     bool   selectionnee;                // l'objet a-t-il été sélectionné pour calibrer l'antenne
    44                                         // actuellement en mode alignement ?
     43    bool   selectionnee;                // l'objet a-t-il été sélectionné pour calibrer l'antenne ?
    4544};
    4645
     
    9190    void *my_thread_process ();
    9291   
    93     // intialise la clase
     92    // initialise la classe
    9493   
    9594    int init(int argc, char **argv);
     
    106105
    107106
    108     //communications entre les antennes et le microcontrÃŽleur
     107    //communications entre les antennes et le micro-contrÃŽleur
    109108
    110109    void LireReponse();
     
    135134   
    136135
    137     //Gestion serveur NED
     136    // Gestion du serveur NED
    138137   
    139138    CoordonneesHoraires ServeurNED(string objet);
     
    166165   
    167166
    168     double Pression;                            // Pression atmosphérique en mBar
     167    double Pression;                            // Pression atmosphérique en mbar
    169168    double Temperature;                         // température de l'atmosphÚre en °C
    170169
    171170    bool NoExit;                                // A-t-on tapé exit pour sortir ? Permet de fermer le thread à ce moment-là
    172171    bool Transit;                               // Si oui, le mode transit est activé, sinon, c'est le mode tracking
    173     bool run;                                   // execute actuellement un fichier de mouvements
    174     bool exitrun;                               // doit-on sortir du programme à la fin de l'execution de la commande run ?
     172    bool run;                                   // exécute actuellement un fichier de mouvements
     173    bool exitrun;                               // doit-on sortir du programme à la fin de l'exécution de la commande run ?
    175174    bool J2000;                                 // est-ce que les coordonnées du fichier de mouvements sont en coordonnées J2000 ?
    176175    bool ModificationAlignement;                // Est-ce que l'une des antennes est en cours d'alignement et est-ce qu'un paramÚtre
  • BAORadio/libindi/libindi/BAOControl/baocontrol_params

    r643 r648  
    1111temperature=10
    1212
     13[alignement]
     14methode_alignement=SIMPLE
     15
    1316[suivi]
    1417mode=tracking
  • BAORadio/libindi/libindi/communs/alignement.cpp

    r644 r648  
    1919{
    2020    //Initialisation des paramÚtres des antennes
    21    
     21
    2222    InitAlignement();
    2323}
     
    8888void Alignement::TransmettreParametresClasseAstro(double Annee, double Mois, double Jour, double Heu, double Min, double Sec, double Longitude, double Latitude, double Pression, double Temp)
    8989{
    90     DefinirLongitudeLatitude(Longitude, Latitude); 
     90    DefinirLongitudeLatitude(Longitude, Latitude);
    9191    DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec);
    92     DefinirPressionTemp(Pression, Temp);   
     92    DefinirPressionTemp(Pression, Temp);
    9393}
    9494
     
    118118
    119119/**************************************************************************************
    120 **  Calcule la matrice de rotation d'un angle alpha autour d'un axe défini 
     120**  Calcule la matrice de rotation d'un angle alpha autour d'un axe défini
    121121**  par les paramÚtres t et r dans un systÚme de coordonnées spĥériques
    122122**  Le signe - devant le cos permet seulement de rendre le repÚre compatible avec WinStars
    123123** que j'utilise pour faire des vérifications...
    124124** Fonction utile pour de débogage de la fct d'alignement
    125 ** 
     125**
    126126***************************************************************************************/
    127127
     
    397397
    398398    // Pour chaque variable coordonnées, on calcule d'abord l'azimut et la hauteur de l'objet correspondant
    399    
     399
    400400    Azimut(a1.x, a1.y, &aa1.x, &aa1.y);
    401401
     
    509509        MATRICE[3][3] = mm33;
    510510
    511         //Pour vérifs
     511        //Pour vérifs
    512512        //RotationAutourDunAxe(0.3,Pi/2.0-0.1, 0.2);
    513        
    514         return 1;
     513
     514        return 1;
    515515    }
    516516    else
     
    602602    int best2 = 0;
    603603    int best3 = 0;
    604    
    605    
     604
     605
    606606    // On calcule le temps sidéral local, etc...
    607    
     607
    608608    CalculTSL();
    609609
     
    738738        os << "\nUtilisation du triangle : " << map[best1] << " " << map[best2] << " " << map[best3]  << "\n" ;
    739739
    740         c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]] + GetTSL());
    741         c1.y = de[map[best1]];
    742         c1.z = 1.0;
    743 
    744         c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]] + GetTSL());
    745         c2.y = de[map[best2]];
    746         c2.z = 1.0;
    747 
    748         c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]] + GetTSL());
    749         c3.y = de[map[best3]];
    750         c3.z = 1.0;
     740        if (MethodeAlignement == SIMPLE)
     741        {
     742            c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]] + GetTSL());
     743            c1.y = de[map[best1]];
     744            c1.z = 1.0;
     745
     746            c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]] + GetTSL());
     747            c2.y = de[map[best2]];
     748            c2.z = 1.0;
     749
     750            c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]] + GetTSL());
     751            c3.y = de[map[best3]];
     752            c3.z = 1.0;
     753        }
     754        else
     755        {
     756            c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]]);
     757            c1.y = de[map[best1]];
     758            c1.z = 1.0;
     759
     760            c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]]);
     761            c2.y = de[map[best2]];
     762            c2.z = 1.0;
     763
     764            c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]]);
     765            c3.y = de[map[best3]];
     766            c3.z = 1.0;
     767        }
     768
    751769
    752770        os << "Point 1 :  ho=" << DHMS(c1.x * N180divPi, false);
     
    797815    os << MATRICE[1][3] << "   \t" << MATRICE[2][3] << "    \t" << MATRICE[3][3] << "\n";
    798816
    799    
    800    
    801    
    802 
    803    
     817
     818
     819
     820
     821
    804822    //Vérifications supp
    805823    /*
     
    811829    os << GetHeure() << ":" << GetMin() << ":" << GetSec() << "\n";
    812830    os << DHMS(GetTSL()*N180divPi, true) << "\n\n";
    813    
     831
    814832      Azimut(c3.x, c3.y, &mm1.x, &mm1.y);
    815833
     
    848866    */
    849867
    850    
    851    
     868
     869
    852870    //Afficher les messages de cette fonction
    853871
     
    10181036    os2.str("");
    10191037
     1038    /*  char chaine[100];
     1039    sprintf(chaine, "************** %s\n",alignment_method_data);
     1040      cout << chaine;*/
     1041
    10201042    if (alignment_method_data)
    10211043    {
     
    10381060    {
    10391061        // Si la procédure d'alignement se termine, il faut calculer la matrice de correction
    1040        
     1062
    10411063        if (AlignementEnCours != atoi(align_data))
    10421064        {
     
    11031125    stringstream os;
    11041126
    1105    
     1127
    11061128    //AfficherLog("Enregistrement de l'alignement des antennes dans le fichier " + fileName + "\n", true);
    11071129
     
    11111133    section = os.str();
    11121134    os.str("");
    1113    
     1135
    11141136    os << "delta_az_polar";
    11151137    key     = os.str();
     
    11371159    os.str("");
    11381160
     1161
    11391162    writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str());
     1163
     1164    /*    char chaine[100];
     1165    sprintf(chaine, "s************** %i\n",MethodeAlignement);
     1166       cout << chaine;*/
    11401167
    11411168
  • BAORadio/libindi/libindi/communs/const.h

    r647 r648  
    119119/////////////////////////////////////////////
    120120
     121// Port utilisé sur le réseau tcp/ip pour communiquer avec les antennes
     122
     123#define BAO_PORT 8000
     124
     125// Délai maximum en ms d'attente de la réponse des micro-contrÃŽleurs
     126
     127#define MAX_DELAI_REPONSE 40
     128
    121129// Si une commande ne recoit pas d'acknowledge. Alors refaire 80 tentatives en renvoyant la commande
    122130
  • BAORadio/libindi/libindi/drivers/telescope/BAO.cpp

    r642 r648  
    4343    init_properties();
    4444
    45     // Le bouton connect de la boîte de dialogue d'indi8BAO
     45    // Le bouton connect de la boîte de dialogue d'indi_BAO
    4646    // est dans l'état IDLE au démarrage
    4747
     
    5252    lastRA                = 0.0;
    5353    lastDEC               = 0.0;
     54   
     55    // Jour julien de la derniÚre actualisation
     56   
    5457    JJAnc                 = 0.0;
    5558
    5659    // Variables d'état
    5760
    58     currentSet            =  0;         // Variables internes d'Indi, ne pas toucher
    59     lastSet               = -1;         // Variable interne d'Indi, ne pas toucher
     61    currentSet            =  0;
    6062
    6163    // Nombre d'antennes connectées
     
    6567    // Le mode tracking est activé par défaut
    6668
    67     TrackingMode          =  1;
     69    TrackingMode          =  BAO_TRACKING;
     70   
     71    // Méthode d'alignement par défaut
     72   
     73    MethodeAlignement     = SIMPLE;
    6874
    6975    // délais en sec entre deux actualisations
    7076    // dans les modes transit et tracking
    7177
    72     ActualisationTMTransit  = 15.0 * 60.0;    // Délai entre 2 actualisations dans le mode transit
     78    ActualisationTMTransit  = 15.0 * 60.0;    // Délai entre 2 actualisations dans le mode transit (en sec)
     79   
    7380    ActualisationTMTracking = 5.0;            //                "                 "        tracking
    7481
     
    8693    RealisationGoto       = false;
    8794
    88     // vaut true si l'utilisateur demande l'annulation du mouvement en cours
     95    // = true si l'utilisateur demande l'annulation du mouvement en cours
    8996
    9097    Abort                 = false;
    9198
    92     // vaut true si l'utilisateur demande de mettre les antennes en mode park
     99    // = true si l'utilisateur demande de mettre les antennes en mode park
    93100
    94101    Park                  = false;
    95102
    96     // vaut true un objet est actuellement suivi par les antennes
     103    // = true si un objet est actuellement suivi par les antennes
    97104
    98105    Suivi                 = false;
    99106
    100     // vaut true si l'utilisateur demande à sortir de l'application -> permet de fermer le thread
     107    // = true si l'utilisateur sort de l'application -> permet de fermer le thread
    101108
    102109    Exit                  = false;
     110   
     111    // Initialisation des paramÚtres atmosphériques par défaut
    103112   
    104113    Pression              = 1013.0;
     
    141150BAO::~BAO()
    142151{
    143     //On informe le thread que nous allons sortir
     152    // On informe le thread que nous allons sortir
    144153
    145154    Exit = true;
     
    161170
    162171    // Petit message à l'attention de l'utilisateur
    163     // permet de savoir si le destructeur est bien atteint
     172    // permet de savoir si le destructeur a bien été atteint
    164173
    165174    IDLog("Sortie de indi_BAO\n");
     
    257266
    258267/**************************************************************************************
    259 ** Initialisation de la boîte de dialogue INDI (suite)
    260 ** Vider tous les vecteurs
     268** Définition de tous les vecteurs de la boîte de dialogue INDI
     269** Cette procédure doit être obligatoirement présente dans tous pilotes Indi
    261270**
    262271***************************************************************************************/
     
    271280    IDDefSwitch(&ConnectSP, NULL);
    272281    IDDefText(&ObjectTP, NULL);
    273     IDDefNumber(&EquatorialCoordsWNP, NULL);
    274     IDDefNumber(&GeographicCoordsWNP, NULL);
    275     IDDefNumber(&PressionTempWNP, NULL);
     282    IDDefNumber(&EquatorialCoordsWNP, NULL);     
    276283    IDDefSwitch(&OnCoordSetSP, NULL);
    277284    IDDefSwitch(&AlignmentSP, NULL);
     
    282289    IDDefNumber(&ActualisationNP1, NULL);
    283290    IDDefNumber(&ActualisationNP2, NULL);
    284 }
    285 
    286 
    287 /**************************************************************************************
    288 ** Initialisation des vecteurs INDI
    289 ** ParamÚtres par défaut
     291    IDDefNumber(&PressionTempWNP, NULL);
     292    IDDefNumber(&GeographicCoordsWNP, NULL); 
     293}
     294
     295
     296/**************************************************************************************
     297** Initialisation des vecteurs de la boîte Indi
     298** Cette procédure doit être obligatoirement présente dans tous pilotes Indi
    290299**
    291300***************************************************************************************/
     
    333342** En cas de changement de texte dans la boîte de dialogue (par exemple : changement du
    334343** nom de l'objet) alors suivre l'objet...
    335 ** 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
     344** Cette fonction n'est pas utilisée
     345** TODO: faut-il proposer cette fonction depuis la boîte alors qu'il est déjà
     346** possible de le faire depuis  Kstars et BAOcontrol ?
     347**
    338348**
    339349***************************************************************************************/
     
    372382** Exemple : longitude, latitude, ar, dec etc...) -> prendre en compte les modifications
    373383**
     384** const char *dev  contient le nom du dispositif recevant le message (ici indi_BAO)
     385** const char *name reçoit  le nom de la rubrique modifiée par l'utilisateur
     386** (ex : les coordonnées géographiques, les coordonnées horaires de l'objet etc...)
     387** double names[] contient la liste de tous les champs modifiables dans chaque rubrique
     388** (ex : longitude et latitude dans la rubrique coordonnées géographiques
     389** char *values[] contient toutes les valeurs (numériques ou non) mais toujours exprimées
     390** sous la forme d'une chaîne de caractÚres
     391**
    374392***************************************************************************************/
    375393
     
    400418    if (!strcmp (name, GeographicCoordsWNP.name))
    401419    {
    402         // l'utilisateur a modifié un les coordonnées géographiques de la boite indi
     420        // l'utilisateur a modifié une des coordonnées géographiques de la boite indi
    403421
    404422        int i = 0, nset = 0;
    405423
    406424        // 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
     425        // ici la latitude et la longitude valent 0.0
    408426
    409427        Latitude  = 0.0;
     
    412430        // pour ce vecteur, on sait qu'il y a n éléments possibles
    413431        // 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
     432        // il y a deux éléments : la longitude et la latitude
     433        // pour la rubrique alignement, il y a en a trois : simple, affine et taki
    417434
    418435        for (i = 0; i < n; i++)
     
    425442            if (eqp == &GeographicCoordsWN[0])
    426443            {
    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
     444                // ici on a identifié la zone latitude de la boîte de dialogue
     445                // Value[i] contient la chaîne de caractÚre correspondante dans la boîte
    429446                // C'est la valeur saisie par l'utilisateur
    430447
     
    459476        if (nset == 2)
    460477        {
    461             //Vérification
    462             //IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude);
    463 
    464             //nset vaut 2, on sommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs
     478            // Vérification
     479            // IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude);
     480
     481            // nset vaut 2, nous sommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs
    465482            // saisies par l'utilisateur
    466483            // voir le code plus haut pour comprendre...
    467484
    468             // On change la couleur de la "diode" de la rubrique coordonnées géographiques de la boîte
    469             // en vert
     485            // On change la couleur de la "diode" de la rubrique coordonnées
     486            // géographiques de la boîte en vert
    470487
    471488            GeographicCoordsWNP.s = IPS_OK;
     
    478495        {
    479496            // quelque chose cloche
    480             // peut-être l'une des veleurs saisies par l'utilisateur n'est-elle pas dans
     497            // peut-être l'une des valeurs saisies par l'utilisateur n'est-elle pas dans
    481498            // le bon intervalle ? ex : lat = 150°
    482499
     
    496513
    497514        // 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...
     515        // qui utilisera ces informations pur calculer l'azimut des objets et le temps sidéral local en particulier...
    499516
    500517        DefinirLongitudeLatitude(Longitude, Latitude);
     
    533550            else if (eqp == &EquatorialCoordsWN[1])
    534551            {
    535                 //même chose pour la déclinaison
     552                // même chose pour la déclinaison
    536553                newDEC = values[i];
    537554
     
    553570            targetDEC = newDEC;
    554571
    555             // on les affiches dans les logs
     572            // on les affiche dans les logs
    556573
    557574            fs_sexa(RAStr, newRA, 2, 3600);
     
    602619            if (eqp == &PressionTempWN[0])
    603620            {
    604                 // on a compris que l'utilisateur avait changé l'ascension droite de l'objet
     621                // on a compris que l'utilisateur a changé l'ascension droite de l'objet
    605622
    606623                // on affecte la nouvelle valeur à newRA
     
    649666    if (!strcmp (name, ActualisationNP1.name))
    650667    {
    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
     668        // on a ici exactement le même fonctionnement que précédemment
     669        // on rÚgle ici les valeurs des délais entre deux actualisations
    653670        // 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
     671        // Retourne un message d'erreur si les durées ne sont pas exprimées
     672        // dans un intervalle > 0 et < 3600
    656673
    657674        double newAct1 = 1.0;
     
    717734/**************************************************************************************
    718735** L'utilisateur clique sur l'un des boutons de la boîte Indi
    719 **
     736** Même observation que pour la procédure précédente
     737**
    720738***************************************************************************************/
    721739
     
    767785            return;
    768786
    769         currentSet = get_switch_index(&AlignmentSP);
    770         AlignmentSP.s = IPS_OK;
     787        MethodeAlignement = get_switch_index(&AlignmentSP) + 1 ;
     788       
     789        /*char chaine[100];     
     790        sprintf(chaine, "****************************************** %i\n", MethodeAlignement);
     791        IDLog(chaine);*/
     792       
     793        AlignmentSP.s = IPS_OK;
    771794        IDSetSwitch(&AlignmentSP, NULL);
    772795
    773         for (int i=0; i<MAXALIGNEMENTANTENNE; i++)
    774         {
    775             switch (currentSet)
     796        for (int i=0; i<MAXHOSTNAME; i++)
     797        {
     798            switch (MethodeAlignement)
    776799            {
    777800            case 1 :
     
    846869** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept
    847870** qui est bloquante.
     871** L'adresse IP de l'antenne qui a effectué la connexion est consignée dans la variable IP
     872** de la structure Sockets. L'état de l'antenne (connected) est placée à true
    848873**
    849874***************************************************************************************/
     
    858883
    859884            Sockets[SocketsNumber].IP = server.recupip(Sockets[SocketsNumber].new_sock);
    860 
    861             Sockets[SocketsNumber++].Connected = true;
     885           
     886            Sockets[SocketsNumber].AlignementAntenne->MethodeAlignement = MethodeAlignement;
     887
     888            Sockets[SocketsNumber++].Connected = true;     
    862889
    863890            InitThreadOK = true;
     
    894921/**************************************************************************************
    895922** Extraction de la position de l'antenne aprÚs l'envoi de la commande P
    896 ** Le retour de la commande P est POSITION/valeur_az/valeur_alt/
    897 ** ExtractPosition retourne donc Valeur_az et Valeur_alt
     923** Le retour de la commande P est POSITION/valeur_az/valeur_alt/
     924** Ce retour est envoyé dans la chaîne str
     925** ExtractPosition retourne une structure Position contenant Valeur_az et Valeur_alt
     926** Ex: ExtractPosition("POSITION/0100/0001/", result)  retourne result.x=100 et result.y=1
    898927**
    899928***************************************************************************************/
     
    929958
    930959/************************************************************************************
    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
     960** Cette procédure, aprÚs avoir appliqué la matrice de rotation aux coordonnées de l'objet
     961** visées par l'utilisateur, effectue les conversions en unités codeurs des paraboles
    934962** (càd en nb de tours des deux axes moteurs depuis la position PARK)
    935963**
     
    954982        if (Sockets[i].Connected)
    955983        {
    956             newRA = newRA2;
     984            newRA  = newRA2;
    957985            newDEC = newDEC2;
    958986         
     
    960988            // sur les coordonnées horaires de l'objet visé
    961989
    962             // il faut vérifier auparavent que la matrice de rotation est disponible
     990            // il faut vérifier auparavant que la matrice de rotation est disponible
    963991            // pour l'antenne i
    964992
    965993            if  (Sockets[i].AlignementAntenne->Matrice_ok)
    966994            {
    967                 // On est bien dans le cas de l'allignement AFFINE ou Taki
     995                // On est bien dans le cas de l'alignement AFFINE ou Taki
    968996
    969997                if (Sockets[i].AlignementAntenne->MethodeAlignement ==  AFFINE ||
    970                         Sockets[i].AlignementAntenne->MethodeAlignement ==  TAKI)
     998                    Sockets[i].AlignementAntenne->MethodeAlignement ==  TAKI)
    971999                {
    9721000                    // On crée un vecteur avec pour coordonnées
    9731001                    // x = Angle horaire de l'objet visé
    974                     // y = déclainaison de l'objet
     1002                    // y = déclinaison de l'objet
    9751003                    // z = 1.0
    9761004                    // Voir la documentation pour plus d'explications sur le calcul affine/taki
     
    9991027                    // On récupÚre les nouvelles coordonnées. z ne nous intéresse pas
    10001028
    1001                     newRA  = VerifAngle(result.x+GetTSL());
     1029                    newRA  = VerifAngle(result.x + GetTSL());
    10021030                    newDEC = result.y;
    10031031
     
    10231051                }
    10241052            }
    1025                    IDLog("Nouvelles Coordonnées AD =%s  Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str());               
    1026 
    1027 
     1053   
    10281054            // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation)
    10291055
     
    10421068
    10431069                // 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
     1070                // Les coordonnées du vecteur correspondent à la position
     1071                // d'un point défini par une latitude targetAlt et une longitude targetAz
     1072                // sur une sphÚre de rayon 1.
     1073                // On reconnaît les formules de passage des coordonnées
    10481074                // sphériques aux coordonnées rectangulaires
    1049                
    10501075               
    10511076
     
    10671092                    targetAz = atan( result.y / result.x );
    10681093                   
    1069                     if (result.x < 0) targetAz+=Pi;
     1094                    if (result.x < 0) targetAz += Pi;
    10701095                }
    10711096                else targetAz = Pidiv2;
     
    11071132
    11081133
    1109             //Conversion des deux angles en pas codeurs
     1134            // Conversion des deux angles en pas codeurs
    11101135
    11111136            if ( targetAlt < HAUTMIN )
     
    11401165                //4000 pas pour 360° sur l'axe az
    11411166
    1142                 Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0);
     1167                Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * (double)NBREPASCODEURSAZ / 360.0);
    11431168               
    11441169                // Message de debug
    11451170
    1146                 IDLog("Nbre de pas codeurs Az = %i        Alt = %i\n", Sockets[i].TargetPosition.x, Sockets[i].TargetPosition.y);
     1171                IDLog("Nbre de pas codeurs Az = %i  Alt = %i\n", Sockets[i].TargetPosition.x, Sockets[i].TargetPosition.y);
    11471172            }
    11481173        }
     
    11531178
    11541179/************************************************************************************
    1155 * Retourne le nombre d'antennes actuellement connectées
    1156 *
     1180** Retourne le nombre d'antennes actuellement connectées
     1181**
    11571182************************************************************************************/
    11581183
     
    11871212** Procédure principale
    11881213** Elle est appelée toutes les ms
     1214**
    11891215***************************************************************************************/
    11901216
     
    11991225    struct timezone tz;
    12001226
    1201     //si pas de connexion avec le seveur d'indi -> on sort
     1227    //si pas de connexion avec le serveur d'indi -> on sort
    12021228
    12031229    if (!is_connected()) return;
     
    12271253        DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec);
    12281254
    1229         //Puis on calule le temps sidéral local, le JJ etc.
     1255        // Puis on calcule le temps sidéral local, le JJ etc.
    12301256
    12311257        CalculTSL();
     
    12431269                    Sockets[i].AlignementAntenne->TransmettreParametresClasseAstro(Annee, Mois, Jour, Heu, Min, Sec, Longitude, Latitude, Pression, Temp);         
    12441270                   
    1245                     Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180);
     1271                    if (Sockets[i].AlignementAntenne->MethodeAlignement == SIMPLE )
     1272                    {
     1273                      //IDLog("chargement simple\n");
     1274                      Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180);
     1275                    }
     1276                    else
     1277                       {
     1278                        // IDLog("chargement taki\n");
     1279                      Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180);
     1280                    }
    12461281                }
    12471282            }
     
    12681303
    12691304        /////////////////////////////////////////////////
    1270         // Début des échanges avec les microcontrÃŽleurs
    1271 
    1272         // Analyse des réponses des microcontrÃŽleurs
     1305        // Début des échanges avec les micro-contrÃŽleurs
     1306
     1307        // Analyse des réponses des micro-contrÃŽleurs
    12731308
    12741309        for (int i=1; i<SocketsNumber; i++)
     
    12801315                    string reponse, buffereponse;
    12811316
    1282                     // on récupÚre la réponse du microcontrÃŽleur
     1317                    // on récupÚre la réponse du micro-contrÃŽleur
    12831318
    12841319                    Sockets[i].new_sock >> reponse;
     
    13361371                            if (reponse.find("POSITION") != string::npos)
    13371372                            {
    1338                                 // Il y a une erreur signalée par le microcontroleur
     1373                                // Il y a une erreur signalée par le micro-contrÃŽleur
    13391374
    13401375                                if (reponse.find("NACK") != string::npos)
     
    13641399                                    {
    13651400                                        // La fonction extractPositon confirme que les positions transmises
    1366                                         // par le microcontrÃŽleur sont valides
     1401                                        // par le micro-contrÃŽleur sont valides
    13671402
    13681403                                        OnCoordSetSP.s = IPS_OK;
     
    13931428                                if (reponse.find("NACK") != string::npos)
    13941429                                {
    1395                                     // Une erreur  est retournée par le microcontroleur concernant la commande Park
     1430                                    // Une erreur  est retournée par le micro-contrÃŽleur concernant la commande Park
    13961431                                    // On affiche le voyant Park en rouge dans la boîte indi...
    13971432
     
    14181453                                if (reponse.find("NACK") != string::npos)
    14191454                                {
    1420                                     // Une erreur  est retournée par le microcontroleur concernant la commande Abort
     1455                                    // Une erreur  est retournée par le micro-contrÃŽleur concernant la commande Abort
    14211456                                    // On affiche le voyant Park en rouge dans la boîte indi...
    14221457
     
    14431478                                if (reponse.find("NACK") != string::npos)
    14441479                                {
    1445                                     // Une erreur  est retournée par le microcontroleur concernant la commande Goto
     1480                                    // Une erreur  est retournée par le micro-contrÃŽleur concernant la commande Goto
    14461481                                    // On affiche le voyant Park en rouge dans la boîte indi...
    14471482
     
    14521487                                    IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : Erreur GOTO !\n",  Sockets[i].IP.c_str());
    14531488
    1454                                     // On déconnecte l'antenne. Elle ne semble pas en mesure d'executer les ordres goto
     1489                                    // On déconnecte l'antenne. Elle ne semble pas en mesure d'exécuter les ordres goto
    14551490
    14561491                                    DeconnecterSocket(i);
     
    14601495                                    if (reponse.find("OK") != string::npos)
    14611496                                    {
    1462                                         // On a ici la confirmation que l'antenne 'i' a bien réalisé
    1463                                         // le goto
     1497                                        // On a ici la confirmation que l'antenne 'i' a bien réalisé le goto
    14641498
    14651499                                        // On prend note
     
    14881522                                        }
    14891523
    1490                                         // Si le nombre d'antennes connectées est >0
     1524                                        // Si le nombre d'antennes connectées est > 0
    14911525                                        // et que toutes les antennes connectées ont
    14921526                                        // réalisé le goto alors...
     
    14951529                                        {
    14961530                                            // C'est bon ! Tout marche bien...
    1497                                             // On actualise l'AR et la dec dans la boîte de dialogue
     1531                                            // On actualise l'AD et la Dec dans la boîte de dialogue
    14981532
    14991533                                            lastRA  = targetRA;
     
    15591593            Suivi = false;
    15601594
    1561             // On arrête l'enchaînement des actions
    1562             // pour réaliser un goto
     1595            // On arrête l'enchaînement des actions nécessaires à la réalisation d'un goto
    15631596
    15641597            RealisationGoto = false;
     
    16171650            InitAntennes();
    16181651
    1619             //Pour permettre de refaire un park
     1652            // Pour permettre de refaire un park
    16201653
    16211654            Park = false;
     
    16291662        {
    16301663            // Délais entre deux actualisations
    1631 
    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)
    1635 
    1636 
    1637             // On actualise la position si le delai est dépassé
     1664           
     1665            // Actualisation toutes les 15 minutes en mode transit (par défaut)
     1666
     1667            double delai = ActualisationTMTransit / 3600.0 / 24.0;   
     1668           
     1669            // et 5 secs en mode tracking (par défaut)
     1670
     1671            if (TrackingMode == BAO_TRACKING) delai = ActualisationTMTracking / 3600.0 / 24.0;   
     1672
     1673
     1674            // On actualise la position si le délai est dépassé
    16381675
    16391676            if (GetJJ() - JJAnc > delai)
    16401677            {
    1641                 // Cette variable vaudra true lorsque le goto aura été réalisé
     1678                // Cette variable vaut true lorsque le goto a été réalisé
    16421679
    16431680                UpdatedGoto = false;
     
    17061743                    case 0 :
    17071744                    {
    1708                         // On doit intialiser l'acknowledge à false
     1745                        // On doit initialiser l'acknowledge à false
    17091746
    17101747                        Sockets[i].ack_pos    = false;
     
    17651802
    17661803                            // Les erreurs graves s'accumulent. Pas de réponse aprÚs plusieurs minutes
    1767                             // Il faut déconnecter l'antenne
     1804                            // -> Il faut déconnecter l'antenne
    17681805                            if (Sockets[i].AnomaliesExecution > MAXANOMALIES)
    17691806                            {
     
    17721809                                OnCoordSetSP.s = IPS_ALERT;
    17731810
    1774                                 //Message à l'attentnio de l'utilisateur
     1811                                //Message à l'attention de l'utilisateur
     1812                               
    17751813                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre POSITION. \
    17761814Deconnexion de l antenne.", Sockets[i].IP.c_str());
    17771815
    17781816                                // On déconnecte l'antenne
     1817                               
    17791818                                DeconnecterSocket(i);
    17801819                            }
     
    17921831                            // Tout vas bien
    17931832                            // On ne consigne aucune anomalie
     1833                           
    17941834                            Sockets[i].AttenteExecution = 0;
    17951835                            Sockets[i].AnomaliesExecution = 0;
    17961836
    17971837                            //On passe à l'étape suivante
     1838                           
    17981839                            Sockets[i].etape++;
    17991840                        }
     
    18121853
    18131854                                // On consigne une erreur grave. L'antenne tarde à répondre
     1855                               
    18141856                                Sockets[i].AnomaliesExecution++;
    18151857                            }
     
    18171859                            // Aucune réponse de l'antenne depuis plusieurs minutes
    18181860                            // On la déconnecte
     1861                           
    18191862                            if (Sockets[i].AnomaliesExecution > MAXANOMALIES)
    18201863                            {
     
    18241867
    18251868                                //Message d'erreur
     1869                               
    18261870                                IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : la position retournee n est pas valide. \
    18271871Deconnexion de l antenne.", Sockets[i].IP.c_str());
    18281872
    18291873                                //Déconnexion de l'antenne
     1874                               
    18301875                                DeconnecterSocket(i);
    18311876                            }
     
    18981943                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    18991944                            {
    1900                                 // On prolonge l'attente afin de recevoit un GOTO OK
     1945                                // On prolonge l'attente afin de recevoir un GOTO OK
    19011946
    19021947                                Sockets[i].etape = 5;
     
    19051950                            }
    19061951
    1907                             // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes
     1952                            // On déconnecte l'antenne s'il n'y a pas de confirmation du goto au bout de 2 minutes
    19081953                            if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO)
    19091954                            {
     
    19271972
    19281973        ///////////////////////////////////////
    1929         // Traitement de l'étape 3 de la réalisation d'un goto
     1974        // Réalisation d'un goto - traitement de l'étape 3
    19301975        // 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)
     1976        // pour pouvoir envoyer les gotos à toutes les antennes lorsque l'on a la confirmation
     1977        // qu'elles sont toutes prêtes à exécuter cet ordre (être à l'étape 3 pour un socket)
    19331978        // -> meilleure synchronisation
    19341979
     
    20042049/**************************************************************************************
    20052050** Mode transit ou tracking
     2051**
    20062052***************************************************************************************/
    20072053
     
    20112057    {
    20122058        // Transit
     2059       
    20132060    case BAO_TRANSIT:
    20142061
    2015         //Eteindre les voyants dans la boîte de dialogue Indi
     2062        // Ã‰teindre les voyants dans la boîte de dialogue Indi
    20162063        EquatorialCoordsWNP.s = IPS_BUSY;
    20172064        AbortSlewSP.s = IPS_IDLE;
     
    20262073        InitAntennes();
    20272074
    2028         // On garde la trace du début du Goto pour enchainer les actualisations
     2075        // On garde la trace du début du Goto pour enchaîner les actualisations
    20292076
    20302077        JJAnc = GetJJ();
     
    20362083        // Mode transit activé
    20372084
    2038         TrackingMode = 1;
     2085        TrackingMode = BAO_TRANSIT;
    20392086
    20402087        // On suit un objet
     
    20532100
    20542101        // Tracking
     2102       
    20552103    case BAO_TRACKING:
    20562104
    2057         //Eteindre les voyants dans la boîte de dialogue Indi
     2105        // Éteindre les voyants dans la boîte de dialogue Indi
     2106       
    20582107        EquatorialCoordsWNP.s = IPS_BUSY;
    20592108        AbortSlewSP.s = IPS_IDLE;
     
    20702119        ADDEC2Motor(targetRA, targetDEC);
    20712120
    2072         TrackingMode = 2;
     2121        TrackingMode = BAO_TRACKING;
    20732122
    20742123        Suivi = true;
     
    20882137/**************************************************************************************
    20892138** Connexion / Déconnexion avec le télescope
     2139**
    20902140***************************************************************************************/
    20912141
     
    22702320
    22712321    // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas codeur alors
    2272     // on fait le trajet dans le sens inverse pour aller plus vite
     2322    // on fait le trajet en sens inverse pour aller plus vite
    22732323
    22742324    // problÚme 2 : Passage au méridien
     
    22782328
    22792329    // ne pas faire des tours complets en Az pour rien...
     2330   
    22802331    while (deltaAz > NBREPASCODEURSAZ) deltaAz -= NBREPASCODEURSAZ;
    22812332
    22822333    // Doit résoudre tous les problÚmes concernant l'azimut...
     2334   
    22832335    if (deltaAz > NBREPASCODEURSAZ / 2 )
    22842336    {
     
    23132365{
    23142366    //Il ne faut exécuter la fonction qu'une seule fois
     2367   
    23152368    static int isInit = 0;
    23162369
  • BAORadio/libindi/libindi/drivers/telescope/BAO.h

    r642 r648  
    5757
    5858    int sendalertes;                        // une requête 'send' a généré une erreur sur le réseau
    59     int AttenteExecution;                   // L'antenne parvient-elle à executer un cycle de commandes ?
     59    int AttenteExecution;                   // L'antenne parvient-elle à exécuter un cycle de commandes ?
    6060    int AnomaliesExecution;                 // Erreur critique. L'antenne ne répond plus !
    61     int etape;                              // étape dans le cycle de commandes/réponses entre PC et microcontroleurs
     61    int etape;                              // étape dans le cycle de commandes/réponses entre PC et micro-contrÃŽleurs
    6262
    6363    bool Connected;                         // le micro-contrÃŽleur est-il connecté ?
    6464    bool PosValides;                        // le micro-contrÃŽleur a-t-il donné une position des moteurs valide ?
    6565    bool ack_status;                        // Etat des acknowledges ?
    66     bool ack_pos;                           // le PC a-t-il reçu une confirmation du microcontroleurs aprÚs un ordre POSITION ?
    67     bool ack_park;                          // le PC a-t-il reçu une confirmation du microcontroleurs aprÚs un ordre PARK ?
    68     bool ack_abort;                         // le PC a-t-il reçu une confirmation du microcontroleurs aprÚs un ordre ABORT ?
    69     bool ack_goto;                          // le PC a-t-il reçu une confirmation du microcontroleurs aprÚs un ordre GOTO ?
     66    bool ack_pos;                           // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre POSITION ?
     67    bool ack_park;                          // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre PARK ?
     68    bool ack_abort;                         // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre ABORT ?
     69    bool ack_goto;                          // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre GOTO ?
    7070    bool GotoOk;                            // Est-ce que le dernier goto est OK ?
    7171
    7272    Position TargetPosition;                // Position à atteindre
    73     Position Pos;                           // derniÚre position retournée par le microcontrÃŽleur
     73    Position Pos;                           // derniÚre position retournée par le micro-contrÃŽleur
    7474   
    7575    Alignement *AlignementAntenne;          // Contient les paramÚtres d'alignement de l'antenne 
     
    7979// Le PC et les antennes communiquent par le biais du port 8000 sur le réseau Ethernet
    8080
    81 ServerSocket server( 8000 );         
     81ServerSocket server( BAO_PORT );         
    8282
    8383class BAO : public Astro
     
    206206    double lastDEC;                      // ...et la déclinaison
    207207    double JJAnc;                        // Sauvegarde du jour julien lors de la derniÚre actualisation de la position (fct Goto)
    208     double ActualisationTMTransit;       // Délai entre deux actualisations dans les modes transit
    209     double ActualisationTMTracking;      //  "                 "                     "     tracking
     208    double ActualisationTMTransit;       // Délai entre deux actualisations dans les modes transit (en sec)
     209    double ActualisationTMTracking;      //  "                 "                     "     tracking (en sec)
    210210    double Longitude;                    // Longitude et latitude du lieu d'observation
    211211    double Latitude;
     
    221221
    222222    int    currentSet;                   // mode de suivi actuel - tracking ou transit
    223     int    lastSet;                      // Variable interne de l'interface indi - ne pas toucher
    224     int    TrackingMode;                 // 1 : Transit           2: Tracking
     223    int    MethodeAlignement;            // Méthode d'alignement
     224    BAO_STATUS  TrackingMode;            // Mode de suivi actuellement activé
    225225};
    226226
  • BAORadio/libindi/libindi/result_recherche_bao

    r643 r648  
    1 
    2 
    3 Results from query to  NASA/IPAC Extragalactic Database (NED),
    4 which is operated by the Jet Propulsion Laboratory, California Institute of
    5 Technology, under contract with the National Aeronautics and Space Administration.
    6 This work was (partially) supported by the US National Virtual Observatory
    7 development project, which is funded by the National Science Foundation
    8 under cooperative agreement AST0122449 with The Johns Hopkins University.
    9 
    10 
    11 
    12 queryDateTime:2012-02-24T03:26:46PST
    13 
    14 
    15 
    16 Main Information Table for MESSIER 092
    17 
    18 
    19 
    20 Equinox:J2000.0
    21 
    22 
    23 
    24 CoordSystem:Equatorial
    25 
    26 No.|Object Name|RA(deg)|DEC(deg)|Type|Velocity|Redshift|Redshift Flag|Magnitude and Filter|Distance (arcmin)|References|Notes|Photometry Points|Positions|Redshift Points|Diameter Points|Associations
    27 1|MESSIER 092|259.28029 |  43.13652 |*Cl||||     ||27|1|0|0|0|2|2
Note: See TracChangeset for help on using the changeset viewer.