[490] | 1 | /* |
---|
[504] | 2 | Pilote Indi BAORadio |
---|
| 3 | franckrichard033@gmail.com |
---|
| 4 | Juin 2011 |
---|
| 5 | */ |
---|
[490] | 6 | |
---|
[504] | 7 | #ifndef BAO_H |
---|
| 8 | #define BAO_H |
---|
[490] | 9 | |
---|
[504] | 10 | #include <stdio.h> |
---|
| 11 | #include <stdlib.h> |
---|
| 12 | #include <string.h> |
---|
| 13 | #include <stdarg.h> |
---|
| 14 | #include <math.h> |
---|
| 15 | #include <unistd.h> |
---|
| 16 | #include <time.h> |
---|
| 17 | #include <memory> |
---|
| 18 | #include <pthread.h> |
---|
| 19 | #include <iostream> |
---|
| 20 | #include <time.h> |
---|
| 21 | #include <unistd.h> |
---|
| 22 | #include <sys/time.h> |
---|
[490] | 23 | |
---|
[504] | 24 | #include <config.h> |
---|
[490] | 25 | |
---|
[504] | 26 | #include "indicom.h" |
---|
[490] | 27 | |
---|
[504] | 28 | #include "Socket.h" |
---|
[490] | 29 | #include "indidevapi.h" |
---|
| 30 | #include "indicom.h" |
---|
| 31 | #include "ServerSocket.h" |
---|
| 32 | #include "SocketException.h" |
---|
| 33 | #include "astro.h" |
---|
| 34 | |
---|
[504] | 35 | |
---|
[490] | 36 | #define MAXCARACTERES 1024 |
---|
| 37 | |
---|
[504] | 38 | #define MAXATTENTE 80 // Si une commande ne recoit pas d'acknowledge. Alors refaire 80 tentatives en renvoyant la commande |
---|
| 39 | #define MAXANOMALIES 2 // Si pas de réponse au bout de 80 tentatives -> erreur critique -> socket perdu ? |
---|
[498] | 40 | #define MAXANOMALIESGOTO 1500 |
---|
[490] | 41 | |
---|
[504] | 42 | #define NBREPASCODEURSAZ 4000 |
---|
| 43 | |
---|
| 44 | |
---|
| 45 | using namespace std; |
---|
| 46 | |
---|
[490] | 47 | struct Position |
---|
| 48 | { |
---|
[504] | 49 | long int x; |
---|
| 50 | long int y; |
---|
[490] | 51 | }; |
---|
| 52 | |
---|
| 53 | struct DefSocket |
---|
| 54 | { |
---|
[504] | 55 | ServerSocket new_sock; // socket permettant de gérer la connexion avec une antennes |
---|
| 56 | |
---|
| 57 | string IP; // IP de l'antenne |
---|
| 58 | |
---|
| 59 | bool Connected; // le micro-contrÎleur est-il connecté ? |
---|
| 60 | bool PosValides; // le micro-contrÎleur a-t-il donné une position des moteurs valide ? |
---|
| 61 | char status; // status='B' pour busy 'R' pour READY |
---|
| 62 | int sendalertes; // une requête 'send' a généré une erreur sur le réseau |
---|
| 63 | int AttenteExecution; // L'antenne parvient-elle à executer un cycle de commandes ? |
---|
| 64 | int AnomaliesExecution; // Erreur critique. L'antenne ne répond plus ! |
---|
| 65 | |
---|
| 66 | 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 | |
---|
| 69 | bool ack_status; // Etat des acknowledges ? |
---|
| 70 | bool ack_pos; // le PC a reçu une confirmation du microcont aprÚs un ordre POSITION |
---|
| 71 | bool ack_park; // le PC a reçu une confirmation du microcont aprÚs un ordre PARK |
---|
| 72 | bool ack_abort; // le PC a reçu une confirmation du microcont aprÚs un ordre ABORT |
---|
| 73 | bool ack_goto; // le PC a reçu une confirmation du microcont aprÚs un ordre GOTO |
---|
| 74 | bool GotoOk; // Est-ce que le dernier goto est OK ? |
---|
[490] | 75 | }; |
---|
| 76 | |
---|
| 77 | |
---|
[504] | 78 | ServerSocket server( 8000 ); // Le PC et les antennes communiquent par le biais du port 8000 sur le réseau tcp |
---|
| 79 | |
---|
[490] | 80 | class BAO : public Astro |
---|
| 81 | { |
---|
| 82 | public: |
---|
| 83 | BAO(); |
---|
| 84 | ~BAO(); |
---|
[504] | 85 | |
---|
[490] | 86 | void ISGetProperties (const char *dev); |
---|
| 87 | void ISNewNumber (const char *dev, const char *name, double values[], char *names[], int n); |
---|
| 88 | void ISNewText (const char *dev, const char *name, char *texts[], char *names[], int n); |
---|
| 89 | void ISNewSwitch (const char *dev, const char *name, ISState *states, char *names[], int n); |
---|
| 90 | void ISPoll (); |
---|
[504] | 91 | |
---|
| 92 | void *pThreadSocket (); |
---|
| 93 | void *pThreadExit (); |
---|
| 94 | |
---|
[490] | 95 | bool COMMANDE(int numsocket, char* Commande, char* Params); |
---|
[504] | 96 | bool ExtractPosition(string str, Position *result); |
---|
| 97 | |
---|
[490] | 98 | void connection_lost(); |
---|
| 99 | void connection_resumed(); |
---|
[504] | 100 | |
---|
[490] | 101 | bool STATUS(int numsocket); |
---|
| 102 | bool POSITION(int numsocket); |
---|
| 103 | bool ABORT(int numsocket); |
---|
| 104 | bool PARK(int numsocket); |
---|
| 105 | bool GOTO(int numsocket, int deltaAz, int deltaAlt); |
---|
| 106 | void ADDEC2Motor(double newRA, double newDEC); |
---|
| 107 | int AntennesConnectees(); |
---|
[504] | 108 | void DeconnecterSocket(int num); |
---|
[490] | 109 | void InitAntennes(); |
---|
[504] | 110 | |
---|
| 111 | /*******************************************************/ |
---|
| 112 | /* Connection Routines |
---|
| 113 | ********************************************************/ |
---|
| 114 | void init_properties(); |
---|
| 115 | void get_initial_data(); |
---|
| 116 | void connect_telescope(); |
---|
| 117 | bool is_connected(void); |
---|
| 118 | |
---|
| 119 | /*******************************************************/ |
---|
| 120 | /* Misc routines |
---|
| 121 | ********************************************************/ |
---|
| 122 | bool process_coords(); |
---|
| 123 | int get_switch_index(ISwitchVectorProperty *sp); |
---|
| 124 | |
---|
| 125 | /*******************************************************/ |
---|
| 126 | /* Simulation Routines |
---|
| 127 | ********************************************************/ |
---|
| 128 | void enable_simulation(bool enable); |
---|
| 129 | |
---|
| 130 | /*******************************************************/ |
---|
| 131 | /* Error handling routines |
---|
| 132 | ********************************************************/ |
---|
| 133 | void slew_error(int slewCode); |
---|
| 134 | void reset_all_properties(); |
---|
| 135 | void handle_error(INumberVectorProperty *nvp, int err, const char *msg); |
---|
| 136 | void correct_fault(); |
---|
| 137 | |
---|
| 138 | |
---|
| 139 | |
---|
[490] | 140 | private: |
---|
| 141 | |
---|
[492] | 142 | enum BAO_STATUS { BAO_TRANSIT, BAO_TRACKING, BAO_PARK }; |
---|
[490] | 143 | |
---|
| 144 | /* Switches */ |
---|
| 145 | ISwitch ConnectS[2]; |
---|
| 146 | ISwitch OnCoordSetS[2]; |
---|
| 147 | ISwitch AbortSlewS[1]; |
---|
| 148 | ISwitch ParkS[1]; |
---|
| 149 | |
---|
| 150 | /* Texts */ |
---|
| 151 | IText PortT[1]; |
---|
| 152 | IText ObjectT[1]; |
---|
| 153 | |
---|
| 154 | /* Numbers */ |
---|
| 155 | //INumber EquatorialCoordsRN[2]; |
---|
| 156 | INumber EquatorialCoordsWN[2]; |
---|
| 157 | INumber GeographicCoordsWN[2]; |
---|
[495] | 158 | INumber ActualisationN1[1]; |
---|
| 159 | INumber ActualisationN2[1]; |
---|
[504] | 160 | |
---|
[495] | 161 | //INumber SlewAccuracyN[2]; |
---|
| 162 | //INumber TrackAccuracyN[2]; |
---|
[490] | 163 | |
---|
| 164 | /* Switch Vectors */ |
---|
| 165 | ISwitchVectorProperty ConnectSP; |
---|
| 166 | ISwitchVectorProperty OnCoordSetSP; |
---|
| 167 | ISwitchVectorProperty AbortSlewSP; |
---|
| 168 | ISwitchVectorProperty ParkSP; |
---|
| 169 | |
---|
| 170 | /* Number Vectors */ |
---|
[492] | 171 | //INumberVectorProperty EquatorialCoordsRNP; |
---|
[490] | 172 | INumberVectorProperty EquatorialCoordsWNP; |
---|
| 173 | INumberVectorProperty GeographicCoordsWNP; |
---|
[495] | 174 | //INumberVectorProperty SlewAccuracyNP; |
---|
| 175 | //INumberVectorProperty TrackAccuracyNP; |
---|
| 176 | INumberVectorProperty ActualisationNP1; |
---|
| 177 | INumberVectorProperty ActualisationNP2; |
---|
[490] | 178 | |
---|
[504] | 179 | |
---|
[490] | 180 | /* Text Vectors */ |
---|
| 181 | ITextVectorProperty PortTP; |
---|
| 182 | ITextVectorProperty ObjectTP; |
---|
| 183 | |
---|
| 184 | |
---|
| 185 | |
---|
| 186 | protected: |
---|
[504] | 187 | int SocketsNumber; // nbre de sockets utilisés pour connecter les antennes |
---|
| 188 | bool InitThreadOK; // Le thread est bien actif |
---|
| 189 | DefSocket Sockets[MAXHOSTNAME + 1]; // Etat de chaque socket. Un socket permet la communication avec une antenne |
---|
| 190 | pthread_t th1; // le pointeur du thread |
---|
[490] | 191 | |
---|
[504] | 192 | double JD; // Jour julien |
---|
| 193 | double lastRA; // Sauvegarde de la derniÚre position avant actualisation |
---|
[490] | 194 | double lastDEC; |
---|
[504] | 195 | double JJAnc; // Sauvegarde du jour julien lors de la derniÚre actualisation de la position (fct Goto) |
---|
| 196 | double ActualisationTM1; // Délais entre deux actualisations dans les modes transit et tracking |
---|
[495] | 197 | double ActualisationTM2; |
---|
[504] | 198 | double Longitude; // Longitude et latitude du lieu d'observation |
---|
| 199 | double Latitude; |
---|
| 200 | bool ActualisationPosition; // Permet de faire les étapes nécessaires pour réaliser un mouvement |
---|
| 201 | bool Abort; // Annulation du mouvement en cours |
---|
| 202 | bool Park; // On place les antennes dans une position de repos |
---|
| 203 | bool Suivi; // Suivi d'un objet en cours... |
---|
| 204 | bool UpdateGoto; // On peut exécuter un Goto |
---|
| 205 | bool Exit; // On ferme le driver |
---|
| 206 | |
---|
| 207 | int currentSet; // Variable interne de l'interface indi |
---|
| 208 | int lastSet; // Variable interne de l'interface indi |
---|
| 209 | int TrackingMode; //1 : Transit 2: Tracking |
---|
| 210 | |
---|
| 211 | Position TargetPosition; //Position à atteindre en coordonnées équatoriales |
---|
[490] | 212 | }; |
---|
| 213 | |
---|
| 214 | #endif |
---|