| 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 */ | 
|---|
| 12 | void 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 */ | 
|---|
| 29 | void 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 */ | 
|---|
| 38 | void 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 */ | 
|---|
| 86 | void 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 */ | 
|---|
| 174 | void 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 */ | 
|---|
| 194 | void 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 | 
|---|
| 268 | est conforme à ce que l'on attendait ? */ | 
|---|
| 269 | bool 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 */ | 
|---|
| 291 | void 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 */ | 
|---|
| 318 | void *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 */ | 
|---|
| 379 | bool 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 */ | 
|---|
| 426 | bool 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 */ | 
|---|
| 462 | bool 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 */ | 
|---|
| 497 | bool 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 */ | 
|---|
| 528 | bool 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 */ | 
|---|
| 558 | bool 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 */ | 
|---|
| 612 | bool 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 */ | 
|---|
| 668 | bool 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 */ | 
|---|
| 825 | bool 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 */ | 
|---|
| 859 | void 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 */ | 
|---|
| 969 | bool 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 |  | 
|---|
| 1089 | int 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 | } | 
|---|