Changeset 648 for BAORadio/libindi
- Timestamp:
- Mar 7, 2012, 6:19:29 PM (13 years ago)
- Location:
- BAORadio/libindi/libindi
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BAORadio/libindi/libindi/BAOControl/baocontrol.cpp
r642 r648 27 27 ChoixCouleurs=1; 28 28 29 // Affichage de la version du porgramme29 // Affichage de la version du programme 30 30 31 31 AfficherLog("\n\n\n\n\n \ … … 66 66 client_socket = NULL; 67 67 68 // cha ines de caractÚres et tableaux68 // chaînes de caractÚres et tableaux 69 69 70 70 LatitudeChar = ""; … … 78 78 79 79 80 // on initalise aussi les structures80 // on initialise aussi les structures 81 81 82 82 for (int i=0; i<MAXANTENNES; i++) … … 147 147 } 148 148 149 150 149 // Ouverture du socket avec indi_BAO 151 150 … … 218 217 219 218 220 // cré eune fenêtre219 // création d'une fenêtre 221 220 222 221 w = XCreateSimpleWindow(d, RootWindow(d, DefaultScreen(d)), … … 226 225 227 226 228 // Création du double buffer 227 // Création d'un double buffer (pour éviter le scintillement de l'écran 228 // lors de l'actualisation de la fenêtre.) 229 229 230 230 db = XCreatePixmap(d, w, larg_fenetre, haut_fenetre, DefaultDepth(d, DefaultScreen(d))); … … 265 265 /************************************************************************************** 266 266 ** Dessine les éléments dans la fenêtre graphique 267 ** 267 268 ***************************************************************************************/ 268 269 … … 295 296 // on évite les affichages de l'heure du genre 12:56:60 ou 24:00:00 296 297 297 if (s ==60) {298 if (s == 60) { 298 299 s = 0; 299 300 mi++; … … 350 351 } 351 352 352 XFillArc(d, db ,color, 10 +i*30, 20+j*30, 15, 15, 0, 360*64);353 354 XDrawArc(d, db ,noir, 10 +i*30, 20+j*30, 15, 15, 0, 360*64);353 XFillArc(d, db ,color, 10 + i * 30, 20 + j * 30, 15, 15, 0, 360 * 64); 354 355 XDrawArc(d, db ,noir, 10 + i * 30, 20 + j * 30, 15, 15, 0, 360 * 64); 355 356 } 356 357 } … … 374 375 375 376 // On n'affiche la fenêtre graphique que lorsque tous les éléments ont été dessinés à l'intérieur 376 // On évite ainsi le sci entillement de la fenêtre...377 // On évite ainsi le scintillement de la fenêtre... 377 378 378 379 XCopyArea(d, db, w, noir, 0, 0, larg_fenetre, haut_fenetre, 0, 0); 379 380 380 381 381 // On force le rafra ichissement de l'écran382 // On force le rafraîchissement de l'écran 382 383 383 384 XFlush(d); … … 439 440 reponse = reponse.substr(reponse.find("message") + 9); 440 441 441 // (on en garde une trace)442 // (on en garde une trace) 442 443 443 444 memreponse = reponse; … … 481 482 482 483 // erreur sur une antenne -> on change son état dans la fenêtre 483 // on trouve les erreurs dans les messages d'indi_BAO for umulée484 // de la façon suiv nate: "ALERTE antenne" ou bien "Erreur sur l antenne"484 // on trouve les erreurs dans les messages d'indi_BAO formulée 485 // de la façon suivante: "ALERTE antenne" ou bien "Erreur sur l antenne" 485 486 486 487 if ((reponse.find("ALERTE antenne ") != string::npos) || … … 531 532 /************************************************************************************** 532 533 ** Est-ce que la réponse du pilote indi_BAO est conforme à ce que l'on attendait ? 533 ** Retourne true si c'est bonne534 ** 534 535 ** 535 536 ***************************************************************************************/ … … 557 558 duree++; 558 559 } 559 while (reponse.length() == 0 && duree < 20); // on attend un message pendant 10 ms max560 while (reponse.length() == 0 && duree < MAX_DELAI_REPONSE ); // on attend un message pendant 10 ms max 560 561 561 562 // on ajoute tous les messages reçus dans memmreponse … … 644 645 645 646 // Tant que l'utilisateur n'a pas tapé la commande 'exit' 647 646 648 while (NoExit) 647 649 { … … 655 657 656 658 657 // Faut-il ex ecuter un fichier de mouvements ?659 // Faut-il exécuter un fichier de mouvements ? 658 660 659 661 if (run && numobjets > 1 && runnum < numobjets) … … 664 666 if ( JJ >= objets[runnum].JJ && !objets[runnum].exec ) 665 667 { 666 // petit message pour l'utilisateur au début de l'ex ecution du tout premier mouvement668 // petit message pour l'utilisateur au début de l'exécution du tout premier mouvement 667 669 668 670 if ( runnum == 1 ) AfficherLog("Début de l'exécution du fichier de mouvements\n\n", true); … … 703 705 cout << ">"; 704 706 705 // on réinitial e toutes les variables impliquées dans la commande run707 // on réinitialise toutes les variables impliquées dans la commande run 706 708 707 709 run = false; … … 709 711 numobjets = 1; 710 712 711 // On sort du programme dans le cas BAOControl -r fileName713 // On sort du programme dans le cas de BAOControl -r fileName 712 714 713 715 NoExit = !exitrun; … … 722 724 } 723 725 724 // on lit et affiche la réponse des micro controlleurs726 // on lit et affiche la réponse des micro-contrÃŽleurs 725 727 726 728 LireReponse(); … … 734 736 gettimeofday(&tv, NULL); 735 737 736 // on ne sauvegarde les paramÚtres des alignements que si l'horloge du systÚme vient juste737 // de changer de seconde. Cela evite les conflits avec le pilote indi_BAO qui cherche738 // On ne sauvegarde les paramÚtres des alignements que si l'horloge du systÚme vient juste 739 // de changer de seconde. Cela permet d'éviter les conflits d'accÚs avec le pilote indi_BAO qui cherche 738 740 // quant à lui à charger ce même fichier en fin de seconde... 739 741 740 if (tv.tv_usec/1.0E6 >0.0 && tv.tv_usec/1.0E6<0.1)742 if (tv.tv_usec/1.0E6 > 0.0 && tv.tv_usec/1.0E6 < 0.1) 741 743 { 742 for (int i=0; i<numAntennes; i++) if (Antennes[i].ok == 1) Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg"); 744 for (int i=0; i<numAntennes; i++) if (Antennes[i].ok == 1) 745 { 746 if (MethodeAlignement == SIMPLE ) 747 { 748 Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg"); 749 } 750 else 751 { 752 Antennes[i].AlignementAntenne->EnregistrementParametresAlignement(Antennes[i].ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg"); 753 } 754 } 755 743 756 } 744 757 } … … 781 794 size_t pos = chaine.find(commande); 782 795 783 // si la commande est présente dans cha ine, on continue796 // si la commande est présente dans chaîne, on continue 784 797 785 798 if (pos != string::npos) … … 820 833 // on prend tout d'un bloc aprÚs la commande -> chaine 1 821 834 // utile pour une commande du type "goto m 42" qui doit retourner "m 42" dans une 822 // même cha ine835 // même chaîne 823 836 824 837 *chaine1 = chaine; … … 833 846 /************************************************************************************** 834 847 ** Envoie la longitude et la latitude du lieu d'observation au pilote indi_BAO 848 ** sous la forme de vecteurs xml 849 ** (voir les particularités des drivers développés sous Indi) 835 850 ** 836 851 ***************************************************************************************/ … … 839 854 { 840 855 // la communication avec le pilote indi_BAO 841 // se fait par l'envoi de fichiersxml856 // se fait par l'envoi de trames au format xml 842 857 843 858 try … … 980 995 981 996 /************************************************************************************** 982 ** Envoie les paramÚtres delaitransit et delaitracking au pilote indi_BAO 983 ** Ces paramÚtres définissent la durée (en sec) entre deux actualisations 984 ** dans les modes tracking et transit 997 ** Envoie la méthode d'alignement au pilote indi_bao 998 ** Ce paramÚtre peut être SIMPLE, AFFINE ou TAKI 985 999 ** 986 1000 ***************************************************************************************/ … … 1000 1014 *client_socket << "</oneSwitch>"; 1001 1015 *client_socket << "<oneSwitch name=\"TAKI\">"; 1002 (MethodeAlignement == TAKI) ? *client_socket << "On" : *client_socket << "Off";1016 (MethodeAlignement == TAKI) ? *client_socket << "On" : *client_socket << "Off"; 1003 1017 *client_socket << "</oneSwitch>"; 1004 1018 *client_socket << "</newSwitchVector>"; … … 1098 1112 1099 1113 /************************************************************************************** 1100 ** Dirige r l'antenne vers les coordonnées ar et dec et suivre l'objet1101 ** en activant le modetransit ou tracking.1114 ** Dirige l'antenne vers les coordonnées ar et dec et suit l'objet en activant le mode 1115 ** transit ou tracking. 1102 1116 ** 1103 1117 ** si J2000 == true, cela signifie que les coordonnées ar et dec sont données dans le 1104 1118 ** le systÚme de coordonnées J2000 (écliptique et équinoxe du 1 janvier 2000 à 0 h TU) 1105 1119 ** Des calculs supplémentaires (précession, nutation, aberration) sont alors réalisés 1106 ** pour ramener les coordonnées ad et decà l'écliptique et l'équinoxe de la date de1120 ** pour ramener les coordonnées horaires à l'écliptique et l'équinoxe de la date de 1107 1121 ** l'observation. 1108 1122 ** … … 1124 1138 1125 1139 arf = ( ar1 + ar2 / 60.0 + ar3 / 3600.0 ) * 15.0 * Pidiv180; 1140 1126 1141 decf = ( fabs(dec1) + dec2 / 60.0 + dec3 / 3600.0 ) * Pidiv180; 1127 1142 1128 1143 if (dec[0] == '-') decf = -decf; 1129 1144 1130 // calculs pupplémentaires pour se ramener1145 // Calculs supplémentaires pour ramener les coordonnées horaires 1131 1146 // à l'époque de l'observation 1132 1147 … … 1157 1172 *client_socket << "<newSwitchVector device=\"BAO\" name=\"ON_COORD_SET\">"; 1158 1173 *client_socket << "<oneSwitch name=\"TRANSIT\">"; 1159 if (Transit) *client_socket << "On"; 1160 else *client_socket << "Off"; 1174 (Transit) ? *client_socket << "On" : *client_socket << "Off"; 1161 1175 *client_socket << "</oneSwitch>"; 1162 1176 1163 1177 *client_socket << "<oneSwitch name=\"TRACKING\">"; 1164 if (Transit) *client_socket << "Off"; 1165 else *client_socket << "On"; 1178 (Transit) ? *client_socket << "Off" : *client_socket << "On"; 1166 1179 *client_socket << "</oneSwitch>"; 1167 1180 *client_socket << "</newSwitchVector>"; … … 1207 1220 /************************************************************************************** 1208 1221 ** Se connecte ou se déconnecte au pilote indi_BAO 1222 ** 1209 1223 ***************************************************************************************/ 1210 1224 … … 1215 1229 *client_socket << "<newSwitchVector device=\"BAO\" name=\"CONNECTION\">"; 1216 1230 1217 if (connect) *client_socket << "<oneSwitch name=\"CONNECT\">"; 1218 else *client_socket << "<oneSwitch name=\"DISCONNECT\">"; 1231 (connect) ? *client_socket << "<oneSwitch name=\"CONNECT\">" : *client_socket << "<oneSwitch name=\"DISCONNECT\">"; 1219 1232 1220 1233 *client_socket << "On"; … … 1253 1266 AfficherLog("La connexion a été établie avec le pilote indi_BAO.\n\n", true); 1254 1267 1268 // Au moment de la connexion avec le driver indi_BAO 1269 // On transmet les paramÚtres du lieu de l'observation, le mode de suivi 1270 // ainsi que la méthode d'alignement utilisée 1271 1255 1272 usleep(500000); 1256 1273 … … 1273 1290 1274 1291 /************************************************************************************** 1275 ** Gestion du clavier en mode raw p ourla procédure d'alignement1292 ** Gestion du clavier en mode raw pendant la procédure d'alignement 1276 1293 ** Cela permet de ne pas avoir à taper sur la touche 'entrée' aprÚs avoir appuyé sur 1277 1294 ** une flÚche de direction 1295 ** 1278 1296 ***************************************************************************************/ 1279 1297 … … 1308 1326 ** Le principe consiste à utiliser des étoiles comme point de repÚre pour la calibration 1309 1327 ** des antennes : on compare la position calculée de chaque objet avec la position 1310 ** effectivement mesurée lors de la procédure d'alignement. On en tire alorsune matrice1328 ** effectivement mesurée lors de la procédure d'alignement. On en tire une matrice 1311 1329 ** de rotation qui doit corriger les défauts d'alignement de l'antenne (le 0 pas codeur 1312 1330 ** pas parfaitement dirigé vers le sud et un axe de rotation az pas forcément 1313 1331 ** perpendiculaire au sol...) 1332 ** 1314 1333 ***************************************************************************************/ 1315 1334 … … 1348 1367 { 1349 1368 // L'alignement de l'antenne 'num' est en cours. Il ne faut pas calculer la 1350 // matrice de correction tant que ce n'est pas fini.. 1369 // matrice de correction tant que ce n'est pas fini... 1351 1370 1352 1371 AfficherLog("Début de l'alignement de l'antenne.\n\n", true); … … 1354 1373 // On charge les paramÚtres d'alignement existants s'ils existent 1355 1374 1356 Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", atol(ip.c_str()), num); 1375 if ( MethodeAlignement == SIMPLE ) 1376 { 1377 Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg", atol(ip.c_str()), num); 1378 } 1379 else 1380 { 1381 Antennes[num].AlignementAntenne->ChargementParametresAlignement(ip, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg", atol(ip.c_str()), num); 1382 } 1357 1383 1358 1384 // l'antenne num est en cours d'alignement … … 1362 1388 // Si on n'a pas encore effectué la premiÚre phase de l'alignement (viser la polaire) dans les méthode d'alignement AFFINE et TAKI 1363 1389 1364 if ( Antennes[num].AlignementAntenne->delta_az_polar == 0 && MethodeAlignement!=SIMPLE) 1390 /* 1391 if ( Antennes[num].AlignementAntenne->delta_az_polar == 0 && MethodeAlignement != SIMPLE) 1365 1392 { 1366 1393 cout << "Le radiotélescope va pointer l'étoile polaire.\n"; 1367 cout << "Agissez sur les touches Q et D pour centrer l'étoile dans le viseur...\n"; 1368 cout << "Appuyez sur A pour envoyer un ABORT à l'antenne.\n"; 1369 cout << "Puis, appuyez sur ESC pour valider...\n\n"; 1394 cout << "Agissez sur les touches Q et D pour centrer l'étoile dans le viseur...\n"; 1395 cout << "Appuyez sur S pour changer de vitesse et sur A pour envoyer un ABORT à l'antenne.\n"; 1396 cout << "Appuyez sur G pour reprendre le suivi de l'objet aprÚs un ABORT ou un message d'erreur.\n"; 1397 cout << "Puis, appuyez sur ESC pour valider...\n\n"; 1370 1398 1371 1399 … … 1398 1426 ModificationAlignement=true; 1399 1427 AfficherLog("delta_az - 1\n", true); 1400 1428 1401 1429 break; 1430 //abort 1402 1431 case 'a' : 1403 1432 Abort(); … … 1406 1435 break; 1407 1436 1408 1437 // vitesse 1x ou 10x 1438 case 's' : 1439 (Vitesse == 1 ) ? Vitesse = 10 : Vitesse = 1; 1440 os << "Vitesse=" << Vitesse << "x\n\n"; 1441 AfficherLog(&os, true); 1442 1443 break; 1444 1445 // reprise du goto 1446 case 'g' : 1447 AfficherLog("Reprise du GOTO.\n\n", true); 1448 Goto("02:31:49.6", "89:15:50.9", Transit, true); 1449 sleep(2); 1450 1451 break; 1452 1453 1409 1454 } 1410 1455 1411 1456 } while (c!=27); 1412 } 1457 } */ 1413 1458 1414 1459 1415 1460 AfficherLog("\n\n\nListe des étoiles brillantes situées à plus de 30° au-dessus de l'horizon :\n\n", true); 1461 1462 // Mise à jour du temps sidéral local 1416 1463 1417 1464 UpdateTime(); … … 1428 1475 Etoiles[i].ha = RefractionAtmospherique(Etoiles[i].ha); 1429 1476 1430 // Sélectionner et afficher les étoiles > 30° 1477 // Sélectionne et affiche les étoiles > 30° 1478 // et donc la magnitude < MAGNITUDEMAXETOILESCALIBRATION 1431 1479 1432 1480 if ( Etoiles[i].selectionnee = ((Etoiles[i].ha > (HAUTMIN + 5.0) * Pidiv180) && (Etoiles[i].mag < MAGNITUDEMAXETOILESCALIBRATION)) ) … … 1442 1490 if (Etoiles[i].selectionnee) 1443 1491 { 1444 for (int j=1; j <=Antennes[num].AlignementAntenne->nbrcorrections; j++)1492 for (int j=1; j <= Antennes[num].AlignementAntenne->nbrcorrections; j++) 1445 1493 { 1446 1494 // Là , un point important: on ne prend pas en compte l'AD des objets dans le reste des calculs 1447 // Mais l'angle horaire de ces objets avec le méridien en retranchant le temps sidéral local 1448 // à l'ascension droite des objets. Voir les détails dans la documentation.... 1495 // Mais l'angle horaire de ces objets avec le méridien. Voir les détails dans la documentation.... 1449 1496 1450 1497 double distances = DistanceAngulaireEntre2Points( … … 1454 1501 Etoiles[i].de); 1455 1502 1456 // Ici, on ne s electionne que des étoiles qui ne soont pas trop proches de positions ayant déjà servies à la calibration1503 // Ici, on ne sélectionne que des étoiles qui ne sont pas trop proches de positions ayant déjà servies à la calibration 1457 1504 // de l'antenne et qui multiplierait les mesures sans amélioration de la précision 1458 1505 … … 1473 1520 AfficherLog("(Tapez sur la touche f pour achever l'alignement de l'antenne et enregistrer les paramÚtres.)\n", true); 1474 1521 1475 // activer le mode raw évite d'avoir à taper sur la touche entrée entre chaque pression1522 // activer le mode raw évite d'avoir à devoir taper sur la touche entrée entre chaque pression 1476 1523 // sur le clavier 1477 1524 … … 1501 1548 // On sauvegarde les coordonnées de l'objet qui servira à la calibration de l'antenne num 1502 1549 1503 Antennes[num].AlignementAntenne->ad[Antennes[num].AlignementAntenne->nbrcorrections] 1504 Antennes[num].AlignementAntenne->de[Antennes[num].AlignementAntenne->nbrcorrections] 1550 Antennes[num].AlignementAntenne->ad[Antennes[num].AlignementAntenne->nbrcorrections] = Etoiles[i].ad; 1551 Antennes[num].AlignementAntenne->de[Antennes[num].AlignementAntenne->nbrcorrections] = Etoiles[i].de; 1505 1552 1506 1553 do … … 1568 1615 break; 1569 1616 1617 //abort 1570 1618 case 'a' : 1571 1619 Abort(); … … 1574 1622 break; 1575 1623 1624 // vitesse 1x ou 10x 1576 1625 case 's' : 1577 1626 (Vitesse == 1 ) ? Vitesse = 10 : Vitesse = 1; … … 1581 1630 break; 1582 1631 1632 // reprise du goto 1583 1633 case 'g' : 1584 1634 AfficherLog("Reprise du GOTO.\n\n", true); … … 1596 1646 case 'f': 1597 1647 { 1598 // on sort de la boucle en cas d'appuie sur la touche f 1648 // on sort de la boucle lorsque l'utilisateur tape sur 'f' 1649 1599 1650 i = numEtoiles; 1600 1651 } … … 1606 1657 AfficherLog("\nFin de la procédure d'alignement.\n\n", true); 1607 1658 1608 // On indique au reste du programme que la calibration sur l'antenne num est terminée1659 // On indique au reste du programme que la calibration sur l'antenne num est achevée 1609 1660 1610 1661 Antennes[num].AlignementAntenne->AlignementEnCours = false; 1611 1662 1612 ModificationAlignement =true;1663 ModificationAlignement = true; 1613 1664 } 1614 1665 else … … 1625 1676 1626 1677 /************************************************************************************** 1627 ** Lance l'ex ecutution d'un fichier de mouvements1678 ** Lance l'exécution d'un fichier de mouvements 1628 1679 ** 1629 1680 ***************************************************************************************/ … … 1637 1688 UpdateTime(); 1638 1689 1639 if ( exec && numobjets >1 )1690 if ( exec && numobjets > 1 ) 1640 1691 { 1641 1692 // Si le chargement du fichier s'est bien déroulé et qu'il y a plus d'un mouvement dedans … … 1644 1695 { 1645 1696 ErreurLog("Le fichier contient des dates qui sont toutes périmées. Exécution annulée.\n\n"); 1697 1646 1698 NoExit = !exitrun; 1647 1699 … … 1650 1702 else 1651 1703 { 1652 AfficherLog("Ex ecution du fichier " + fichier + " en attente...\n\n", true);1704 AfficherLog("Exécution du fichier " + fichier + " en attente...\n\n", true); 1653 1705 run = true; 1654 1706 } … … 1657 1709 { 1658 1710 ErreurLog("\nLe fichier " + fichier + " contient des erreurs ou n'existe pas...\n\n\n"); 1711 1659 1712 NoExit=!exitrun; 1660 1713 … … 1670 1723 ** Décomposition et vérification des dates, heures, AD et déclinaisons 1671 1724 ** 1672 ** type = 0 -> cha ine contient une déclinaison ou une latitude1673 ** type = 1 -> longitude1674 ** type = 2 -> AD ouheure1675 ** type = 3 -> date1725 ** type = 0 -> chaîne contient une déclinaison ou une latitude 1726 ** type = 1 -> " " une longitude 1727 ** type = 2 -> " " une AD ou une heure 1728 ** type = 3 -> " " une date 1676 1729 ** 1677 1730 ** Exemple de Décomposition("15:23:12", 2, a, b, c) retourne a=15, b=23, c=12 1678 ** si la cha ine a un format incorrect, la fct retourne false1731 ** si la chaîne a un format incorrect, la fct retourne false 1679 1732 ** 1680 1733 ***************************************************************************************/ … … 1691 1744 (type == 3) ? car="/" : car=":"; 1692 1745 1693 // Y a-t-il 2 caractÚres ':' ou '/' dans la cha ine ?1746 // Y a-t-il 2 caractÚres ':' ou '/' dans la chaîne ? 1694 1747 // C'est indispensable dans tous les cas 1695 1748 … … 1716 1769 c = Arrondi(atof(s.c_str()) * 100.0) / 100.0; 1717 1770 1718 //vérification de la cohérence des infos contenues dans la cha ine1771 //vérification de la cohérence des infos contenues dans la chaîne 1719 1772 1720 1773 if (type < 3 ) … … 1752 1805 ** identification des commandes entrées par l'utilisateur 1753 1806 ** puis exécution des commandes 1807 ** Chaine peut contenir par ex "goto betelgeuse", "goto 12:23:01 +22:53:00", "status" etc... 1754 1808 ** 1755 1809 ***************************************************************************************/ … … 1842 1896 { 1843 1897 ErreurLog("Erreur goto : le format de la commande est goto AD DEC\n \ 1844 L'AD doit être de la forme xx:yy:zz (ex: 12:00:03 pour 12h 0m 3s)\n \ 1845 La déclinaison doit être de la forme +/-xx:yy:zz (ex: -12:50:01.1 pour -12° 50' 01.1'')\n\n \ 1846 Il est egalement possible de faire suivre la commande d'un nom d'un objet\n \ 1847 Exemple goto M 31 ou encore goto ngc145.\n \ 1848 Ne pas préciser dans ce cas J2000.\n\n"); 1898 L'AD doit être de la forme xx:yy:zz J2000 (ex: 12:00:03 pour 12h 0m 3s)\n \ 1899 La déclinaison doit être de la forme +/-xx:yy:zz (ex: -12:50:01.1 pour -12° 50' 01.1'')\n \ 1900 J2000 est un paramÚtre optionnel qui sert à indiquer que les coordonnées horaires\n \ 1901 sont exprimées dans le repÚre du même nom.\n\n \ 1902 Il est egalement possible de faire suivre la commande d'un nom d'un objet\n \ 1903 Exemple goto M 31 ou encore goto ngc145.\n \ 1904 Ne pas préciser dans ce cas J2000.\n\n"); 1849 1905 } 1850 1906 } … … 2047 2103 2048 2104 Antennes[num].AlignementAntenne->InitAlignement(); 2105 2106 Antennes[num].AlignementAntenne->MethodeAlignement = MethodeAlignement; 2049 2107 2050 2108 ModificationAlignement = true; … … 2280 2338 int rc; 2281 2339 2282 //initial sation des variables de retour2340 //initialisation des variables de retour 2283 2341 2284 2342 reponse.ar = ""; … … 2426 2484 ** Lecture d'un fichier ligne aprÚs ligne 2427 2485 ** retourne -1 à la fin 2486 ** 2428 2487 ***************************************************************************************/ 2429 2488 … … 2480 2539 2481 2540 ///////////////////////////////////////// 2482 // Rubrique Coo données géographiques2541 // Rubrique Coordonnées géographiques 2483 2542 2484 2543 section = "coordonnees geographiques"; … … 2538 2597 } 2539 2598 2599 ///////////////////////////////////////// 2600 // Port de connexion du serveur Indi 2540 2601 2541 2602 key = "port"; … … 2593 2654 } 2594 2655 2656 ///////////////////////////////////////// 2657 // Rubrique alignement 2658 2659 section = "alignement"; 2660 2661 key = "methode_alignement"; 2662 2663 if (readINI(section.c_str(), key.c_str(), &value, fileName.c_str())) 2664 { 2665 AfficherLog("methode d'alignement = " + (string)value + "\n", true); 2666 switch (value[0]) 2667 { 2668 case 's' : 2669 case 'S' : 2670 MethodeAlignement = SIMPLE; 2671 break; 2672 2673 case 'a' : 2674 case 'A' : 2675 MethodeAlignement = AFFINE; 2676 break; 2677 2678 case 't' : 2679 case 'T' : 2680 MethodeAlignement = TAKI; 2681 break; 2682 } 2683 2684 SAFEDELETE_TAB(value); 2685 } 2686 else 2687 { 2688 ErreurLog("Le paramÚtre methode_alignement est incorrect !\n"); 2689 2690 return false; 2691 } 2692 2693 2595 2694 2596 2695 ///////////////////////////////////////// … … 2609 2708 else 2610 2709 { 2611 ErreurLog("Le paramÚtre mode est incorrect !\n");2710 ErreurLog("Le paramÚtre mode suivi est incorrect !\n"); 2612 2711 2613 2712 return false; … … 2969 3068 SAFEDELETE_TAB(value); 2970 3069 2971 Etoiles[numEtoiles].ad = (a1 + a2 /60.0 + a3/3600.0) * 15.0 * Pidiv180;3070 Etoiles[numEtoiles].ad = (a1 + a2 / 60.0 + a3 / 3600.0) * 15.0 * Pidiv180; 2972 3071 } 2973 3072 else … … 2984 3083 && (Decomposition(value, 0, &a1, &a2, &a3))) 2985 3084 { 2986 Etoiles[numEtoiles].de = (fabs(a1) + a2 /60.0 + a3/3600.0 ) * Pidiv180;2987 2988 if (value[0] == '-') Etoiles[numEtoiles].de = - Etoiles[numEtoiles].de;3085 Etoiles[numEtoiles].de = (fabs(a1) + a2 / 60.0 + a3 / 3600.0 ) * Pidiv180; 3086 3087 if (value[0] == '-') Etoiles[numEtoiles].de = - Etoiles[numEtoiles].de; 2989 3088 2990 3089 SAFEDELETE_TAB(value); … … 3005 3104 if (readINI(section.c_str(), key.c_str(), &value, fileName.c_str())) 3006 3105 { 3007 Etoiles[numEtoiles].mag =(double)atof(value);3106 Etoiles[numEtoiles].mag = atof(value); 3008 3107 SAFEDELETE_TAB(value); 3009 3108 } … … 3019 3118 // Passage du repÚre J2000 à l'écliptique et à l'équinoxe liée à la date de l'observation 3020 3119 3021 Precession (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);3022 NutationEtoile (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de);3120 Precession (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de); 3121 NutationEtoile (&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de); 3023 3122 AberrationAnnuelle(&Etoiles[numEtoiles].ad, &Etoiles[numEtoiles].de); 3024 3123 … … 3093 3192 3094 3193 // si on a utilisé l'option -r en ligne de commande 3095 // alors on charge et on ex ecute le fichier de mouvements3194 // alors on charge et on exécute le fichier de mouvements 3096 3195 3097 3196 if (argc == 3) … … 3158 3257 3159 3258 // sauvegarder la position courante 3259 3160 3260 long pos = fichier.tellg(); 3261 3161 3262 // se placer en fin de fichier 3263 3162 3264 fichier.seekg( 0 , ios_base::end ); 3265 3163 3266 // récupérer la nouvelle position = la taille du fichier 3267 3164 3268 long size = fichier.tellg(); 3269 3165 3270 return (size > 0); 3166 3271 } -
BAORadio/libindi/libindi/BAOControl/baocontrol.h
r642 r648 41 41 double ha; // hauteur au-dessus de l'horizon (en rad) 42 42 double mag; // magnitude 43 bool selectionnee; // l'objet a-t-il été sélectionné pour calibrer l'antenne 44 // actuellement en mode alignement ? 43 bool selectionnee; // l'objet a-t-il été sélectionné pour calibrer l'antenne ? 45 44 }; 46 45 … … 91 90 void *my_thread_process (); 92 91 93 // in tialise la clase92 // initialise la classe 94 93 95 94 int init(int argc, char **argv); … … 106 105 107 106 108 //communications entre les antennes et le micro contrÃŽleur107 //communications entre les antennes et le micro-contrÃŽleur 109 108 110 109 void LireReponse(); … … 135 134 136 135 137 // Gestionserveur NED136 // Gestion du serveur NED 138 137 139 138 CoordonneesHoraires ServeurNED(string objet); … … 166 165 167 166 168 double Pression; // Pression atmosphérique en m Bar167 double Pression; // Pression atmosphérique en mbar 169 168 double Temperature; // température de l'atmosphÚre en °C 170 169 171 170 bool NoExit; // A-t-on tapé exit pour sortir ? Permet de fermer le thread à ce moment-là 172 171 bool Transit; // Si oui, le mode transit est activé, sinon, c'est le mode tracking 173 bool run; // ex ecute actuellement un fichier de mouvements174 bool exitrun; // doit-on sortir du programme à la fin de l'ex ecution de la commande run ?172 bool run; // exécute actuellement un fichier de mouvements 173 bool exitrun; // doit-on sortir du programme à la fin de l'exécution de la commande run ? 175 174 bool J2000; // est-ce que les coordonnées du fichier de mouvements sont en coordonnées J2000 ? 176 175 bool ModificationAlignement; // Est-ce que l'une des antennes est en cours d'alignement et est-ce qu'un paramÚtre -
BAORadio/libindi/libindi/BAOControl/baocontrol_params
r643 r648 11 11 temperature=10 12 12 13 [alignement] 14 methode_alignement=SIMPLE 15 13 16 [suivi] 14 17 mode=tracking -
BAORadio/libindi/libindi/communs/alignement.cpp
r644 r648 19 19 { 20 20 //Initialisation des paramÚtres des antennes 21 21 22 22 InitAlignement(); 23 23 } … … 88 88 void Alignement::TransmettreParametresClasseAstro(double Annee, double Mois, double Jour, double Heu, double Min, double Sec, double Longitude, double Latitude, double Pression, double Temp) 89 89 { 90 DefinirLongitudeLatitude(Longitude, Latitude); 90 DefinirLongitudeLatitude(Longitude, Latitude); 91 91 DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec); 92 DefinirPressionTemp(Pression, Temp); 92 DefinirPressionTemp(Pression, Temp); 93 93 } 94 94 … … 118 118 119 119 /************************************************************************************** 120 ** Calcule la matrice de rotation d'un angle alpha autour d'un axe défini 120 ** Calcule la matrice de rotation d'un angle alpha autour d'un axe défini 121 121 ** par les paramÚtres t et r dans un systÚme de coordonnées spĥériques 122 122 ** Le signe - devant le cos permet seulement de rendre le repÚre compatible avec WinStars 123 123 ** que j'utilise pour faire des vérifications... 124 124 ** Fonction utile pour de débogage de la fct d'alignement 125 ** 125 ** 126 126 ***************************************************************************************/ 127 127 … … 397 397 398 398 // Pour chaque variable coordonnées, on calcule d'abord l'azimut et la hauteur de l'objet correspondant 399 399 400 400 Azimut(a1.x, a1.y, &aa1.x, &aa1.y); 401 401 … … 509 509 MATRICE[3][3] = mm33; 510 510 511 511 //Pour vérifs 512 512 //RotationAutourDunAxe(0.3,Pi/2.0-0.1, 0.2); 513 514 513 514 return 1; 515 515 } 516 516 else … … 602 602 int best2 = 0; 603 603 int best3 = 0; 604 605 604 605 606 606 // On calcule le temps sidéral local, etc... 607 607 608 608 CalculTSL(); 609 609 … … 738 738 os << "\nUtilisation du triangle : " << map[best1] << " " << map[best2] << " " << map[best3] << "\n" ; 739 739 740 c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]] + GetTSL()); 741 c1.y = de[map[best1]]; 742 c1.z = 1.0; 743 744 c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]] + GetTSL()); 745 c2.y = de[map[best2]]; 746 c2.z = 1.0; 747 748 c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]] + GetTSL()); 749 c3.y = de[map[best3]]; 750 c3.z = 1.0; 740 if (MethodeAlignement == SIMPLE) 741 { 742 c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]] + GetTSL()); 743 c1.y = de[map[best1]]; 744 c1.z = 1.0; 745 746 c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]] + GetTSL()); 747 c2.y = de[map[best2]]; 748 c2.z = 1.0; 749 750 c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]] + GetTSL()); 751 c3.y = de[map[best3]]; 752 c3.z = 1.0; 753 } 754 else 755 { 756 c1.x = VerifAngle(ad[map[best1]] - tsl[map[best1]]); 757 c1.y = de[map[best1]]; 758 c1.z = 1.0; 759 760 c2.x = VerifAngle(ad[map[best2]] - tsl[map[best2]]); 761 c2.y = de[map[best2]]; 762 c2.z = 1.0; 763 764 c3.x = VerifAngle(ad[map[best3]] - tsl[map[best3]]); 765 c3.y = de[map[best3]]; 766 c3.z = 1.0; 767 } 768 751 769 752 770 os << "Point 1 : ho=" << DHMS(c1.x * N180divPi, false); … … 797 815 os << MATRICE[1][3] << " \t" << MATRICE[2][3] << " \t" << MATRICE[3][3] << "\n"; 798 816 799 800 801 802 803 817 818 819 820 821 804 822 //Vérifications supp 805 823 /* … … 811 829 os << GetHeure() << ":" << GetMin() << ":" << GetSec() << "\n"; 812 830 os << DHMS(GetTSL()*N180divPi, true) << "\n\n"; 813 831 814 832 Azimut(c3.x, c3.y, &mm1.x, &mm1.y); 815 833 … … 848 866 */ 849 867 850 851 868 869 852 870 //Afficher les messages de cette fonction 853 871 … … 1018 1036 os2.str(""); 1019 1037 1038 /* char chaine[100]; 1039 sprintf(chaine, "************** %s\n",alignment_method_data); 1040 cout << chaine;*/ 1041 1020 1042 if (alignment_method_data) 1021 1043 { … … 1038 1060 { 1039 1061 // Si la procédure d'alignement se termine, il faut calculer la matrice de correction 1040 1062 1041 1063 if (AlignementEnCours != atoi(align_data)) 1042 1064 { … … 1103 1125 stringstream os; 1104 1126 1105 1127 1106 1128 //AfficherLog("Enregistrement de l'alignement des antennes dans le fichier " + fileName + "\n", true); 1107 1129 … … 1111 1133 section = os.str(); 1112 1134 os.str(""); 1113 1135 1114 1136 os << "delta_az_polar"; 1115 1137 key = os.str(); … … 1137 1159 os.str(""); 1138 1160 1161 1139 1162 writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str()); 1163 1164 /* char chaine[100]; 1165 sprintf(chaine, "s************** %i\n",MethodeAlignement); 1166 cout << chaine;*/ 1140 1167 1141 1168 -
BAORadio/libindi/libindi/communs/const.h
r647 r648 119 119 ///////////////////////////////////////////// 120 120 121 // Port utilisé sur le réseau tcp/ip pour communiquer avec les antennes 122 123 #define BAO_PORT 8000 124 125 // Délai maximum en ms d'attente de la réponse des micro-contrÎleurs 126 127 #define MAX_DELAI_REPONSE 40 128 121 129 // Si une commande ne recoit pas d'acknowledge. Alors refaire 80 tentatives en renvoyant la commande 122 130 -
BAORadio/libindi/libindi/drivers/telescope/BAO.cpp
r642 r648 43 43 init_properties(); 44 44 45 // Le bouton connect de la boîte de dialogue d'indi 8BAO45 // Le bouton connect de la boîte de dialogue d'indi_BAO 46 46 // est dans l'état IDLE au démarrage 47 47 … … 52 52 lastRA = 0.0; 53 53 lastDEC = 0.0; 54 55 // Jour julien de la derniÚre actualisation 56 54 57 JJAnc = 0.0; 55 58 56 59 // Variables d'état 57 60 58 currentSet = 0; // Variables internes d'Indi, ne pas toucher 59 lastSet = -1; // Variable interne d'Indi, ne pas toucher 61 currentSet = 0; 60 62 61 63 // Nombre d'antennes connectées … … 65 67 // Le mode tracking est activé par défaut 66 68 67 TrackingMode = 1; 69 TrackingMode = BAO_TRACKING; 70 71 // Méthode d'alignement par défaut 72 73 MethodeAlignement = SIMPLE; 68 74 69 75 // délais en sec entre deux actualisations 70 76 // dans les modes transit et tracking 71 77 72 ActualisationTMTransit = 15.0 * 60.0; // Délai entre 2 actualisations dans le mode transit 78 ActualisationTMTransit = 15.0 * 60.0; // Délai entre 2 actualisations dans le mode transit (en sec) 79 73 80 ActualisationTMTracking = 5.0; // " " tracking 74 81 … … 86 93 RealisationGoto = false; 87 94 88 // vauttrue si l'utilisateur demande l'annulation du mouvement en cours95 // = true si l'utilisateur demande l'annulation du mouvement en cours 89 96 90 97 Abort = false; 91 98 92 // vauttrue si l'utilisateur demande de mettre les antennes en mode park99 // = true si l'utilisateur demande de mettre les antennes en mode park 93 100 94 101 Park = false; 95 102 96 // vaut trueun objet est actuellement suivi par les antennes103 // = true si un objet est actuellement suivi par les antennes 97 104 98 105 Suivi = false; 99 106 100 // vaut true si l'utilisateur demande à sortirde l'application -> permet de fermer le thread107 // = true si l'utilisateur sort de l'application -> permet de fermer le thread 101 108 102 109 Exit = false; 110 111 // Initialisation des paramÚtres atmosphériques par défaut 103 112 104 113 Pression = 1013.0; … … 141 150 BAO::~BAO() 142 151 { 143 // On informe le thread que nous allons sortir152 // On informe le thread que nous allons sortir 144 153 145 154 Exit = true; … … 161 170 162 171 // Petit message à l'attention de l'utilisateur 163 // permet de savoir si le destructeur est bienatteint172 // permet de savoir si le destructeur a bien été atteint 164 173 165 174 IDLog("Sortie de indi_BAO\n"); … … 257 266 258 267 /************************************************************************************** 259 ** Initialisation de la boîte de dialogue INDI (suite)260 ** Vider tous les vecteurs268 ** Définition de tous les vecteurs de la boîte de dialogue INDI 269 ** Cette procédure doit être obligatoirement présente dans tous pilotes Indi 261 270 ** 262 271 ***************************************************************************************/ … … 271 280 IDDefSwitch(&ConnectSP, NULL); 272 281 IDDefText(&ObjectTP, NULL); 273 IDDefNumber(&EquatorialCoordsWNP, NULL); 274 IDDefNumber(&GeographicCoordsWNP, NULL); 275 IDDefNumber(&PressionTempWNP, NULL); 282 IDDefNumber(&EquatorialCoordsWNP, NULL); 276 283 IDDefSwitch(&OnCoordSetSP, NULL); 277 284 IDDefSwitch(&AlignmentSP, NULL); … … 282 289 IDDefNumber(&ActualisationNP1, NULL); 283 290 IDDefNumber(&ActualisationNP2, NULL); 284 } 285 286 287 /************************************************************************************** 288 ** Initialisation des vecteurs INDI 289 ** ParamÚtres par défaut 291 IDDefNumber(&PressionTempWNP, NULL); 292 IDDefNumber(&GeographicCoordsWNP, NULL); 293 } 294 295 296 /************************************************************************************** 297 ** Initialisation des vecteurs de la boîte Indi 298 ** Cette procédure doit être obligatoirement présente dans tous pilotes Indi 290 299 ** 291 300 ***************************************************************************************/ … … 333 342 ** En cas de changement de texte dans la boîte de dialogue (par exemple : changement du 334 343 ** nom de l'objet) alors suivre l'objet... 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 344 ** Cette fonction n'est pas utilisée 345 ** TODO: faut-il proposer cette fonction depuis la boîte alors qu'il est déjà 346 ** possible de le faire depuis Kstars et BAOcontrol ? 347 ** 338 348 ** 339 349 ***************************************************************************************/ … … 372 382 ** Exemple : longitude, latitude, ar, dec etc...) -> prendre en compte les modifications 373 383 ** 384 ** const char *dev contient le nom du dispositif recevant le message (ici indi_BAO) 385 ** const char *name reçoit le nom de la rubrique modifiée par l'utilisateur 386 ** (ex : les coordonnées géographiques, les coordonnées horaires de l'objet etc...) 387 ** double names[] contient la liste de tous les champs modifiables dans chaque rubrique 388 ** (ex : longitude et latitude dans la rubrique coordonnées géographiques 389 ** char *values[] contient toutes les valeurs (numériques ou non) mais toujours exprimées 390 ** sous la forme d'une chaîne de caractÚres 391 ** 374 392 ***************************************************************************************/ 375 393 … … 400 418 if (!strcmp (name, GeographicCoordsWNP.name)) 401 419 { 402 // l'utilisateur a modifié un les coordonnées géographiques de la boite indi420 // l'utilisateur a modifié une des coordonnées géographiques de la boite indi 403 421 404 422 int i = 0, nset = 0; 405 423 406 424 // En cas d'erreur, on doit pouvoir sortir avec des paramÚtres par défaut 407 // ici la latitude et la longitude vondront 0.0425 // ici la latitude et la longitude valent 0.0 408 426 409 427 Latitude = 0.0; … … 412 430 // pour ce vecteur, on sait qu'il y a n éléments possibles 413 431 // 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 432 // il y a deux éléments : la longitude et la latitude 433 // pour la rubrique alignement, il y a en a trois : simple, affine et taki 417 434 418 435 for (i = 0; i < n; i++) … … 425 442 if (eqp == &GeographicCoordsWN[0]) 426 443 { 427 // ici on a identifié la zone latitude de la boîte de dialogue428 // Value[i] contient la cha ine de caractÚre correspondante dans la boîte444 // ici on a identifié la zone latitude de la boîte de dialogue 445 // Value[i] contient la chaîne de caractÚre correspondante dans la boîte 429 446 // C'est la valeur saisie par l'utilisateur 430 447 … … 459 476 if (nset == 2) 460 477 { 461 // Vérification462 // IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude);463 464 // nset vaut 2, onsommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs478 // Vérification 479 // IDLog("Geographic : RA %5.2f - DEC %5.2f\n", Latitude, Longitude); 480 481 // nset vaut 2, nous sommes donc sûrs qu'il n'y a pas de problÚme dans les valeurs 465 482 // saisies par l'utilisateur 466 483 // voir le code plus haut pour comprendre... 467 484 468 // On change la couleur de la "diode" de la rubrique coordonnées géographiques de la boîte469 // en vert485 // On change la couleur de la "diode" de la rubrique coordonnées 486 // géographiques de la boîte en vert 470 487 471 488 GeographicCoordsWNP.s = IPS_OK; … … 478 495 { 479 496 // quelque chose cloche 480 // peut-être l'une des v eleurs saisies par l'utilisateur n'est-elle pas dans497 // peut-être l'une des valeurs saisies par l'utilisateur n'est-elle pas dans 481 498 // le bon intervalle ? ex : lat = 150° 482 499 … … 496 513 497 514 // 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 t sl en particulier...515 // qui utilisera ces informations pur calculer l'azimut des objets et le temps sidéral local en particulier... 499 516 500 517 DefinirLongitudeLatitude(Longitude, Latitude); … … 533 550 else if (eqp == &EquatorialCoordsWN[1]) 534 551 { 535 // même chose pour la déclinaison552 // même chose pour la déclinaison 536 553 newDEC = values[i]; 537 554 … … 553 570 targetDEC = newDEC; 554 571 555 // on les affiche sdans les logs572 // on les affiche dans les logs 556 573 557 574 fs_sexa(RAStr, newRA, 2, 3600); … … 602 619 if (eqp == &PressionTempWN[0]) 603 620 { 604 // on a compris que l'utilisateur a vaitchangé l'ascension droite de l'objet621 // on a compris que l'utilisateur a changé l'ascension droite de l'objet 605 622 606 623 // on affecte la nouvelle valeur à newRA … … 649 666 if (!strcmp (name, ActualisationNP1.name)) 650 667 { 651 // on a ici exactement le même fonctionnement que précédem ent652 // on rà ©gle ici les valeurs des delais entre deux actualisations668 // on a ici exactement le même fonctionnement que précédemment 669 // on rÚgle ici les valeurs des délais entre deux actualisations 653 670 // de la position en mode transit et tracking 654 // retourne un message d'erreur si les durées ne sont pas exprimées655 // dans un intervalle > 0 .0et < 3600671 // Retourne un message d'erreur si les durées ne sont pas exprimées 672 // dans un intervalle > 0 et < 3600 656 673 657 674 double newAct1 = 1.0; … … 717 734 /************************************************************************************** 718 735 ** L'utilisateur clique sur l'un des boutons de la boîte Indi 719 ** 736 ** Même observation que pour la procédure précédente 737 ** 720 738 ***************************************************************************************/ 721 739 … … 767 785 return; 768 786 769 currentSet = get_switch_index(&AlignmentSP); 770 AlignmentSP.s = IPS_OK; 787 MethodeAlignement = get_switch_index(&AlignmentSP) + 1 ; 788 789 /*char chaine[100]; 790 sprintf(chaine, "****************************************** %i\n", MethodeAlignement); 791 IDLog(chaine);*/ 792 793 AlignmentSP.s = IPS_OK; 771 794 IDSetSwitch(&AlignmentSP, NULL); 772 795 773 for (int i=0; i<MAX ALIGNEMENTANTENNE; i++)774 { 775 switch ( currentSet)796 for (int i=0; i<MAXHOSTNAME; i++) 797 { 798 switch (MethodeAlignement) 776 799 { 777 800 case 1 : … … 846 869 ** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept 847 870 ** qui est bloquante. 871 ** L'adresse IP de l'antenne qui a effectué la connexion est consignée dans la variable IP 872 ** de la structure Sockets. L'état de l'antenne (connected) est placée à true 848 873 ** 849 874 ***************************************************************************************/ … … 858 883 859 884 Sockets[SocketsNumber].IP = server.recupip(Sockets[SocketsNumber].new_sock); 860 861 Sockets[SocketsNumber++].Connected = true; 885 886 Sockets[SocketsNumber].AlignementAntenne->MethodeAlignement = MethodeAlignement; 887 888 Sockets[SocketsNumber++].Connected = true; 862 889 863 890 InitThreadOK = true; … … 894 921 /************************************************************************************** 895 922 ** Extraction de la position de l'antenne aprÚs l'envoi de la commande P 896 ** Le retour de la commande P est POSITION/valeur_az/valeur_alt/ 897 ** ExtractPosition retourne donc Valeur_az et Valeur_alt 923 ** Le retour de la commande P est POSITION/valeur_az/valeur_alt/ 924 ** Ce retour est envoyé dans la chaîne str 925 ** ExtractPosition retourne une structure Position contenant Valeur_az et Valeur_alt 926 ** Ex: ExtractPosition("POSITION/0100/0001/", result) retourne result.x=100 et result.y=1 898 927 ** 899 928 ***************************************************************************************/ … … 929 958 930 959 /************************************************************************************ 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 960 ** Cette procédure, aprÚs avoir appliqué la matrice de rotation aux coordonnées de l'objet 961 ** visées par l'utilisateur, effectue les conversions en unités codeurs des paraboles 934 962 ** (cà d en nb de tours des deux axes moteurs depuis la position PARK) 935 963 ** … … 954 982 if (Sockets[i].Connected) 955 983 { 956 newRA = newRA2;984 newRA = newRA2; 957 985 newDEC = newDEC2; 958 986 … … 960 988 // sur les coordonnées horaires de l'objet visé 961 989 962 // il faut vérifier auparav ent que la matrice de rotation est disponible990 // il faut vérifier auparavant que la matrice de rotation est disponible 963 991 // pour l'antenne i 964 992 965 993 if (Sockets[i].AlignementAntenne->Matrice_ok) 966 994 { 967 // On est bien dans le cas de l'al lignement AFFINE ou Taki995 // On est bien dans le cas de l'alignement AFFINE ou Taki 968 996 969 997 if (Sockets[i].AlignementAntenne->MethodeAlignement == AFFINE || 970 998 Sockets[i].AlignementAntenne->MethodeAlignement == TAKI) 971 999 { 972 1000 // On crée un vecteur avec pour coordonnées 973 1001 // x = Angle horaire de l'objet visé 974 // y = décl ainaison de l'objet1002 // y = déclinaison de l'objet 975 1003 // z = 1.0 976 1004 // Voir la documentation pour plus d'explications sur le calcul affine/taki … … 999 1027 // On récupÚre les nouvelles coordonnées. z ne nous intéresse pas 1000 1028 1001 newRA = VerifAngle(result.x +GetTSL());1029 newRA = VerifAngle(result.x + GetTSL()); 1002 1030 newDEC = result.y; 1003 1031 … … 1023 1051 } 1024 1052 } 1025 IDLog("Nouvelles Coordonnées AD =%s Dec = %s\n", DHMS(newRA*N180divPi, true).c_str(), DHMS(newDEC*N180divPi, false).c_str()); 1026 1027 1053 1028 1054 // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation) 1029 1055 … … 1042 1068 1043 1069 // On constitue un vecteur vect 1044 // Les coordonnées du vecteur correspond ont à la position1045 // d'un point sur une sphÚre de rayon 11046 // avec une latitude = targetAlt et une longitude=targetAz 1047 // on reconnait bienles formules de passage des coordonnées1070 // Les coordonnées du vecteur correspondent à la position 1071 // d'un point défini par une latitude targetAlt et une longitude targetAz 1072 // sur une sphÚre de rayon 1. 1073 // On reconnaît les formules de passage des coordonnées 1048 1074 // sphériques aux coordonnées rectangulaires 1049 1050 1075 1051 1076 … … 1067 1092 targetAz = atan( result.y / result.x ); 1068 1093 1069 if (result.x < 0) targetAz +=Pi;1094 if (result.x < 0) targetAz += Pi; 1070 1095 } 1071 1096 else targetAz = Pidiv2; … … 1107 1132 1108 1133 1109 // Conversion des deux angles en pas codeurs1134 // Conversion des deux angles en pas codeurs 1110 1135 1111 1136 if ( targetAlt < HAUTMIN ) … … 1140 1165 //4000 pas pour 360° sur l'axe az 1141 1166 1142 Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * 4000.0/ 360.0);1167 Sockets[i].TargetPosition.x = (int) Arrondi( targetAz * (double)NBREPASCODEURSAZ / 360.0); 1143 1168 1144 1169 // Message de debug 1145 1170 1146 IDLog("Nbre de pas codeurs Az = %i 1171 IDLog("Nbre de pas codeurs Az = %i Alt = %i\n", Sockets[i].TargetPosition.x, Sockets[i].TargetPosition.y); 1147 1172 } 1148 1173 } … … 1153 1178 1154 1179 /************************************************************************************ 1155 * Retourne le nombre d'antennes actuellement connectées1156 * 1180 ** Retourne le nombre d'antennes actuellement connectées 1181 ** 1157 1182 ************************************************************************************/ 1158 1183 … … 1187 1212 ** Procédure principale 1188 1213 ** Elle est appelée toutes les ms 1214 ** 1189 1215 ***************************************************************************************/ 1190 1216 … … 1199 1225 struct timezone tz; 1200 1226 1201 //si pas de connexion avec le se veur d'indi -> on sort1227 //si pas de connexion avec le serveur d'indi -> on sort 1202 1228 1203 1229 if (!is_connected()) return; … … 1227 1253 DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec); 1228 1254 1229 // Puis on calule le temps sidéral local, le JJ etc.1255 // Puis on calcule le temps sidéral local, le JJ etc. 1230 1256 1231 1257 CalculTSL(); … … 1243 1269 Sockets[i].AlignementAntenne->TransmettreParametresClasseAstro(Annee, Mois, Jour, Heu, Min, Sec, Longitude, Latitude, Pression, Temp); 1244 1270 1245 Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180); 1271 if (Sockets[i].AlignementAntenne->MethodeAlignement == SIMPLE ) 1272 { 1273 //IDLog("chargement simple\n"); 1274 Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennesSIMPLE.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180); 1275 } 1276 else 1277 { 1278 // IDLog("chargement taki\n"); 1279 Sockets[i].AlignementAntenne->ChargementParametresAlignement(Sockets[i].IP, "/home/" + (string)getenv("USER") + "/AlignementAntennesTAKI.cfg", targetRA * 15 * Pidiv180, targetDEC * Pidiv180); 1280 } 1246 1281 } 1247 1282 } … … 1268 1303 1269 1304 ///////////////////////////////////////////////// 1270 // Début des échanges avec les micro contrÃŽleurs1271 1272 // Analyse des réponses des micro contrÃŽleurs1305 // Début des échanges avec les micro-contrÃŽleurs 1306 1307 // Analyse des réponses des micro-contrÃŽleurs 1273 1308 1274 1309 for (int i=1; i<SocketsNumber; i++) … … 1280 1315 string reponse, buffereponse; 1281 1316 1282 // on récupÚre la réponse du micro contrÃŽleur1317 // on récupÚre la réponse du micro-contrÃŽleur 1283 1318 1284 1319 Sockets[i].new_sock >> reponse; … … 1336 1371 if (reponse.find("POSITION") != string::npos) 1337 1372 { 1338 // Il y a une erreur signalée par le micro controleur1373 // Il y a une erreur signalée par le micro-contrÃŽleur 1339 1374 1340 1375 if (reponse.find("NACK") != string::npos) … … 1364 1399 { 1365 1400 // La fonction extractPositon confirme que les positions transmises 1366 // par le micro contrÃŽleur sont valides1401 // par le micro-contrÃŽleur sont valides 1367 1402 1368 1403 OnCoordSetSP.s = IPS_OK; … … 1393 1428 if (reponse.find("NACK") != string::npos) 1394 1429 { 1395 // Une erreur est retournée par le micro controleur concernant la commande Park1430 // Une erreur est retournée par le micro-contrÃŽleur concernant la commande Park 1396 1431 // On affiche le voyant Park en rouge dans la boîte indi... 1397 1432 … … 1418 1453 if (reponse.find("NACK") != string::npos) 1419 1454 { 1420 // Une erreur est retournée par le micro controleur concernant la commande Abort1455 // Une erreur est retournée par le micro-contrÃŽleur concernant la commande Abort 1421 1456 // On affiche le voyant Park en rouge dans la boîte indi... 1422 1457 … … 1443 1478 if (reponse.find("NACK") != string::npos) 1444 1479 { 1445 // Une erreur est retournée par le micro controleur concernant la commande Goto1480 // Une erreur est retournée par le micro-contrÃŽleur concernant la commande Goto 1446 1481 // On affiche le voyant Park en rouge dans la boîte indi... 1447 1482 … … 1452 1487 IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : Erreur GOTO !\n", Sockets[i].IP.c_str()); 1453 1488 1454 // On déconnecte l'antenne. Elle ne semble pas en mesure d'ex ecuter les ordres goto1489 // On déconnecte l'antenne. Elle ne semble pas en mesure d'exécuter les ordres goto 1455 1490 1456 1491 DeconnecterSocket(i); … … 1460 1495 if (reponse.find("OK") != string::npos) 1461 1496 { 1462 // On a ici la confirmation que l'antenne 'i' a bien réalisé 1463 // le goto 1497 // On a ici la confirmation que l'antenne 'i' a bien réalisé le goto 1464 1498 1465 1499 // On prend note … … 1488 1522 } 1489 1523 1490 // Si le nombre d'antennes connectées est > 01524 // Si le nombre d'antennes connectées est > 0 1491 1525 // et que toutes les antennes connectées ont 1492 1526 // réalisé le goto alors... … … 1495 1529 { 1496 1530 // C'est bon ! Tout marche bien... 1497 // On actualise l'A R et la dec dans la boîte de dialogue1531 // On actualise l'AD et la Dec dans la boîte de dialogue 1498 1532 1499 1533 lastRA = targetRA; … … 1559 1593 Suivi = false; 1560 1594 1561 // On arrête l'enchaînement des actions 1562 // pour réaliser un goto 1595 // On arrête l'enchaînement des actions nécessaires à la réalisation d'un goto 1563 1596 1564 1597 RealisationGoto = false; … … 1617 1650 InitAntennes(); 1618 1651 1619 // Pour permettre de refaire un park1652 // Pour permettre de refaire un park 1620 1653 1621 1654 Park = false; … … 1629 1662 { 1630 1663 // Délais entre deux actualisations 1631 1632 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) 1635 1636 1637 // On actualise la position si le delai est dépassé 1664 1665 // Actualisation toutes les 15 minutes en mode transit (par défaut) 1666 1667 double delai = ActualisationTMTransit / 3600.0 / 24.0; 1668 1669 // et 5 secs en mode tracking (par défaut) 1670 1671 if (TrackingMode == BAO_TRACKING) delai = ActualisationTMTracking / 3600.0 / 24.0; 1672 1673 1674 // On actualise la position si le délai est dépassé 1638 1675 1639 1676 if (GetJJ() - JJAnc > delai) 1640 1677 { 1641 // Cette variable vau dra true lorsque le goto aura été réalisé1678 // Cette variable vaut true lorsque le goto a été réalisé 1642 1679 1643 1680 UpdatedGoto = false; … … 1706 1743 case 0 : 1707 1744 { 1708 // On doit in tialiser l'acknowledge à false1745 // On doit initialiser l'acknowledge à false 1709 1746 1710 1747 Sockets[i].ack_pos = false; … … 1765 1802 1766 1803 // Les erreurs graves s'accumulent. Pas de réponse aprÚs plusieurs minutes 1767 // Il faut déconnecter l'antenne1804 // -> Il faut déconnecter l'antenne 1768 1805 if (Sockets[i].AnomaliesExecution > MAXANOMALIES) 1769 1806 { … … 1772 1809 OnCoordSetSP.s = IPS_ALERT; 1773 1810 1774 //Message à l'attentnio de l'utilisateur 1811 //Message à l'attention de l'utilisateur 1812 1775 1813 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : pas d acknowledge recu apres l ordre POSITION. \ 1776 1814 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1777 1815 1778 1816 // On déconnecte l'antenne 1817 1779 1818 DeconnecterSocket(i); 1780 1819 } … … 1792 1831 // Tout vas bien 1793 1832 // On ne consigne aucune anomalie 1833 1794 1834 Sockets[i].AttenteExecution = 0; 1795 1835 Sockets[i].AnomaliesExecution = 0; 1796 1836 1797 1837 //On passe à l'étape suivante 1838 1798 1839 Sockets[i].etape++; 1799 1840 } … … 1812 1853 1813 1854 // On consigne une erreur grave. L'antenne tarde à répondre 1855 1814 1856 Sockets[i].AnomaliesExecution++; 1815 1857 } … … 1817 1859 // Aucune réponse de l'antenne depuis plusieurs minutes 1818 1860 // On la déconnecte 1861 1819 1862 if (Sockets[i].AnomaliesExecution > MAXANOMALIES) 1820 1863 { … … 1824 1867 1825 1868 //Message d'erreur 1869 1826 1870 IDSetSwitch(&OnCoordSetSP, "Erreur sur l antenne %s : la position retournee n est pas valide. \ 1827 1871 Deconnexion de l antenne.", Sockets[i].IP.c_str()); 1828 1872 1829 1873 //Déconnexion de l'antenne 1874 1830 1875 DeconnecterSocket(i); 1831 1876 } … … 1898 1943 if (Sockets[i].AttenteExecution > MAXATTENTE) 1899 1944 { 1900 // On prolonge l'attente afin de recevoi tun GOTO OK1945 // On prolonge l'attente afin de recevoir un GOTO OK 1901 1946 1902 1947 Sockets[i].etape = 5; … … 1905 1950 } 1906 1951 1907 // On déconnecte l'antenne s'il n'y a pas de co onfirmation du goto au bout de 2 minutes1952 // On déconnecte l'antenne s'il n'y a pas de confirmation du goto au bout de 2 minutes 1908 1953 if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO) 1909 1954 { … … 1927 1972 1928 1973 /////////////////////////////////////// 1929 // Traitement de l'étape 3 de la réalisation d'un goto1974 // Réalisation d'un goto - traitement de l'étape 3 1930 1975 // On place cette partie du traitement en dehors du switch et de la boucle 1931 // pour pouvoir envoyer les ordresgotos à toutes les antennes lorsque l'on a la confirmation1932 // qu'elles sont toutes prêtes à ex ecuter cet ordre (être à l'étape 3 pour un socket)1976 // pour pouvoir envoyer les gotos à toutes les antennes lorsque l'on a la confirmation 1977 // qu'elles sont toutes prêtes à exécuter cet ordre (être à l'étape 3 pour un socket) 1933 1978 // -> meilleure synchronisation 1934 1979 … … 2004 2049 /************************************************************************************** 2005 2050 ** Mode transit ou tracking 2051 ** 2006 2052 ***************************************************************************************/ 2007 2053 … … 2011 2057 { 2012 2058 // Transit 2059 2013 2060 case BAO_TRANSIT: 2014 2061 2015 // Eteindre les voyants dans la boîte de dialogue Indi2062 // Ãteindre les voyants dans la boîte de dialogue Indi 2016 2063 EquatorialCoordsWNP.s = IPS_BUSY; 2017 2064 AbortSlewSP.s = IPS_IDLE; … … 2026 2073 InitAntennes(); 2027 2074 2028 // On garde la trace du début du Goto pour encha iner les actualisations2075 // On garde la trace du début du Goto pour enchaîner les actualisations 2029 2076 2030 2077 JJAnc = GetJJ(); … … 2036 2083 // Mode transit activé 2037 2084 2038 TrackingMode = 1;2085 TrackingMode = BAO_TRANSIT; 2039 2086 2040 2087 // On suit un objet … … 2053 2100 2054 2101 // Tracking 2102 2055 2103 case BAO_TRACKING: 2056 2104 2057 //Eteindre les voyants dans la boîte de dialogue Indi 2105 // Ãteindre les voyants dans la boîte de dialogue Indi 2106 2058 2107 EquatorialCoordsWNP.s = IPS_BUSY; 2059 2108 AbortSlewSP.s = IPS_IDLE; … … 2070 2119 ADDEC2Motor(targetRA, targetDEC); 2071 2120 2072 TrackingMode = 2;2121 TrackingMode = BAO_TRACKING; 2073 2122 2074 2123 Suivi = true; … … 2088 2137 /************************************************************************************** 2089 2138 ** Connexion / Déconnexion avec le télescope 2139 ** 2090 2140 ***************************************************************************************/ 2091 2141 … … 2270 2320 2271 2321 // problÚme 1 : si deltaAz > à un demi-tours - soit 2000 pas codeur alors 2272 // on fait le trajet dans lesens inverse pour aller plus vite2322 // on fait le trajet en sens inverse pour aller plus vite 2273 2323 2274 2324 // problÚme 2 : Passage au méridien … … 2278 2328 2279 2329 // ne pas faire des tours complets en Az pour rien... 2330 2280 2331 while (deltaAz > NBREPASCODEURSAZ) deltaAz -= NBREPASCODEURSAZ; 2281 2332 2282 2333 // Doit résoudre tous les problÚmes concernant l'azimut... 2334 2283 2335 if (deltaAz > NBREPASCODEURSAZ / 2 ) 2284 2336 { … … 2313 2365 { 2314 2366 //Il ne faut exécuter la fonction qu'une seule fois 2367 2315 2368 static int isInit = 0; 2316 2369 -
BAORadio/libindi/libindi/drivers/telescope/BAO.h
r642 r648 57 57 58 58 int sendalertes; // une requête 'send' a généré une erreur sur le réseau 59 int AttenteExecution; // L'antenne parvient-elle à ex ecuter un cycle de commandes ?59 int AttenteExecution; // L'antenne parvient-elle à exécuter un cycle de commandes ? 60 60 int AnomaliesExecution; // Erreur critique. L'antenne ne répond plus ! 61 int etape; // étape dans le cycle de commandes/réponses entre PC et micro controleurs61 int etape; // étape dans le cycle de commandes/réponses entre PC et micro-contrÃŽleurs 62 62 63 63 bool Connected; // le micro-contrÃŽleur est-il connecté ? 64 64 bool PosValides; // le micro-contrÃŽleur a-t-il donné une position des moteurs valide ? 65 65 bool ack_status; // Etat des acknowledges ? 66 bool ack_pos; // le PC a-t-il reçu une confirmation du micro controleurs aprÚs un ordre POSITION ?67 bool ack_park; // le PC a-t-il reçu une confirmation du micro controleurs aprÚs un ordre PARK ?68 bool ack_abort; // le PC a-t-il reçu une confirmation du micro controleurs aprÚs un ordre ABORT ?69 bool ack_goto; // le PC a-t-il reçu une confirmation du micro controleurs aprÚs un ordre GOTO ?66 bool ack_pos; // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre POSITION ? 67 bool ack_park; // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre PARK ? 68 bool ack_abort; // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre ABORT ? 69 bool ack_goto; // le PC a-t-il reçu une confirmation du micro-contrÃŽleurs aprÚs un ordre GOTO ? 70 70 bool GotoOk; // Est-ce que le dernier goto est OK ? 71 71 72 72 Position TargetPosition; // Position à atteindre 73 Position Pos; // derniÚre position retournée par le micro contrÃŽleur73 Position Pos; // derniÚre position retournée par le micro-contrÃŽleur 74 74 75 75 Alignement *AlignementAntenne; // Contient les paramÚtres d'alignement de l'antenne … … 79 79 // Le PC et les antennes communiquent par le biais du port 8000 sur le réseau Ethernet 80 80 81 ServerSocket server( 8000);81 ServerSocket server( BAO_PORT ); 82 82 83 83 class BAO : public Astro … … 206 206 double lastDEC; // ...et la déclinaison 207 207 double JJAnc; // Sauvegarde du jour julien lors de la derniÚre actualisation de la position (fct Goto) 208 double ActualisationTMTransit; // Délai entre deux actualisations dans les modes transit 209 double ActualisationTMTracking; // " " " tracking 208 double ActualisationTMTransit; // Délai entre deux actualisations dans les modes transit (en sec) 209 double ActualisationTMTracking; // " " " tracking (en sec) 210 210 double Longitude; // Longitude et latitude du lieu d'observation 211 211 double Latitude; … … 221 221 222 222 int currentSet; // mode de suivi actuel - tracking ou transit 223 int lastSet; // Variable interne de l'interface indi - ne pas toucher224 int TrackingMode; // 1 : Transit 2: Tracking223 int MethodeAlignement; // Méthode d'alignement 224 BAO_STATUS TrackingMode; // Mode de suivi actuellement activé 225 225 }; 226 226 -
BAORadio/libindi/libindi/result_recherche_bao
r643 r648 1 2 3 Results from query to NASA/IPAC Extragalactic Database (NED),4 which is operated by the Jet Propulsion Laboratory, California Institute of5 Technology, under contract with the National Aeronautics and Space Administration.6 This work was (partially) supported by the US National Virtual Observatory7 development project, which is funded by the National Science Foundation8 under cooperative agreement AST0122449 with The Johns Hopkins University.9 10 11 12 queryDateTime:2012-02-24T03:26:46PST13 14 15 16 Main Information Table for MESSIER 09217 18 19 20 Equinox:J2000.021 22 23 24 CoordSystem:Equatorial25 26 No.|Object Name|RA(deg)|DEC(deg)|Type|Velocity|Redshift|Redshift Flag|Magnitude and Filter|Distance (arcmin)|References|Notes|Photometry Points|Positions|Redshift Points|Diameter Points|Associations27 1|MESSIER 092|259.28029 | 43.13652 |*Cl|||| ||27|1|0|0|0|2|2
Note: See TracChangeset
for help on using the changeset viewer.