************************ ## DEVICES & CHANNELS ************************ VERSION: 0.33 Date: 30/10/2019 By: epallier@irap.omp.eu ******************************************************************************************** # 1) TEST (avec simulateur) Pour lancer les TESTS: $ cd test/ $ ./test_client_gemini.py (test de connexion locale avec un "simulateur" de Gemini) Ca doit se terminer par quelque chose comme: Ran 2 tests in 0.013s OK Là, il faut arrêter avec CTRL-C (car je ne sais pas encore comment arrêter le simulateur de Telescope (serveur) autrement !) ******************************************************************************************** # 2) RUN Pour lancer le client sur le telescope Gemini de Guitalens (AK) : $ cd concrete_component/gemini/ $ ./client_telescope_gemini_controller_run.py (Windows: python3 client_telescope_controller_gemini_run.py) (NB: un log "client.log" est créé et alimenté au fur et à mesure) (Pour avoir moins de détail, mettre la variable DEBUG à False dans le fichier telescope_controller_gemini_run.py) (press ENTER to quit) Examples of requests: REQUEST TO SERVER (ENTER to quit): >>> :GR# NATIVE Command to send is ':GR#' Sent: b'00090000:GR#\x00' Sent 13 bytes RECEIVED (ALL BYTES): b'0009000015:01:48#\x00' RECEIVED (useful data): 15:01:48 REQUEST TO SERVER (ENTER to quit): >>> get ra GENERIC Command to send is get_ra NATIVE Command to send is ':GR#' Sent: b'00100000:GR#\x00' Sent 13 bytes RECEIVED (ALL BYTES): b'0010000015:01:48#\x00' RECEIVED (useful data): 15:01:48 result is 15:01:48 ******************************************************************************************** # 3) DEV Pour lancer le même client seulement sur le "simulateur" de telescope (localhost, port 11110), ajouter "local" à la fin: $ ./client_telescope_gemini_controller_run.py local (ENTER to quit the client) (CTRL-C to stop the simulator server) Ceci n'est plus nécessaire depuis le 30/9/19 car le simulateur est lancé automatiquement par le client : ((( Dans un autre terminal, lancer le simulateur: $ ./server_telescope_gemini_simulator_run.py (CTRL-C to stop it) ))) ******************************************************************************************** # 4) DONE 5/10/18: - greatly improved (plant)UML class diagram(s) 4/10/18: - BIG REORGANIZATION OF CODE => new class DeviceControllerAbstract which has a component ClientChannel (of type "socket", "serial", or "usb") - tests ok - cleanup 2/10/18: - included "doctests" in tests (try it by running "cd test/ ; ./test_client_gemini.py") - started plc client - improved telescope simulator server answers : do_goto(), do_move(), do_init() - improved telescope simulator server answers - tests pass ok - decorator @generic_cmd - abstract commands dictionary is now the default one and is ovewritable with native dictionary - native telescope class is now less than 300 lines (majority of code is in the abstract class so that it is easy to make a new concrete telescope class): => ne contient quasiment QUE le dictionnaire des commandes natives - cleanup 1/10/18: - interpreteur de cde generique et native : set ra 20:00:00 ou :GR# - execute_cmd(): - execute_generic_cmd() - execute_native_cmd() - GenericResult() 28/9/18: - move do_init() to abstract class - generic return code for each command - clean code - move do_goto() and move_dir() to abstract class - doctests 27/9/18: - GOTO - finalize do_init() - set date&time, set lat&long - README file enriched - help => liste cdes possibles - (X) set DATE & TIME (p109) - Ce que fait AK avec TCL ou C: sprintf(ligne,":SC%02d/%02d/%02d#:SL%02d:%02d:%02.0f#:SG+00#",m,d,y-2000,h,min,s); 1) :SG+00# => TU 2) SC%02d/%02d/%02d#: mois, jour, YY 3) SL%02d:%02d:%02.0f#: hh:mn:ss (heure locale) m,d,y-2000,h,min,s Faire les 3 commandes ensemble en 1 seule ligne, chacune séparée par #, le tout terminé par « 00 » - generic commands available from client console - generic commands implemented - procedure initialize() - ACK (cde 6) - 3 types of commands - \x00 at end - classe SocketClientAbstract de base ******************************************************************************************** 5) WORK CURRENTLY IN PROGRESS... - main updated - tests updated - comment functions args ******************************************************************************************** 6) TODO LIST - INTEGRATION INTO PYROS - LOG: avoir le nom du module qui logue et non pas only logs.py - interpreteur de cde generique (avec celme pour les values) : set ra 20:00:00 - Tele MEADE ETX (altaz) : cf doc pdf (from page 1) - peut être en 3 modes : land, altaz, polar (equatorial) - :AP# => passer en mode polar - :AA# => passer en mode AltAz - cette config doit être fait dans do_init() - doc page 1 : x=implémenté, p=partial, - = pas implémenté - Position class - POSITION (p103): - (100) MOVE() (p104-105) => en altaz ou radec => préférer "haut, bas, gauche, droite" plutôt que North, South, west, east (surtout sur altaz ça n'a aucun sens) => sur equatorial, h,b = DEC et g,d = RA - set_speed() - start(direction) avec direction = h,b,g,d => move infini - stop() - pulse(direction, nbsec) = start() puis sleep(nbsec) puis stop() - éventuellement start_diagonal qui ferait start(up) et start(right) en alternance (pas prioritaire) - MOVE(direction, rate, duration): - move dans une direction (N,S,E,O) à l'infini - ':Q#' pour arrêter (p 108) - duration: infinie si pas donnée - rate (p108): 4 vitesses différentes (prendre la plus lente par défaut), entre 0 et 1: - [0-0.25] : RC => Rate Center. Subsequent Move commands will move at Centering Speed. - [0.25-0.50] : RG => Rate Guide. Subsequent Move commands will move at Guiding Speed. - [0.50-0.75] : RM => Rate Move. Subsequent Move commands will move at Centering Speed. - [0.75-1.0] : RS => Rate Slew. Subsequent Move commands will move at Slewing Speed. - (100) GOTO: - bloquant ou non - 1) goto_setmode(radec | hadec | altaz) - 2) goto() - Attention, gemini ne comprend que radec, les tarot ne comprennent que hadec !!! : => goto_setmode(radec) ne fait rien sur un gemini, mais convertit sur un tarot - (100) vitesse de pointage (slew speed) : n'existe pas sur tous les tele - drift = tracking speed : une fois que tele a pointé, comment il part... - toujours en hadec - tracking_speed = 0 => tele est fixe - t.tracking_speed(ha ou ra, dec) => ha est en nb degrés/sec => t.tracking_speed(0,0) => t.tracking_speed("diurnal" ou "sideral",0) // sideral c'est mieux - jour solaire : 86400s/jour - jour sideral (diurnal) = durée d'une journée pour une étoile = 86164s/jour (moins que jour solaire, à cause du fait que en 24h, la Terre a avancé sur son orbite circulaire) - nb degrés/sec = 360/86400 pour jour solaire, et 360/86164 pour jour sideral - (200) timeout : 1 pour send, 1 pour receive - (200) celme.angles => infos() à généraliser - (200) type erreurs - 1000 : communication (network, cable débranché) = channel - 2000 : syntax - 3000 : out of limit (pointage hors limite, ex: sur le sol) - 4000 : controller - 5000 : file (disk...) - (200) generic functions return tuple with error code : res = get_ra() => res.res is the result => res.error is the error object : err.error_code, err.generic_msg, err.native_msg => ou plutot: res,error = get_ra() res,_ = get_ra() # pour ignorer le code erreur res is the result error is the error object - (200) PLC abstract client - (100) input commands format : - get ra - set ra "2h3m27s" => converted by celme.Angle(ra).deg() - (100) _cmds = list of functions (???) - remplacer utf-8 par unicode ou iso... - cdes 05 (p100): - cde 05 => return long list of parameters (= GROS GET) - ENQ = 05 - Table d'attributs pour chaque telescope (config) - _connect() ou connect() ? - Implémenter les commandes NATIVES (non LX-200) : - < ou >, termine par ':' + checksum + # ******************************************************************************************** 7) INFORMATIONS GMT = TU décalé de 12h, mais maintenant c'est pareil TU = UTC civil, voir aussi UT1, UT2 COMMANDES LX-200: - SA et SZ pour envoyer coord en alt-az RA-DEC is converted into "pas codeurs" 1 pas codeur (mvmt interne du tele) = environ 1 sec arc sur le ciel (en gros, RA = petit axe du tele, DEC = grand axe du tele) Parking = vers le nord (cf photo) = en position CWD (Counter Weight Down) (contre-poids en bas ?) Par défaut, le tele fonctionne en RADEC J2000 http://82.64.28.71:8083/L5V1serial.html Ce qui marche: - REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:GD# Received (all data): 01000000+90:00:00# - REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:GR# Received (all data): 0100000015:01:48# - REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:GR# Received (all data): 0100000016:04:17# - Get Software Level l(one digit) and Version vv(two digits) REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:GV# Received (all data): 01000000510# - REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:GG# Received (all data): 01000000+00# - Get Maximum Velocity of both axes (N = No mvmt) REQUEST TO SERVER [ex: ':GD#' (Get Dec), ':GR#' (Get RA)']: 01000000:Gv# Received (all data): 01000000N