Changeset 642 for BAORadio/libindi/libindi/drivers/telescope/BAO.cpp
- Timestamp:
- Feb 24, 2012, 12:37:36 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BAORadio/libindi/libindi/drivers/telescope/BAO.cpp
r619 r642 11 11 12 12 #include "BAO.h" 13 #include "../communs/alt2motor.h" 13 14 14 15 … … 22 23 const char *OPTIONS_GROUP = "Options"; // Options Group 23 24 24 /* Handy Macros */ 25 //#define currentRA EquatorialCoordsRN[0].value 26 //#define currentDEC EquatorialCoordsRN[1].value 27 #define targetRA EquatorialCoordsWN[0].value 28 #define targetDEC EquatorialCoordsWN[1].value 25 26 #define targetRA EquatorialCoordsWN[0].value 27 #define targetDEC EquatorialCoordsWN[1].value 29 28 30 29 … … 34 33 35 34 35 36 36 /************************************************************************************** 37 37 ** Initialisation de la classe BAO 38 ** 38 39 ***************************************************************************************/ 39 40 … … 42 43 init_properties(); 43 44 44 // télescope en état IDLE 45 ConnectSP.s = IPS_IDLE; 45 // Le bouton connect de la boîte de dialogue d'indi8BAO 46 // est dans l'état IDLE au démarrage 47 48 ConnectSP.s = IPS_IDLE; 46 49 47 50 // derniÚre actualisation 48 lastRA = 0.0; 49 lastDEC = 0.0; 50 JJAnc = 0.0; 51 52 currentSet = 0; 53 lastSet = -1; 54 SocketsNumber = 1; 55 TrackingMode = 1; 56 57 // délais en sec entre deux actualisations de la 58 // position dans les modes transit et tracking 59 60 ActualisationTM1 = 15.0 * 60.0; 61 ActualisationTM2 = 5.0; 62 63 UpdateGoto = true; 64 InitThreadOK = false; 65 ActualisationPosition = false; 66 Abort = false; 67 Park = false; 68 Suivi = false; 69 Exit = false; 51 52 lastRA = 0.0; 53 lastDEC = 0.0; 54 JJAnc = 0.0; 55 56 // Variables d'état 57 58 currentSet = 0; // Variables internes d'Indi, ne pas toucher 59 lastSet = -1; // Variable interne d'Indi, ne pas toucher 60 61 // Nombre d'antennes connectées 62 63 SocketsNumber = 1; 64 65 // Le mode tracking est activé par défaut 66 67 TrackingMode = 1; 68 69 // délais en sec entre deux actualisations 70 // dans les modes transit et tracking 71 72 ActualisationTMTransit = 15.0 * 60.0; // Délai entre 2 actualisations dans le mode transit 73 ActualisationTMTracking = 5.0; // " " tracking 74 75 // cette variable vaut "true" lorsque le thread de l'aplication a été initialisé 76 77 InitThreadOK = false; 78 79 // UpdatedGoto = true lorsque le dernier goto a bien été réalisé jusqu'au bout 80 81 UpdatedGoto = true; 82 83 // RealisationGoto = true lorsque les étapes nécessaires à la réalisation d'un goto 84 // sont en cours d'execution 85 86 RealisationGoto = false; 87 88 // vaut true si l'utilisateur demande l'annulation du mouvement en cours 89 90 Abort = false; 91 92 // vaut true si l'utilisateur demande de mettre les antennes en mode park 93 94 Park = false; 95 96 // vaut true un objet est actuellement suivi par les antennes 97 98 Suivi = false; 99 100 // vaut true si l'utilisateur demande à sortir de l'application -> permet de fermer le thread 101 102 Exit = false; 103 104 Pression = 1013.0; 105 106 Temp = 10.0; 70 107 71 108 72 109 // initialisation des sockets (Antennes) 73 110 74 111 for (int i=0; i<MAXHOSTNAME; i++) 75 112 { 76 Sockets[i].Connected = false; 77 Sockets[i].IP = ""; 78 79 Sockets[i].Delta.x = 0.0; 80 Sockets[i].Delta.y = 0.0; 113 Sockets[i].Connected = false; 114 Sockets[i].IP = ""; 115 Sockets[i].TargetPosition.x = 0.0; 116 Sockets[i].TargetPosition.y = 0.0; 117 Sockets[i].AlignementAntenne = new Alignement(); 118 119 if (Sockets[i].AlignementAntenne) Sockets[i].AlignementAntenne->InitAlignement(); 81 120 } 82 121 83 122 // initialisations supplémentaires 84 123 85 124 InitAntennes(); 86 125 87 126 // Numéro de version 88 89 IDLog("In itilizing from BAO device...\n");90 IDLog("Driver Version: 2 011-12-02\n");127 128 IDLog("Indi server BAORadio...\n"); 129 IDLog("Driver Version: 23-02-2012\n"); 91 130 92 131 //connect_telescope(); … … 94 133 95 134 135 96 136 /************************************************************************************** 97 137 ** Destructeur 98 ** Lorsque l'on lance indi_BAO depuis indiserver dans un terminal99 ** Le destructeur ne semble jamais être atteint lorsque l'on sort... A vérifier100 ***************************************************************************************/ 138 ** 139 ***************************************************************************************/ 140 101 141 BAO::~BAO() 102 142 { 143 //On informe le thread que nous allons sortir 144 103 145 Exit = true; 146 147 // On lui laisse une seconde pour qu'il se termine 148 104 149 sleep(1); 105 pthread_join (th1, NULL); 106 } 150 151 // destruction du thread 152 153 pthread_join(th1, NULL); 154 155 // destruction des objets AlignementAntennes 156 157 for (int i=0; i<MAXHOSTNAME; i++) 158 { 159 delete Sockets[i].AlignementAntenne; 160 } 161 162 // Petit message à l'attention de l'utilisateur 163 // permet de savoir si le destructeur est bien atteint 164 165 IDLog("Sortie de indi_BAO\n"); 166 } 167 107 168 108 169 109 170 /************************************************************************************ 110 * Initialisation des paramÚtres des antennes111 * 171 ** Initialisation des paramÚtres des antennes 172 ** 112 173 ************************************************************************************/ 174 113 175 void BAO::InitAntennes() 114 176 { … … 121 183 Sockets[i].etape = 0; 122 184 123 Sockets[i].ack_status = false; 124 Sockets[i].ack_pos = false; 125 Sockets[i].ack_park = false; 126 Sockets[i].ack_abort = false; 127 Sockets[i].ack_goto = false; 128 129 Sockets[i].PosValides = false; 130 Sockets[i].GotoOk = false; 131 } 132 } 185 Sockets[i].ack_status = false; 186 Sockets[i].ack_pos = false; 187 Sockets[i].ack_park = false; 188 Sockets[i].ack_abort = false; 189 Sockets[i].ack_goto = false; 190 191 Sockets[i].PosValides = false; 192 Sockets[i].GotoOk = false; 193 } 194 } 195 133 196 134 197 135 198 /************************************************************************************** 136 199 ** Initialisation des boutons et des zones d'affichage dans la boîte de dialogue INDI 200 ** se référer à la documentation d'INDI 201 ** 137 202 ***************************************************************************************/ 138 203 … … 149 214 IUFillSwitchVector(&OnCoordSetSP, OnCoordSetS, NARRAY(OnCoordSetS), mydev, "ON_COORD_SET", "On Set", BASIC_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE); 150 215 216 // Alignment Set 217 IUFillSwitch(&AlignmentS[0], "SIMPLE", "Simple", ISS_ON); 218 IUFillSwitch(&AlignmentS[1], "AFFINE", "Affine", ISS_OFF); 219 IUFillSwitch(&AlignmentS[2], "TAKI", "Taki", ISS_OFF); 220 IUFillSwitchVector(&AlignmentSP, AlignmentS, NARRAY(AlignmentS), mydev, "ALIGNMENT_SET", "Alignment", BASIC_GROUP, IP_RW, ISR_1OFMANY, 0, IPS_IDLE); 221 151 222 // Abort 152 223 IUFillSwitch(&AbortSlewS[0], "ABORT", "Abort", ISS_OFF); … … 171 242 IUFillNumberVector(&GeographicCoordsWNP, GeographicCoordsWN, NARRAY(GeographicCoordsWN), mydev, "GEOGRAPHIC_COORD" , "Geographic coords", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE); 172 243 244 // Pression température - SET 245 IUFillNumber(&PressionTempWN[0], "Pression", "Pression mb", "%10.6m", 0., 1500., 0., 0.); 246 IUFillNumber(&PressionTempWN[1], "Temperature", "Temperature °c", "%10.6m", -50., +50., 0., 0.); 247 IUFillNumberVector(&PressionTempWNP, PressionTempWN, NARRAY(PressionTempWN), mydev, "PRESSION_DATA" , "Pression, Temperature", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE); 248 173 249 // Actualisation - SET 174 IUFillNumber(&ActualisationN1[0], "DELAY", "Transit mode delay (Sec)", "%10.6m", 0., 3600., 0., 0.);250 IUFillNumber(&ActualisationN1[0], "DELAY", "Transit delay (s)", "%10.6m", 0., 3600., 0., 0.); 175 251 IUFillNumberVector(&ActualisationNP1, ActualisationN1, NARRAY(ActualisationN1), mydev, "DELAY1" , "", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE); 176 252 177 IUFillNumber(&ActualisationN2[0], "DELAY", "Tracking mode delay (Sec)", "%10.6m", 0., 3600., 0., 0.);253 IUFillNumber(&ActualisationN2[0], "DELAY", "Tracking delay (s)", "%10.6m", 0., 3600., 0., 0.); 178 254 IUFillNumberVector(&ActualisationNP2, ActualisationN2, NARRAY(ActualisationN2), mydev, "DELAY2" , "", OPTIONS_GROUP, IP_WO, 0, IPS_IDLE); 179 255 } … … 182 258 /************************************************************************************** 183 259 ** Initialisation de la boîte de dialogue INDI (suite) 260 ** Vider tous les vecteurs 261 ** 184 262 ***************************************************************************************/ 185 263 … … 195 273 IDDefNumber(&EquatorialCoordsWNP, NULL); 196 274 IDDefNumber(&GeographicCoordsWNP, NULL); 275 IDDefNumber(&PressionTempWNP, NULL); 197 276 IDDefSwitch(&OnCoordSetSP, NULL); 277 IDDefSwitch(&AlignmentSP, NULL); 198 278 IDDefSwitch(&AbortSlewSP, NULL); 199 279 IDDefSwitch(&ParkSP, NULL); … … 207 287 /************************************************************************************** 208 288 ** Initialisation des vecteurs INDI 289 ** ParamÚtres par défaut 290 ** 209 291 ***************************************************************************************/ 210 292 … … 213 295 ConnectSP.s = IPS_IDLE; 214 296 OnCoordSetSP.s = IPS_IDLE; 297 AlignmentSP.s = IPS_IDLE; 215 298 AbortSlewSP.s = IPS_IDLE; 216 299 ParkSP.s = IPS_IDLE; 217 300 ObjectTP.s = IPS_IDLE; 218 301 EquatorialCoordsWNP.s = IPS_IDLE; 302 PressionTempWNP.s = IPS_IDLE; 219 303 GeographicCoordsWNP.s = IPS_IDLE; 220 304 ActualisationNP1.s = IPS_IDLE; … … 222 306 223 307 IUResetSwitch(&OnCoordSetSP); 308 IUResetSwitch(&AlignmentSP); 224 309 IUResetSwitch(&AbortSlewSP); 225 310 IUResetSwitch(&ParkSP); 226 311 227 312 OnCoordSetS[0].s = ISS_ON; 313 AlignmentS[0].s = ISS_ON; 228 314 ConnectS[0].s = ISS_OFF; 229 315 ConnectS[1].s = ISS_ON; … … 231 317 IDSetSwitch(&ConnectSP, NULL); 232 318 IDSetSwitch(&OnCoordSetSP, NULL); 319 IDSetSwitch(&AlignmentSP, NULL); 233 320 IDSetSwitch(&AbortSlewSP, NULL); 234 321 IDSetSwitch(&ParkSP, NULL); 235 322 IDSetText(&ObjectTP, NULL); 236 323 IDSetNumber(&EquatorialCoordsWNP, NULL); 324 IDSetNumber(&PressionTempWNP, NULL); 237 325 IDSetNumber(&GeographicCoordsWNP, NULL); 238 326 IDSetNumber(&ActualisationNP1, NULL); … … 241 329 242 330 331 243 332 /************************************************************************************** 244 333 ** En cas de changement de texte dans la boîte de dialogue (par exemple : changement du 245 ** nom de l'objet) alors suivre l'objet... 334 ** nom de l'objet) alors suivre l'objet... 246 335 ** Cette fonction n'est pas encore utilisée 336 ** TODO: faut-il pouvoir modifier le nom de l'objet depuis la boîte ? 337 ** pas sûr que cela soit utile: kstars et BAOcontrol permettent de faire cela 338 ** 247 339 ***************************************************************************************/ 248 340 … … 275 367 276 368 369 277 370 /************************************************************************************** 278 371 ** En cas de changement d'une valeur numérique dans la boîte de dialogue Indi … … 285 378 286 379 // Ignore if not ours 380 287 381 if (strcmp (dev, mydev)) 288 382 return; 289 383 384 // Si pas de connexion -> on sort 385 290 386 if (is_connected() == false) 291 387 { 292 388 IDMessage(mydev, "Error ! BAO is offline. Please connect before issuing any commands."); 389 293 390 reset_all_properties(); 391 294 392 return; 295 393 } … … 299 397 // Geographic Coords 300 398 // =================================== 399 301 400 if (!strcmp (name, GeographicCoordsWNP.name)) 302 401 { 303 int i=0, nset=0, error_code=0; 304 305 Latitude=0.0; 306 Longitude=0.0; 307 308 for (nset = i = 0; i < n; i++) 309 { 402 // l'utilisateur a modifié un les coordonnées géographiques de la boite indi 403 404 int i = 0, nset = 0; 405 406 // En cas d'erreur, on doit pouvoir sortir avec des paramÚtres par défaut 407 //ici la latitude et la longitude vondront 0.0 408 409 Latitude = 0.0; 410 Longitude = 0.0; 411 412 // pour ce vecteur, on sait qu'il y a n éléments possibles 413 // Exemple pour la rubrique coordonnées géographique de la boîte indi 414 // il y a deux éléments : la longtude et la latitude 415 // pour la rubrique alignement, il y aen a trois par exemple : 416 // simple, affine et taki 417 418 for (i = 0; i < n; i++) 419 { 420 // pour chacun d'entre eux, on regarde si le nom passé en argument de la fonction (*name) 421 // correspond bien à l'un des éléments du vecteur GeographicCoordsWNP 422 310 423 INumber *eqp = IUFindNumber (&GeographicCoordsWNP, names[i]); 424 311 425 if (eqp == &GeographicCoordsWN[0]) 312 426 { 427 //ici on a identifié la zone latitude de la boîte de dialogue 428 // Value[i] contient la chaine de caractÚre correspondante dans la boîte 429 // C'est la valeur saisie par l'utilisateur 430 313 431 Latitude = values[i]; 432 433 // On doit vérifier que la latitude est dans un intervalle correct 434 314 435 nset += Latitude >= -90.0 && Latitude <= 90.0; 436 437 // on convertit en radians 315 438 316 439 Latitude *= Pidiv180; … … 318 441 else if (eqp == &GeographicCoordsWN[1]) 319 442 { 443 // ici on a identifié une modification dans la rubrique longitude 444 320 445 Longitude = values[i]; 446 447 // dans l'intervalle ? 448 321 449 nset += Longitude >= 0.0 && Longitude <= 360.0; 450 451 // en radians 322 452 323 453 Longitude *= -Pidiv180; … … 332 462 //IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude); 333 463 464 //nset vaut 2, on sommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs 465 // saisies par l'utilisateur 466 // voir le code plus haut pour comprendre... 467 468 // On change la couleur de la "diode" de la rubrique coordonnées géographiques de la boîte 469 // en vert 470 334 471 GeographicCoordsWNP.s = IPS_OK; 472 473 // pas de message d'erreur dans la boîte 474 335 475 IDSetNumber(&GeographicCoordsWNP, NULL); 336 476 } 337 477 else 338 478 { 479 // quelque chose cloche 480 // peut-être l'une des veleurs saisies par l'utilisateur n'est-elle pas dans 481 // le bon intervalle ? ex : lat = 150° 482 483 // on change la couleur de la diode 484 339 485 GeographicCoordsWNP.s = IPS_ALERT; 486 487 // on affiche un message d'erreur 488 340 489 IDSetNumber(&GeographicCoordsWNP, "Latitude or Longitude missing or invalid"); 341 490 342 Latitude=0.0; 343 Longitude=0.0; 344 } 491 // on fixe arbitrairement les valeurs à 0 492 493 Latitude = 0.0; 494 Longitude = 0.0; 495 } 496 497 // c'est bon. On peut donc transmettre les nouvelles valeurs à la classe astro 498 // qui utilisera ces informations pur calculer l'azimut des objets et le tsl en particulier... 345 499 346 500 DefinirLongitudeLatitude(Longitude, Latitude); … … 355 509 if (!strcmp (name, EquatorialCoordsWNP.name)) 356 510 { 357 int i=0, nset=0, error_code=0; 358 double newRA =0, newDEC =0; 359 360 for (nset = i = 0; i < n; i++) 511 int i = 0, nset = 0; 512 513 double newRA =0.0, newDEC =0.0; 514 515 // nous avons le même principe de fonctionnement que pour les coordonnées géographiques 516 517 for (i = 0; i < n; i++) 361 518 { 362 519 INumber *eqp = IUFindNumber (&EquatorialCoordsWNP, names[i]); 520 363 521 if (eqp == &EquatorialCoordsWN[0]) 364 522 { 523 // on a compris que l'utilisateur avait changé l'ascension droite de l'objet 524 525 // on affecte la nouvelle valeur à newRA 526 365 527 newRA = values[i]; 528 529 // Est-ce que cette valeur est dans le bon intervalle ? 530 366 531 nset += newRA >= 0 && newRA <= 24.0; 367 532 } 368 533 else if (eqp == &EquatorialCoordsWN[1]) 369 534 { 535 //même chose pour la déclinaison 370 536 newDEC = values[i]; 537 371 538 nset += newDEC >= -90.0 && newDEC <= 90.0; 372 539 } … … 375 542 376 543 // si les coordonnées de l'objet sont correctes 544 377 545 if (nset == 2) 378 546 { … … 380 548 double targetAZ, targetAlt; 381 549 550 // On garde une trace des nouvelles coordonnées saisies par l'utilisateur 551 382 552 targetRA = newRA; 383 553 targetDEC = newDEC; 384 554 555 // on les affiches dans les logs 556 385 557 fs_sexa(RAStr, newRA, 2, 3600); 386 558 fs_sexa(DecStr, newDEC, 2, 3600); … … 392 564 393 565 ADDEC2Motor(newRA, newDEC); 566 567 // on déclenche le goto 394 568 395 569 if (process_coords() == false) 396 570 { 397 571 EquatorialCoordsWNP.s = IPS_ALERT; 572 398 573 IDSetNumber(&EquatorialCoordsWNP, NULL); 399 574 } … … 402 577 { 403 578 EquatorialCoordsWNP.s = IPS_ALERT; 579 404 580 IDSetNumber(&EquatorialCoordsWNP, "Error ! RA or Dec missing or invalid"); 405 581 } … … 407 583 return; 408 584 } 585 586 587 // =================================== 588 // Pression, Temperature 589 // =================================== 590 if (!strcmp (name, PressionTempWNP.name)) 591 { 592 int i = 0, nset = 0; 593 594 double newPression =0.0, newTemperature =0.0; 595 596 // nous avons le même principe de fonctionnement que pour les coordonnées géographiques 597 598 for (i = 0; i < n; i++) 599 { 600 INumber *eqp = IUFindNumber (&PressionTempWNP, names[i]); 601 602 if (eqp == &PressionTempWN[0]) 603 { 604 // on a compris que l'utilisateur avait changé l'ascension droite de l'objet 605 606 // on affecte la nouvelle valeur à newRA 607 608 newPression = values[i]; 609 610 // Est-ce que cette valeur est dans le bon intervalle ? 611 612 nset += newPression >= 0.0 && newPression <= 1500.0; 613 } 614 else if (eqp == &PressionTempWN[1]) 615 { 616 //même chose pour la déclinaison 617 newTemperature = values[i]; 618 619 nset += newTemperature >= -50.0 && newTemperature <= 50.0; 620 } 621 } 622 623 624 // si les coordonnées de l'objet sont correctes 625 626 if (nset == 2) 627 { 628 PressionTempWNP.s = IPS_OK; 629 630 IDSetNumber(&PressionTempWNP, NULL); 631 632 Pression = newPression; 633 Temp = newTemperature; 634 } 635 else 636 { 637 PressionTempWNP.s = IPS_ALERT; 638 639 IDSetNumber(&PressionTempWNP, "Error ! Bad values for pression or temperature"); 640 } 641 642 return; 643 } 644 409 645 410 646 // =================================== … … 413 649 if (!strcmp (name, ActualisationNP1.name)) 414 650 { 415 int i=0, nset=0, error_code=0; 416 double newAct1 =0; 417 418 for (nset = i = 0; i < n; i++) 651 // on a ici exactement le même fonctionnement que précédement 652 // on régle ici les valeurs des delais entre deux actualisations 653 // de la position en mode transit et tracking 654 // retourne un message d'erreur si les durées ne sont pas exprimées 655 // dans un intervalle > 0.0 et < 3600 656 657 double newAct1 = 1.0; 658 659 for (int i = 0; i < n; i++) 419 660 { 420 661 INumber *eqp = IUFindNumber (&ActualisationNP1, names[i]); 662 421 663 if (eqp == &ActualisationN1[0]) 422 664 { 423 665 newAct1 = values[i]; 424 666 425 if ( newAct1 >= 0.0 && newAct1 <= 3600.0)667 if ( newAct1 >= 0.0 && newAct1 <= 3600.0 ) 426 668 { 427 ActualisationTM 1= newAct1;669 ActualisationTMTransit = newAct1; 428 670 429 671 ActualisationNP1.s = IPS_OK; 672 430 673 IDSetNumber(&ActualisationNP1, NULL); 431 674 } … … 433 676 { 434 677 ActualisationNP1.s = IPS_ALERT; 678 435 679 IDSetNumber(&ActualisationNP1, "Error ! Delay invalid"); 436 680 } … … 441 685 if (!strcmp (name, ActualisationNP2.name)) 442 686 { 443 int i=0, nset=0, error_code=0; 444 double newAct2 =0; 445 446 for (nset = i = 0; i < n; i++) 687 double newAct2 = 1.0; 688 689 for (int i = 0; i < n; i++) 447 690 { 448 691 INumber *eqp = IUFindNumber (&ActualisationNP2, names[i]); 692 449 693 if (eqp == &ActualisationN2[0]) 450 694 { 451 695 newAct2 = values[i]; 452 696 453 if ( newAct2 >= 0.0 && newAct2 <= 3600.0)697 if ( newAct2 >= 0.0 && newAct2 <= 3600.0 ) 454 698 { 455 ActualisationTM 2= newAct2;699 ActualisationTMTracking = newAct2; 456 700 457 701 ActualisationNP2.s = IPS_OK; 702 458 703 IDSetNumber(&ActualisationNP2, NULL); 459 704 } … … 469 714 470 715 716 471 717 /************************************************************************************** 472 718 ** L'utilisateur clique sur l'un des boutons de la boîte Indi 719 ** 473 720 ***************************************************************************************/ 474 721 … … 513 760 514 761 // =================================== 762 // Alignment Set 763 // =================================== 764 if (!strcmp(name, AlignmentSP.name)) 765 { 766 if (IUUpdateSwitch(&AlignmentSP, states, names, n) < 0) 767 return; 768 769 currentSet = get_switch_index(&AlignmentSP); 770 AlignmentSP.s = IPS_OK; 771 IDSetSwitch(&AlignmentSP, NULL); 772 773 for (int i=0; i<MAXALIGNEMENTANTENNE; i++) 774 { 775 switch (currentSet) 776 { 777 case 1 : 778 Sockets[i].AlignementAntenne->MethodeAlignement = SIMPLE; 779 break; 780 case 2 : 781 Sockets[i].AlignementAntenne->MethodeAlignement = AFFINE; 782 break; 783 case 3 : 784 Sockets[i].AlignementAntenne->MethodeAlignement = TAKI; 785 break; 786 } 787 } 788 789 return; 790 } 791 792 // =================================== 515 793 // Abort slew 516 794 // =================================== 517 795 if (!strcmp (name, AbortSlewSP.name)) 518 796 { 519 Abort =true;797 Abort = true; 520 798 521 799 IUResetSwitch(&AbortSlewSP); … … 568 846 ** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept 569 847 ** qui est bloquante. 848 ** 570 849 ***************************************************************************************/ 571 850 … … 590 869 IDLog("\n");*/ 591 870 } 592 593 sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier 871 872 sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier 594 873 } 595 874 while (!Exit); … … 617 896 ** Le retour de la commande P est POSITION/valeur_az/valeur_alt/ 618 897 ** ExtractPosition retourne donc Valeur_az et Valeur_alt 898 ** 619 899 ***************************************************************************************/ 620 900 … … 633 913 if (pos != string::npos) 634 914 { 635 result->x = atol( str2.substr(0, pos).c_str());636 637 result->y = atol( str2.substr(pos + 1).c_str());638 639 640 } 641 } 915 result->x = atol( str2.substr(0, pos).c_str() ); 916 917 result->y = atol( str2.substr(pos + 1).c_str() ); 918 919 return true; 920 } 921 } 642 922 643 923 IDLog((str +" failed !\n").c_str()); … … 649 929 650 930 /************************************************************************************ 651 * cette procédure convertit les coordonnées équatoriales de l'objet visé 652 * en unités de codeurs des paraboles (nb de tours des deux axes moteurs depuis la position PARK) 931 ** Cette procédure, aprÚs avoir appliqué la matrice de rotation aux coordonnées 932 ** visées par l'utilisateur, convertit les coordonnées équatoriales de l'objet visé 933 ** en unités de codeurs des paraboles 934 ** (cà d en nb de tours des deux axes moteurs depuis la position PARK) 935 ** 653 936 ************************************************************************************/ 654 937 … … 657 940 double targetAz; 658 941 double targetAlt; 942 double newRA2 = newRA * 15.0 * Pidiv180; 943 double newDEC2 = newDEC * Pidiv180; 659 944 char AzStr[32]; 660 945 char AltStr[32]; 661 662 663 // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation) 664 665 Azimut( newRA * 15.0 * Pidiv180, newDEC * Pidiv180, &targetAz, &targetAlt); 666 667 // Correction de la réfraction atmosphérique 668 669 targetAlt = RefractionAtmospherique(targetAlt); 670 671 // Petit calcul pour faire en sorte que le sud soit à 0° d'azimut 672 673 targetAz = VerifAngle( targetAz + Pi ); 674 675 // On convertit les angles précédents en degrés 676 677 targetAlt *= N180divPi; 678 targetAz *= N180divPi; 679 680 // Affichage dans les logs 681 682 fs_sexa(AzStr, targetAz, 2, 3600); 683 fs_sexa(AltStr, targetAlt, 2, 3600); 684 685 IDLog("Horizontal coords : Az = %s Alt = %s\n", AzStr, AltStr); 686 687 688 //Conversion des deux angles en pas codeurs 689 690 if ( targetAlt < 30.0 ) 691 { 692 // L'objet est trop bas (<30°). On annule le suivi... 693 694 IDSetSwitch(&OnCoordSetSP, "Erreur ! L objet suivi est situe a moins de 30° au-dessus de l horizon. Goto annule."); 695 696 Suivi = false; 697 698 ActualisationPosition = false; 699 700 InitAntennes(); 701 } 702 else 703 { 704 // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger 705 // la hauteur en appliquant hauteur=180°-hauteur 706 707 if (targetAlt > 90.0) 708 { 709 targetAlt = 180.0 - targetAlt; 710 targetAz += 180.0; 711 } 712 713 // On applique la formule de Marc pour convertir la hauteur en nombre de pas codeur alt 714 715 double I0 = 81.0; 716 double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 ); 717 718 double Codalt = (sqrt(I2) - I0) / 0.078947; 719 720 721 TargetPosition.y = (int) Arrondi(Codalt); 722 723 //4000 pas pour 360° sur l'axe az 724 725 TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0); 726 727 IDLog("Nbre de pas codeurs Az = %i Alt = %i\n", TargetPosition.x, TargetPosition.y); 728 } 729 } 730 731 732 /************************************************************************************** 733 ** Le fichier file existe-t-il et n'est-il pas vide ? 734 **************************************************************************************/ 735 736 bool BAO::is_readable( const std::string & file ) 737 { 738 std::ifstream fichier( file.c_str() ); 739 if (fichier.fail()) return false; 740 741 // sauvegarder la position courante 742 long pos = fichier.tellg(); 743 // se placer en fin de fichier 744 fichier.seekg( 0 , std::ios_base::end ); 745 // récupérer la nouvelle position = la taille du fichier 746 long size = fichier.tellg() ; 747 // restaurer la position initiale du fichier 748 fichier.seekg( pos, std::ios_base::beg ) ; 749 return size ; 750 } 751 752 753 /************************************************************************************** 754 ** Chargement des paramÚtres d'alignement des antennes 755 **************************************************************************************/ 756 757 bool BAO::ChargementParametresAlignement(string fileName) 758 { 759 string value; 760 761 stringstream os; 762 763 char *delta_az = NULL; 764 765 char *delta_ha = NULL; 766 767 if (!is_readable(fileName)) return false; 768 769 //IDLog("Chargement du fichier d alignement des antennes %s\n", fileName.c_str()); 770 771 //Chargement des corrections des antennes 772 946 Coord result, vect; 947 948 // Pour toutes les antennes connectées 949 773 950 for (int i=0; i<SocketsNumber; i++) 774 951 { 952 // On vérifie qu'elles sont encore connectées 953 775 954 if (Sockets[i].Connected) 776 955 { 777 os << "Alignement antenne ip x.x.x." << Sockets[i].IP.substr(Sockets[i].IP.rfind(".")+1); 778 779 value="delta_az"; 780 781 if (readINI((char*)os.str().c_str(), (char*)value.c_str(), &delta_az, (char*)fileName.c_str())) 782 783 value="delta_ha"; 784 785 if (readINI((char*)os.str().c_str(), (char*)value.c_str(), &delta_ha, (char*)fileName.c_str())) 786 787 if (delta_az && delta_ha) 956 newRA = newRA2; 957 newDEC = newDEC2; 958 959 // Dans les modes d'alignement AFFINE et TAKI, on applique la matrice de correction 960 // sur les coordonnées horaires de l'objet visé 961 962 // il faut vérifier auparavent que la matrice de rotation est disponible 963 // pour l'antenne i 964 965 if (Sockets[i].AlignementAntenne->Matrice_ok) 788 966 { 789 // Si les corrections de l'antenne i ont été modifiées depuis le démarrage du programme 790 // -> on les applique... 791 if (Sockets[i].Delta.x != atol(delta_az) || Sockets[i].Delta.y != atol(delta_ha)) 792 { 793 Sockets[i].Delta.x = atol(delta_az); 794 795 Sockets[i].Delta.y = atol(delta_ha); 796 797 IDLog("Correction antenne ip %s deltaAz=%i deltaHa=%i\n", Sockets[i].IP.c_str(), Sockets[i].Delta.x, Sockets[i].Delta.y); 798 } 967 // On est bien dans le cas de l'allignement AFFINE ou Taki 968 969 if (Sockets[i].AlignementAntenne->MethodeAlignement == AFFINE || 970 Sockets[i].AlignementAntenne->MethodeAlignement == TAKI) 971 { 972 // On crée un vecteur avec pour coordonnées 973 // x = Angle horaire de l'objet visé 974 // y = déclainaison de l'objet 975 // z = 1.0 976 // Voir la documentation pour plus d'explications sur le calcul affine/taki 977 978 vect.x = VerifAngle( newRA2 - GetTSL() ); 979 vect.y = newDEC2; 980 vect.z = 1.0; 981 982 // Message pour l'utilisateur et les logs 983 984 IDLog("Application de la matrice AFFINE/TAKI\nCoordonnees initiales: AD = %s Dec = %s\n", DHMS(newRA2*N180divPi, true ).c_str(), 985 DHMS(newDEC2*N180divPi, false ).c_str()); 986 987 // On applique la matrice de transformation 988 989 switch (Sockets[i].AlignementAntenne->MethodeAlignement) 990 { 991 case AFFINE : 992 Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionAffine(&result, vect); 993 break; 994 case TAKI : 995 Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionTaki( &result, vect); 996 break; 997 } 998 999 // On récupÚre les nouvelles coordonnées. z ne nous intéresse pas 1000 1001 newRA = VerifAngle(result.x+GetTSL()); 1002 newDEC = result.y; 1003 1004 IDLog("Coordonnees finales: AD = %s Dec = %s\n", DHMS(newRA*N180divPi, true ).c_str(), 1005 DHMS(newDEC*N180divPi, false ).c_str()); 1006 } 799 1007 } 800 801 if (delta_az) { 802 delete [] delta_az; 803 delta_az=NULL; 1008 else 1009 { 1010 if (Sockets[i].AlignementAntenne->AlignementEnCours) 1011 { 1012 // Si la matrice n'est pas prête, c'est que la procédure d'alignement de l'antenne i n'est pas encore achevée. 1013 // On se contente ici d'appliquer des deltas en ascension droite et en déclinaison. Ces deltas sont envoyés de BAOcontrol 1014 // au driver indi_BAO par l'intermédiaire du fichier AlignementAntennes.cfg 1015 // Consultez la documentation pour comprendre le principe de fonctionnement de l'alignement et de la communication 1016 // entre les deux programmes 1017 1018 newRA = VerifAngle(newRA2 + Sockets[i].AlignementAntenne->delta_ad[Sockets[i].AlignementAntenne->nbrcorrections] * PasDeltaAD); 1019 newDEC = newDEC2 + Sockets[i].AlignementAntenne->delta_de[Sockets[i].AlignementAntenne->nbrcorrections] * PasDeltaDe; 1020 1021 IDLog("Alignement en cours.\nDelta RA=%i delta Dec=%i\n", Sockets[i].AlignementAntenne->delta_ad[Sockets[i].AlignementAntenne->nbrcorrections], Sockets[i].AlignementAntenne->delta_de[Sockets[i].AlignementAntenne->nbrcorrections]); 1022 IDLog("Nouvelles Coordonnées AD =%s Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str()); 1023 } 804 1024 } 805 806 if (delta_ha) { 807 delete [] delta_ha; 808 delta_ha=NULL; 1025 IDLog("Nouvelles Coordonnées AD =%s Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str()); 1026 1027 1028 // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation) 1029 1030 Azimut( newRA, newDEC, &targetAz, &targetAlt); 1031 1032 // Si la méthode d'alignement est la méthode SIMPLE, alors on doit cette fois-ci appliquer la matrice 1033 // de correction au coordonnées horizontales et non aux coordonnées horaires comme ce que nous 1034 // avons vu plus haut 1035 1036 if (Sockets[i].AlignementAntenne->Matrice_ok && Sockets[i].AlignementAntenne->MethodeAlignement == SIMPLE) 1037 { 1038 // AprÚs s'être assurer que nous utilisons la méthode SIMPLE et que la matrice de rotation est ok 1039 1040 IDLog("Application de la matrice SIMPLE\nCoordonnees initiales: Azi = %s Haut = %s\n", DHMS(targetAz*N180divPi, false ).c_str(), 1041 DHMS(targetAlt*N180divPi, false ).c_str()); 1042 1043 // On constitue un vecteur vect 1044 // Les coordonnées du vecteur correspondont à la position 1045 // d'un point sur une sphÚre de rayon 1 1046 // avec une latitude = targetAlt et une longitude=targetAz 1047 // on reconnait bien les formules de passage des coordonnées 1048 // sphériques aux coordonnées rectangulaires 1049 1050 1051 1052 vect.x = cos(targetAz) * cos(targetAlt); 1053 vect.y = sin(targetAz) * cos(targetAlt); 1054 vect.z = sin(targetAlt); 1055 1056 1057 // Application de la matrice SIMPLE 1058 1059 Sockets[i].AlignementAntenne->AppliquerMatriceCorrectionSimple(&result, vect); 1060 1061 1062 // Là on doit repasser des coordonnées rectangulaires 1063 // aux coordonnées sphériques 1064 1065 if (result.x != 0.0) 1066 { 1067 targetAz = atan( result.y / result.x ); 1068 1069 if (result.x < 0) targetAz+=Pi; 1070 } 1071 else targetAz = Pidiv2; 1072 1073 targetAz = VerifAngle(targetAz); 1074 1075 targetAlt = asin(result.z); 1076 1077 1078 IDLog("Coordonnees finales: Azi = %s Haut = %s\n", DHMS(targetAz*N180divPi, false ).c_str(), 1079 DHMS(targetAlt*N180divPi, false ).c_str()); 809 1080 } 810 1081 811 os.str(""); 812 } 813 } 814 815 return true; 816 } 1082 // Application du delta en azimut (préalablement réglé sur la polaire) 1083 // Correspond à la variable AlignementAntenne->delta_az_polar 1084 // Ne s'applique que pour les alignements AFFINE et TAKI 1085 1086 if (Sockets[i].AlignementAntenne->MethodeAlignement != SIMPLE) targetAz += Sockets[i].AlignementAntenne->delta_az_polar * PasDeltaAD; 1087 1088 // Correction de la réfraction atmosphérique 1089 1090 targetAlt = RefractionAtmospherique(targetAlt); 1091 1092 // On ajoute Pi pour que le sud soit à 0° d'azimut 1093 1094 targetAz = VerifAngle( targetAz + Pi ); 1095 1096 // On convertit les angles précédents en degrés 1097 1098 targetAlt *= N180divPi; 1099 targetAz *= N180divPi; 1100 1101 // Affichage dans les logs 1102 1103 fs_sexa(AzStr, targetAz, 2, 3600); 1104 fs_sexa(AltStr, targetAlt, 2, 3600); 1105 1106 IDLog("Coordonnees horizontales finales: Azi = %s Haut= %s\n", AzStr, AltStr); 1107 1108 1109 //Conversion des deux angles en pas codeurs 1110 1111 if ( targetAlt < HAUTMIN ) 1112 { 1113 // L'objet est trop bas ( < 30°). On annule le suivi... 1114 1115 IDSetSwitch(&OnCoordSetSP, "Erreur ! L objet suivi est situe a moins de 30 deg au-dessus de l horizon. Goto annule."); 1116 1117 Suivi = false; 1118 1119 RealisationGoto = false; 1120 1121 InitAntennes(); 1122 1123 return; 1124 } 1125 else 1126 { 1127 // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger 1128 // la hauteur en appliquant hauteur=180°-hauteur 1129 1130 if (targetAlt > 90.0) 1131 { 1132 targetAlt = 180.0 - targetAlt; 1133 targetAz += 180.0; 1134 } 1135 1136 // On applique la formule de Marc pour convertir la hauteur en nombre de pas codeur alt 1137 1138 Sockets[i].TargetPosition.y = (int) Arrondi( Alt2Motor( targetAlt ) ); 1139 1140 //4000 pas pour 360° sur l'axe az 1141 1142 Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0); 1143 1144 // Message de debug 1145 1146 IDLog("Nbre de pas codeurs Az = %i Alt = %i\n", Sockets[i].TargetPosition.x, Sockets[i].TargetPosition.y); 1147 } 1148 } 1149 } 1150 } 1151 817 1152 818 1153 819 1154 /************************************************************************************ 820 * Retourne le nombre d'antennes connectées821 * 1155 * Retourne le nombre d'antennes actuellement connectées 1156 * 822 1157 ************************************************************************************/ 823 1158 … … 830 1165 return num; 831 1166 } 1167 832 1168 833 1169 … … 839 1175 void BAO::DeconnecterSocket(int num) 840 1176 { 841 IDLog("Deconnexion de l antenne : %s\n", Sockets[num].IP.c_str());1177 if (Sockets[num].Connected) IDLog("Deconnexion de l antenne : %s\n", Sockets[num].IP.c_str()); 842 1178 Sockets[num].new_sock.shutdown(); 843 1179 Sockets[num].Connected = false; 844 1180 Sockets[num].IP = ""; 845 1181 } 1182 1183 846 1184 847 1185 … … 877 1215 gettimeofday(&tv, &tz); 878 1216 879 double Annee =(double)(date.tm_year+1900);880 double Mois =(double)(date.tm_mon+1);881 double Jour =(double)date.tm_mday;882 double Heu =(double)date.tm_hour;883 double Min =(double)date.tm_min;884 double Sec =(double)date.tm_sec+tv.tv_usec/1.0E6;885 double UTCP =0.0;//(double)date.tm_isdst;1217 double Annee = (double)(date.tm_year + 1900); 1218 double Mois = (double)(date.tm_mon + 1); 1219 double Jour = (double)date.tm_mday; 1220 double Heu = (double)date.tm_hour; 1221 double Min = (double)date.tm_min; 1222 double Sec = (double)date.tm_sec+tv.tv_usec/1.0E6; 1223 double UTCP = 0.0;//(double)date.tm_isdst; 886 1224 887 1225 // On transmet la date et l'heure à la classe Astro … … 892 1230 893 1231 CalculTSL(); 894 } 895 896 // On chargement les paramÚtres de corrections des antennes toutes les secondes 897 898 if ( compt%1000 == 0 ) ChargementParametresAlignement("/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg"); 1232 1233 1234 // On charge les paramÚtres de correction des antennes toutes les demi-secondes 1235 1236 if ( compt%500 == 0 && tv.tv_usec/1.0E6 > 0.5 ) 1237 { 1238 for (int i=1; i<SocketsNumber; i++) 1239 { 1240 if (Sockets[i].Connected) 1241 { 1242 // Si l'antenne i est connectée, on charge les paramÚtres 1243 Sockets[i].AlignementAntenne->TransmettreParametresClasseAstro(Annee, Mois, Jour, Heu, Min, Sec, Longitude, Latitude, Pression, Temp); 1244 1245 Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180); 1246 } 1247 } 1248 } 1249 } 1250 899 1251 900 1252 … … 946 1298 // on garde en stock la deuxiÚme partie de la trame 947 1299 // pour un traitement ultérieur 1300 948 1301 buffereponse = reponse.substr(pos + 1); 949 1302 950 1303 // Partie traitée 1304 951 1305 reponse = reponse.substr(0, pos); 952 953 IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str()); 1306 1307 // on l'affiche dans le log 1308 1309 IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str()); 954 1310 955 1311 // On vérifie ici les acknowledges 1312 956 1313 if ((reponse.find("ACK") != string::npos) && (reponse.find("NACK") == string::npos)) 957 1314 { 958 1315 if (reponse.find("POSITION") != string::npos) 959 1316 { 960 Sockets[i].ack_pos =true;1317 Sockets[i].ack_pos = true; 961 1318 } 962 1319 else if (reponse.find("GOTO") != string::npos) 963 1320 { 964 Sockets[i].ack_goto =true;1321 Sockets[i].ack_goto = true; 965 1322 } 966 1323 else if (reponse.find("PARK") != string::npos) 967 1324 { 968 Sockets[i].ack_park =true;1325 Sockets[i].ack_park = true; 969 1326 } 970 1327 else if (reponse.find("ABORT")!= string::npos) 971 1328 { 972 Sockets[i].ack_abort =true;1329 Sockets[i].ack_abort = true; 973 1330 } 974 1331 } 975 1332 else 976 1333 { 977 // réponse à la requête POSITION1334 // Réponse à la requête POSITION 978 1335 979 1336 if (reponse.find("POSITION") != string::npos) 980 1337 { 1338 // Il y a une erreur signalée par le microcontroleur 1339 981 1340 if (reponse.find("NACK") != string::npos) 982 1341 { 983 //problÚme concernant la commande P 1342 // ProblÚme concernant la commande P 1343 // On affiche dans la boîte indi un voyant de couleur rouge 1344 // et on affiche un message d'erreur 1345 984 1346 OnCoordSetSP.s = IPS_ALERT; 1347 985 1348 IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : position de l antenne inconnue !\n", 986 1349 Sockets[i].IP.c_str()); 1350 1351 // La position de l'antenne st donc inconnue 1352 987 1353 Sockets[i].PosValides = false; 988 // Si la position de l'antenne est inconnue, on déconnecte l'antenne 1354 1355 // On déconnecte l'antenne 1356 989 1357 Sockets[i].Connected = false; 990 1358 } 991 1359 else if (Sockets[i].ack_pos) 992 { 993 if ( Sockets[i].PosValides = (ExtractPosition(reponse, &Sockets[i].Pos) == true) ) 994 { 995 OnCoordSetSP.s = IPS_OK; 996 IDSetSwitch(&OnCoordSetSP, "Antenne %s : POSITION OK (x=%i, y=%i)\n", 997 Sockets[i].IP.c_str(), Sockets[i].Pos.x, Sockets[i].Pos.y); 998 } 999 else 1000 { 1001 OnCoordSetSP.s = IPS_ALERT; 1002 IDSetSwitch(&OnCoordSetSP, "Antenne %s : La position n est pas valide !\n", 1003 Sockets[i].IP.c_str()); 1004 } 1005 1360 { 1361 // La position devrait être valide si on arrive ici... 1362 1363 if ( Sockets[i].PosValides = (ExtractPosition(reponse, &Sockets[i].Pos) == true) ) 1364 { 1365 // La fonction extractPositon confirme que les positions transmises 1366 // par le microcontrÃŽleur sont valides 1367 1368 OnCoordSetSP.s = IPS_OK; 1369 1370 // message dans les logs 1371 1372 IDSetSwitch(&OnCoordSetSP, "Antenne %s : POSITION OK (x=%i, y=%i)\n", 1373 Sockets[i].IP.c_str(), Sockets[i].Pos.x, Sockets[i].Pos.y); 1374 } 1375 else 1376 { 1377 // Erreur repérée par la fonction ExtractPosition 1378 1379 OnCoordSetSP.s = IPS_ALERT; 1380 1381 // On en informe l'utilisateur 1382 1383 IDSetSwitch(&OnCoordSetSP, "Antenne %s : La position n est pas valide !\n", 1384 Sockets[i].IP.c_str()); 1385 } 1006 1386 } 1007 1387 } … … 1013 1393 if (reponse.find("NACK") != string::npos) 1014 1394 { 1395 // Une erreur est retournée par le microcontroleur concernant la commande Park 1396 // On affiche le voyant Park en rouge dans la boîte indi... 1397 1015 1398 ParkSP.s = IPS_ALERT; 1399 1400 // ... et on affiche un message d'erreur 1401 1016 1402 IDSetSwitch(&ParkSP, "ALERTE antenne %s : erreur PARK !\n", Sockets[i].IP.c_str()); 1017 1403 } 1018 1404 else if (Sockets[i].ack_park && reponse.find("OK")!=string::npos) 1019 1405 { 1406 // PARK ok ! 1407 1020 1408 ParkSP.s = IPS_OK; 1409 1021 1410 IDSetSwitch(&ParkSP, "Antenne %s : PARK OK\n", Sockets[i].IP.c_str()); 1022 1411 } … … 1029 1418 if (reponse.find("NACK") != string::npos) 1030 1419 { 1420 // Une erreur est retournée par le microcontroleur concernant la commande Abort 1421 // On affiche le voyant Park en rouge dans la boîte indi... 1422 1031 1423 AbortSlewSP.s = IPS_ALERT; 1424 1425 // ... et on affiche un message d'erreur 1426 1032 1427 IDSetSwitch(&AbortSlewSP, "ALERTE antenne %s : erreur ABORT !\n", Sockets[i].IP.c_str()); 1033 1428 } 1034 1429 else if (Sockets[i].ack_abort && reponse.find("OK")!=string::npos) 1035 1430 { 1431 // OK ! 1432 1036 1433 AbortSlewSP.s = IPS_OK; 1434 1037 1435 IDSetSwitch(&AbortSlewSP, "Antenne %s : ABORT OK\n", Sockets[i].IP.c_str()); 1038 1436 } 1039 1040 1437 } 1041 1438 … … 1046 1443 if (reponse.find("NACK") != string::npos) 1047 1444 { 1445 // Une erreur est retournée par le microcontroleur concernant la commande Goto 1446 // On affiche le voyant Park en rouge dans la boîte indi... 1447 1048 1448 OnCoordSetSP.s = IPS_ALERT; 1449 1450 // Message d'erreur 1451 1049 1452 IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : Erreur GOTO !\n", Sockets[i].IP.c_str()); 1453 1454 // On déconnecte l'antenne. Elle ne semble pas en mesure d'executer les ordres goto 1455 1050 1456 DeconnecterSocket(i); 1051 1457 } … … 1061 1467 Sockets[i].GotoOk = true; 1062 1468 1469 // Voyant en vert dans la boîte Indi 1470 1471 OnCoordSetSP.s = IPS_OK; 1472 1063 1473 // Message pour l'utilisateur 1064 1065 OnCoordSetSP.s = IPS_OK; 1474 1066 1475 IDSetSwitch(&OnCoordSetSP, "Antenne %s : GOTO OK.\n", Sockets[i].IP.c_str()); 1067 1476 1068 1477 // Fin du Goto pour toutes les antennes ? 1069 1070 int num=0; 1478 // On compte les antennes connectées qui ont réalisé le dernier ordre goto 1479 1480 int num = 0; 1071 1481 1072 1482 for (int j=1; j<SocketsNumber; j++) 1073 1074 1483 { 1484 if (Sockets[j].Connected) 1075 1485 { 1076 1486 if (Sockets[j].GotoOk) num++; 1077 1487 } 1078 } 1488 } 1489 1490 // Si le nombre d'antennes connectées est >0 1491 // et que toutes les antennes connectées ont 1492 // réalisé le goto alors... 1079 1493 1080 1494 if ((num == AntennesConnectees()) && (num>0)) 1081 1495 { 1082 1496 // C'est bon ! Tout marche bien... 1083 1497 // On actualise l'AR et la dec dans la boîte de dialogue 1084 1498 … … 1086 1500 lastDEC = targetDEC; 1087 1501 1088 // On a fini le mouvement. On attend le prochain goto... 1089 1090 ActualisationPosition=false; 1502 // On a fini le mouvement. Il n'y a donc plus d'étape à faire 1503 // dans le processus de réalisation d'un goto 1504 // RealisationGoto vaut donc false 1505 1506 RealisationGoto = false; 1091 1507 1092 1508 // Réinitialisation des paramÚtres des antennes en vue d'un prochain goto … … 1095 1511 1096 1512 // On dessine les voyants de la boîte de dialogue en vert 1513 1097 1514 OnCoordSetSP.s = IPS_OK; 1098 1515 EquatorialCoordsWNP.s = IPS_OK; … … 1100 1517 1101 1518 // Confirmation dans la boîte de dialogue que toutes 1102 // les antennes sont OK 1103 OnCoordSetSP.s = IPS_OK; 1519 // les antennes sont OK 1520 1104 1521 IDSetSwitch(&OnCoordSetSP, "GOTO OK !"); 1105 1106 UpdateGoto=true;1107 } 1522 1523 UpdatedGoto = true; 1524 } 1108 1525 } 1109 1526 } … … 1113 1530 // On passe à la trame suivante si memreponse n'est pas vide 1114 1531 1115 reponse =buffereponse;1116 pos =reponse.find("\n");1532 reponse = buffereponse; 1533 pos = reponse.find("\n"); 1117 1534 } 1118 1535 } 1119 1536 catch (SocketException& e) //Aïe 1120 1537 { 1538 // Une exception concerne le socket i 1539 1540 // On déconnecte l'antenne pour plus de sécurité 1541 1121 1542 DeconnecterSocket(i); 1122 1543 … … 1141 1562 // pour réaliser un goto 1142 1563 1143 ActualisationPosition= false;1564 RealisationGoto = false; 1144 1565 1145 1566 // On envoie l'ordre ABORT à toutes les antennes … … 1153 1574 } 1154 1575 1576 // Message à destination de l'utilisateur et des logs 1577 1155 1578 IDSetSwitch(&OnCoordSetSP, "ABORT OK !"); 1156 1579 … … 1161 1584 //Pour permettre de refaire un abort 1162 1585 1163 Abort =false;1586 Abort = false; 1164 1587 } 1165 1588 … … 1176 1599 // pour réaliser un goto 1177 1600 1178 ActualisationPosition= false;1601 RealisationGoto = false; 1179 1602 1180 1603 // On envoie l'ordre PARK à toutes les antennes … … 1196 1619 //Pour permettre de refaire un park 1197 1620 1198 Park =false;1621 Park = false; 1199 1622 } 1200 1623 … … 1203 1626 // Gestion du suivi 1204 1627 1205 if ((Suivi) && (Update Goto))1628 if ((Suivi) && (UpdatedGoto)) 1206 1629 { 1207 1630 // Délais entre deux actualisations 1208 1631 1209 double delai =ActualisationTM1 / 3600.0 / 24.0; // Actualisation toutes les 15 minutes en mode transit1210 1211 if (TrackingMode ==2) delai=ActualisationTM2 / 3600.0 / 24.0; //et 5 secs en mode tracking1632 double delai = ActualisationTMTransit / 3600.0 / 24.0; // Actualisation toutes les 15 minutes en mode transit (par défaut) 1633 1634 if (TrackingMode == 2) delai = ActualisationTMTracking / 3600.0 / 24.0; //et 5 secs en mode tracking (par défaut) 1212 1635 1213 1636 … … 1216 1639 if (GetJJ() - JJAnc > delai) 1217 1640 { 1218 UpdateGoto = false; 1641 // Cette variable vaudra true lorsque le goto aura été réalisé 1642 1643 UpdatedGoto = false; 1219 1644 1220 1645 // Conversion des coordonnées en pas moteur … … 1226 1651 InitAntennes(); 1227 1652 1228 ActualisationPosition = true; 1653 // On lance le processus d'actualisation du goto 1654 1655 RealisationGoto = true; 1229 1656 1230 1657 // On sauvegarde la date … … 1243 1670 if (Suivi) IDLog("Arrêt du suivi !"); 1244 1671 1245 ActualisationPosition=false;1672 RealisationGoto=false; 1246 1673 1247 1674 Suivi=false; … … 1254 1681 1255 1682 1256 // Exécution de la procédure complÚte de lecture de la position de l'antenne 1257 // puis envoi d'une commande Goto 1258 1259 if (ActualisationPosition) 1683 // Exécution de la procédure complÚte d'un goto : 1684 // 1Úre étape : envoi de la commande POSITION à toutes les antennes 1685 // 2Úme étape : Vérification de l'acknowledge de la commande POSITION pour chaque antenne 1686 // 3Úme étape : Les positions retournées par les antennes sont-elles valides ? 1687 // 4Úme étape : Si oui, envoie de la commande goto à toutes les antennes 1688 // 5Úme étape : est-ce que toutes les antennes ont envoyé l'acknowledge de la commande goto ? 1689 // 6Úme étape : les antennes ont toutes répondu GOTO OK ! 1690 1691 if (RealisationGoto) 1260 1692 { 1261 1693 for (int i=1; i<SocketsNumber; i++) 1262 1694 { 1695 // On ne parle qu'aux antennes connectées 1696 1263 1697 if (Sockets[i].Connected) 1264 1698 { 1699 // En fonction de l'étage de la réalisation d'un goto par l'antenne i 1700 1265 1701 switch (Sockets[i].etape) 1266 1702 { 1267 1703 1268 // Envoi de la commande POS1704 // Envoi de la commande POS 1269 1705 1270 1706 case 0 : 1271 1707 { 1708 // On doit intialiser l'acknowledge à false 1709 1272 1710 Sockets[i].ack_pos = false; 1711 1712 // et considérer que la position de l'antenne n'est pas valide 1713 1273 1714 Sockets[i].PosValides = false; 1274 1715 1716 // avant d'envoyer l'ordre POSITION 1717 1275 1718 if (!POSITION(i)) Sockets[i].sendalertes++; 1719 1720 // On passe à l'étage suivante 1276 1721 1277 1722 Sockets[i].etape++; … … 1286 1731 if (Sockets[i].ack_pos) 1287 1732 { 1288 // tout marche bien 1733 // tout marche bien. On a bien reçu l'acknowledge de l'antenne i 1734 1735 // Il n'y a donc aucune attente supplémentaire pour recevoir la réponse 1289 1736 Sockets[i].AttenteExecution = 0; 1737 1738 // Pas d'anomalie à consigner 1290 1739 Sockets[i].AnomaliesExecution = 0; 1740 1741 // On passe à l'étape suivante 1291 1742 Sockets[i].etape++; 1292 i--; //permet de revenir sur ce même socket malgré la boucle 1293 // -> plus rapide 1743 1744 //permet de rester sur le même socket malgré la boucle -> plus rapide 1745 i--; 1294 1746 } 1295 1747 else 1296 1748 { 1297 // on réitÚre l'ordre précédent si rien ne se passe1749 // On réitÚre l'ordre précédent si rien ne se passe 1298 1750 1299 1751 // On garde une trace de l'anomalie 1752 1300 1753 Sockets[i].AttenteExecution++; 1301 1754 1302 1755 if (Sockets[i].AttenteExecution > MAXATTENTE) 1303 1756 { 1304 // on recommence depuis le début 1757 // on recommence depuis le début. 1758 // Peut-être que l'antenne n'a pas reçu l'ordre ? 1305 1759 Sockets[i].etape = 0; 1306 1760 Sockets[i].AttenteExecution = 0; 1761 1762 // Pas de réponse. On consigne une erreur grave 1307 1763 Sockets[i].AnomaliesExecution++; 1308 1764 } 1309 1765 1310 // Toujours rien -> plus sérieux : il faut déconnecter l'antenne 1766 // Les erreurs graves s'accumulent. Pas de réponse aprÚs plusieurs minutes 1767 // Il faut déconnecter l'antenne 1311 1768 if (Sockets[i].AnomaliesExecution > MAXANOMALIES) 1312 1769 { 1313 OnCoordSetSP.s = IPS_ALERT; 1770 //Voyant en rouge dans la boîte Indi 1771 1772 OnCoordSetSP.s = IPS_ALERT; 1773 1774 //Message à l'attentnio de l'utilisateur 1314 1775 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre POSITION. \ 1315 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1776 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1777 1778 // On déconnecte l'antenne 1316 1779 DeconnecterSocket(i); 1317 1780 } … … 1327 1790 if (Sockets[i].PosValides) 1328 1791 { 1792 // Tout vas bien 1793 // On ne consigne aucune anomalie 1329 1794 Sockets[i].AttenteExecution = 0; 1330 1795 Sockets[i].AnomaliesExecution = 0; 1331 Sockets[i].etape++; // on passe à l'étape suivante 1796 1797 //On passe à l'étape suivante 1798 Sockets[i].etape++; 1332 1799 } 1333 1800 else 1334 1801 { 1335 1802 // on réitÚre l'ordre précédent si rien ne se passe 1803 1336 1804 Sockets[i].AttenteExecution++; 1337 1805 1338 1806 if (Sockets[i].AttenteExecution > MAXATTENTE) 1339 1807 { 1340 // on attend encore la réponse posvalides 1808 // on attend encore la réponse posvalides 1809 1341 1810 Sockets[i].etape = 2; 1342 1811 Sockets[i].AttenteExecution = 0; 1812 1813 // On consigne une erreur grave. L'antenne tarde à répondre 1343 1814 Sockets[i].AnomaliesExecution++; 1344 1815 } 1345 1816 1817 // Aucune réponse de l'antenne depuis plusieurs minutes 1818 // On la déconnecte 1346 1819 if (Sockets[i].AnomaliesExecution > MAXANOMALIES) 1347 1820 { 1348 OnCoordSetSP.s = IPS_ALERT; 1821 // Voyant en rouge 1822 1823 OnCoordSetSP.s = IPS_ALERT; 1824 1825 //Message d'erreur 1349 1826 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : la position retournee n est pas valide. \ 1350 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1827 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1828 1829 //Déconnexion de l'antenne 1351 1830 DeconnecterSocket(i); 1352 1831 } … … 1354 1833 } 1355 1834 break; 1835 1836 1837 1838 // On peut remarquer qu'il n'y a pas de case 3 ici... 1839 // L'envoie de la commande goto se fait portant pendant l'étape 3 en dehors du switch 1840 // Voir le code plus loin... 1356 1841 1357 1842 … … 1373 1858 if (Sockets[i].AttenteExecution > MAXATTENTE) 1374 1859 { 1375 // On prolonge l'attente 1860 // On prolonge l'attente pour recevoir l'acknowledge du goto 1376 1861 Sockets[i].etape = 4; 1377 1862 Sockets[i].AttenteExecution = 0; … … 1381 1866 if (Sockets[i].AnomaliesExecution > MAXANOMALIES) 1382 1867 { 1383 OnCoordSetSP.s = IPS_ALERT; 1384 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre GOTO. \ 1385 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1868 OnCoordSetSP.s = IPS_ALERT; 1869 1870 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre GOTO. Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1871 1386 1872 DeconnecterSocket(i); 1387 1873 } … … 1397 1883 if (Sockets[i].GotoOk) 1398 1884 { 1885 // On a bien reçu Goto Ok pour l'antenne i ! 1886 1399 1887 Sockets[i].AttenteExecution = 0; 1400 1888 Sockets[i].AnomaliesExecution = 0; 1889 1890 //On passe à l'étape suivante 1401 1891 Sockets[i].etape++; 1402 1892 } … … 1408 1898 if (Sockets[i].AttenteExecution > MAXATTENTE) 1409 1899 { 1410 // On prolonge l'attente 1411 1900 // On prolonge l'attente afin de recevoit un GOTO OK 1901 1412 1902 Sockets[i].etape = 5; 1413 1903 Sockets[i].AttenteExecution = 0; … … 1415 1905 } 1416 1906 1417 // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes 1907 // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes 1418 1908 if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO) 1419 1909 { 1420 OnCoordSetSP.s = IPS_ALERT; 1421 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : l antenne n a pas renvoye GOTO/OK. \ 1422 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1910 // Alerte sur une antenne 1911 OnCoordSetSP.s = IPS_ALERT; 1912 1913 // Message d'erreur 1914 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : l antenne n a pas renvoye GOTO/OK. Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1915 1916 //Déconnexion de l'antenne 1423 1917 DeconnecterSocket(i); 1424 1918 } … … 1433 1927 1434 1928 /////////////////////////////////////// 1435 //On attend que toutes les antennes soient prêtes pour lancer l'ordre Goto -> meilleure synchronisation 1436 1437 int num=0; 1929 // Traitement de l'étape 3 de la réalisation d'un goto 1930 // On place cette partie du traitement en dehors du switch et de la boucle 1931 // pour pouvoir envoyer les ordres gotos à toutes les antennes lorsque l'on a la confirmation 1932 // qu'elles sont toutes prêtes à executer cet ordre (être à l'étape 3 pour un socket) 1933 // -> meilleure synchronisation 1934 1935 // On compte les antennes rendues à l'étape 3 et qui attendent 1936 1937 int num = 0; 1438 1938 1439 1939 for (int i=1; i<SocketsNumber; i++) 1440 1940 { 1941 // Uniquement les antennes connectées 1942 1441 1943 if (Sockets[i].Connected) 1442 1944 { 1443 if (Sockets[i].etape == 3) num++; //fin de la procédure ActualisationPosition. 1444 // num antennes sont prêtes à recevoir l'ordre GOTO 1945 if (Sockets[i].etape == 3) num++; // num antennes sont prêtes à recevoir l'ordre GOTO 1445 1946 } 1446 1947 } 1948 1949 // Toutes les antennes connectées sont prêtes à recevoir l'ordre goto 1447 1950 1448 1951 if ((num == AntennesConnectees()) && (num>0)) … … 1452 1955 if (Sockets[i].Connected) 1453 1956 { 1957 // On envoie l'ordre 1958 1454 1959 Sockets[i].ack_goto = false; 1455 1960 Sockets[i].AttenteExecution = 0; 1456 1961 Sockets[i].AnomaliesExecution = 0; 1457 1962 1458 if (!GOTO(i, TargetPosition.x - Sockets[i].Pos.x - Sockets[i].Delta.x, TargetPosition.y - Sockets[i].Pos.y - Sockets[i].Delta.y)) Sockets[i].sendalertes++;1963 if (!GOTO(i, Sockets[i].TargetPosition.x - Sockets[i].Pos.x, Sockets[i].TargetPosition.y - Sockets[i].Pos.y )) Sockets[i].sendalertes++; 1459 1964 1460 1965 Sockets[i].etape++; … … 1464 1969 1465 1970 /////////////////////////////////////// 1466 // Détection d'anomalies sur la socket. Déconnexion du micro-cont ? 1971 // Opération garbage 1972 // Détection d'anomalies sur le socket i. 1973 // Ce n'est pas normal ici. Il faut déconnecte l'antenne 1467 1974 1468 1975 for (int i=1; i<SocketsNumber; i++) … … 1472 1979 if (Sockets[i].sendalertes > 0) 1473 1980 { 1474 OnCoordSetSP.s = IPS_ALERT; 1981 // Alarme dans la boîte Indi 1982 1983 OnCoordSetSP.s = IPS_ALERT; 1984 1985 // Erreur dans les logs 1986 1475 1987 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : deconnexion de l antenne.", Sockets[i].IP.c_str()); 1988 1989 // Déconnexion antenne 1476 1990 1477 1991 DeconnecterSocket(i); … … 1480 1994 } 1481 1995 } 1482 1996 1483 1997 //incrémentation du compteur 1998 1484 1999 compt++; 1485 2000 } … … 1511 2026 InitAntennes(); 1512 2027 2028 // On garde la trace du début du Goto pour enchainer les actualisations 2029 1513 2030 JJAnc = GetJJ(); 1514 1515 ADDEC2Motor(targetRA, targetDEC); 2031 2032 // Conversion des coordonnées horaires en pas moteur 2033 2034 ADDEC2Motor(targetRA, targetDEC); 2035 2036 // Mode transit activé 1516 2037 1517 2038 TrackingMode = 1; 1518 2039 2040 // On suit un objet 2041 1519 2042 Suivi = true; 1520 2043 1521 UpdateGoto = false; 1522 1523 ActualisationPosition = true; 2044 // Aucun goto n'a été encore réalisé 2045 2046 UpdatedGoto = false; 2047 2048 // Mais on se lance dans la réalisation d'un goto 2049 2050 RealisationGoto = true; 1524 2051 1525 2052 break; … … 1539 2066 InitAntennes(); 1540 2067 1541 JJAnc =GetJJ();1542 1543 2068 JJAnc = GetJJ(); 2069 2070 ADDEC2Motor(targetRA, targetDEC); 1544 2071 1545 2072 TrackingMode = 2; … … 1547 2074 Suivi = true; 1548 2075 1549 Update Goto = false;1550 1551 ActualisationPosition = true;2076 UpdatedGoto = false; 2077 2078 RealisationGoto = true; 1552 2079 1553 2080 break; … … 1581 2108 1582 2109 // On lance le thread ! 1583 1584 Exit=false; 2110 // Exit ne faudra true que lorsque sera venu le moment de sortir ! 2111 2112 Exit = false; 2113 2114 // Création du thread 1585 2115 1586 2116 if (pthread_create (&th1, NULL, (void*(*)(void*))LancementThread, this) < 0) … … 1592 2122 1593 2123 case ISS_OFF: 1594 1595 // On sort du thread1596 1597 Exit = true;1598 sleep(1);1599 pthread_join (th1, NULL);1600 InitThreadOK = false;1601 2124 1602 2125 // Etat des voyants … … 1621 2144 SocketsNumber = 1; 1622 2145 2146 // On sort du thread 2147 2148 // On dit au thread de sortir de la boucle 2149 2150 Exit = true; 2151 2152 // Désactiver la boucle de traitement des messages des ISPOLL 2153 2154 InitThreadOK = false; 2155 2156 // On laisse 1 s au thread pour sortir de la boucle 2157 2158 sleep(1); 2159 2160 // On détruit le thread 2161 2162 pthread_join (th1, NULL); 2163 2164 // on sort du programme 2165 2166 exit(EXIT_SUCCESS); 2167 1623 2168 break; 1624 2169 } … … 1630 2175 /************************************************************************************** 1631 2176 ** Envoie une commande sur le socket numsocket 2177 ** 1632 2178 ***************************************************************************************/ 1633 2179 … … 1639 2185 { 1640 2186 sprintf(chaine, "%s%s\n", Commande, Params); 1641 1642 1643 1644 2187 2188 Sockets[numsocket].new_sock << chaine; 2189 2190 IDLog("Commande envoyee a %s: %s", Sockets[numsocket].IP.c_str(), chaine); 1645 2191 } 1646 2192 catch (SocketException& e) 1647 2193 { 2194 // Consignation d'une anomalie sur le socket 2195 1648 2196 DeconnecterSocket(numsocket); 1649 2197 … … 1661 2209 /************************************************************************************** 1662 2210 ** Commande POSITION 2211 ** 1663 2212 ***************************************************************************************/ 1664 2213 … … 1670 2219 /************************************************************************************** 1671 2220 ** Commande PARK 2221 ** 1672 2222 ***************************************************************************************/ 1673 2223 … … 1679 2229 /************************************************************************************** 1680 2230 ** Commande ABORT 2231 ** 1681 2232 ***************************************************************************************/ 1682 2233 … … 1689 2240 /************************************************************************************** 1690 2241 ** Commande GOTO 2242 ** 1691 2243 ***************************************************************************************/ 1692 2244 … … 1700 2252 sensAz = 1; 1701 2253 2254 // gestion des signes des deltas 2255 1702 2256 if ( deltaAz < 0 ) 1703 2257 { … … 1713 2267 1714 2268 // Vérification du nombre de pas à faire au niveau de l'axe azimut 1715 // Rappel : un tour complet autour de l'axe az fait 4000 pas codeur ( #define NBREPASCODEURSAZ dans BAO.h)1716 1717 // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas alors2269 // Rappel : un tour complet autour de l'axe az fait 4000 pas codeur (voir #define NBREPASCODEURSAZ dans BAO.h) 2270 2271 // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas codeur alors 1718 2272 // on fait le trajet dans le sens inverse pour aller plus vite 1719 2273 … … 1730 2284 { 1731 2285 deltaAz = NBREPASCODEURSAZ - deltaAz; 2286 1732 2287 sensAz = 1 - sensAz; 1733 2288 } … … 1735 2290 //on envoie les coordonnées au driver 1736 2291 1737 if (sensAz == 1 ) sensAz='f'; elsesensAz='b';1738 1739 if (sensAlt == 1 ) sensAlt='f'; elsesensAlt='b';2292 (sensAz == 1 ) ? sensAz='f' : sensAz='b'; 2293 2294 (sensAlt == 1 ) ? sensAlt='f': sensAlt='b'; 1740 2295 1741 2296 sprintf(Params, "%c%04i%c%04i", sensAz, deltaAz, sensAlt, deltaAlt); … … 1838 2393 1839 2394 1840 /**************************************************************************************1841 **1842 ***************************************************************************************/1843 void BAO::get_initial_data()1844 {1845 // IDSetNumber (&EquatorialCoordsRNP, NULL);1846 }1847 1848 /**************************************************************************************1849 **1850 ***************************************************************************************/1851 void BAO::slew_error(int slewCode)1852 {1853 OnCoordSetSP.s = IPS_IDLE;1854 1855 if (slewCode == 1)1856 IDSetSwitch (&OnCoordSetSP, "Object below horizon.");1857 else if (slewCode == 2)1858 IDSetSwitch (&OnCoordSetSP, "Object below the minimum elevation limit.");1859 else1860 IDSetSwitch (&OnCoordSetSP, "Slew failed.");1861 }1862 2395 1863 2396 /************************************************************************************** … … 1929 2462 1930 2463 2464
Note: See TracChangeset
for help on using the changeset viewer.