Blame view

src/device_controller/README.md 9.77 KB
ac0e5c70   Etienne Pallier   nouveau devices_c...
1

5eea9431   Etienne Pallier   bugfix start_agen...
2
************************
c84c9d3b   Etienne Pallier   update doc test e...
3
## DEVICES & CHANNELS
5eea9431   Etienne Pallier   bugfix start_agen...
4
************************
57621753   Etienne Pallier   NOUVELLE ARCHI un...
5
VERSION: 0.33
ac0e5c70   Etienne Pallier   nouveau devices_c...
6

57621753   Etienne Pallier   NOUVELLE ARCHI un...
7
Date: 30/10/2019
ac0e5c70   Etienne Pallier   nouveau devices_c...
8
9
10

By: epallier@irap.omp.eu

9ee212a8   Etienne Pallier   Renommage des fic...
11

dbefae59   Etienne Pallier   Restructuring : p...
12
13
14
15




ac0e5c70   Etienne Pallier   nouveau devices_c...
16
17

********************************************************************************************
57621753   Etienne Pallier   NOUVELLE ARCHI un...
18
# 1) TEST (avec simulateur)
ac0e5c70   Etienne Pallier   nouveau devices_c...
19
20

Pour lancer les TESTS:
c84c9d3b   Etienne Pallier   update doc test e...
21
22
23
24

	$ cd test/
	$ ./test_client_gemini.py 
	(test de connexion locale avec un "simulateur" de Gemini)
ac0e5c70   Etienne Pallier   nouveau devices_c...
25
26
27
28
29
30
31
32
33
34

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 !)



********************************************************************************************
c84c9d3b   Etienne Pallier   update doc test e...
35
# 2) RUN
ac0e5c70   Etienne Pallier   nouveau devices_c...
36

d52240d4   Etienne Pallier   nouvelle classe D...
37
Pour lancer le client sur le telescope Gemini de Guitalens (AK) :
c84c9d3b   Etienne Pallier   update doc test e...
38

827af78a   Etienne Pallier   Nouvelle base de ...
39
	$ cd concrete_component/gemini/
9ee212a8   Etienne Pallier   Renommage des fic...
40
	$ ./client_telescope_gemini_controller_run.py
c84c9d3b   Etienne Pallier   update doc test e...
41
	(Windows: python3 client_telescope_controller_gemini_run.py)
ac0e5c70   Etienne Pallier   nouveau devices_c...
42
43
44
45
46
47
48

(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:

c84c9d3b   Etienne Pallier   update doc test e...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
	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
ac0e5c70   Etienne Pallier   nouveau devices_c...
64
65
66
67



********************************************************************************************
c84c9d3b   Etienne Pallier   update doc test e...
68
69
70
71
# 3) DEV

Pour lancer le même client seulement sur le "simulateur" de telescope (localhost, port 11110), ajouter "local" à la fin:

9ee212a8   Etienne Pallier   Renommage des fic...
72
	$ ./client_telescope_gemini_controller_run.py local
827af78a   Etienne Pallier   Nouvelle base de ...
73
74
	(ENTER to quit the client)
	(CTRL-C to stop the simulator server)
ac0e5c70   Etienne Pallier   nouveau devices_c...
75

d52240d4   Etienne Pallier   nouvelle classe D...
76
77
78
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: 
c84c9d3b   Etienne Pallier   update doc test e...
79
	$ ./server_telescope_gemini_simulator_run.py
9ee212a8   Etienne Pallier   Renommage des fic...
80
	(CTRL-C to stop it)
d52240d4   Etienne Pallier   nouvelle classe D...
81
)))
ac0e5c70   Etienne Pallier   nouveau devices_c...
82
83
84
	
	
********************************************************************************************
c84c9d3b   Etienne Pallier   update doc test e...
85
# 4) DONE
ac0e5c70   Etienne Pallier   nouveau devices_c...
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334

	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