source: BAORadio/libindi/v1.0.1/BAOControl/baocontrol.cpp

Last change on this file was 502, checked in by frichard, 14 years ago

-BAOControl : petite interface permettant de contrôler les antennes via le pilote indi_BAO
-Le pilote indi_BAO utilise désormais indilib v 0.7

  • Property svn:executable set to *
File size: 29.5 KB
Line 
1/********************/
2/* BAOCONTROL       */
3/*                  */
4/********************/
5
6
7#include "baocontrol.h"
8
9
10/* Affiche à l'écran (si AfficheEcran==true) et sauvegarde dans le fichier
11   BAOControl.log le message contenu dans la variable chaine */
12void Affiche(std::string chaine, bool AfficheEcran)
13{
14    FILE *pFile = NULL;
15
16    pFile = fopen ("BAOControl.log", "a");
17
18    if (AfficheEcran) std::cout << chaine;
19   
20    fprintf (pFile, chaine.c_str());
21
22    os.str("");
23
24    fclose (pFile);
25}
26
27
28/*Affiche les messages d'erreur en rouge */
29void Erreur(std::string chaine)
30{
31    std::cout << red;
32    Affiche(chaine, true);
33    std::cout << black;
34}
35
36
37/*initialise une fenêtre graphique */
38void initialiserFenetre()
39{
40    XGCValues gcv;
41    XFontStruct * fd;
42   
43    /*contacte le serveur*/
44    if ((d = XOpenDisplay(getenv("DISPLAY"))) == NULL)
45    {
46        Erreur("Impossible de contacter le serveur\n\n");
47        exit(1);
48    }
49
50    /*crée une fenêtre*/
51    w = XCreateSimpleWindow(d, RootWindow(d, DefaultScreen(d)),
52                            0, 0, larg, haut,
53                            2, BlackPixel(d, DefaultScreen(d)),
54                            WhitePixel(d, DefaultScreen(d)));
55       
56    /* Creation du double buffer */
57    db = XCreatePixmap(d, w, larg, haut, DefaultDepth(d, DefaultScreen(d)));
58
59    /*chargement d'une police de caractÚres*/
60    if ((fd=XLoadQueryFont(d, "fixed")) == NULL)
61    {
62        Erreur("Impossible de charger la police fixed\n\n");
63        exit(1);
64    }
65
66    /*création d'un contexte graphique*/
67    gcv.font = fd->fid;
68    gcv.foreground = BlackPixel(d, DefaultScreen(d));
69    noir = XCreateGC(d, w, GCFont | GCForeground, &gcv);
70
71    gcv.foreground = 200*255;
72    vert = XCreateGC(d, w, GCFont | GCForeground, &gcv);
73
74    gcv.foreground = 255*256*256;
75    rouge = XCreateGC(d, w, GCFont | GCForeground, &gcv);
76
77    gcv.foreground = 200*256*256+200*256+200;
78    gris = XCreateGC(d, w, GCFont | GCForeground, &gcv);
79
80    /*affiche la fenêtre */
81    XMapWindow(d, w);
82}
83
84
85/* Dessine les éléments de la fenêtre graphique */
86void Dessiner()
87{
88    char chaine[100];
89    GC color;
90
91    /* On efface la fenêtre */
92    XSetForeground(d, noir, WhitePixel(d, DefaultScreen(d)));
93    XFillRectangle(d, db, noir, 0, 0, larg, haut);
94    XSetForeground(d, noir, BlackPixel(d, DefaultScreen(d)));
95
96    /* Affichage de la date et de l'heure */
97    int h=astro->Heu;
98    int m=astro->Min;
99    int s=astro->Sec;
100    int j=astro->Jour;
101   
102    if (s==60) {
103        s=0;
104        m++;
105        if (m==60) {
106            m=0;
107            h++;
108            if (h==24) {
109                h=0;
110                j++;
111            }
112        }
113    }   
114   
115    sprintf(chaine, "%02i:%02i:%02i TU    %02i/%02.0f/%04.0f    JJ=%10.5f",
116            h, m, s, j, astro->Mois, astro->Annee, astro->JJ);
117
118    XDrawString(d, db, noir, 10, 10, chaine, strlen(chaine));
119
120    if (run)
121    {
122        sprintf(chaine, "Prochaine etape dans %4.1fs", (objets[runnum].JJ-astro->JJ)*3600.0*24.0);
123
124        if ((objets[runnum].JJ-astro->JJ)*3600.0*24.0 >= 0.0) XDrawString(d, db, noir, 350, 10, chaine, strlen(chaine));
125    }
126
127    /*affichage des cercles d'état*/
128    for (int i=0; i <20; i++)
129    {
130        for (int j=0; j<5; j++)
131        {
132            switch(Antennes[20*j+i].ok)
133            {
134              case 1 : color=vert; break;
135              case 2 : color=rouge; break;
136              default: color=gris; break;
137            }
138            XFillArc(d, db ,color, 10+i*30, 20+j*30, 15, 15, 0, 360*64);
139            XDrawArc(d, db ,noir, 10+i*30, 20+j*30, 15, 15, 0, 360*64);
140        }
141    }
142
143
144    /*Affichage des messages d'erreur*/
145    if (lognum>15)
146    {
147        for (int i=lognum-1; i>lognum-16; i--)
148        {
149            if ((logs[i].find("Err")!=string::npos)
150                    || (logs[i].find("ALERTE")!=string::npos)) color=rouge;
151            else color=vert;
152            XDrawString(d, db, color, 10, 15*12+(i-lognum+15)*12, logs[i].c_str(), strlen(logs[i].c_str()));
153        }
154    }
155    else
156    {
157        for (int i=0; i<lognum; i++)
158        {
159            if ((logs[i].find("Err")!=string::npos)
160                    || (logs[i].find("ALERTE")!=string::npos)) color=rouge;
161            else color=vert;
162            XDrawString(d, db, color, 10, 15*12+i*12, logs[i].c_str(), strlen(logs[i].c_str()));
163        }
164    }
165   
166    XCopyArea(d, db, w, noir, 0, 0, larg, haut, 0, 0); 
167         
168    /* on force le rafraichissement de l'écran */
169    XFlush(d);
170}
171
172
173/* Gestion des messages concernant la fenêtre graphique */
174void rouler(char* reponse)
175{
176    XEvent e;
177
178    if (XCheckWindowEvent(d, w, ExposureMask, &e))
179    {
180        switch (e.type)
181        {
182        default:
183            //std::cout << "J'ai reçu un évÚnement " <<  e.type << std::endl
184            break;
185        case Expose :
186            Dessiner();
187            break;
188        }
189    }
190}
191
192
193/* RécupÚre les messages envoyés par indi_BAO */
194void LireReponse()
195{
196    std::string reponse, decomp;
197    std::stringstream os;
198    bool test=false;
199
200    *client_socket >> reponse;
201
202    if (reponse.find("message")!=string::npos)
203    {
204        /* on ne garde que la partie intéressante */
205        reponse=reponse.substr(reponse.find("message")+9);
206
207        reponse=reponse.substr(0, reponse.find("\""));
208
209        /*récupÚre l'adresse ip de l'antenne */
210        if (reponse.find(". (Antennes connectees")!=string::npos)
211        {
212            decomp=reponse.substr(0, reponse.find(". (Antennes connectees"));
213            decomp=decomp.substr(decomp.rfind(".")+1);
214
215            /*si cette antenne est déjà connectée, on change son état */
216            for (int i=0; i<numAntenne; i++)
217            {
218                if (atoi(decomp.c_str()) == Antennes[i].ip)
219                {
220                    Antennes[i].ok=1;
221                    test=true;
222                    break;
223                }
224            }
225
226            /*ou on ajoute son état */
227            if (!test)
228            {
229                Antennes[numAntenne].ip=atoi(decomp.c_str());
230                Antennes[numAntenne].ok=1;
231                numAntenne++;
232            }
233        }
234
235        /*erreur sur une antenne -> on change son état dans la fenêtre */
236        if  ((reponse.find("ALERTE antenne ")!=string::npos) || (reponse.find("Erreur sur l antenne ")!=string::npos))
237        {
238            decomp=reponse.substr(0, reponse.find(" :"));
239            decomp=decomp.substr(decomp.rfind(".")+1);
240
241            for (int i=0; i<numAntenne; i++)
242            {
243                if (atoi(decomp.c_str()) == Antennes[i].ip)
244                {
245                    Antennes[i].ok=2;
246                }
247            }
248        }
249
250        /* On sauvegarde le message dans le tableau log */
251        os << lognum << " : " << reponse;
252       
253        Affiche(os.str(), false);
254        Affiche("\n", false);
255
256        logs[lognum++]=os.str();
257        if (lognum>=MAXLOG-1) lognum=0;
258         
259        /*on actualise la fenêtre */
260        Dessiner();
261    }
262
263    rouler((char *)reponse.c_str());
264}
265
266
267/* Est-ce que la réponse du pilote indi_BAO
268est conforme à ce que l'on attendait ? */
269bool VerifReponse(std::string reponseattendue)
270{
271    std::string reponse;
272
273    usleep(10000); // attendre 10 ms pour laisser le temps au pilote indi_BAO de répondre
274
275    *client_socket >> reponse;
276
277    if (reponse.find(reponseattendue)==string::npos)
278    {   
279        //réponse inconnue -> une erreur ?
280        os << "Réponse du pilote indi_BAO :" << std::endl << reponse
281                  << std::endl << std::endl << std::endl;
282        Erreur(os.str());         
283    }
284
285    return true;
286}
287
288
289/*Récupération de la date et de l'heure
290 et calcul du jour julien et du tsl */
291void CalculJourJulien()
292{
293    struct tm date;
294    time_t t;
295    struct timeval tv;
296    struct timezone tz;
297
298    time(&t);
299    date=*gmtime(&t);
300    gettimeofday(&tv, &tz);
301
302    astro->Annee=(double)(date.tm_year+1900);
303    astro->Mois=(double)(date.tm_mon+1);
304    astro->Jour=(double)date.tm_mday;
305    astro->Heu=(double)date.tm_hour;
306    astro->Min=(double)date.tm_min;
307    astro->Sec=(double)date.tm_sec+tv.tv_usec/1.0E6;
308    astro->UTCP=0.0;//(double)date.tm_isdst;
309
310    //Calcul du temps sidéral local et du JJ
311
312    astro->CalculTSL();
313}
314
315
316/* gestion du thread permettant l'actualisation de la fenêtre graphique
317 et la récupération des messages d'indi_BAO */
318void *my_thread_process (void * arg)
319{
320    while (NoExit)
321    {
322        CalculJourJulien();
323
324        //Execution d'un fichier de mouvements
325        if (run && numobjets>1 && runnum<numobjets)
326        {
327            /* On lance l'exécution des mouvements programmés */
328            if (astro->JJ>=objets[runnum].JJ && !objets[runnum].exec)
329            {
330                if (runnum==1) Affiche("Début de l'exécution du fichier de mouvements\n\n", true);
331                os << "Suivi de l'objet n°" << runnum << std::endl;
332                Affiche(os.str(), true);
333                objets[runnum].exec=true;
334
335                Goto(objets[runnum].ad, objets[runnum].de, Transit);
336            }
337
338            /*on arrive à la fin du mouvements i */
339            if (astro->JJ>=objets[runnum].JJ+objets[runnum].Duree/3600.0/24.0)
340            {
341                Abort();
342
343                /*fin de la commande run */
344                if (runnum+1>=numobjets)
345                {
346                    Affiche("Fin de l'execution du fichier de mouvements\n\n", true);
347                    std::cout << std::endl << blue << ">";
348                    run=false;
349                    runnum=1;
350                    numobjets=1;
351
352                    /*on sort du programme dans le cas ./BAOControl -r fileName */
353                    if (exitrun) NoExit=false;
354                }
355                else
356                {
357                    runnum++;
358                }
359            }
360        }
361
362        LireReponse();
363
364        Dessiner();
365
366        usleep(100000); //100 ms
367    }
368
369    pthread_exit (0);
370}
371
372
373
374/* Décomposition et vérification des dates, heures, AD et déclinaisons
375 type = 0 -> Déclinaison/latitude
376 type = 1 -> longitude
377 type = 2 -> AD ou heure
378 type = 3 -> date */
379bool Decomposition(std::string chaine, char type, float *a1, float *a2, float *a3)
380{
381    std::string car, s;
382    int pos1, pos2;
383    float a, b, c;
384
385    if (type==3) car="/"; else car=":";
386   
387    /* Y a-t-il 2 caractÚres : ou / à la suite ? */
388    int test=0;
389    for (int i=0; i<chaine.length(); i++) if (chaine[i]==car[0]) test++;
390    if (test<2) return false;
391
392    s=chaine.substr(0, chaine.find(car));
393
394    a=atoi(s.c_str());
395     
396    s=chaine.substr(chaine.find(car)+1, chaine.rfind(car)-chaine.find(car)-1);
397   
398    b=atoi(s.c_str());
399
400    s=chaine.substr(chaine.rfind(car)+1);
401
402    c=atoi(s.c_str());
403
404    if (type <3)
405    {
406        if ((type==0) && (a>90.0 || a<-90.0)) return false;
407        if ((type==1) && (a>180.0 || a<-180.0)) return false;
408        if ((type==2) && (a>23.0 || a<0.0)) return false;
409        if (b<0.0 || b>59.0) return false;
410        if (c<0.0 || c>=60.0) return false;
411    }
412    else
413    {
414        if (a<0.0 || a>31.0) return false;
415        if (b<0.0 || b>12.0) return false;
416    }
417
418    if (a1!=NULL) *a1=a;
419    if (a2!=NULL) *a2=b;
420    if (a3!=NULL) *a3=c;
421
422    return true;
423}
424
425/* isole les différents éléments de la commande saisie par l'utilisateur */
426bool DecompositionCommande(std::string chaine, std::string commande, std::string *chaine1, std::string *chaine2)
427{
428    size_t pos;
429
430    pos = chaine.find(commande);
431
432    if (pos!=string::npos)
433    {
434        pos+=commande.length();
435
436        chaine=chaine.substr(pos);
437
438        while (chaine[0] == ' ') chaine=chaine.substr(1);
439
440        *chaine1=chaine.substr(0,chaine.find(" "));
441
442        if (chaine2!=NULL)
443        {
444            pos = chaine.find(" ");
445
446            if (pos!=string::npos)
447            {
448                chaine=chaine.substr(pos+1);
449
450                while (chaine[0] == ' ') chaine=chaine.substr(1);
451
452                *chaine2=chaine.substr(0, chaine.find(" "));
453            }
454        }
455    }
456
457    return true;
458}
459
460
461/*Envoie la longitude et la latitude du lieu d'observation au pilote indi_BAO */
462bool EncoyerCoordGeographiques()
463{
464    try
465    {
466        *client_socket << "<newNumberVector device=\"BAO\" name=\"GEOGRAPHIC_COORD\">";
467        *client_socket << "<oneNumber name=\"LAT\">";
468        *client_socket << Latitude;
469        *client_socket << "</oneNumber>";
470        *client_socket << "<oneNumber name=\"LONG\">";
471        *client_socket << Longitude;
472        *client_socket << "</oneNumber>";
473        *client_socket << "</newNumberVector>";
474
475        if (!VerifReponse("name=\"GEOGRAPHIC_COORD\" state=\"Ok\""))
476        {
477            Erreur("ERREUR fct EncoyerCoordGeographiques : pas de réponse du pilote indi_BAO.\n\n");
478
479            return false;
480        }
481    }
482
483    catch ( SocketException& e )
484    {
485        os << "Exception was caught:" << e.description() << std::endl;
486        Erreur(os.str());
487        return false;
488    }
489
490    std::cout << "Les coordonnées géographiques ont bien été envoyées au pilote indi_BAO"  << std::endl << std::endl;
491
492    return true;
493}
494
495
496/* Place les antennes en position de repos */
497bool Park()
498{
499    try
500    {
501        *client_socket << "<newSwitchVector device=\"BAO\" name=\"\" >";
502        *client_socket << "<oneSwitch name=\"PARK\">";
503        *client_socket << "On";
504        *client_socket << "</oneSwitch>";
505        *client_socket << "</newSwitchVector>";
506
507        if (!VerifReponse("Envoi de la commande Park"))
508        {
509            Erreur("La commande PARK a échoué.\n\n");;
510
511            return false;
512        }
513    }
514    catch ( SocketException& e)
515    {
516        os << e.description() << "\n";
517        Erreur(os.str());
518        return false;
519    }
520
521    Affiche("Le pilote indi_BAO a bien reçu la commande PARK.\n\n", true);
522
523    return true;
524}
525
526
527/* Annule le mouvement en cours */
528bool Abort()
529{
530    try
531    {
532        *client_socket << "<newSwitchVector device=\"BAO\" name=\"ABORT_MOTION\" >";
533        *client_socket << "<oneSwitch name=\"ABORT\">";
534        *client_socket << "On";
535        *client_socket << "</oneSwitch>";
536        *client_socket << "</newSwitchVector>";
537
538        if (!VerifReponse("name=\"ABORT_MOTION\" state=\"Ok\""))
539        {
540            Erreur("L'annulation a échoué.\n\n");
541
542            return false;
543        }
544    }
545    catch ( SocketException& e)
546    {
547        os << e.description() << "\n";
548        Erreur(os.str());
549        return false;
550    }
551
552    Affiche("Le pilote indi_BAO a bien reçu la commande ABORT.\n\n", true);
553
554    return true;
555}
556
557/*aller aux coordonnées ar et dec dans le mode transit ou tracking */
558bool Goto(std::string ar, std::string dec, bool Transit)
559{
560    try
561    {
562        *client_socket << "<newSwitchVector device=\"BAO\" name=\"ON_COORD_SET\">";
563        *client_socket << "<oneSwitch name=\"TRANSIT\">";
564        if (Transit) *client_socket << "On";
565        else *client_socket << "Off";
566        *client_socket << "</oneSwitch>";
567
568        *client_socket << "<oneSwitch name=\"TRACKING\">";
569        if (Transit)  *client_socket << "Off";
570        else *client_socket << "On";
571        *client_socket << "</oneSwitch>";
572        *client_socket << "</newSwitchVector>";
573
574        if (!VerifReponse("name=\"ON_COORD_SET\""))
575        {
576            Erreur("Le changement de mode TRANSIT/TRACKING a échoué.\n\n");
577
578            return false;
579        }
580
581        *client_socket << "<newNumberVector device=\"BAO\" name=\"EQUATORIAL_EOD_COORD_REQUEST\">";
582        *client_socket << "<oneNumber name=\"RA\">";
583        *client_socket << ar;
584        *client_socket << "</oneNumber>";
585        *client_socket << "<oneNumber name=\"DEC\">";
586        *client_socket << dec;
587        *client_socket << "</oneNumber>";
588        *client_socket << "</newNumberVector>";
589
590        if (!VerifReponse("name=\"EQUATORIAL_EOD_COORD_REQUEST\""))
591        {
592            Erreur("Le transfert des coordonnées de l'objet a échoué.\n\n");
593
594            return false;
595        }
596    }
597    catch ( SocketException& e)
598    {
599        os << e.description() << "\n";
600        Erreur(os.str());
601        return false;
602    }
603
604    os << "Les nouvelles coordonnées AD=" << ar << "  DEC=" << dec << " ont été envoyées au pilote indi_BAO.\n\n";
605    Affiche(os.str(), true);
606
607    return true;
608}
609
610
611/*se connecter ou se déconnecter au pilote indi_BAO */
612bool Connect(bool connect)
613{
614    try
615    {
616        *client_socket << "<newSwitchVector device=\"BAO\" name=\"CONNECTION\">";
617
618        if (connect) *client_socket << "<oneSwitch name=\"CONNECT\">";
619        else *client_socket << "<oneSwitch name=\"DISCONNECT\">";
620
621        *client_socket << "On";
622        *client_socket << "</oneSwitch>";
623        *client_socket << "</newSwitchVector>";
624
625        if (connect)
626        {
627            if (!VerifReponse("BAORadio is online"))
628            {
629                Erreur("La connexion a échoué.\n\n");
630
631                return false;
632            }
633        }
634        else
635        {
636            if (!VerifReponse("BAORadio is offline"))
637            {
638                Erreur("La déconnexion a échoué.\n\n");
639
640                return false;
641            }
642        }
643    }
644
645    catch ( SocketException& e )
646    {
647        os << "Exception was caught:" << e.description() << std::endl;
648        Erreur(os.str());
649        return false;
650    }
651
652    if (connect)
653    {
654        Affiche("La connexion a été établie avec le pilote indi_BAO.\n\n", true);
655
656        EncoyerCoordGeographiques();
657    }
658    else
659    {
660        Affiche("Confirmation de la déconnexion avec le pilote indi_BAO.\n\n", true);
661    }
662
663    return true;
664}
665
666
667/* Lecture des mouvements planifiés dans le fichier fileName */
668bool LectureFichierMouvements(char * fileName)
669{
670    char * section =(char * )malloc(80);
671    char * key = (char *)malloc(80);
672    char * chaine = (char *)malloc(80);
673    char * value;
674   
675    Astro * AstroJJ;
676   
677    float a1, a2, a3, h;
678
679    numobjets=1;
680
681    os << "Lecture du fichier " << fileName << std::endl << std::endl;
682    Affiche(os.str(), true);
683
684    strcpy(section, "objet 1");
685    strcpy(key, "date");
686
687    while ((readINI(section, key, &value, fileName)) && (numobjets<MAXOBJETS))
688    {
689        os << "object n°" << numobjets << std::endl;
690        Affiche(os.str(), true);
691
692        strcpy(key, "date");
693
694        if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 3, &a1, &a2, &a3)))
695        {
696            os << "Date du début de l'observation : le " << value;
697            Affiche(os.str(), true);
698
699            AstroJJ = new Astro();
700           
701            AstroJJ->Jour=a1;
702            AstroJJ->Mois=a2;
703            AstroJJ->Annee=a3;
704
705            AstroJJ->CalculJJ(0.0);
706
707            objets[numobjets].JJ=AstroJJ->JJ;
708           
709            delete AstroJJ;
710        }
711        else
712        {
713            os << "La date de la rubrique [objet " << numobjets << "] est incorrecte !" << std::endl;
714            Erreur(os.str());       
715            return false;
716        }
717
718        strcpy(key, "heure");
719
720        if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 2, &a1, &a2, &a3)))
721        {
722            os << " à " <<  value ;
723            Affiche(os.str(), true);
724
725            objets[numobjets].JJ+=(a1+a2/60.0+a3/3600.0)/24.0;
726           
727            sprintf(chaine, " TU  -> JJ=%10.5f\n", objets[numobjets].JJ);
728           
729            Affiche(chaine, true);
730           
731            for (int i=1; i<numobjets; i++)
732            {
733              if (objets[i].JJ==objets[numobjets].JJ)
734              {
735                os << "Attention, les observations des objets " << i << " et " << numobjets << " sont définies à la même date !\n";
736                Erreur(os.str());
737              }
738             
739              if (objets[i].JJ+objets[i].Duree/3600/24.0>objets[numobjets].JJ)
740              {
741                os << "Attention, les observations des objets " << i << " et " << numobjets << " se chevauchent !\n";
742                Erreur(os.str());
743              }
744            }
745        }
746        else
747        {
748            os << "L'heure de la rubrique [objet " << numobjets << "] est incorrecte !" << std::endl;
749            Erreur(os.str());
750            return false;
751        }
752
753
754
755
756        strcpy(key, "duree");
757
758        objets[numobjets].Duree=0.0;
759
760        if (readINI(section, key, &value, fileName))
761        {
762           os << "Durée de l'observation : " << value << " secondes" << std::endl;
763           Affiche(os.str(), true);
764
765           objets[numobjets].Duree=atof(value);
766        }
767        else
768        {
769            os << "La duree d'observation de la rubrique [objet " << numobjets << "] est incorrecte !" << std::endl;
770            Erreur(os.str());
771            return false;
772        }
773
774
775        strcpy(key, "ad");
776
777        strcpy(objets[numobjets].ad, "");
778
779        if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 2, NULL, NULL, NULL)))
780        {
781            os << "Ascension droite de l'objet : " << value << std::endl;
782            Affiche(os.str(), true);
783           
784            strcpy(objets[numobjets].ad, value);
785        }
786        else
787        {
788            os << "L'ascension droite de la rubrique [objet " << numobjets << "] est incorrecte !" << std::endl;
789            Erreur(os.str());
790            return false;
791        }
792
793
794        strcpy(key, "de");
795
796        strcpy(objets[numobjets].de, "");
797
798        if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 0, NULL, NULL, NULL)))
799        {
800            os << "Déclinaison de l'objet : " << value << std::endl << std::endl;
801            Affiche(os.str(), true);
802
803            strcpy(objets[numobjets].de, value);
804        }
805        else
806        {
807            os << "La déclinaison de la rubrique [objet " << numobjets << "] est incorrecte !" << std::endl;
808            Erreur(os.str());
809            return false;
810        }
811
812        objets[numobjets].exec=false;
813
814        numobjets++;
815
816        sprintf(section, "objet %i", numobjets);
817
818    }
819   
820
821    return true;
822}
823
824/*Execute le fichier de mouvements */
825bool Run(std::string fichier)
826{
827    bool exec=LectureFichierMouvements((char *)fichier.c_str());
828
829    CalculJourJulien();
830
831    if (exec && numobjets>1)
832    {
833        if (objets[numobjets-1].JJ+objets[numobjets-1].Duree/3600.0/24.0 < astro->JJ)
834        {
835            Erreur("Le fichier contient des dates qui sont toutes périmées. Exécution annulée.\n\n");
836            if (exitrun) NoExit=false;
837            return false;
838        }
839        else
840        {
841            os << "Execution du fichier " << fichier << " en attente..." << std::endl << std::endl;
842            Affiche(os.str(), true);
843            run=true;
844        }
845    }
846    else
847    {
848        os << std::endl << "Le fichier " << fichier << " contient des erreurs ou n'existe pas...\n" << std::endl << std::endl;
849        Erreur(os.str());
850        if (exitrun) NoExit=false;
851        return false;
852    }
853
854    return true;
855}
856
857
858/*identification des commandes entrées par l'utilisateur */
859void DecodageEntreesUtilisateur(std::string chaine)
860{
861    std::string ar, de, fichier;
862
863
864    if (chaine.find("goto")!=string::npos)
865    {
866        if (DecompositionCommande(chaine, "goto", &ar, &de) && Decomposition(ar, 2, NULL, NULL, NULL) && Decomposition(de, 0, NULL, NULL, NULL))
867        {
868            Goto(ar, de, Transit);
869        }
870        else
871        {
872            Erreur("Erreur goto : le format de la commande est goto AD DEC\n \
873                    L AD doit être de la forme xx:yy:zz   (ex: 12:00:03 pour 12h 0m 3s)\n \
874                    La déclinaison doit être de la forme +/-xx:yy:zz (ex: -12:50:01 pour -12° 50' 01'')\n\n");
875        }
876    }
877   
878   
879    if (chaine.find("abort")!=string::npos)
880    {
881        Abort();
882
883        if (chaine.find("run")!=string::npos)
884        {
885            run=false;
886            runnum=1;
887            numobjets=1;
888
889            Affiche("Annulation de l'exécution du fichier de mouvements.\n\n", true);
890           
891            return;
892        }
893    }
894   
895
896    if (chaine.find("run")!=string::npos)
897    {
898        if (DecompositionCommande(chaine, "run", &fichier, NULL))
899        {
900            Run(fichier);
901        }
902        else
903        {
904            Erreur("Erreur run : la commande run doit être suivie par un nom de fichier.\n\n");
905        }
906    }
907   
908
909    if (chaine.find("connect")!=string::npos)
910    {
911        Connect(chaine.find("disconnect")==string::npos);
912    }
913       
914
915    if (chaine.find("transit")!=string::npos)
916    {
917        Affiche("Mode transit activé.\n\n", true);
918
919        Transit=true;
920    }
921   
922
923    if (chaine.find("tracking")!=string::npos)
924    {
925        Affiche("Mode tracking activé.\n\n", true);
926
927        Transit=false;
928    }
929   
930
931    if (chaine.find("park")!=string::npos)
932    {
933        Park();
934    }
935   
936
937   
938   
939
940    if (chaine.find("help")!=string::npos)
941    {
942        std::cout << std::endl;
943
944        std::cout << "connect : connecte le pilote INDI" << std::endl;
945        std::cout << "disconnect : ferme la connexion avec le pilote INDI" << std::endl;
946        std::cout << "goto AD Dec : pointe l'objet aux coordonnées AD Dec" << std::endl;
947        std::cout << "transit : mode de suivi transit" << std::endl;
948        std::cout << "tracking : mode de suivi tracking" << std::endl;
949        std::cout << "run filename : execute le fichier filename" << std::endl;
950        std::cout << "abort run : annule l'exécution du fichier de mouvements" << std::endl;
951        std::cout << "abort : annule le mouvement en cours" << std::endl;
952        std::cout << "park : place les antennes en position de repos" << std::endl;
953        std::cout << "exit : sortir de BAOControl" << std::endl;
954
955        std::cout << std::endl;
956    }
957   
958
959    if (chaine.find("exit")!=string::npos)
960    {
961        Connect (false);
962
963        NoExit=false;
964    }
965}
966
967
968/* chargement des paramÚtres dans le fichier params */
969bool ChargementParametres()
970{
971    char * section =(char * )malloc(80);
972    char * key = (char *)malloc(80);
973    char * value;
974    char * fileName = (char *)malloc(sizeof(char)*255);
975
976
977    Affiche("Lecture du fichier de configuration 'params' :\n\n", true);
978
979    strcpy(fileName,"params");
980
981    strcpy(section, "connexion indi");
982
983    strcpy(key, "serveur");
984
985    strcpy(Serveur, "");
986
987    if (readINI(section, key, &value, fileName))
988    {
989        strcpy(Serveur, value);
990        os << "serveur=" << Serveur << std::endl;
991        Affiche(os.str(), true);
992    }
993    else
994    {
995        os << "Nom du serveur invalide !" << std::endl;
996        Erreur(os.str());
997        return false;
998    }
999
1000    strcpy(key, "port");
1001
1002    if (readINI(section, key, &value, fileName))
1003    {
1004        Port=atoi(value);
1005        os << "port=" << Port << std::endl << std::endl;
1006        Affiche(os.str(), true);
1007    }
1008    else
1009    {
1010        os << "Numéro de port incorrect !" << std::endl;
1011        Erreur(os.str());
1012        return false;
1013    }
1014
1015    strcpy(section, "coordonnees geographiques");
1016
1017    strcpy(Latitude, "");
1018    strcpy(Longitude, "");
1019   
1020    strcpy(key, "latitude");
1021
1022    if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 0, NULL, NULL, NULL)))
1023    {
1024        strcpy(Latitude, value);
1025        os << "latitude=" << Latitude << std::endl;
1026        Affiche(os.str(), true);
1027    }
1028    else
1029    {
1030        os << "La latitude est incorrecte !" << std::endl;
1031        Erreur(os.str());
1032        return false;
1033    }
1034
1035    strcpy(key, "longitude");
1036
1037    if ((readINI(section, key, &value, fileName)) && (Decomposition(value, 1, NULL, NULL, NULL)))
1038    {
1039        strcpy(Longitude, value);
1040        os << "longitude=" << Longitude << std::endl << std::endl;
1041        Affiche(os.str(), true);
1042    }
1043    else
1044    {
1045        os << "La longitude est incorrecte !" << std::endl;
1046        Erreur(os.str());
1047        return false;
1048    }
1049
1050    strcpy(section, "transit");
1051
1052    strcpy(key, "delai");
1053
1054    if (readINI(section, key, &value, fileName))
1055    {
1056        delaitransit=atoi(value);
1057        os << "delai transit= " << delaitransit << " sec" << std::endl;
1058        Affiche(os.str(), true);
1059    }
1060    else
1061    {
1062        os << "Le paramÚtre transit est incorrect !" << std::endl;
1063        Erreur(os.str());
1064        return false;
1065    }
1066
1067    strcpy(section, "tracking");
1068
1069    strcpy(key, "delai");
1070
1071    if (readINI(section, key, &value, fileName))
1072    {
1073        delaitracking=atoi(value);
1074        os << "delai tracking= " << delaitracking << " sec" << std::endl << std::endl;
1075        Affiche(os.str(), true);
1076    }
1077    else
1078    {
1079        os << "Le paramÚtre tracking est incorrect !" << std::endl;
1080        Erreur(os.str());
1081        return false;
1082    }
1083
1084    return true;
1085}
1086
1087
1088
1089int main(int argc, char **argv)
1090{
1091    std::string chaine;
1092
1093    pthread_t th1;
1094
1095    if (argc >1)
1096    {
1097        if (strstr(argv[1], "-h")!=NULL)
1098        {
1099            std::cout << "usage :\n \
1100       BAOControl -h ou --help : affiche l'aide\n \
1101       BAOControl -r FileName : execute les mouvements définis dans le fichier FileName\n\n";
1102
1103            return 0;
1104        }
1105    }
1106
1107    for (int i=0; i<MAXANTENNES; i++)
1108    {
1109        Antennes[i].ok=0;
1110        Antennes[i].ip=0;
1111    }
1112
1113    for (int i=0; i<MAXOBJETS; i++)
1114    {
1115        objets[i].JJ=0;
1116        objets[i].exec=false;
1117    }
1118
1119
1120    Affiche("\n\n\n\n\n\n \
1121    ************************\n \
1122    *      BAO Control     *\n \
1123    *         v0.1         *\n \
1124    *      10/11/2010      *\n \
1125    ************************\n\n", true);
1126
1127    if (!ChargementParametres())
1128    {
1129        Erreur("Le fichier de configuration 'params' contient des erreurs ou n'existe pas. Merci de vérifier.\n");
1130        exit(1);
1131    }
1132
1133    client_socket = new ClientSocket("localhost", Port );
1134
1135   
1136    Connect(true);
1137
1138    if (argc == 1)  std::cout << "Tapez help pour obtenir des infos sur les commandes disponibles.\n" << std::endl;
1139
1140    initialiserFenetre();
1141
1142    XSelectInput(d,w, ExposureMask );
1143
1144    if (pthread_create(&th1, NULL, my_thread_process, NULL) < 0) {
1145        Erreur("Impossible de créer le thread\n");
1146        exit (1);
1147    }
1148   
1149    astro = new Astro();
1150
1151    if (argc == 3)
1152    {
1153        if (strstr(argv[1], "-r")!=NULL)
1154        {
1155            exitrun=true;
1156
1157            Run(argv[2]);
1158
1159            do
1160            {
1161
1162            } while (NoExit);
1163        }
1164        else
1165        {
1166            Erreur("Usage incorrect\n\n");
1167        }
1168    }
1169    else
1170    {
1171
1172        do
1173        {
1174            std::cout << blue << '>';
1175            getline(std::cin, chaine);
1176            std::cout << black;
1177
1178            for (int i=0; i<chaine.size();++i) chaine[i] = tolower(chaine[i]);
1179
1180            DecodageEntreesUtilisateur(chaine);
1181        }
1182        while (NoExit);
1183    }
1184
1185    delete astro;
1186    delete client_socket;
1187
1188    return 0;
1189}
Note: See TracBrowser for help on using the repository browser.