Changeset 619 for BAORadio


Ignore:
Timestamp:
Dec 4, 2011, 7:51:30 PM (13 years ago)
Author:
frichard
Message:
 
Location:
BAORadio/libindi/libindi
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • BAORadio/libindi/libindi/BAOControl/Makefile

    r504 r619  
    22#
    33
    4 CC = g++
    5 #CFLAGS = -g
    6 #CXXFLAGS = -g
     4CC = g++
     5#debug
     6CFLAGS = -g
     7CXXFLAGS = -g
    78
    8 BAOcontrol_objects =  main.o baocontrol.o ClientSocket.o Socket.o filetools.o exception.o ../drivers/telescope/astro.o
     9BAOcontrol_objects =  main.o baocontrol.o ClientSocket.o Socket.o filetools.o exception.o
    910
    1011
     
    1314
    1415BAOcontrol: $(BAOcontrol_objects)
    15         g++  -o BAOcontrol $(BAOcontrol_objects) -lpthread -lX11
     16        g++ $(CXXFLAGS) -c -o ../BAOControl/astro.o ../drivers/telescope/astro.cpp
     17        g++ $(CXXFLAGS) -o BAOcontrol $(BAOcontrol_objects) astro.o -lpthread -lX11
    1618
    1719Socket:  Socket.cpp
    1820ClientSocket: ClientSocket.cpp
    19 Astro: ../drivers/telescope/astro.cpp
    2021baocontrol: baocontrol.cpp
     22filetools: filetools.cpp
     23exception: exception.c
    2124main: main.cpp
    2225
  • BAORadio/libindi/libindi/BAOControl/baocontrol.cpp

    r504 r619  
    44/* Franck RICHARD             */
    55/* franckrichard033@gmail.com */
    6 /* Juin 2011                  */
     6/* Décembre 2011              */
    77/******************************/
    88
    99
    1010#include "baocontrol.h"
     11#include <termios.h>
     12#include <unistd.h>
    1113
    1214
     
    3133 * Laboratoire de l'Accélérateur Linéaire *\n \
    3234 *                                        *\n \
    33  *             v0.2  20/06/2011           *\n \
     35 *             v0.4  02/12/2011           *\n \
    3436 *        franckrichard033@gmail.com      *\n \
    3537 ******************************************\n\n\n", true);
     
    4143    delaitracking = 0;
    4244    lognum        = 0;
    43     numAntenne    = 0;
     45    numAntennes   = 0;
    4446    numobjets     = 0;
    4547    runnum        = 1;
     
    7274        Antennes[i].ok=0;
    7375        Antennes[i].ip=0;
     76        Antennes[i].delta_az=0;
     77        Antennes[i].delta_ha=0;
    7478    }
    7579
     
    123127{
    124128    // destruction des tableaux
    125 
     129   
    126130    delete [] Antennes;
    127131    delete [] objets;
    128132
    129     // destruction de la fenêtre graphique, des caractÚres
     133    // destruction de la fenêtre graphique,des caractÚres
    130134
    131135    if (d!=NULL)
     
    417421        {
    418422            // On ne garde que la partie intéressante
    419             // La partie suivant "message="...
     423            // La partie "message="...
    420424            reponse = reponse.substr(reponse.find("message") + 9);
    421425
     
    426430
    427431            // On récupÚre l'adresse ip de l'antenne qui nous parle
    428             // et on met à jour le tabmeau des états des antennes
     432            // et on met à jour le tableau des états des antennes
    429433
    430434            if (reponse.find(". (Antennes connectees")!=string::npos)
    431435            {
    432                 decomp=reponse.substr(0, reponse.find(". (Antennes connectees"));
    433                 decomp=decomp.substr(decomp.rfind(".")+1);
     436                decomp = reponse.substr(0, reponse.find(". (Antennes connectees"));
     437                decomp = decomp.substr(decomp.rfind(".")+1);
    434438
    435439                // si cette antenne est déjà connectée, on change son état
    436 
    437                 for (int i=0; i<numAntenne; i++)
     440               
     441                if (atoi(decomp.c_str())!=0) for (int i=0; i<numAntennes; i++)
    438442                {
    439443                    if (atoi(decomp.c_str()) == Antennes[i].ip)
     
    449453                if (!test)
    450454                {
    451                     Antennes[numAntenne].ip = atoi(decomp.c_str());
    452                     Antennes[numAntenne++].ok = 1;
     455                    Antennes[numAntennes].ip = atoi(decomp.c_str());
     456                    Antennes[numAntennes++].ok = 1;
    453457                }
    454458            }
     
    462466                decomp = decomp.substr(decomp.rfind(".") + 1);
    463467
    464                 for (int i=0; i<numAntenne; i++)
     468                for (int i=0; i<numAntennes; i++)
    465469                {
    466470                    if (atoi(decomp.c_str()) == Antennes[i].ip)
     
    498502
    499503
     504
    500505/**************************************************************************************
    501506** Est-ce que la réponse du pilote indi_BAO est conforme à ce que l'on attendait ?
     
    596601    DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec);
    597602
    598 
    599     // On lance le calcul
     603    // On lance les calculs
    600604
    601605    CalculTSL();
     
    627631
    628632        // Faut-il executer un fichier de mouvements ?
    629         // il faut qu'il y ait plus d'un mouvement
    630         // et exxecuter les commande dans ce test jusqu'au dernier mouvement
    631633
    632634        if (run && numobjets>1 && runnum<numobjets)
     
    637639            if (JJ >= objets[runnum].JJ && !objets[runnum].exec)
    638640            {
    639                 // petits messages pour l'utilisateur
    640 
    641                 if (runnum==1) Affiche("Début de l'exécution du fichier de mouvements\n\n", true);
     641                // petit message pour l'utilisateur
     642
     643                if ( runnum == 1 ) Affiche("Début de l'exécution du fichier de mouvements\n\n", true);
    642644
    643645                os << "Suivi de l'objet n°" << runnum << endl;
     
    677679                    // on réinitiale toutes les variables impliquées dans la commande run
    678680
    679                     run=false;
    680                     runnum=1;
    681                     numobjets=1;
     681                    run         = false;
     682                    runnum      = 1;
     683                    numobjets   = 1;
    682684
    683685                    // On sort du programme dans le cas BAOControl -r fileName
     
    718720    return 0;
    719721}
    720 
    721722
    722723
     
    752753        while (chaine[0] == ' ') chaine = chaine.substr(1);
    753754
    754         // si on veut prendre les deux arguments d'un commande
     755        // si on veut prendre les deux arguments d'une commande
    755756
    756757        if (chaine2 != NULL)
     
    775776        {
    776777            // on prend tout d'un bloc aprÚs la commande -> chaine 1
    777             // utile pour une commande ty type goto m 42 qui doit retourner "m 42" dans une
     778            // utile pour une commande du type "goto m 42" qui doit retourner "m 42" dans une
    778779            // même chaine
    779780
     
    794795{
    795796    // la communication avec le pilote indi_BAO
    796     // se fait par l'envoie de petit fichier xml
     797    // se fait par l'envoie de fichiers xml
    797798    // d'où le cÃŽté complexe des commandes
    798799
     
    936937    // à l'époque de l'observation
    937938
    938     if (J2000)
     939    if ( J2000 )
    939940    {
    940941        Precession(&arf, &decf);
     
    10711072    {
    10721073        Affiche("BAOcontrol s'est bien déconnecté du pilote indi_BAO.\n\n", true);
     1074    }
     1075
     1076    return true;
     1077}
     1078
     1079
     1080/**************************************************************************************
     1081** Gestion du clavier en mode raw pour la procédure d'alignement
     1082***************************************************************************************/
     1083
     1084void mode_raw(int activer)
     1085{
     1086    static struct termios cooked;
     1087    static int raw_actif = 0;
     1088   
     1089    if (raw_actif == activer)
     1090        return;
     1091   
     1092    if (activer)
     1093    {
     1094        struct termios raw;
     1095       
     1096        tcgetattr(STDIN_FILENO, &cooked);
     1097       
     1098        raw = cooked;
     1099        cfmakeraw(&raw);
     1100        tcsetattr(STDIN_FILENO, TCSANOW, &raw);
     1101    }
     1102    else
     1103        tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
     1104   
     1105    raw_actif = activer;
     1106}
     1107
     1108
     1109/**************************************************************************************
     1110** Alignement de l'antenne située à l'adresse ip
     1111***************************************************************************************/
     1112
     1113bool BAOcontrol::Alignement(string ip)
     1114{
     1115   bool test=false;
     1116   
     1117   int i;
     1118   
     1119   if (ip.rfind(".") != string::npos) ip=ip.substr(ip.rfind(".")+1);
     1120   
     1121   for (i=0; i<numAntennes; i++)
     1122   {
     1123      if (atoi(ip.c_str()) == Antennes[i].ip) { test=true; break; }
     1124   }
     1125 
     1126   if ((test) && (atoi(ip.c_str())!=0))
     1127   {
     1128         Affiche("Début de l'alignement de l'antenne.\n \
     1129         Appuyez sur les touches Z,Q,D,X pour centrer l'objet dans le viseur.\n \
     1130         (ESC pour arrêter et valider).\n\n", true);
     1131         
     1132         int c = 0;
     1133         
     1134         while (c!=27)
     1135         {
     1136           mode_raw(1);
     1137           
     1138           c = getchar();
     1139           
     1140           mode_raw(0);
     1141           
     1142           switch(c)
     1143           {
     1144             case 122 : Antennes[i].delta_ha++; Affiche("delta_ha + 1\n", true); break;
     1145             case 100 : Antennes[i].delta_az++; Affiche("delta_az + 1\n", true); break;
     1146             case 113 : Antennes[i].delta_az--; Affiche("delta_az - 1\n", true); break;
     1147             case 120 : Antennes[i].delta_ha--; Affiche("delta_ha - 1\n", true); break;
     1148           } 
     1149           
     1150           // Enregistrement des paramÚtres d'alignement des antennes
     1151   
     1152           EnregistrementParametresAlignement("/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg");
     1153         }         
     1154   } 
     1155   else
     1156   {
     1157         Erreur("L'antenne située à l'adresse ip indiquée n'existe pas\n\n");
     1158         
     1159         return false;
     1160   }
     1161   
     1162   return true;
     1163}
     1164
     1165
     1166/**************************************************************************************
     1167** Sauvegarde des paramÚtres d'alignement des antennes
     1168***************************************************************************************/
     1169
     1170bool BAOcontrol::EnregistrementParametresAlignement(string fileName)
     1171{
     1172    string section;
     1173    string key;
     1174    string value;
     1175    char ip[100];
     1176
     1177    stringstream os;
     1178
     1179    //Affiche("Enregistrement de l'alignement des antennes dans le fichier " + fileName + "\n", true);
     1180
     1181    //Enregistrement des corrections des l'antennes
     1182
     1183    for (int i=0; i< numAntennes; i++)
     1184    {
     1185        sprintf(ip, "%i", Antennes[i].ip);
     1186        os << "Alignement antenne ip x.x.x." << (string)ip;
     1187        section = os.str();
     1188        os.str("");
     1189        key     = "delta_az";
     1190        os << Antennes[i].delta_az;
     1191        value = os.str();
     1192        os.str("");
     1193
     1194        writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str());
     1195
     1196        key     = "delta_ha";
     1197        os << Antennes[i].delta_ha;
     1198        value = os.str();
     1199        os.str("");
     1200
     1201        writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str());
    10731202    }
    10741203
     
    16031732        }
    16041733    }
     1734   
     1735    // correction de l'alignement d'une antenne par rapport à l'objet visé
     1736
     1737    if (chaine.find("align")!=string::npos)
     1738    {
     1739        string antenne;
     1740
     1741        CommandeOK = true;
     1742
     1743        if (DecompositionCommande(chaine, "align", &antenne, NULL))
     1744        {
     1745            Alignement(antenne);
     1746        }
     1747        else
     1748        {
     1749            Erreur("Erreur align : la commande align doit être suivie par l'ip de l'antenne qui faut aligner.\n\n");
     1750        }
     1751    }
    16051752
    16061753    // Aide du programme
     
    16281775        cout << "                    Goto sun permet de suivre le soleil." << endl;
    16291776        cout << "search nom_objet :  interroge le serveur NED sur internet et retourne les coordonnées de l'objet." << endl;
     1777        cout << "align ip :          lance la procédure d'alignement de l'antenne d'adresse ip." << endl;
    16301778        cout << "transit :           active le mode de suivi transit." << endl;
    16311779        cout << "tracking :          active le mode de suivi tracking." << endl;
     
    18181966
    18191967/**************************************************************************************
    1820 ** Lecteur d'un fichier ligne aprÚs ligne
     1968** Lecture d'un fichier ligne aprÚs ligne
    18211969** retourne -1 à la fin
    18221970***************************************************************************************/
     
    21352283
    21362284            // on décode et exécute les commandes
    2137             DecodageEntreesUtilisateur(chaine);
     2285            DecodageEntreesUtilisateur(chaine);   
     2286           
    21382287        }
    21392288        while (NoExit);
  • BAORadio/libindi/libindi/BAOControl/baocontrol.h

    r504 r619  
    2323#include <sys/time.h>
    2424
    25 
    2625// couleurs utilisées dans le terminal
    2726
     
    3837
    3938
    40 // limites des tableaux
     39// dimensions des tableaux
    4140
    4241#define MAXLOG 1000
     
    4544
    4645
    47 //dimensions de la fenêtre graphique
     46// dimensions de la fenêtre graphique
    4847
    4948#define haut_fenetre 10+22*10
     
    5857
    5958    char ok;                            // actuellement disponible ?
     59   
     60    long delta_az;
     61   
     62    long delta_ha;
    6063};
    6164
     
    6467struct DefObjets
    6568{
    66     double JJ;                          // Jour julien où le télescope doit aller pointer vers l'objet
     69    double JJ;                          // Date julienne où le télescope doit aller pointer l'objet
    6770    double Duree;                       // Durée de l'observation de l'objet en sec
    6871    string ad;                          // Ascension droite J2000 de l'objet
     
    103106    bool Connect(bool connect);
    104107    bool LectureFichierMouvements(string fileName);
     108    bool EnregistrementParametresAlignement(string fileName);
    105109    void DecodageEntreesUtilisateur(string chaine);
    106110    bool Run(string fichier);
     
    108112    Coordonnees ServeurNED(string objet);
    109113    int  readline (FILE * pfile, char *tab);
     114    bool Alignement(string ip);
    110115
    111116
     
    122127    int delaitracking;                          // Délai entre deux actualisations de la position en mode tracking
    123128    int lognum;                                 // Nbre d'enregistrements dans le tableau logs
    124     int numAntenne;                             // Nbre d'antennes connectées
     129    int numAntennes;                            // Nbre d'antennes connectées
    125130    int numobjets;                              // Nbre d'objets dans le dernier fichier de mouvements chargé
    126131    int runnum;                                 // Numéro de l'objet actuellement visé dans le fichier de mouvement
    127132
    128133    double Pression;                            // Pression atmosphérique en mBar
    129     double Temperature;                         // température de l'atmosphÚre
     134    double Temperature;                         // température de l'atmosphÚre en °C
    130135
    131136    bool NoExit;                                // A-t-on tapé exit pour sortir ? Permet de fermer le thread à ce moment-là
  • BAORadio/libindi/libindi/BAOControl/filetools.cpp

    r504 r619  
    8484            delete prev;
    8585
    86 
    8786        } while (pKey!=keyprev);
    8887 
    89         if (pSection->name) delete []pSection->name;
     88        if (pSection->name) delete [] pSection->name;
    9089
    9190        secprev=pSection;
     
    222221 ******************************************************/
    223222
    224 /*
     223
    225224
    226225char * writeINI (char *sectionName, char *keyName, char *keyValue, char *fileName)
     
    229228  char *pKeyName = NULL;
    230229  char *pKeyValue = NULL;
    231   INI *pIni = NULL;
     230  INI  *pIni = NULL;
    232231  SECTION *pSection = NULL;
    233232  KEY *pKey = NULL;
    234233  TRY
    235234  {
    236     pKeyName = (char *) m_malloc (sizeof (char) * strlen (keyName) + 1);
    237     pSectionName =
    238       (char *) m_malloc (sizeof (char) * strlen (sectionName) + 3);
     235    pKeyName = new char [sizeof (char) * strlen (keyName) + 1];
     236    pSectionName = new char [sizeof (char) * strlen (sectionName) + 3];
    239237    if (keyValue != NULL)
    240238      {
    241         pKeyValue = (char *) m_malloc (sizeof (char) * strlen (keyValue) + 1);
     239        pKeyValue = new char [sizeof (char) * strlen (keyValue) + 1];
    242240        strcpy (pKeyValue, keyValue);
    243241        pKeyValue[strlen (keyValue)] = '\0';
     
    245243    else
    246244      {
    247         pKeyValue = (char *) m_malloc (sizeof (char));
     245        pKeyValue = new char [sizeof (char)];
    248246        pKeyValue[0] = '\0';
    249247      }
     
    255253    //chargement
    256254    pIni = _loadINI (fileName);
    257 
    258255  }
    259256  CATCH (ERR_FOPEN)
     
    277274      if (pKey != NULL)
    278275        {
    279           pKey->value =
    280             (char *) realloc (pKey->value,
    281                               sizeof (char) * strlen (pKeyName) + 1);
     276          if (pKey->value != NULL) { delete [] pKey->value; pKey->value = NULL; pKey->value = new char [sizeof (char) * strlen (pKeyValue) + 1]; }
     277         
    282278          if (pKey->value == NULL)
    283279            {
     
    296292  else
    297293    {
    298       //section pas trouve, on la cree avec sa cle
     294       //section pas trouve, on la cree avec sa cle
    299295      pSection = _newSECTION (pSectionName);
    300296      _addSECTION (pIni, pSection);
     
    305301  TRY
    306302  {
    307 
    308303    //sauvegarde
    309304    _saveINI (pIni);
     
    312307  CATCH (ERR_FOPEN)
    313308  {
    314     printf ("erruer sur le fichier %s", pIni->fileName);
     309    printf ("erreur sur le fichier %s", pIni->fileName);
    315310  }
    316311  ENDTRY;
    317312
    318313  //nettoyage
    319 
    320   free (pIni);
    321   free (pSection);
    322   free (pKey);
    323   free (pKeyName);
    324   free (pSectionName);
     314  if (pKey->value != NULL) delete [] pKey->value;
     315  if (pKey != NULL) delete [] pKey;
     316  if (pKeyName != NULL) delete [] pKeyName;
     317  if (pSectionName != NULL) delete [] pSectionName;
     318  if (pIni != NULL) delete [] pIni;
     319  if (pSection != NULL) delete [] pSection;
    325320  pIni = NULL;
    326321  pKeyName = NULL;
     
    328323  return pKeyValue;
    329324}
    330 */
     325
    331326
    332327/******************************************************
     
    756751******************************************************/
    757752
    758 /*
    759  * int
     753
     754 int
    760755_saveINI (INI * pIni)
    761756{
     
    787782              TRY
    788783              {
    789                 str = (char *) m_malloc (sizeof (char) * offset);
     784                str = new char [sizeof (char) * offset];
    790785              }
    791786              CATCH (ERR_MALLOC)
     
    805800              pKey_pred = pKey;
    806801              pKey = pKey->next;
    807               free (str);
     802              delete [] str;
    808803            }
    809804          while (pKey != pKey_pred);
     
    816811  //nettoyage
    817812  fclose (pFile);
    818 }*/
     813}
    819814
    820815/******************************************************
     
    859854    /* on lit ligne par ligne */
    860855    nbRead = readline (pFile, pBuf);
    861     if (nbRead==-1) { fclose(pFile); delete  [] pIni->fileName; delete pIni; delete [] pBuf; return 0;}
     856  //  if (nbRead==-1) { fclose(pFile); delete  [] pIni->fileName; delete pIni; delete [] pBuf; return 0;}
    862857    while (nbRead != -1)
    863858    {
  • BAORadio/libindi/libindi/BAOControl/result

    r504 r619  
    1010
    1111
    12 queryDateTime:2011-06-26T14:47:53PDT
     12queryDateTime:2011-12-04T07:23:36PST
    1313
    1414
    1515
    16 Main Information Table for MESSIER 082
     16Main Information Table for MESSIER 031
    1717
    1818
     
    2525
    2626No.|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 082|148.96969 |  69.67938 |G|   203| 0.000677 |    | 9.30||1671|32|239|9|14|9|0
     271|MESSIER 031| 10.68479 |  41.26906 |G|  -300|-0.001001 |    | 4.36||3357|17|132|8|26|7|0
  • BAORadio/libindi/libindi/CMakeLists.txt

    r504 r619  
    314314${CMAKE_SOURCE_DIR}/drivers/telescope/ServerSocket.cpp
    315315${CMAKE_SOURCE_DIR}/drivers/telescope/astro.cpp
    316    ${CMAKE_SOURCE_DIR}/drivers/telescope/BAO.cpp )
     316${CMAKE_SOURCE_DIR}/drivers/telescope/BAO.cpp
     317${CMAKE_SOURCE_DIR}/drivers/telescope/exception.c
     318${CMAKE_SOURCE_DIR}/drivers/telescope/filetools.cpp
     319 )
    317320   
    318321add_executable(indi_BAO ${BAO_SRCS} ${liblilxml_SRCS} ${libindicom_SRCS})
  • BAORadio/libindi/libindi/drivers/telescope/BAO.cpp

    r504 r619  
    55## Franck RICHARD
    66## franckrichard033@gmail.com
    7 ## Juin 2011
     7## Décembre 2011
    88##
    99#############################
     
    1515auto_ptr<BAO> telescope(0);
    1616
    17 const int POLLMS = 1;                                   // Period of update, 1 ms.
     17const int  POLLMS = 1;                                  // Period of update, 1 ms.
    1818
    1919const char *mydev = "BAO";                              // Name of our device.
     
    6666    Abort           = false;
    6767    Park            = false;
    68     Suivi            = false;
     68    Suivi           = false;
    6969    Exit            = false;
    7070
    7171
    7272    // initialisation des sockets (Antennes)
     73   
    7374    for (int i=0; i<MAXHOSTNAME; i++)
    7475    {
    75         Sockets[i].Connected=false;
    76         Sockets[i].IP="";
     76        Sockets[i].Connected = false;
     77        Sockets[i].IP = "";
     78               
     79        Sockets[i].Delta.x = 0.0;
     80        Sockets[i].Delta.y = 0.0;
    7781    }
    7882
    7983    // initialisations supplémentaires
     84   
    8085    InitAntennes();
    8186
    8287    // Numéro de version
     88   
    8389    IDLog("Initilizing from BAO device...\n");
    84     IDLog("Driver Version: 2011-06-27\n");
     90    IDLog("Driver Version: 2011-12-02\n");
    8591
    8692    //connect_telescope();
     
    9197** Destructeur
    9298** Lorsque l'on lance indi_BAO depuis indiserver dans un terminal
    93 ** Le destructeur ne semble jamais être atteint lorsque l'on sort...
     99** Le destructeur ne semble jamais être atteint lorsque l'on sort... A vérifier
    94100***************************************************************************************/
    95101BAO::~BAO()
    96102{
    97     Exit=true;
     103    Exit = true;
    98104    sleep(1);
    99105    pthread_join (th1, NULL);
    100106}
    101107
     108
     109/************************************************************************************
     110* Initialisation des paramÚtres des antennes
     111*
     112************************************************************************************/
     113void BAO::InitAntennes()
     114{
     115    for (int i=0; i<MAXHOSTNAME; i++)
     116    {
     117        Sockets[i].status             = 0;
     118        Sockets[i].sendalertes        = 0;
     119        Sockets[i].AttenteExecution   = 0;
     120        Sockets[i].AnomaliesExecution = 0;
     121        Sockets[i].etape              = 0;
     122
     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}
    102133
    103134
     
    171202    IDDefNumber(&ActualisationNP1, NULL);
    172203    IDDefNumber(&ActualisationNP2, NULL);
    173 
    174 }
    175 
    176 
    177 
    178 /**************************************************************************************
    179 ** En cas de changement de texte dans la boîte de dialogue. Exemple : changement du
    180 ** nom de l'objet. Cette fonction n'est pas encore utilisée
     204}
     205
     206
     207/**************************************************************************************
     208** Initialisation des vecteurs INDI
     209***************************************************************************************/
     210
     211void BAO::reset_all_properties()
     212{
     213    ConnectSP.s                 = IPS_IDLE;
     214    OnCoordSetSP.s              = IPS_IDLE;
     215    AbortSlewSP.s               = IPS_IDLE;
     216    ParkSP.s                    = IPS_IDLE;
     217    ObjectTP.s                  = IPS_IDLE;
     218    EquatorialCoordsWNP.s       = IPS_IDLE;
     219    GeographicCoordsWNP.s       = IPS_IDLE;
     220    ActualisationNP1.s          = IPS_IDLE;
     221    ActualisationNP2.s          = IPS_IDLE;
     222
     223    IUResetSwitch(&OnCoordSetSP);
     224    IUResetSwitch(&AbortSlewSP);
     225    IUResetSwitch(&ParkSP);
     226
     227    OnCoordSetS[0].s = ISS_ON;
     228    ConnectS[0].s = ISS_OFF;
     229    ConnectS[1].s = ISS_ON;
     230
     231    IDSetSwitch(&ConnectSP, NULL);
     232    IDSetSwitch(&OnCoordSetSP, NULL);
     233    IDSetSwitch(&AbortSlewSP, NULL);
     234    IDSetSwitch(&ParkSP, NULL);
     235    IDSetText(&ObjectTP, NULL);
     236    IDSetNumber(&EquatorialCoordsWNP, NULL);
     237    IDSetNumber(&GeographicCoordsWNP, NULL);
     238    IDSetNumber(&ActualisationNP1, NULL);
     239    IDSetNumber(&ActualisationNP2, NULL);
     240}
     241
     242
     243/**************************************************************************************
     244** 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...
     246** Cette fonction n'est pas encore utilisée
    181247***************************************************************************************/
    182248
     
    211277/**************************************************************************************
    212278** En cas de changement d'une valeur numérique dans la boîte de dialogue Indi
    213 ** Exemple : longitude, latitude, ar, dec etc...
     279** Exemple : longitude, latitude, ar, dec etc...) -> prendre en compte les modifications
    214280**
    215281***************************************************************************************/
     
    260326
    261327        // Si la longitude et la latitude sont correctes
     328        // on envoie les coordonnées à la classe Astro
    262329        if (nset == 2)
    263330        {
     
    457524        {
    458525            AbortSlewSP.s = IPS_OK;
    459             EquatorialCoordsWNP.s       = IPS_IDLE;
     526            EquatorialCoordsWNP.s = IPS_IDLE;
    460527            ObjectTP.s = IPS_IDLE;
    461528
     
    481548        {
    482549            AbortSlewSP.s = IPS_OK;
    483             EquatorialCoordsWNP.s       = IPS_IDLE;
     550            EquatorialCoordsWNP.s = IPS_IDLE;
    484551            ObjectTP.s = IPS_IDLE;
    485552
     
    494561
    495562
    496 /**************************************************************************************
    497 ** Initialisation des vecteurs INDI
    498 ***************************************************************************************/
    499 
    500 void BAO::reset_all_properties()
    501 {
    502     char chaine[10];
    503 
    504     ConnectSP.s                 = IPS_IDLE;
    505     OnCoordSetSP.s              = IPS_IDLE;
    506     AbortSlewSP.s               = IPS_IDLE;
    507     ParkSP.s                    = IPS_IDLE;
    508     ObjectTP.s                  = IPS_IDLE;
    509     EquatorialCoordsWNP.s       = IPS_IDLE;
    510     GeographicCoordsWNP.s       = IPS_IDLE;
    511     ActualisationNP1.s          = IPS_IDLE;
    512     ActualisationNP2.s          = IPS_IDLE;
    513 
    514     IUResetSwitch(&OnCoordSetSP);
    515     IUResetSwitch(&AbortSlewSP);
    516     IUResetSwitch(&ParkSP);
    517 
    518     OnCoordSetS[0].s = ISS_ON;
    519     ConnectS[0].s = ISS_OFF;
    520     ConnectS[1].s = ISS_ON;
    521 
    522     IDSetSwitch(&ConnectSP, NULL);
    523     IDSetSwitch(&OnCoordSetSP, NULL);
    524     IDSetSwitch(&AbortSlewSP, NULL);
    525     IDSetSwitch(&ParkSP, NULL);
    526     IDSetText(&ObjectTP, NULL);
    527     IDSetNumber(&EquatorialCoordsWNP, NULL);
    528     IDSetNumber(&GeographicCoordsWNP, NULL);
    529     IDSetNumber(&ActualisationNP1, NULL);
    530     IDSetNumber(&ActualisationNP2, NULL);
    531 }
    532 
    533 
    534 
    535 
    536563
    537564/**************************************************************************************
    538565** Gestion du thread
    539 ** permet de suivre la connexion/déconnexion des antennes
     566** permet de suivre la connexion/déconnexion des antennes toutes les secondes
    540567**
    541 ** l'utilisation d'un thread permet d'éviter de bloquer l'exécution du pilote
    542 ** avec la fonction accept qui est bloquante
     568** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept
     569** qui est bloquante.
    543570***************************************************************************************/
    544571
     
    556583
    557584            InitThreadOK = true;
    558 
    559             usleep(100);
    560585        }
    561586        catch ( SocketException& e )
     
    565590            IDLog("\n");*/
    566591        }
     592       
     593        sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier
    567594    }
    568595    while (!Exit);
     
    570597    pthread_exit (0);
    571598}
    572 
    573599
    574600
     
    583609    appli->pThreadSocket();
    584610
    585 
    586611    return 0;
    587612}
     
    589614
    590615/**************************************************************************************
    591 ** Extraction de la position de l'antenne aprÚs l'envoie de la commande P
     616** Extraction de la position de l'antenne aprÚs l'envoi de la commande P
    592617** Le retour de la commande P est POSITION/valeur_az/valeur_alt/
    593618** ExtractPosition retourne donc Valeur_az et Valeur_alt
     
    616641    }
    617642
    618     IDLog((str +" fail\n").c_str());
     643    IDLog((str +" failed !\n").c_str());
    619644
    620645    return false;
     
    636661
    637662
    638     // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu)
     663    // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation)
    639664
    640665    Azimut( newRA * 15.0 * Pidiv180, newDEC * Pidiv180, &targetAz, &targetAlt);
    641666   
    642     // Refraction atmosphérique
     667    // Correction de la réfraction atmosphérique
    643668   
    644669    targetAlt = RefractionAtmospherique(targetAlt);
    645670
    646     // Petit calcul pour faire en sorte que le sud soit à ° d'azimut
     671    // Petit calcul pour faire en sorte que le sud soit à 0° d'azimut
    647672
    648673    targetAz = VerifAngle( targetAz + Pi );
    649674
    650     // En degrés
     675    // On convertit les angles précédents en degrés
    651676
    652677    targetAlt *= N180divPi;
    653     targetAz *=  N180divPi;
    654 
     678    targetAz  *= N180divPi;
    655679
    656680    // Affichage dans les logs
     
    659683    fs_sexa(AltStr, targetAlt, 2, 3600);
    660684
    661     IDLog("Horizontal coords : az = %s     Alt = %s\n", AzStr, AltStr);
     685    IDLog("Horizontal coords : Az = %s     Alt = %s\n", AzStr, AltStr);
    662686
    663687
    664688    //Conversion des deux angles en pas codeurs
    665689
    666     if (targetAlt < 30.0 )
     690    if ( targetAlt < 30.0 )
    667691    {
    668692        // L'objet est trop bas (<30°). On annule le suivi...
     
    678702    else
    679703    {
    680         // Si la hauteur est supérieure à 90°, on doit faire une rotation de l'azimut de 180° et corriger
    681         // la hauteur en appliquant hauteur= 180° - hauteur
     704        // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger
     705        // la hauteur en appliquant hauteur=180°-hauteur
    682706
    683707        if (targetAlt > 90.0)
     
    690714
    691715        double I0 = 81.0;
    692         double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 ) ;
     716        double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 );
    693717
    694718        double Codalt = (sqrt(I2) - I0) / 0.078947;
     
    701725        TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0);
    702726
    703         IDLog("Nbre de pas codeurs az = %i        Alt = %i\n", TargetPosition.x, TargetPosition.y);
    704     }
     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
     736bool 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
     757bool 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   
     773    for (int i=0; i<SocketsNumber; i++)
     774    {
     775        if (Sockets[i].Connected)
     776        {
     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)
     788            {
     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               }
     799            }
     800
     801            if (delta_az) {
     802                delete [] delta_az;
     803                delta_az=NULL;
     804            }
     805
     806            if (delta_ha) {
     807                delete [] delta_ha;
     808                delta_ha=NULL;
     809            }
     810
     811            os.str("");
     812        }
     813    }
     814   
     815    return true;
    705816}
    706817
    707818
    708819/************************************************************************************
    709 * Retourne simplement le nombre d'antennes connectées
     820* Retourne le nombre d'antennes connectées
     821*
    710822************************************************************************************/
    711823
     
    718830    return num;
    719831}
    720 
    721 
    722 /************************************************************************************
    723 * Initialisation des paramÚtres des antennes
    724 *
    725 ************************************************************************************/
    726 void BAO::InitAntennes()
    727 {
    728     for (int i=0; i < MAXHOSTNAME; i++)
    729     {
    730         Sockets[i].status             = 0;
    731         Sockets[i].sendalertes        = 0;
    732         Sockets[i].AttenteExecution   = 0;
    733         Sockets[i].AnomaliesExecution = 0;
    734         Sockets[i].etape              = 0;
    735 
    736         Sockets[i].ack_status = false;
    737         Sockets[i].ack_pos    = false;
    738         Sockets[i].ack_park   = false;
    739         Sockets[i].ack_abort  = false;
    740         Sockets[i].ack_goto   = false;
    741 
    742         Sockets[i].PosValides = false;
    743         Sockets[i].GotoOk     = false;
    744     }
    745 }
    746 
    747832
    748833
     
    768853void BAO::ISPoll()
    769854{
    770     static int memSocketsNumber = -1;       // Combien d'antennes étaient-elles connectées à l'appel précédent d'ISPoll ?
    771     static unsigned int compt   =  0;      // permet de répondre toutes les 100ms aux demandes de nouvelles connexions
    772 
    773     // utilise pour le travail sur les chaine
    774 
    775     int pos;
     855    static int memSocketsNumber = -1;      // Combien y avait-il d'antennes connectées lors de l'appel précédent d'ISPoll ?
     856    static unsigned int compt   =  0;      // Compteur de la fonction ISPoll
    776857
    777858    struct tm date;
     
    782863    //si pas de connexion avec le seveur d'indi -> on sort
    783864
    784     if (is_connected() == false) return;
     865    if (!is_connected()) return;
    785866
    786867
     
    808889        DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec);
    809890
    810         //Puis on calule le temps sidéral local, le JJ etc...
     891        //Puis on calule le temps sidéral local, le JJ etc.
    811892
    812893        CalculTSL();
    813894    }
     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");
    814899
    815900
     
    819904    {
    820905
    821         // Nouvelle connexion sur le socket !
     906        // Nouvelle connexion sur le socket ?
    822907
    823908        if (SocketsNumber > memSocketsNumber)
     
    853938                    // pour différencier une trame de la précédente
    854939
    855                     pos = reponse.find("\n");
     940                    int pos = reponse.find("\n");
    856941
    857942                    // S'il y a une réponse
     
    859944                    while ((pos != string::npos) && (reponse.length() > 1))
    860945                    {
    861                         // on garde en stock la seconde partie trame pour un
    862                         // traitement ultérieure
     946                        // on garde en stock la deuxiÚme partie de la trame
     947                        // pour un traitement ultérieur
    863948                        buffereponse = reponse.substr(pos + 1);
    864949
     
    866951                        reponse = reponse.substr(0, pos);
    867952                       
    868                         IDLog("Réponse reçue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str());
    869 
    870                         // On analyse ici les acknowledges
     953                        IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str());
     954
     955                        // On vérifie ici les acknowledges
    871956                        if ((reponse.find("ACK") != string::npos) && (reponse.find("NACK") == string::npos))
    872957                        {
     
    896981                                if (reponse.find("NACK") != string::npos)
    897982                                {
    898                                     //problÚme concernant la réponse à la commande P
     983                                    //problÚme concernant la commande P
    899984                                    OnCoordSetSP.s = IPS_ALERT;
    900985                                    IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : position de l antenne inconnue !\n",
     
    9691054                                    if (reponse.find("OK") != string::npos)
    9701055                                    {
    971                                         // On a la confirmation que l'antenne 'i' a bien réalisé
     1056                                        // On a ici la confirmation que l'antenne 'i' a bien réalisé
    9721057                                        // le goto
    9731058
     
    10011086                                            lastDEC = targetDEC;
    10021087
    1003                                             // On change en vert les voyants dans la boîte de dialogue
    1004 
     1088                                            // On a fini le mouvement. On attend le prochain goto...
     1089
     1090                                            ActualisationPosition=false;
     1091
     1092                                            // Réinitialisation des paramÚtres des antennes en vue d'un prochain goto
     1093
     1094                                            InitAntennes();
     1095
     1096                                            // On dessine les voyants de la boîte de dialogue en vert
    10051097                                            OnCoordSetSP.s = IPS_OK;
    10061098                                            EquatorialCoordsWNP.s = IPS_OK;
    10071099                                            IDSetNumber (&EquatorialCoordsWNP, NULL);
    10081100
    1009                                             // On a fini le mouvement. On attend le prochain goto...
    1010 
    1011                                             ActualisationPosition=false;
    1012 
    1013                                             // Réinitialisation des antennes en vue d'un prochain goto
    1014 
    1015                                             InitAntennes();
    1016 
    1017                                             UpdateGoto=true;
    1018 
    10191101                                            // Confirmation dans la boîte de dialogue que toutes
    1020                                             // les antennes sont OK
    1021                                            
     1102                                            // les antennes sont OK         
    10221103                                            OnCoordSetSP.s = IPS_OK;
    10231104                                            IDSetSwitch(&OnCoordSetSP, "GOTO OK !");
     1105                                           
     1106                                            UpdateGoto=true;
    10241107                                        }                                       
    10251108                                    }
     
    10471130
    10481131        ///////////////////////////////////////
    1049         // L'utilisateur a demandé l'annulation du mouvement
    1050         // en cours
     1132        // L'utilisateur a demandé l'annulation du mouvement en cours
    10511133
    10521134        if (Abort)
     
    11231205        if ((Suivi) && (UpdateGoto))
    11241206        {
    1125             // Durée entre deux actualisations
     1207            // Délais entre deux actualisations
    11261208
    11271209            double delai=ActualisationTM1 / 3600.0 / 24.0;   // Actualisation toutes les 15 minutes en mode transit
     
    12561338                            if (Sockets[i].AttenteExecution > MAXATTENTE)
    12571339                            {
    1258                                 // on attend davantage la réponse posvalides                               
     1340                                // on attend encore la réponse posvalides                               
    12591341                                Sockets[i].etape = 2;
    12601342                                Sockets[i].AttenteExecution = 0;
     
    13331415                            }
    13341416
    1335                             // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes                       
     1417                            // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes   
    13361418                            if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO)
    13371419                            {
     
    13741456                    Sockets[i].AnomaliesExecution = 0;
    13751457
    1376                     if (!GOTO(i, TargetPosition.x - Sockets[i].Pos.x , TargetPosition.y - Sockets[i].Pos.y )) Sockets[i].sendalertes++;
     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++;
    13771459
    13781460                    Sockets[i].etape++;
     
    13981480        }
    13991481    }
    1400 
     1482   
     1483    //incrémentation du compteur
    14011484    compt++;
    14021485}
     
    15591642        Sockets[numsocket].new_sock << chaine;
    15601643       
    1561         IDLog("Commande envoyée à %s: %s", Sockets[numsocket].IP.c_str(), chaine);
     1644        IDLog("Commande envoyee a %s: %s", Sockets[numsocket].IP.c_str(), chaine);
    15621645    }
    15631646    catch (SocketException& e)
     
    16401723    // On risque alors de faire un tour complet en sens inverse pour rattraper l'objet -> à éviter
    16411724
    1642     // évite de faire des tours complets en Az pour rien...
     1725    // ne pas faire des tours complets en Az pour rien...
    16431726    while (deltaAz > NBREPASCODEURSAZ) deltaAz -= NBREPASCODEURSAZ;
    16441727
    1645     // Doit résoudre tous les problÚmes...
     1728    // Doit résoudre tous les problÚmes concernant l'azimut...
    16461729    if (deltaAz > NBREPASCODEURSAZ / 2 )
    16471730    {
     
    16521735    //on envoie les coordonnées au driver
    16531736
    1654     if (sensAz == 1 )  sensAz='f';
    1655     else sensAz='b';
    1656     if (sensAlt == 1 ) sensAlt='f';
    1657     else sensAlt='b';
     1737    if (sensAz == 1 )  sensAz='f'; else sensAz='b';
     1738   
     1739    if (sensAlt == 1 ) sensAlt='f'; else sensAlt='b';
    16581740
    16591741    sprintf(Params, "%c%04i%c%04i", sensAz, deltaAz, sensAlt, deltaAlt);
     
    16651747
    16661748/**************************************************************************************
    1667 ** Les fonctions qui suivent sont nécessaires pour construire un pilote Indi
     1749** Les fonctions qui suivent sont nécessaires pour construire le pilote Indi_BAO
    16681750** Elles sont appelées par le noyau d'Indi
    16691751***************************************************************************************/
  • BAORadio/libindi/libindi/drivers/telescope/BAO.h

    r504 r619  
    22 Pilote Indi BAORadio
    33 franckrichard033@gmail.com
    4  Juin 2011
     4 Décembre 2011
    55*/
    66
     
    2121#include <unistd.h>
    2222#include <sys/time.h>
     23#include <fstream>
    2324
    2425#include <config.h>
     
    3233#include "SocketException.h"
    3334#include "astro.h"
    34 
     35#include "filetools.h"
    3536
    3637#define MAXCARACTERES 1024
     
    6566
    6667    Position Pos;                    // derniÚre position retournée par le microcontrÃŽleur
    67     int etape;                       //étape dans le cycle de commandes/réponses entre PC et microcontroleurs
     68    Position Delta;                  // Corrections en Az et Ha
     69    int etape;                       // étape dans le cycle de commandes/réponses entre PC et microcontroleurs
    6870
    6971    bool ack_status;                 // Etat des acknowledges ?
     
    7375    bool ack_goto;                   // le PC a reçu une confirmation du microcont aprÚs un ordre GOTO
    7476    bool GotoOk;                     // Est-ce que le dernier goto est OK ?
     77   
     78   
    7579};
    7680
     
    108112    void DeconnecterSocket(int num);
    109113    void InitAntennes();
    110 
     114    bool ChargementParametresAlignement(string fileName);
     115    bool is_readable( const std::string & file );
     116 
    111117    /*******************************************************/
    112118    /* Connection Routines
Note: See TracChangeset for help on using the changeset viewer.