Changeset 619 for BAORadio/libindi
- Timestamp:
- Dec 4, 2011, 7:51:30 PM (13 years ago)
- Location:
- BAORadio/libindi/libindi
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
BAORadio/libindi/libindi/BAOControl/Makefile
r504 r619 2 2 # 3 3 4 CC = g++ 5 #CFLAGS = -g 6 #CXXFLAGS = -g 4 CC = g++ 5 #debug 6 CFLAGS = -g 7 CXXFLAGS = -g 7 8 8 BAOcontrol_objects = main.o baocontrol.o ClientSocket.o Socket.o filetools.o exception.o ../drivers/telescope/astro.o9 BAOcontrol_objects = main.o baocontrol.o ClientSocket.o Socket.o filetools.o exception.o 9 10 10 11 … … 13 14 14 15 BAOcontrol: $(BAOcontrol_objects) 15 g++ -o BAOcontrol $(BAOcontrol_objects) -lpthread -lX11 16 g++ $(CXXFLAGS) -c -o ../BAOControl/astro.o ../drivers/telescope/astro.cpp 17 g++ $(CXXFLAGS) -o BAOcontrol $(BAOcontrol_objects) astro.o -lpthread -lX11 16 18 17 19 Socket: Socket.cpp 18 20 ClientSocket: ClientSocket.cpp 19 Astro: ../drivers/telescope/astro.cpp20 21 baocontrol: baocontrol.cpp 22 filetools: filetools.cpp 23 exception: exception.c 21 24 main: main.cpp 22 25 -
BAORadio/libindi/libindi/BAOControl/baocontrol.cpp
r504 r619 4 4 /* Franck RICHARD */ 5 5 /* franckrichard033@gmail.com */ 6 /* Juin 2011*/6 /* Décembre 2011 */ 7 7 /******************************/ 8 8 9 9 10 10 #include "baocontrol.h" 11 #include <termios.h> 12 #include <unistd.h> 11 13 12 14 … … 31 33 * Laboratoire de l'Accélérateur Linéaire *\n \ 32 34 * *\n \ 33 * v0. 2 20/06/2011 *\n \35 * v0.4 02/12/2011 *\n \ 34 36 * franckrichard033@gmail.com *\n \ 35 37 ******************************************\n\n\n", true); … … 41 43 delaitracking = 0; 42 44 lognum = 0; 43 numAntenne 45 numAntennes = 0; 44 46 numobjets = 0; 45 47 runnum = 1; … … 72 74 Antennes[i].ok=0; 73 75 Antennes[i].ip=0; 76 Antennes[i].delta_az=0; 77 Antennes[i].delta_ha=0; 74 78 } 75 79 … … 123 127 { 124 128 // destruction des tableaux 125 129 126 130 delete [] Antennes; 127 131 delete [] objets; 128 132 129 // destruction de la fenêtre graphique, 133 // destruction de la fenêtre graphique,des caractÚres 130 134 131 135 if (d!=NULL) … … 417 421 { 418 422 // On ne garde que la partie intéressante 419 // La partie suivant"message="...423 // La partie "message="... 420 424 reponse = reponse.substr(reponse.find("message") + 9); 421 425 … … 426 430 427 431 // On récupÚre l'adresse ip de l'antenne qui nous parle 428 // et on met à jour le tab meau des états des antennes432 // et on met à jour le tableau des états des antennes 429 433 430 434 if (reponse.find(". (Antennes connectees")!=string::npos) 431 435 { 432 decomp =reponse.substr(0, reponse.find(". (Antennes connectees"));433 decomp =decomp.substr(decomp.rfind(".")+1);436 decomp = reponse.substr(0, reponse.find(". (Antennes connectees")); 437 decomp = decomp.substr(decomp.rfind(".")+1); 434 438 435 439 // si cette antenne est déjà connectée, on change son état 436 437 for (int i=0; i<numAntenne; i++)440 441 if (atoi(decomp.c_str())!=0) for (int i=0; i<numAntennes; i++) 438 442 { 439 443 if (atoi(decomp.c_str()) == Antennes[i].ip) … … 449 453 if (!test) 450 454 { 451 Antennes[numAntenne ].ip = atoi(decomp.c_str());452 Antennes[numAntenne ++].ok = 1;455 Antennes[numAntennes].ip = atoi(decomp.c_str()); 456 Antennes[numAntennes++].ok = 1; 453 457 } 454 458 } … … 462 466 decomp = decomp.substr(decomp.rfind(".") + 1); 463 467 464 for (int i=0; i<numAntenne ; i++)468 for (int i=0; i<numAntennes; i++) 465 469 { 466 470 if (atoi(decomp.c_str()) == Antennes[i].ip) … … 498 502 499 503 504 500 505 /************************************************************************************** 501 506 ** Est-ce que la réponse du pilote indi_BAO est conforme à ce que l'on attendait ? … … 596 601 DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec); 597 602 598 599 // On lance le calcul 603 // On lance les calculs 600 604 601 605 CalculTSL(); … … 627 631 628 632 // Faut-il executer un fichier de mouvements ? 629 // il faut qu'il y ait plus d'un mouvement630 // et exxecuter les commande dans ce test jusqu'au dernier mouvement631 633 632 634 if (run && numobjets>1 && runnum<numobjets) … … 637 639 if (JJ >= objets[runnum].JJ && !objets[runnum].exec) 638 640 { 639 // petit s messagespour l'utilisateur640 641 if ( runnum==1) Affiche("Début de l'exécution du fichier de mouvements\n\n", true);641 // petit message pour l'utilisateur 642 643 if ( runnum == 1 ) Affiche("Début de l'exécution du fichier de mouvements\n\n", true); 642 644 643 645 os << "Suivi de l'objet n°" << runnum << endl; … … 677 679 // on réinitiale toutes les variables impliquées dans la commande run 678 680 679 run =false;680 runnum =1;681 numobjets =1;681 run = false; 682 runnum = 1; 683 numobjets = 1; 682 684 683 685 // On sort du programme dans le cas BAOControl -r fileName … … 718 720 return 0; 719 721 } 720 721 722 722 723 … … 752 753 while (chaine[0] == ' ') chaine = chaine.substr(1); 753 754 754 // si on veut prendre les deux arguments d'un commande755 // si on veut prendre les deux arguments d'une commande 755 756 756 757 if (chaine2 != NULL) … … 775 776 { 776 777 // on prend tout d'un bloc aprÚs la commande -> chaine 1 777 // utile pour une commande ty type goto m 42qui doit retourner "m 42" dans une778 // utile pour une commande du type "goto m 42" qui doit retourner "m 42" dans une 778 779 // même chaine 779 780 … … 794 795 { 795 796 // la communication avec le pilote indi_BAO 796 // se fait par l'envoie de petit fichierxml797 // se fait par l'envoie de fichiers xml 797 798 // d'où le cÃŽté complexe des commandes 798 799 … … 936 937 // à l'époque de l'observation 937 938 938 if ( J2000)939 if ( J2000 ) 939 940 { 940 941 Precession(&arf, &decf); … … 1071 1072 { 1072 1073 Affiche("BAOcontrol s'est bien déconnecté du pilote indi_BAO.\n\n", true); 1074 } 1075 1076 return true; 1077 } 1078 1079 1080 /************************************************************************************** 1081 ** Gestion du clavier en mode raw pour la procédure d'alignement 1082 ***************************************************************************************/ 1083 1084 void mode_raw(int activer) 1085 { 1086 static struct termios cooked; 1087 static int raw_actif = 0; 1088 1089 if (raw_actif == activer) 1090 return; 1091 1092 if (activer) 1093 { 1094 struct termios raw; 1095 1096 tcgetattr(STDIN_FILENO, &cooked); 1097 1098 raw = cooked; 1099 cfmakeraw(&raw); 1100 tcsetattr(STDIN_FILENO, TCSANOW, &raw); 1101 } 1102 else 1103 tcsetattr(STDIN_FILENO, TCSANOW, &cooked); 1104 1105 raw_actif = activer; 1106 } 1107 1108 1109 /************************************************************************************** 1110 ** Alignement de l'antenne située à l'adresse ip 1111 ***************************************************************************************/ 1112 1113 bool BAOcontrol::Alignement(string ip) 1114 { 1115 bool test=false; 1116 1117 int i; 1118 1119 if (ip.rfind(".") != string::npos) ip=ip.substr(ip.rfind(".")+1); 1120 1121 for (i=0; i<numAntennes; i++) 1122 { 1123 if (atoi(ip.c_str()) == Antennes[i].ip) { test=true; break; } 1124 } 1125 1126 if ((test) && (atoi(ip.c_str())!=0)) 1127 { 1128 Affiche("Début de l'alignement de l'antenne.\n \ 1129 Appuyez sur les touches Z,Q,D,X pour centrer l'objet dans le viseur.\n \ 1130 (ESC pour arrêter et valider).\n\n", true); 1131 1132 int c = 0; 1133 1134 while (c!=27) 1135 { 1136 mode_raw(1); 1137 1138 c = getchar(); 1139 1140 mode_raw(0); 1141 1142 switch(c) 1143 { 1144 case 122 : Antennes[i].delta_ha++; Affiche("delta_ha + 1\n", true); break; 1145 case 100 : Antennes[i].delta_az++; Affiche("delta_az + 1\n", true); break; 1146 case 113 : Antennes[i].delta_az--; Affiche("delta_az - 1\n", true); break; 1147 case 120 : Antennes[i].delta_ha--; Affiche("delta_ha - 1\n", true); break; 1148 } 1149 1150 // Enregistrement des paramÚtres d'alignement des antennes 1151 1152 EnregistrementParametresAlignement("/home/" + (string)getenv("USER") + "/AlignementAntennes.cfg"); 1153 } 1154 } 1155 else 1156 { 1157 Erreur("L'antenne située à l'adresse ip indiquée n'existe pas\n\n"); 1158 1159 return false; 1160 } 1161 1162 return true; 1163 } 1164 1165 1166 /************************************************************************************** 1167 ** Sauvegarde des paramÚtres d'alignement des antennes 1168 ***************************************************************************************/ 1169 1170 bool BAOcontrol::EnregistrementParametresAlignement(string fileName) 1171 { 1172 string section; 1173 string key; 1174 string value; 1175 char ip[100]; 1176 1177 stringstream os; 1178 1179 //Affiche("Enregistrement de l'alignement des antennes dans le fichier " + fileName + "\n", true); 1180 1181 //Enregistrement des corrections des l'antennes 1182 1183 for (int i=0; i< numAntennes; i++) 1184 { 1185 sprintf(ip, "%i", Antennes[i].ip); 1186 os << "Alignement antenne ip x.x.x." << (string)ip; 1187 section = os.str(); 1188 os.str(""); 1189 key = "delta_az"; 1190 os << Antennes[i].delta_az; 1191 value = os.str(); 1192 os.str(""); 1193 1194 writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str()); 1195 1196 key = "delta_ha"; 1197 os << Antennes[i].delta_ha; 1198 value = os.str(); 1199 os.str(""); 1200 1201 writeINI((char*)section.c_str(), (char*)key.c_str(), (char*)value.c_str(), (char*)fileName.c_str()); 1073 1202 } 1074 1203 … … 1603 1732 } 1604 1733 } 1734 1735 // correction de l'alignement d'une antenne par rapport à l'objet visé 1736 1737 if (chaine.find("align")!=string::npos) 1738 { 1739 string antenne; 1740 1741 CommandeOK = true; 1742 1743 if (DecompositionCommande(chaine, "align", &antenne, NULL)) 1744 { 1745 Alignement(antenne); 1746 } 1747 else 1748 { 1749 Erreur("Erreur align : la commande align doit être suivie par l'ip de l'antenne qui faut aligner.\n\n"); 1750 } 1751 } 1605 1752 1606 1753 // Aide du programme … … 1628 1775 cout << " Goto sun permet de suivre le soleil." << endl; 1629 1776 cout << "search nom_objet : interroge le serveur NED sur internet et retourne les coordonnées de l'objet." << endl; 1777 cout << "align ip : lance la procédure d'alignement de l'antenne d'adresse ip." << endl; 1630 1778 cout << "transit : active le mode de suivi transit." << endl; 1631 1779 cout << "tracking : active le mode de suivi tracking." << endl; … … 1818 1966 1819 1967 /************************************************************************************** 1820 ** Lect eurd'un fichier ligne aprÚs ligne1968 ** Lecture d'un fichier ligne aprÚs ligne 1821 1969 ** retourne -1 à la fin 1822 1970 ***************************************************************************************/ … … 2135 2283 2136 2284 // on décode et exécute les commandes 2137 DecodageEntreesUtilisateur(chaine); 2285 DecodageEntreesUtilisateur(chaine); 2286 2138 2287 } 2139 2288 while (NoExit); -
BAORadio/libindi/libindi/BAOControl/baocontrol.h
r504 r619 23 23 #include <sys/time.h> 24 24 25 26 25 // couleurs utilisées dans le terminal 27 26 … … 38 37 39 38 40 // limites des tableaux39 // dimensions des tableaux 41 40 42 41 #define MAXLOG 1000 … … 45 44 46 45 47 // dimensions de la fenêtre graphique46 // dimensions de la fenêtre graphique 48 47 49 48 #define haut_fenetre 10+22*10 … … 58 57 59 58 char ok; // actuellement disponible ? 59 60 long delta_az; 61 62 long delta_ha; 60 63 }; 61 64 … … 64 67 struct DefObjets 65 68 { 66 double JJ; // Jour julien où le télescope doit aller pointer versl'objet69 double JJ; // Date julienne où le télescope doit aller pointer l'objet 67 70 double Duree; // Durée de l'observation de l'objet en sec 68 71 string ad; // Ascension droite J2000 de l'objet … … 103 106 bool Connect(bool connect); 104 107 bool LectureFichierMouvements(string fileName); 108 bool EnregistrementParametresAlignement(string fileName); 105 109 void DecodageEntreesUtilisateur(string chaine); 106 110 bool Run(string fichier); … … 108 112 Coordonnees ServeurNED(string objet); 109 113 int readline (FILE * pfile, char *tab); 114 bool Alignement(string ip); 110 115 111 116 … … 122 127 int delaitracking; // Délai entre deux actualisations de la position en mode tracking 123 128 int lognum; // Nbre d'enregistrements dans le tableau logs 124 int numAntenne ; // Nbre d'antennes connectées129 int numAntennes; // Nbre d'antennes connectées 125 130 int numobjets; // Nbre d'objets dans le dernier fichier de mouvements chargé 126 131 int runnum; // Numéro de l'objet actuellement visé dans le fichier de mouvement 127 132 128 133 double Pression; // Pression atmosphérique en mBar 129 double Temperature; // température de l'atmosphÚre 134 double Temperature; // température de l'atmosphÚre en °C 130 135 131 136 bool NoExit; // A-t-on tapé exit pour sortir ? Permet de fermer le thread à ce moment-là -
BAORadio/libindi/libindi/BAOControl/filetools.cpp
r504 r619 84 84 delete prev; 85 85 86 87 86 } while (pKey!=keyprev); 88 87 89 if (pSection->name) delete [] pSection->name;88 if (pSection->name) delete [] pSection->name; 90 89 91 90 secprev=pSection; … … 222 221 ******************************************************/ 223 222 224 /* 223 225 224 226 225 char * writeINI (char *sectionName, char *keyName, char *keyValue, char *fileName) … … 229 228 char *pKeyName = NULL; 230 229 char *pKeyValue = NULL; 231 INI *pIni = NULL;230 INI *pIni = NULL; 232 231 SECTION *pSection = NULL; 233 232 KEY *pKey = NULL; 234 233 TRY 235 234 { 236 pKeyName = (char *) m_malloc (sizeof (char) * strlen (keyName) + 1); 237 pSectionName = 238 (char *) m_malloc (sizeof (char) * strlen (sectionName) + 3); 235 pKeyName = new char [sizeof (char) * strlen (keyName) + 1]; 236 pSectionName = new char [sizeof (char) * strlen (sectionName) + 3]; 239 237 if (keyValue != NULL) 240 238 { 241 pKeyValue = (char *) m_malloc (sizeof (char) * strlen (keyValue) + 1);239 pKeyValue = new char [sizeof (char) * strlen (keyValue) + 1]; 242 240 strcpy (pKeyValue, keyValue); 243 241 pKeyValue[strlen (keyValue)] = '\0'; … … 245 243 else 246 244 { 247 pKeyValue = (char *) m_malloc (sizeof (char));245 pKeyValue = new char [sizeof (char)]; 248 246 pKeyValue[0] = '\0'; 249 247 } … … 255 253 //chargement 256 254 pIni = _loadINI (fileName); 257 258 255 } 259 256 CATCH (ERR_FOPEN) … … 277 274 if (pKey != NULL) 278 275 { 279 pKey->value = 280 (char *) realloc (pKey->value, 281 sizeof (char) * strlen (pKeyName) + 1); 276 if (pKey->value != NULL) { delete [] pKey->value; pKey->value = NULL; pKey->value = new char [sizeof (char) * strlen (pKeyValue) + 1]; } 277 282 278 if (pKey->value == NULL) 283 279 { … … 296 292 else 297 293 { 298 //section pas trouve, on la cree avec sa cle294 //section pas trouve, on la cree avec sa cle 299 295 pSection = _newSECTION (pSectionName); 300 296 _addSECTION (pIni, pSection); … … 305 301 TRY 306 302 { 307 308 303 //sauvegarde 309 304 _saveINI (pIni); … … 312 307 CATCH (ERR_FOPEN) 313 308 { 314 printf ("err uer sur le fichier %s", pIni->fileName);309 printf ("erreur sur le fichier %s", pIni->fileName); 315 310 } 316 311 ENDTRY; 317 312 318 313 //nettoyage 319 320 free (pIni);321 free (pSection);322 free (pKey);323 free (pKeyName);324 free (pSectionName);314 if (pKey->value != NULL) delete [] pKey->value; 315 if (pKey != NULL) delete [] pKey; 316 if (pKeyName != NULL) delete [] pKeyName; 317 if (pSectionName != NULL) delete [] pSectionName; 318 if (pIni != NULL) delete [] pIni; 319 if (pSection != NULL) delete [] pSection; 325 320 pIni = NULL; 326 321 pKeyName = NULL; … … 328 323 return pKeyValue; 329 324 } 330 */ 325 331 326 332 327 /****************************************************** … … 756 751 ******************************************************/ 757 752 758 /* 759 *int753 754 int 760 755 _saveINI (INI * pIni) 761 756 { … … 787 782 TRY 788 783 { 789 str = (char *) m_malloc (sizeof (char) * offset);784 str = new char [sizeof (char) * offset]; 790 785 } 791 786 CATCH (ERR_MALLOC) … … 805 800 pKey_pred = pKey; 806 801 pKey = pKey->next; 807 free (str);802 delete [] str; 808 803 } 809 804 while (pKey != pKey_pred); … … 816 811 //nettoyage 817 812 fclose (pFile); 818 } */813 } 819 814 820 815 /****************************************************** … … 859 854 /* on lit ligne par ligne */ 860 855 nbRead = readline (pFile, pBuf); 861 if (nbRead==-1) { fclose(pFile); delete [] pIni->fileName; delete pIni; delete [] pBuf; return 0;}856 // if (nbRead==-1) { fclose(pFile); delete [] pIni->fileName; delete pIni; delete [] pBuf; return 0;} 862 857 while (nbRead != -1) 863 858 { -
BAORadio/libindi/libindi/BAOControl/result
r504 r619 10 10 11 11 12 queryDateTime:2011- 06-26T14:47:53PDT12 queryDateTime:2011-12-04T07:23:36PST 13 13 14 14 15 15 16 Main Information Table for MESSIER 0 8216 Main Information Table for MESSIER 031 17 17 18 18 … … 25 25 26 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|Associations 27 1|MESSIER 0 82|148.96969 | 69.67938 |G| 203| 0.000677 | | 9.30||1671|32|239|9|14|9|027 1|MESSIER 031| 10.68479 | 41.26906 |G| -300|-0.001001 | | 4.36||3357|17|132|8|26|7|0 -
BAORadio/libindi/libindi/CMakeLists.txt
r504 r619 314 314 ${CMAKE_SOURCE_DIR}/drivers/telescope/ServerSocket.cpp 315 315 ${CMAKE_SOURCE_DIR}/drivers/telescope/astro.cpp 316 ${CMAKE_SOURCE_DIR}/drivers/telescope/BAO.cpp ) 316 ${CMAKE_SOURCE_DIR}/drivers/telescope/BAO.cpp 317 ${CMAKE_SOURCE_DIR}/drivers/telescope/exception.c 318 ${CMAKE_SOURCE_DIR}/drivers/telescope/filetools.cpp 319 ) 317 320 318 321 add_executable(indi_BAO ${BAO_SRCS} ${liblilxml_SRCS} ${libindicom_SRCS}) -
BAORadio/libindi/libindi/drivers/telescope/BAO.cpp
r504 r619 5 5 ## Franck RICHARD 6 6 ## franckrichard033@gmail.com 7 ## Juin20117 ## Décembre 2011 8 8 ## 9 9 ############################# … … 15 15 auto_ptr<BAO> telescope(0); 16 16 17 const int POLLMS = 1; // Period of update, 1 ms.17 const int POLLMS = 1; // Period of update, 1 ms. 18 18 19 19 const char *mydev = "BAO"; // Name of our device. … … 66 66 Abort = false; 67 67 Park = false; 68 Suivi 68 Suivi = false; 69 69 Exit = false; 70 70 71 71 72 72 // initialisation des sockets (Antennes) 73 73 74 for (int i=0; i<MAXHOSTNAME; i++) 74 75 { 75 Sockets[i].Connected=false; 76 Sockets[i].IP=""; 76 Sockets[i].Connected = false; 77 Sockets[i].IP = ""; 78 79 Sockets[i].Delta.x = 0.0; 80 Sockets[i].Delta.y = 0.0; 77 81 } 78 82 79 83 // initialisations supplémentaires 84 80 85 InitAntennes(); 81 86 82 87 // Numéro de version 88 83 89 IDLog("Initilizing from BAO device...\n"); 84 IDLog("Driver Version: 2011- 06-27\n");90 IDLog("Driver Version: 2011-12-02\n"); 85 91 86 92 //connect_telescope(); … … 91 97 ** Destructeur 92 98 ** Lorsque l'on lance indi_BAO depuis indiserver dans un terminal 93 ** Le destructeur ne semble jamais être atteint lorsque l'on sort... 99 ** Le destructeur ne semble jamais être atteint lorsque l'on sort... A vérifier 94 100 ***************************************************************************************/ 95 101 BAO::~BAO() 96 102 { 97 Exit =true;103 Exit = true; 98 104 sleep(1); 99 105 pthread_join (th1, NULL); 100 106 } 101 107 108 109 /************************************************************************************ 110 * Initialisation des paramÚtres des antennes 111 * 112 ************************************************************************************/ 113 void BAO::InitAntennes() 114 { 115 for (int i=0; i<MAXHOSTNAME; i++) 116 { 117 Sockets[i].status = 0; 118 Sockets[i].sendalertes = 0; 119 Sockets[i].AttenteExecution = 0; 120 Sockets[i].AnomaliesExecution = 0; 121 Sockets[i].etape = 0; 122 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 } 102 133 103 134 … … 171 202 IDDefNumber(&ActualisationNP1, NULL); 172 203 IDDefNumber(&ActualisationNP2, NULL); 173 174 } 175 176 177 178 /************************************************************************************** 179 ** En cas de changement de texte dans la boîte de dialogue. Exemple : changement du 180 ** nom de l'objet. Cette fonction n'est pas encore utilisée 204 } 205 206 207 /************************************************************************************** 208 ** Initialisation des vecteurs INDI 209 ***************************************************************************************/ 210 211 void BAO::reset_all_properties() 212 { 213 ConnectSP.s = IPS_IDLE; 214 OnCoordSetSP.s = IPS_IDLE; 215 AbortSlewSP.s = IPS_IDLE; 216 ParkSP.s = IPS_IDLE; 217 ObjectTP.s = IPS_IDLE; 218 EquatorialCoordsWNP.s = IPS_IDLE; 219 GeographicCoordsWNP.s = IPS_IDLE; 220 ActualisationNP1.s = IPS_IDLE; 221 ActualisationNP2.s = IPS_IDLE; 222 223 IUResetSwitch(&OnCoordSetSP); 224 IUResetSwitch(&AbortSlewSP); 225 IUResetSwitch(&ParkSP); 226 227 OnCoordSetS[0].s = ISS_ON; 228 ConnectS[0].s = ISS_OFF; 229 ConnectS[1].s = ISS_ON; 230 231 IDSetSwitch(&ConnectSP, NULL); 232 IDSetSwitch(&OnCoordSetSP, NULL); 233 IDSetSwitch(&AbortSlewSP, NULL); 234 IDSetSwitch(&ParkSP, NULL); 235 IDSetText(&ObjectTP, NULL); 236 IDSetNumber(&EquatorialCoordsWNP, NULL); 237 IDSetNumber(&GeographicCoordsWNP, NULL); 238 IDSetNumber(&ActualisationNP1, NULL); 239 IDSetNumber(&ActualisationNP2, NULL); 240 } 241 242 243 /************************************************************************************** 244 ** 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... 246 ** Cette fonction n'est pas encore utilisée 181 247 ***************************************************************************************/ 182 248 … … 211 277 /************************************************************************************** 212 278 ** En cas de changement d'une valeur numérique dans la boîte de dialogue Indi 213 ** Exemple : longitude, latitude, ar, dec etc... 279 ** Exemple : longitude, latitude, ar, dec etc...) -> prendre en compte les modifications 214 280 ** 215 281 ***************************************************************************************/ … … 260 326 261 327 // Si la longitude et la latitude sont correctes 328 // on envoie les coordonnées à la classe Astro 262 329 if (nset == 2) 263 330 { … … 457 524 { 458 525 AbortSlewSP.s = IPS_OK; 459 EquatorialCoordsWNP.s 526 EquatorialCoordsWNP.s = IPS_IDLE; 460 527 ObjectTP.s = IPS_IDLE; 461 528 … … 481 548 { 482 549 AbortSlewSP.s = IPS_OK; 483 EquatorialCoordsWNP.s 550 EquatorialCoordsWNP.s = IPS_IDLE; 484 551 ObjectTP.s = IPS_IDLE; 485 552 … … 494 561 495 562 496 /**************************************************************************************497 ** Initialisation des vecteurs INDI498 ***************************************************************************************/499 500 void BAO::reset_all_properties()501 {502 char chaine[10];503 504 ConnectSP.s = IPS_IDLE;505 OnCoordSetSP.s = IPS_IDLE;506 AbortSlewSP.s = IPS_IDLE;507 ParkSP.s = IPS_IDLE;508 ObjectTP.s = IPS_IDLE;509 EquatorialCoordsWNP.s = IPS_IDLE;510 GeographicCoordsWNP.s = IPS_IDLE;511 ActualisationNP1.s = IPS_IDLE;512 ActualisationNP2.s = IPS_IDLE;513 514 IUResetSwitch(&OnCoordSetSP);515 IUResetSwitch(&AbortSlewSP);516 IUResetSwitch(&ParkSP);517 518 OnCoordSetS[0].s = ISS_ON;519 ConnectS[0].s = ISS_OFF;520 ConnectS[1].s = ISS_ON;521 522 IDSetSwitch(&ConnectSP, NULL);523 IDSetSwitch(&OnCoordSetSP, NULL);524 IDSetSwitch(&AbortSlewSP, NULL);525 IDSetSwitch(&ParkSP, NULL);526 IDSetText(&ObjectTP, NULL);527 IDSetNumber(&EquatorialCoordsWNP, NULL);528 IDSetNumber(&GeographicCoordsWNP, NULL);529 IDSetNumber(&ActualisationNP1, NULL);530 IDSetNumber(&ActualisationNP2, NULL);531 }532 533 534 535 536 563 537 564 /************************************************************************************** 538 565 ** Gestion du thread 539 ** permet de suivre la connexion/déconnexion des antennes 566 ** permet de suivre la connexion/déconnexion des antennes toutes les secondes 540 567 ** 541 ** l'utilisation d'un thread permet d 'éviter de bloquer l'exécution du pilote542 ** avec la fonction accept qui est bloquante568 ** l'utilisation d'un thread permet de contourner le problÚme de la fonction accept 569 ** qui est bloquante. 543 570 ***************************************************************************************/ 544 571 … … 556 583 557 584 InitThreadOK = true; 558 559 usleep(100);560 585 } 561 586 catch ( SocketException& e ) … … 565 590 IDLog("\n");*/ 566 591 } 592 593 sleep(1); // faire une pause pour éviter de consommer trop de temps CPU -> à vérifier 567 594 } 568 595 while (!Exit); … … 570 597 pthread_exit (0); 571 598 } 572 573 599 574 600 … … 583 609 appli->pThreadSocket(); 584 610 585 586 611 return 0; 587 612 } … … 589 614 590 615 /************************************************************************************** 591 ** Extraction de la position de l'antenne aprÚs l'envoi ede la commande P616 ** Extraction de la position de l'antenne aprÚs l'envoi de la commande P 592 617 ** Le retour de la commande P est POSITION/valeur_az/valeur_alt/ 593 618 ** ExtractPosition retourne donc Valeur_az et Valeur_alt … … 616 641 } 617 642 618 IDLog((str +" fail \n").c_str());643 IDLog((str +" failed !\n").c_str()); 619 644 620 645 return false; … … 636 661 637 662 638 // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu )663 // Calcule la hauteur et l'azimut de la zone du ciel pointée (en fonction de la date et du lieu d'observation) 639 664 640 665 Azimut( newRA * 15.0 * Pidiv180, newDEC * Pidiv180, &targetAz, &targetAlt); 641 666 642 // Refraction atmosphérique667 // Correction de la réfraction atmosphérique 643 668 644 669 targetAlt = RefractionAtmospherique(targetAlt); 645 670 646 // Petit calcul pour faire en sorte que le sud soit à ° d'azimut671 // Petit calcul pour faire en sorte que le sud soit à 0° d'azimut 647 672 648 673 targetAz = VerifAngle( targetAz + Pi ); 649 674 650 // En degrés675 // On convertit les angles précédents en degrés 651 676 652 677 targetAlt *= N180divPi; 653 targetAz *= N180divPi; 654 678 targetAz *= N180divPi; 655 679 656 680 // Affichage dans les logs … … 659 683 fs_sexa(AltStr, targetAlt, 2, 3600); 660 684 661 IDLog("Horizontal coords : az = %s Alt = %s\n", AzStr, AltStr);685 IDLog("Horizontal coords : Az = %s Alt = %s\n", AzStr, AltStr); 662 686 663 687 664 688 //Conversion des deux angles en pas codeurs 665 689 666 if ( targetAlt < 30.0 )690 if ( targetAlt < 30.0 ) 667 691 { 668 692 // L'objet est trop bas (<30°). On annule le suivi... … … 678 702 else 679 703 { 680 // Si la hauteur est supérieure à 90°, on doit faire une rotation de l'azimut de 180°et corriger681 // la hauteur en appliquant hauteur= 180° -hauteur704 // Si la hauteur est supérieure à 90°, on doit ajouter 180° à l'azimut et corriger 705 // la hauteur en appliquant hauteur=180°-hauteur 682 706 683 707 if (targetAlt > 90.0) … … 690 714 691 715 double I0 = 81.0; 692 double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 ) 716 double I2 = 128279.4 - 129723.4 * sin( (targetAlt - 20.2345) * Pidiv180 ); 693 717 694 718 double Codalt = (sqrt(I2) - I0) / 0.078947; … … 701 725 TargetPosition.x = (int) Arrondi( targetAz * 4000.0 / 360.0); 702 726 703 IDLog("Nbre de pas codeurs az = %i Alt = %i\n", TargetPosition.x, TargetPosition.y); 704 } 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 773 for (int i=0; i<SocketsNumber; i++) 774 { 775 if (Sockets[i].Connected) 776 { 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) 788 { 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 } 799 } 800 801 if (delta_az) { 802 delete [] delta_az; 803 delta_az=NULL; 804 } 805 806 if (delta_ha) { 807 delete [] delta_ha; 808 delta_ha=NULL; 809 } 810 811 os.str(""); 812 } 813 } 814 815 return true; 705 816 } 706 817 707 818 708 819 /************************************************************************************ 709 * Retourne simplement le nombre d'antennes connectées 820 * Retourne le nombre d'antennes connectées 821 * 710 822 ************************************************************************************/ 711 823 … … 718 830 return num; 719 831 } 720 721 722 /************************************************************************************723 * Initialisation des paramÚtres des antennes724 *725 ************************************************************************************/726 void BAO::InitAntennes()727 {728 for (int i=0; i < MAXHOSTNAME; i++)729 {730 Sockets[i].status = 0;731 Sockets[i].sendalertes = 0;732 Sockets[i].AttenteExecution = 0;733 Sockets[i].AnomaliesExecution = 0;734 Sockets[i].etape = 0;735 736 Sockets[i].ack_status = false;737 Sockets[i].ack_pos = false;738 Sockets[i].ack_park = false;739 Sockets[i].ack_abort = false;740 Sockets[i].ack_goto = false;741 742 Sockets[i].PosValides = false;743 Sockets[i].GotoOk = false;744 }745 }746 747 832 748 833 … … 768 853 void BAO::ISPoll() 769 854 { 770 static int memSocketsNumber = -1; // Combien d'antennes étaient-elles connectées à l'appel précédent d'ISPoll ? 771 static unsigned int compt = 0; // permet de répondre toutes les 100ms aux demandes de nouvelles connexions 772 773 // utilise pour le travail sur les chaine 774 775 int pos; 855 static int memSocketsNumber = -1; // Combien y avait-il d'antennes connectées lors de l'appel précédent d'ISPoll ? 856 static unsigned int compt = 0; // Compteur de la fonction ISPoll 776 857 777 858 struct tm date; … … 782 863 //si pas de connexion avec le seveur d'indi -> on sort 783 864 784 if ( is_connected() == false) return;865 if (!is_connected()) return; 785 866 786 867 … … 808 889 DefinirDateHeure(Annee, Mois, Jour, Heu, Min, Sec); 809 890 810 //Puis on calule le temps sidéral local, le JJ etc. ..891 //Puis on calule le temps sidéral local, le JJ etc. 811 892 812 893 CalculTSL(); 813 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"); 814 899 815 900 … … 819 904 { 820 905 821 // Nouvelle connexion sur le socket !906 // Nouvelle connexion sur le socket ? 822 907 823 908 if (SocketsNumber > memSocketsNumber) … … 853 938 // pour différencier une trame de la précédente 854 939 855 pos = reponse.find("\n");940 int pos = reponse.find("\n"); 856 941 857 942 // S'il y a une réponse … … 859 944 while ((pos != string::npos) && (reponse.length() > 1)) 860 945 { 861 // on garde en stock la seconde partie trame pour un862 // traitement ultérieure946 // on garde en stock la deuxiÚme partie de la trame 947 // pour un traitement ultérieur 863 948 buffereponse = reponse.substr(pos + 1); 864 949 … … 866 951 reponse = reponse.substr(0, pos); 867 952 868 IDLog("R éponse reçue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str());869 870 // On analyse ici les acknowledges953 IDLog("Reponse recue de %s : %s\n", Sockets[i].IP.c_str(), reponse.c_str()); 954 955 // On vérifie ici les acknowledges 871 956 if ((reponse.find("ACK") != string::npos) && (reponse.find("NACK") == string::npos)) 872 957 { … … 896 981 if (reponse.find("NACK") != string::npos) 897 982 { 898 //problÚme concernant la réponse à lacommande P983 //problÚme concernant la commande P 899 984 OnCoordSetSP.s = IPS_ALERT; 900 985 IDSetSwitch(&OnCoordSetSP, "ALERTE antenne %s : position de l antenne inconnue !\n", … … 969 1054 if (reponse.find("OK") != string::npos) 970 1055 { 971 // On a la confirmation que l'antenne 'i' a bien réalisé1056 // On a ici la confirmation que l'antenne 'i' a bien réalisé 972 1057 // le goto 973 1058 … … 1001 1086 lastDEC = targetDEC; 1002 1087 1003 // On change en vert les voyants dans la boîte de dialogue 1004 1088 // On a fini le mouvement. On attend le prochain goto... 1089 1090 ActualisationPosition=false; 1091 1092 // Réinitialisation des paramÚtres des antennes en vue d'un prochain goto 1093 1094 InitAntennes(); 1095 1096 // On dessine les voyants de la boîte de dialogue en vert 1005 1097 OnCoordSetSP.s = IPS_OK; 1006 1098 EquatorialCoordsWNP.s = IPS_OK; 1007 1099 IDSetNumber (&EquatorialCoordsWNP, NULL); 1008 1100 1009 // On a fini le mouvement. On attend le prochain goto...1010 1011 ActualisationPosition=false;1012 1013 // Réinitialisation des antennes en vue d'un prochain goto1014 1015 InitAntennes();1016 1017 UpdateGoto=true;1018 1019 1101 // Confirmation dans la boîte de dialogue que toutes 1020 // les antennes sont OK 1021 1102 // les antennes sont OK 1022 1103 OnCoordSetSP.s = IPS_OK; 1023 1104 IDSetSwitch(&OnCoordSetSP, "GOTO OK !"); 1105 1106 UpdateGoto=true; 1024 1107 } 1025 1108 } … … 1047 1130 1048 1131 /////////////////////////////////////// 1049 // L'utilisateur a demandé l'annulation du mouvement 1050 // en cours 1132 // L'utilisateur a demandé l'annulation du mouvement en cours 1051 1133 1052 1134 if (Abort) … … 1123 1205 if ((Suivi) && (UpdateGoto)) 1124 1206 { 1125 // D uréeentre deux actualisations1207 // Délais entre deux actualisations 1126 1208 1127 1209 double delai=ActualisationTM1 / 3600.0 / 24.0; // Actualisation toutes les 15 minutes en mode transit … … 1256 1338 if (Sockets[i].AttenteExecution > MAXATTENTE) 1257 1339 { 1258 // on attend davantage la réponse posvalides1340 // on attend encore la réponse posvalides 1259 1341 Sockets[i].etape = 2; 1260 1342 Sockets[i].AttenteExecution = 0; … … 1333 1415 } 1334 1416 1335 // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes 1417 // On déconnecte l'antenne s'il n'y a pas de coonfirmation du goto au bout de 2 minutes 1336 1418 if (Sockets[i].AnomaliesExecution > MAXANOMALIESGOTO) 1337 1419 { … … 1374 1456 Sockets[i].AnomaliesExecution = 0; 1375 1457 1376 if (!GOTO(i, TargetPosition.x - Sockets[i].Pos.x , TargetPosition.y - Sockets[i].Pos.y)) Sockets[i].sendalertes++;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++; 1377 1459 1378 1460 Sockets[i].etape++; … … 1398 1480 } 1399 1481 } 1400 1482 1483 //incrémentation du compteur 1401 1484 compt++; 1402 1485 } … … 1559 1642 Sockets[numsocket].new_sock << chaine; 1560 1643 1561 IDLog("Commande envoy ée Ã%s: %s", Sockets[numsocket].IP.c_str(), chaine);1644 IDLog("Commande envoyee a %s: %s", Sockets[numsocket].IP.c_str(), chaine); 1562 1645 } 1563 1646 catch (SocketException& e) … … 1640 1723 // On risque alors de faire un tour complet en sens inverse pour rattraper l'objet -> à éviter 1641 1724 1642 // évite defaire des tours complets en Az pour rien...1725 // ne pas faire des tours complets en Az pour rien... 1643 1726 while (deltaAz > NBREPASCODEURSAZ) deltaAz -= NBREPASCODEURSAZ; 1644 1727 1645 // Doit résoudre tous les problÚmes ...1728 // Doit résoudre tous les problÚmes concernant l'azimut... 1646 1729 if (deltaAz > NBREPASCODEURSAZ / 2 ) 1647 1730 { … … 1652 1735 //on envoie les coordonnées au driver 1653 1736 1654 if (sensAz == 1 ) sensAz='f'; 1655 else sensAz='b'; 1656 if (sensAlt == 1 ) sensAlt='f'; 1657 else sensAlt='b'; 1737 if (sensAz == 1 ) sensAz='f'; else sensAz='b'; 1738 1739 if (sensAlt == 1 ) sensAlt='f'; else sensAlt='b'; 1658 1740 1659 1741 sprintf(Params, "%c%04i%c%04i", sensAz, deltaAz, sensAlt, deltaAlt); … … 1665 1747 1666 1748 /************************************************************************************** 1667 ** Les fonctions qui suivent sont nécessaires pour construire un pilote Indi1749 ** Les fonctions qui suivent sont nécessaires pour construire le pilote Indi_BAO 1668 1750 ** Elles sont appelées par le noyau d'Indi 1669 1751 ***************************************************************************************/ -
BAORadio/libindi/libindi/drivers/telescope/BAO.h
r504 r619 2 2 Pilote Indi BAORadio 3 3 franckrichard033@gmail.com 4 Juin20114 Décembre 2011 5 5 */ 6 6 … … 21 21 #include <unistd.h> 22 22 #include <sys/time.h> 23 #include <fstream> 23 24 24 25 #include <config.h> … … 32 33 #include "SocketException.h" 33 34 #include "astro.h" 34 35 #include "filetools.h" 35 36 36 37 #define MAXCARACTERES 1024 … … 65 66 66 67 Position Pos; // derniÚre position retournée par le microcontrÃŽleur 67 int etape; //étape dans le cycle de commandes/réponses entre PC et microcontroleurs 68 Position Delta; // Corrections en Az et Ha 69 int etape; // étape dans le cycle de commandes/réponses entre PC et microcontroleurs 68 70 69 71 bool ack_status; // Etat des acknowledges ? … … 73 75 bool ack_goto; // le PC a reçu une confirmation du microcont aprÚs un ordre GOTO 74 76 bool GotoOk; // Est-ce que le dernier goto est OK ? 77 78 75 79 }; 76 80 … … 108 112 void DeconnecterSocket(int num); 109 113 void InitAntennes(); 110 114 bool ChargementParametresAlignement(string fileName); 115 bool is_readable( const std::string & file ); 116 111 117 /*******************************************************/ 112 118 /* Connection Routines
Note: See TracChangeset
for help on using the changeset viewer.