Commit 23b4fbc5098e1347cd471218c626a5b9706456f5

Authored by Etienne Pallier
1 parent a494f372
Exists in dev

move do_init() to abstract class AND generic return code for each

command
sockets_tele/README.txt
... ... @@ -63,6 +63,9 @@ Pour lancer le client sur le "simulateur" de telescope (localhost, port 11110):
63 63 ********************************************************************************************
64 64 4) DONE
65 65  
  66 + - move do_init() to abstract class
  67 + - generic return code for each command
  68 +
66 69 - clean code
67 70 - move do_goto() and move_dir() to abstract class
68 71  
... ... @@ -101,10 +104,8 @@ Pour lancer le client sur le "simulateur" de telescope (localhost, port 11110):
101 104 ********************************************************************************************
102 105 5) WORK CURRENTLY IN PROGRESS...
103 106  
104   - - generic return code for each command
105   -
106   - - move do_init() to abstract class
107   -
  107 + - interpreteur de cde generique : set ra "20:00:00"
  108 +
108 109 - improve server answers
109 110  
110 111 - main updated
... ...
sockets_tele/client_gemini_run.py
... ... @@ -8,7 +8,55 @@ import sys
8 8 DEBUG = True
9 9  
10 10  
  11 +class essai:
  12 + a = 'a'
  13 + c = 'c'
  14 + def __init__(self):
  15 + self.b = 'bB'
  16 + def __get__(self, instance, owner):
  17 + return self.b
  18 + '''
  19 + def __set__(self, instance, value):
  20 + self.b = value
  21 + def __str__(self):
  22 + return self.b
  23 + '''
  24 +class user:
  25 + e = essai()
  26 +
  27 +class GenericResult:
  28 + ''' Usage:
  29 + res = execute(command)
  30 + print("result is", res)
  31 + if res.ko: raise UnexpectedReturnCode()
  32 + if res.ok:
  33 + ...
  34 + '''
  35 + # By default, bad result
  36 + ok = False
  37 + ko = True
  38 +
  39 + def __init__(self, native_result:str, ok=False):
  40 + self.txt = native_result
  41 + self.ok = ok
  42 + self.ko = not ok
  43 + '''
  44 + def __str__(self):
  45 + return self.native_result
  46 + def __repr__(self):
  47 + return self.native_result
  48 + def __get__(self, instance, owner):
  49 + return self.b
  50 + def __set__(self, instance, value):
  51 + self.b = value
  52 + '''
  53 +
  54 +
  55 +
  56 +
  57 +
11 58 def main():
  59 +
12 60 # No argument => connexion to REAL TELESCOPE (DISTANT)
13 61 if len(sys.argv) == 1:
14 62 # Port local AK 8085 = redirigรฉ sur lโ€™IP du tele 192.168.0.12 sur port 11110
... ... @@ -24,17 +72,23 @@ def main():
24 72 # (optional) Only useful for TCP (does nothing for UDP)
25 73 tele_client._connect_to_server()
26 74  
27   - print("RA is", tele_client.get_RA())
28   - print("ack is", tele_client.get_ACK())
  75 + print("RA is", tele_client.get_ra())
  76 +
  77 + ack = tele_client.get_ack()
  78 + print("ack is", ack)
  79 + print("ack.txt is", ack)
  80 + if ack.ok: print("ack is ok")
  81 + if ack.ko: print("ack is ko")
29 82  
30 83 # Initialize telescope config (ack, date, time)
31 84 tele_client.do_init()
32 85  
33   - _mes_tests_temporaires_avirer(tele_client)
  86 + #_mes_tests_temporaires_avirer(tele_client)
34 87  
35 88 #radec = tele_client.get("RA-DEC")
36   - radec = tele_client.get_RADEC()
37   - print("RA-DEC is", radec)
  89 + ra,dec = tele_client.get_radec()
  90 + print("RA-DEC is", ra,dec)
  91 + print("ra is", ra.txt)
38 92  
39 93 #tele_client.do_GOTO(ra='22:00:00',dec='+30:00:00')
40 94 #tele_client.do_GOTO(ra='21:00:00',dec='+20:00:00')
... ... @@ -49,7 +103,9 @@ def main():
49 103 req = input("REQUEST TO SERVER (ENTER to quit): >>> ").strip()
50 104 if not req: break
51 105  
52   - result = tele_client.execute(req)
  106 + res = tele_client.execute(req)
  107 + print("result is", res)
  108 + #print("result.txt is", res.txt)
53 109  
54 110 # END: park telescope
55 111 ###tele_client.do_PARK()
... ... @@ -58,11 +114,20 @@ def main():
58 114  
59 115  
60 116  
61   -
  117 +# @private
62 118 def _mes_tests_temporaires_avirer(tele_client):
63 119  
64 120 print("\n...Execution de mes tests temporaires...\n")
65 121  
  122 + u = user()
  123 + print(u.e)
  124 +
  125 + res = GenericResult('G',False)
  126 + print("res is", res)
  127 + if res.ok: print("res is ok")
  128 + if not res.ko: print("res is not ko")
  129 + if res.txt == 'G': print("res is G")
  130 +
66 131 tele_client.do_move_dir('EAST','4', 'slew')
67 132 tele_client.do_goto(ra='21:00:00',dec='+20:00:00')
68 133 '''
... ...
sockets_tele/src_socket/client/socket_client_telescope_abstract.py
... ... @@ -35,6 +35,11 @@ GET_ONLY=False
35 35 # Execute only "get" commands
36 36 #GET_ONLY=True
37 37  
  38 +# Default timeouts
  39 +TIMEOUT_SEND = 10
  40 +TIMEOUT_RECEIVE = 10
  41 +
  42 +
38 43 '''
39 44 class c(Enum):
40 45  
... ... @@ -50,6 +55,33 @@ class c(Enum):
50 55  
51 56  
52 57  
  58 +class GenericResult:
  59 + ''' Usage:
  60 + res = execute(command)
  61 + print("result is", res)
  62 + if res.ko: raise UnexpectedReturnCode()
  63 + if res.ok:
  64 + ...
  65 + '''
  66 + # By default, bad result
  67 + ok = True
  68 + ko = False
  69 +
  70 + def __init__(self, native_result:str, ok=True):
  71 + self.txt = native_result
  72 + self.ok = ok
  73 + self.ko = not ok
  74 + def __str__(self):
  75 + return self.txt
  76 + '''
  77 + def __repr__(self):
  78 + return self.txt
  79 + def __get__(self, instance, owner):
  80 + return self.b
  81 + def __set__(self, instance, value):
  82 + self.b = value
  83 + '''
  84 +
53 85  
54 86 class Position():
55 87 x = 0
... ... @@ -82,11 +114,11 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
82 114 'CMD-NAME': ['cmd-get', 'cmd-set', 'comment'],
83 115 '''
84 116 _cmd_getset = {
85   - 'ACK': [],
86   - 'RA': [],
87   - 'DEC': [],
88   - 'RADEC': [],
89   - 'TIMEZONE': [],
  117 + 'ack': [],
  118 + 'ra': [],
  119 + 'dec': [],
  120 + #'RADEC': [],
  121 + 'timezone': [],
90 122 #'TIMEZONE_IS_UTC': [],
91 123 'DATE': [],
92 124 'TIME': [],
... ... @@ -128,7 +160,11 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
128 160 if request.startswith('get_') or request.startswith('set_') or request.startswith('do_'):
129 161 print("GENERIC COMMAND")
130 162 if request.startswith('get_'):
131   - generic_cmd,_ = request[4:].split('(')
  163 + #generic_cmd,_ = request[4:].split('(')
  164 + generic_cmd = request[4:]
  165 + if (generic_cmd not in self._cmd_getset.keys()) and (generic_cmd not in self._cmd_do.keys()):
  166 + #eval(request)
  167 + return self.get_radec()
132 168 print("cmd is", generic_cmd)
133 169 return self._get(generic_cmd)
134 170 return
... ... @@ -136,16 +172,23 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
136 172 print("NATIVE COMMAND")
137 173 return self.execute_native_cmd(request)
138 174  
139   - def execute_native_cmd(self, request:str)->str:
  175 + def execute_native_cmd(self, request:str, awaited_res_if_ok=None)->GenericResult:
140 176 self.send_request(request)
141   - return self.receive_data()
  177 + native_res = self.receive_data()
  178 + ok = True if not awaited_res_if_ok else (native_res == awaited_res_if_ok)
  179 + return GenericResult(native_res, ok)
  180 +
  181 + def execute_native_cmd_OLD(self, request:str)->str:
  182 + self.send_request(request)
  183 + native_res = self.receive_data()
  184 + return native_res
142 185 def execute_unformated_native_cmd(self, request:str)->str:
143 186 request = self.formated_cmd(request)
144   - self.send_request(request)
145   - return self.receive_data()
  187 + return self.execute_native_cmd_OLD(request)
146 188  
147 189 def send_request(self, request:str)->str:
148 190 return self.send_data(request)
  191 +
149 192  
150 193 def print_available_commands(self):
151 194 print("\nAvailable commands are:")
... ... @@ -176,14 +219,40 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
176 219 return self._get_set_do(self._cmd_getset, 0, generic_param)
177 220 def _set(self, generic_param:str, value:str)->str:
178 221 if GET_ONLY: return 'NOT_DONE'
179   - return self._get_set_do(self._cmd_getset, 1, generic_param, value)
  222 + return self._get_set_do(self._cmd_getset, 2, generic_param, value)
180 223 def _do(self, generic_param:str)->str:
181 224 if GET_ONLY: return 'NOT_DONE'
182 225 return self._get_set_do(self._cmd_do, 0, generic_param)
183 226  
  227 +
  228 + def _get_set_do(self, dic:dict, indice:int, generic_param:str, value:str=None)->str:
  229 +
  230 + generic_cmd = 'do_'
  231 + if dic == self._cmd_getset:
  232 + generic_cmd = 'get_' if indice==0 else 'set_'
  233 + generic_cmd += generic_param
  234 + log_d("\nGENERIC command: "+generic_cmd)
  235 +
  236 + # Check if generic_param exists
  237 + if not generic_param: raise UnknownCommandException()
  238 + if generic_param not in dic.keys(): raise UnknownCommandException()
  239 + # if this command is not overriden by this class, raise NotImplementedError
  240 + if not dic[generic_param]: raise NotImplementedError
  241 + if len(dic[generic_param]) < indice+1: raise NotImplementedError
  242 +
  243 + # Get corresponding native command:
  244 + native_cmd = dic[generic_param][indice]
  245 + # if this command is not overriden by this class, raise NotImplementedError
  246 + if native_cmd == '': raise NotImplementedError
  247 +
  248 + awaited_res_ok = None
  249 + if len(dic[generic_param]) > 1: awaited_res_ok = dic[generic_param][indice+1]
  250 + return self.execute_native_cmd(self.formated_cmd(native_cmd,value), awaited_res_ok)
  251 +
  252 + '''
184 253 def _get_set_do(self, dic:dict, indice:int, generic_param:str, value:str=None)->str:
185 254 #if generic_param in c: return generic_param.name
186   - #if generic_param == c.RA_DEC: return self.get_RADEC()
  255 + #if generic_param == c.RA_DEC: return self.get_radec()
187 256 #return NotImplementedError
188 257 native_cmds = []
189 258  
... ... @@ -213,87 +282,22 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
213 282 for cmd in native_cmds:
214 283 #print("command is", repr(cmd))
215 284 #res.append(self.put_read(self.formated_cmd(cmd)))
216   - res.append(self.execute_native_cmd(self.formated_cmd(cmd,value)))
  285 + res.append(self.execute_native_cmd_OLD(self.formated_cmd(cmd,value)))
217 286 if len(res) == 1: return res[0]
218 287 return res
219   -
220   -
221   - def set_SPEED(self, speed_rate):
222   - print("from super")
223   - pass
224   -
225   -
226   - ''' GOTO (p105)
227   - - GOTO(position, blocking=Y/N):
228   - (MS = move start)
229   - = Goto RA=18h23m45s Dec=+34d00m00s J2000
230   - - radec.goto()
231 288 '''
232   - def do_goto(self, ra, dec, speed_rate=None):
233   -
234   - # 1) set speed
235   - if speed_rate: self.set_SPEED(speed_rate)
236   -
237   - radec = self.get_RADEC()
238   - print("Current position is", radec)
239 289  
240   - # 2) set RA-DEC
241   - '''
242   - :Sr18:23:45#:Sd+34:00:00#:MS#
243   - '''
244   - res = self.set_RA(ra)
245   - if res != '1': raise UnexpectedCommandReturnCode(res)
246   - res = self.set_DEC(dec)
247   - if res != '1': raise UnexpectedCommandReturnCode(res)
248   -
249   - # 3) MOVE (non blocking by default for GEMINI)
250   - self.do_MOVE()
251   -
252   - # 4) Test velocity until it is "Tracking"
253   - '''
254   - After MOVE, test velocity with ':Gv#' (p103) : we should have 'S', then 'C', then 'T'
255   - - N (for "no tracking")
256   - - T (for Tracking)
257   - - G (for Guiding)
258   - - C (for Centering)
259   - - S (for Slewing)
260   - '''
261   - v = None
262   - while v != 'T':
263   - v = self.get_VELOCITY()
264   - print("Velocity is", v)
265   - time.sleep(2)
266   -
267   - time.sleep(2)
268   - radec = self.get_RADEC()
269   - print("Current position is", radec)
270   -
271   - def do_MOVE_NORTH(self): pass
272   - def do_MOVE_SOUTH(self): pass
273   - def do_MOVE_WEST(self): pass
274   - def do_MOVE_EAST(self): pass
275   -
276   - def do_move_dir(self, dir, nbsec, speed_rate=None):
277   - if speed_rate: self.set_SPEED(speed_rate)
278   - if dir=="NORTH": self.do_MOVE_NORTH()
279   - if dir=="SOUTH": self.do_MOVE_SOUTH()
280   - if dir=="WEST": self.do_MOVE_WEST()
281   - if dir=="EAST": self.do_MOVE_EAST()
282   - time.sleep(int(nbsec))
283   - self.do_STOP()
284 290  
285 291  
286 292 '''
287   - def do(self, generic_cmd:str):
288   - return NotImplementedError
289   - def set(self, generic_param:str):
290   - return NotImplementedError
  293 + ****************************
  294 + GENERIC GET & SET commands
  295 + ****************************
291 296 '''
292 297  
293   - ''' GET & SET commands '''
294   -
295 298 # @abstract
296   - def get_ACK(self): return self._get("ACK")
  299 + def get_ack(self):
  300 + return self._get("ack")
297 301  
298 302 # RA/DEC
299 303 # @abstract
... ... @@ -307,8 +311,8 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
307 311 0 if invalid
308 312 1 if valid
309 313 '''
310   - def get_RA(self): return self._get("RA")
311   - def set_RA(self, ra): return self._set("RA", ra)
  314 + def get_ra(self): return self._get("ra")
  315 + def set_ra(self, ra): return self._set("ra", ra)
312 316  
313 317 '''
314 318 Sets the object's declination.
... ... @@ -321,16 +325,18 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
321 325 0 if invalid
322 326 1 if valid
323 327 '''
324   - def get_DEC(self): return self._get("DEC")
325   - def set_DEC(self, dec): return self._set("DEC", dec)
  328 + def get_dec(self): return self._get("dec")
  329 + def set_dec(self, dec): return self._set("dec", dec)
326 330 # @abstract
327 331 # @abstract
328   - def get_RADEC(self): return self._get("RADEC")
  332 + #def get_radec(self): return self._get("RADEC")
  333 + def get_radec(self)->tuple: return (self.get_ra(),self.get_dec())
  334 +
329 335 def set_RADEC(self, radec): return self._set("RADEC", radec)
330 336  
331 337 #def set_TIMEZONE_IS_UTC(self): return self._set('TIMEZONE_IS_UTC')
332   - def get_TIMEZONE(self): return self._get('TIMEZONE')
333   - def set_TIMEZONE(self, hh): return self._set('TIMEZONE', hh)
  338 + def get_timezone(self): return self._get('timezone')
  339 + def set_timezone(self, hh): return self._set('timezone', hh)
334 340 def get_DATE(self): return self._get('DATE')
335 341 def set_DATE(self, mmddyy): return self._set('DATE', mmddyy)
336 342 def get_TIME(self): return self._get('TIME')
... ... @@ -342,9 +348,15 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
342 348 def set_LATITUDE(self, latitude): return self._set('LATITUDE', latitude)
343 349  
344 350 def get_VELOCITY(self): return self._get('VELOCITY')
345   -
346   -
347   - ''' DO commands '''
  351 +
  352 +
  353 +
  354 +
  355 + '''
  356 + ****************************
  357 + GENERIC DO commands
  358 + ****************************
  359 + '''
348 360  
349 361 # @abstract
350 362 #def do_INIT(self): return self._do("INIT")
... ... @@ -365,8 +377,254 @@ class SocketClientTelescopeAbstract(SocketClientAbstract):
365 377  
366 378 # @abstract
367 379 #def do_GOTO(self, pos:Position): return self._do("GOTO")
368   - def do_WARM_START(self): return self._do("WARM_START")
369   - def do_PREC_REFR(self): return self._do("PREC_REFR")
  380 + #def do_WARM_START(self): return self._do("WARM_START")
  381 + def do_warm_start(self): pass
  382 + def do_PREC_REFR(self): return self._do("PREC_REFR")
  383 +
  384 +
  385 +
  386 + # @abstract
  387 + def do_init(self):
  388 +
  389 + '''
  390 + 1) Send cde ACK ('06') and check answer to see if telescope is ready (see doc page 100)
  391 + (utile pour savoir si tout est ok ; par ex, si une raquette est branchรฉe sur le tele, รงa peut bloquer le protocole)
  392 + Usable for testing the serial link and determining the type of mount (German equatorial).
  393 + Return code can be:
  394 + - B# while the initial startup message is being displayed (new in L4),
  395 + - b# while waiting for the selection of the Startup Mode,
  396 + - S# during a Cold Start (new in L4),
  397 + - G# after completed startup ==> MEANS ALL IS OK
  398 + '''
  399 + #ACK = self.get("ACK")
  400 + ACK = self.get_ack()
  401 +
  402 + '''
  403 + 2) IF telescope is not ready (still starting up), ask it to do a Warm Start ('bW#')
  404 + During Startup, with a "b#" being returned, the PC can select the startup mode by sending a
  405 + โ€ข bC# for selecting the Cold Start,
  406 + โ€ข bW# for selecting the Warm Start,
  407 + โ€ข bR# for selecting the Warm Restart
  408 + If not ok (still starting up, no 'G#' in return), send 'bW#' (see above) for selecting the Warm Start
  409 + '''
  410 + #if ACK != 'G':
  411 + if not ACK.ok:
  412 + self.do_warm_start()
  413 + ACK = self.get_ack()
  414 + elapsed_time = 0
  415 + while not ACK.ok:
  416 + time.sleep(1)
  417 + elapsed_time += 1
  418 + if elapsed_time == TIMEOUT_RECEIVE: raise TimeoutException()
  419 + ACK = self.get_ack()
  420 +
  421 +
  422 + '''
  423 + 3) Set timezone, date, and time (p109)
  424 + '''
  425 +
  426 + '''
  427 + a) set TIMEZONE
  428 + Set the number of hours by which your local time differs from UTC.
  429 + If your local time is earlier than UTC set a positive value,
  430 + if later than UTC set a negative value. The time difference has to be set before setting the calendar date (SC) and local time (SL), since the Real Time Clock is running at UTC
  431 + => :SG{+-}hh#
  432 + '''
  433 + res = self.get_timezone()
  434 + print("Current timezone is", res)
  435 + res = self.set_timezone('+00')
  436 + #if res != '1': raise UnexpectedCommandReturnCode(res)
  437 + if not res.ok: raise UnexpectedCommandReturnCode(res)
  438 + res = self.get_timezone()
  439 + if res.txt != '+00': raise UnexpectedCommandReturnCode(res)
  440 + print("NEW timezone set is", res)
  441 +
  442 +
  443 + return
  444 + '''
  445 + b) set DATE
  446 + Set Calendar Date:
  447 + months mm, days dd, year yy of the civil time according to the timezone set.
  448 + The internal calendar/clock uses GMT
  449 + :SC<mm>/<dd>/<yy>#
  450 + 0 if invalid
  451 + or
  452 + TODO:
  453 + 1Updating planetary data#<24 blanks>#
  454 + '''
  455 + res = self.get_DATE()
  456 + print("Current date is", res)
  457 + # format is 2018-09-26T17:50:21
  458 + d = self.get_utc_date()
  459 + # format to mm/dd/yy
  460 + now_utc_mm_dd_yy = d[5:7] + '/' + d[8:10] + '/' + d[2:4]
  461 + #print("date is", now_utc_mm_dd_yy)
  462 + res = self.set_DATE(now_utc_mm_dd_yy)
  463 + #res = self.set_DATE(self.get_utc_date())
  464 + #if res[0] != '1': raise UnexpectedCommandReturnCode(res)
  465 + #if not res.startswith('1Updating planetary data'): raise UnexpectedCommandReturnCode(res)
  466 + if not res: raise UnexpectedCommandReturnCode(res)
  467 + res = self.get_DATE()
  468 + if res != now_utc_mm_dd_yy: raise UnexpectedCommandReturnCode(res)
  469 + print("NEW DATE set is", res)
  470 +
  471 + '''
  472 + c) set TIME
  473 + Set RTC Time from the civil time hours hh, minutes mm and seconds ss.
  474 + The timezone must be set before using this command
  475 + :SL<hh>:<mm>:<ss>#
  476 + '''
  477 + res = self.get_TIME()
  478 + print("Current time is", res)
  479 + _,now_utc_hh_mm_ss = d.split('T')
  480 + #print("time is", now_utc_hh_mm_ss[:5])
  481 + res = self.set_TIME(now_utc_hh_mm_ss)
  482 + #if res != '1': raise UnexpectedCommandReturnCode(res)
  483 + if not res: raise UnexpectedCommandReturnCode(res)
  484 + res = self.get_TIME()
  485 + if res[:5] != now_utc_hh_mm_ss[:5]: raise UnexpectedCommandReturnCode(res)
  486 +
  487 +
  488 + '''
  489 + 4) Set LOCATION (lat,long) (p103,110)
  490 + Pour l'observatoire de Guitalens:
  491 + Sg = 2.0375 E
  492 + St = 43.6443 N
  493 + (attention, 2.0375 E = - 2.0375)
  494 + '''
  495 +
  496 + '''
  497 + a) set Longitude
  498 + Sets the longitude of the observing site to ddd degrees and mm minutes.
  499 + The longitude has to be specified positively for western latitudes
  500 + (west of Greenwich, the plus sign may be omitted) and negatively for eastern longitudes.
  501 + Alternatively, 360 degrees may be added to eastern longitudes.
  502 + => :Sg{+-}<ddd>*<mm>#
  503 + '''
  504 + # TELE format is -002ยฐ02 (I convert it to -002:02)
  505 + res = self.get_LONGITUDE()
  506 + print("Current longitude is", res)
  507 +
  508 + # CELME format is -002:02:15
  509 + res = self.get_celme_longitude("-2.0375")
  510 + res_ddd_mm = res[:-3]
  511 + #res_ddd_mm = '-002:03'
  512 +
  513 + #print("celme longitude is", res)
  514 + ddd,mm,ss = res.split(':')
  515 + dddmm = ddd+'*'+mm
  516 + #dddmm = '-002*03'
  517 + res = self.set_LONGITUDE(dddmm)
  518 + #if res != '1': raise UnexpectedCommandReturnCode(res)
  519 + if not res: raise UnexpectedCommandReturnCode(res)
  520 + res = self.get_LONGITUDE()
  521 + if res != res_ddd_mm: raise UnexpectedCommandReturnCode(res)
  522 +
  523 + '''
  524 + b) set Latitude
  525 + Sets the latitude of the observing site to dd degrees, mm minutes.
  526 + The minus sign indicates southern latitudes, the positive sign may be omitted.
  527 + => :St{+-}<dd>*<mm>#
  528 + '''
  529 + # TELE format is +43ยฐ38 (I convert it to +43:38)
  530 + res = self.get_LATITUDE()
  531 + print("Current latitude is", res)
  532 +
  533 + # CELME format is +43:38:15
  534 + res = self.get_celme_latitude("+43.6443")
  535 + res_dd_mm = res[:-3]
  536 + print("res is", res)
  537 + #res_dd_mm = '+43:50'
  538 +
  539 + #print("celme longitude is", res)
  540 + dd,mm,ss = res.split(':')
  541 + ddmm = dd+'*'+mm
  542 + #ddmm = '+43*50'
  543 + res = self.set_LATITUDE(ddmm)
  544 + #if res != '1': raise UnexpectedCommandReturnCode(res)
  545 + if not res: raise UnexpectedCommandReturnCode(res)
  546 + res = self.get_LATITUDE()
  547 + if res != res_dd_mm: raise UnexpectedCommandReturnCode(res)
  548 +
  549 +
  550 + '''
  551 + 5) Send cde ':p3#' : Precession & Refraction (see page 107)
  552 + Ask Gemini to do Precession calculation
  553 + Coordinates transferred to the Gemini refer to the standard epoch J2000.0.
  554 + Refraction is calculated (From L4, V1.0 up)
  555 + '''
  556 + self.do_PREC_REFR()
  557 +
  558 +
  559 + # @abstract
  560 + def set_SPEED(self, speed_rate):
  561 + pass
  562 +
  563 +
  564 + ''' GOTO (p105)
  565 + - GOTO(position, blocking=Y/N):
  566 + (MS = move start)
  567 + = Goto RA=18h23m45s Dec=+34d00m00s J2000
  568 + - radec.goto()
  569 + '''
  570 + # @abstract
  571 + def do_goto(self, ra, dec, speed_rate=None):
  572 +
  573 + # 1) set speed
  574 + if speed_rate: self.set_SPEED(speed_rate)
  575 +
  576 + radec = self.get_radec()
  577 + print("Current position is", radec)
  578 +
  579 + # 2) set RA-DEC
  580 + '''
  581 + :Sr18:23:45#:Sd+34:00:00#:MS#
  582 + '''
  583 + res = self.set_ra(ra)
  584 + if res != '1': raise UnexpectedCommandReturnCode(res)
  585 + res = self.set_dec(dec)
  586 + if res != '1': raise UnexpectedCommandReturnCode(res)
  587 +
  588 + # 3) MOVE (non blocking by default for GEMINI)
  589 + self.do_MOVE()
  590 +
  591 + # 4) Test velocity until it is "Tracking"
  592 + '''
  593 + After MOVE, test velocity with ':Gv#' (p103) : we should have 'S', then 'C', then 'T'
  594 + - N (for "no tracking")
  595 + - T (for Tracking)
  596 + - G (for Guiding)
  597 + - C (for Centering)
  598 + - S (for Slewing)
  599 + '''
  600 + v = None
  601 + while v != 'T':
  602 + v = self.get_VELOCITY()
  603 + print("Velocity is", v)
  604 + time.sleep(2)
  605 +
  606 + time.sleep(2)
  607 + radec = self.get_radec()
  608 + print("Current position is", radec)
  609 +
  610 +
  611 + def do_MOVE_NORTH(self): pass
  612 + def do_MOVE_SOUTH(self): pass
  613 + def do_MOVE_WEST(self): pass
  614 + def do_MOVE_EAST(self): pass
  615 +
  616 + # @abstract
  617 + def do_move_dir(self, dir, nbsec, speed_rate=None):
  618 + if speed_rate: self.set_SPEED(speed_rate)
  619 + if dir=="NORTH": self.do_MOVE_NORTH()
  620 + if dir=="SOUTH": self.do_MOVE_SOUTH()
  621 + if dir=="WEST": self.do_MOVE_WEST()
  622 + if dir=="EAST": self.do_MOVE_EAST()
  623 + time.sleep(int(nbsec))
  624 + self.do_STOP()
  625 +
  626 +
  627 +
370 628  
371 629  
372 630 #TODO: delete if not necessary
... ...
sockets_tele/src_socket/client/socket_client_telescope_gemini.py
... ... @@ -21,8 +21,9 @@ sys.path.append(&#39;../..&#39;)
21 21 from src_socket.client.socket_client_telescope_abstract import *
22 22  
23 23  
24   -# Default timeout set to 10s
25   -TIMEOUT = 10
  24 +# Default timeouts
  25 +TIMEOUT_SEND = 10
  26 +TIMEOUT_RECEIVE = 10
26 27  
27 28 # COMMON CONSTANTS WITH SERVER
28 29 TERMINATOR = '\x00'
... ... @@ -56,39 +57,39 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
56 57  
57 58  
58 59 ''' Commands dictionary
59   - 'CMD-NAME': ['cmd-get', 'cmd-set', 'comment'],
  60 + 'CMD-NAME': ['cmd-get', 'awaited_res_ok_for_get', 'cmd-set', 'awaited_res_ok_for_set', 'comment'],
60 61 '''
61 62 # @override
62 63 _cmd_getset = {
63 64  
64   - 'ACK': [COMMAND6],
  65 + 'ack': [COMMAND6, 'G'],
65 66  
66 67 # RA-DEC (p109-110)
67 68 #:Sr<hh>:<mm>.<m># or :Sr<hh>:<mm>:<ss>#
68 69 #Sets the object's Right Ascension and the object status to "Not Selected". The :Sd# command has to follow to complete the selection. The subsequent use of the :ON...# command is recommended
69 70 #:Sd{+-}<dd>{*ยฐ}<mm># or :Sd{+- }<dd>{*ยฐ:}<mm>:<ss>
70 71 #Sets the object's declination. It is important that the :Sr# command has been send prior. Internal calculations are done that may take up to 0.5 seconds. If the coordinate selection is valid the object status is set to "Selected"
71   - 'RA': ['GR', 'Sr', 'commentaire'],
72   - 'DEC': ['GD', 'Sd'],
73   - 'RADEC': [('GR','GD'), ''],
  72 + 'ra': ['GR', None, 'Sr', None, 'commentaire'],
  73 + 'dec': ['GD', None, 'Sd'],
  74 + #'RADEC': [('GR','GD'), ''],
74 75  
75 76 # ALT-AZ (p?)
76   - "ALT": ['GA', ''],
77   - "AZ": ['GZ', ''],
78   - "ALT-AZ": [('GA','GZ'), ''],
  77 + "ALT": ['GA'],
  78 + "AZ": ['GZ'],
  79 + #"ALT-AZ": [('GA','GZ'), ''],
79 80  
80 81 # LONG-LAT
81   - "LONGITUDE": ['Gg', 'Sg'],
82   - "LATITUDE": ['Gt', 'St'],
83   - "LONGLAT": [('Gg','Gt'), ''],
  82 + "LONGITUDE": ['Gg', None, 'Sg'],
  83 + "LATITUDE": ['Gt', None, 'St'],
  84 + #"LONGLAT": [('Gg','Gt'), ''],
84 85  
85   - "hour-angle": ['GH', ''],
  86 + "hour-angle": ['GH'],
86 87  
87   - "max-vel": ['Gv', ''],
  88 + "max-vel": ['Gv'],
88 89  
89   - 'TIMEZONE': ['GG', 'SG'],
90   - 'DATE': ['GC', 'SC'],
91   - 'TIME': ['GL', 'SL'],
  90 + 'timezone': ['GG', None, 'SG', '1'],
  91 + 'DATE': ['GC', None, 'SC'],
  92 + 'TIME': ['GL', None, 'SL'],
92 93  
93 94 'VELOCITY': ['Gv'],
94 95  
... ... @@ -210,6 +211,14 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
210 211 return useful_data
211 212  
212 213  
  214 +
  215 + # @overwrite
  216 + #def get_ack(self): return self.execute_native_cmd(COMMAND6, 'G')
  217 + #def do_warm_start(self): return self.execute_native_cmd('bW')
  218 +
  219 +
  220 +
  221 + """ moved to abstract parent
213 222 # @override
214 223 def do_init(self):
215 224  
... ... @@ -224,7 +233,7 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
224 233 - G# after completed startup ==> MEANS ALL IS OK
225 234 '''
226 235 #ACK = self.get("ACK")
227   - ACK = self.get_ACK()
  236 + ACK = self.get_ack()
228 237  
229 238 '''
230 239 2) IF telescope is not ready (still starting up), ask it to do a Warm Start ('bW#')
... ... @@ -236,13 +245,13 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
236 245 '''
237 246 if ACK != 'G':
238 247 self.do_WARM_START()
239   - ACK = self.get_ACK()
  248 + ACK = self.get_ack()
240 249 elapsed_time = 0
241 250 while ACK != 'G':
242 251 time.sleep(1)
243 252 elapsed_time += 1
244 253 if elapsed_time == TIMEOUT: raise TimeoutException()
245   - ACK = self.get_ACK()
  254 + ACK = self.get_ack()
246 255  
247 256  
248 257 '''
... ... @@ -374,6 +383,7 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
374 383 Refraction is calculated (From L4, V1.0 up)
375 384 '''
376 385 self.do_PREC_REFR()
  386 + """
377 387  
378 388  
379 389 def set_SPEED(self, speed_rate):
... ... @@ -390,10 +400,10 @@ class SocketClientTelescopeGEMINI(SocketClientTelescopeAbstract):
390 400 if not native_cmd: raise UnknownCommandException(speed_rate)
391 401 return self.execute_unformated_native_cmd(native_cmd)
392 402  
393   - def do_MOVE_NORTH(self): return self.execute_native_cmd(':Mn#')
394   - def do_MOVE_SOUTH(self): return self.execute_native_cmd(':Ms#')
395   - def do_MOVE_WEST(self): return self.execute_native_cmd(':Mw#')
396   - def do_MOVE_EAST(self): return self.execute_native_cmd(':Me#')
  403 + def do_MOVE_NORTH(self): return self.execute_native_cmd_OLD(':Mn#')
  404 + def do_MOVE_SOUTH(self): return self.execute_native_cmd_OLD(':Ms#')
  405 + def do_MOVE_WEST(self): return self.execute_native_cmd_OLD(':Mw#')
  406 + def do_MOVE_EAST(self): return self.execute_native_cmd_OLD(':Me#')
397 407  
398 408  
399 409  
... ...