README.md 9.44 KB

** DEVICES & CHANNELS **


VERSION: 0.30.0

Date: 14/05/2019

By: epallier@irap.omp.eu

Comment : AgentDevice, AgentTelescopeRequester


1) TEST

Pour lancer les TESTS: cd test/ ./test_client_gemini.py

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 Alain Klotz: ./telescope_controller_gemini_run.py (Windows: python3 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 client sur le "simulateur" de telescope (localhost, port 11110):

  • dans un terminal, lancer le simulateur: ./server_run.py
  • dans un autre terminal, lancer le client avec le paramètre "local": ./telescope_controller_gemini_run.py local

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