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

Last change on this file since 654 was 502, checked in by frichard, 15 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.