Skip to content

Commit

Permalink
autoguide thread
Browse files Browse the repository at this point in the history
mgjeon committed Mar 19, 2022
1 parent 7c81ebb commit 14d4325
Showing 4 changed files with 247 additions and 55 deletions.
20 changes: 12 additions & 8 deletions python/lvmagp/actor/commands/test.py
Original file line number Diff line number Diff line change
@@ -2,14 +2,18 @@

sci = LVMTelescopeUnit("sci")

# sci.fine_autofocus()
sci.fine_autofocus()
sci.goto_eq(8, -38)
sci.guide_on()

# sci.goto_aa(58, 315)
sci.goto_eq(12.2, -17.5)
import time
def my_exposure(exptime):
print("my_exposure Start")
time.sleep(exptime)
print("my_exposure Done")
return True

# print(sci.find_guide_stars())
# sci.track_off()
# sci.track_on()
sci.guide_on()
# sci.calibration()
res = my_exposure(60)

if (res):
sci.guide_off()
81 changes: 81 additions & 0 deletions python/lvmagp/actor/commands/test2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import time
import signal

import multiprocessing

class LVMTelescopeUnit():
def __init__(self, tel):
self.tel = tel
# self.ag_task = None
self.ag_break = False
self.proc = None

def handler(self, signum, frame):
self.guide_off()

def autoguide_supervisor(self, msg):
while True:
self.autoguiding(msg)
if self.ag_break: break

def autoguiding(self, msg):
time.sleep(1)
print(msg)

def guide_on(self, timeout=None):
# self.ag_task = True
print(f"{self.tel} | Autoguide Start")

try:
signal.signal(signal.SIGINT, self.handler)
if timeout is not None:
signal.signal(signal.SIGALRM, self.handler)
signal.alarm(timeout)
self.proc = multiprocessing.Process(target=self.autoguide_supervisor, args=(f"{self.tel} | Autoguiding...", ))
self.proc.start()
except:
raise Exception
# finally:
# self.ag_task = None

# if not self.proc.is_alive():
# return print(f"{self.tel} | Autoguide Done")

def guide_off(self, proc=None):

if self.proc is not None:
try:
self.proc.terminate()
except:
raise Exception

# if self.ag_task is not None:
# self.ag_break = True
# else:
# raise Exception

def expose(self, exptime):
print(f"{self.tel} | Expose Start")
time.sleep(exptime)
print(f"{self.tel} | Expose Done")
self.guide_off()


if __name__ == '__main__' :
start = time.perf_counter()

sci = LVMTelescopeUnit("sci")
# aaa = LVMTelescopeUnit("aaa")

# p = multiprocessing.Process(target=sci.guide_on)
# p = multiprocessing.Process(target=sci.guide_on, args=(5,))
# p.start()

# aaa.expose(1)
# p.join()
sci.guide_on()
sci.expose(5)


finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)')
65 changes: 65 additions & 0 deletions python/lvmagp/actor/commands/test3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import time
import signal

import threading

class LVMTelescopeUnit():
def __init__(self, tel):
self.tel = tel
self.ag_break = False
# self.proc = None

def handler(self, signum, frame):
self.guide_off()

def autoguide_supervisor(self, msg):
while True:
self.autoguiding(msg)
if self.ag_break: break

def autoguiding(self, msg):
time.sleep(1)
print(msg)

def guide_on(self, timeout=None):
print(f"{self.tel} | Autoguide Start")

try:
signal.signal(signal.SIGINT, self.handler)
if timeout is not None:
signal.signal(signal.SIGALRM, self.handler)
signal.alarm(timeout)
t = threading.Thread(target=self.autoguide_supervisor, args=(f"{self.tel} | Autoguiding...", ))
t.setDaemon(True)
t.start()
except:
raise Exception


def guide_off(self, proc=None):
self.ag_break = True
# if self.proc is not None:
# try:
# self.proc.terminate()
# except:
# raise Exception


def expose(self, exptime):
print(f"{self.tel} | Expose Start")
time.sleep(exptime)
print(f"{self.tel} | Expose Done")
self.guide_off()


if __name__ == '__main__' :
start = time.perf_counter()

sci = LVMTelescopeUnit("sci")

sci.guide_on()
sci.expose(5)


finish = time.perf_counter()
print(f'Finished in {round(finish-start, 2)} second(s)')
136 changes: 89 additions & 47 deletions python/lvmagp/actor/commfunc.py
Original file line number Diff line number Diff line change
@@ -2,10 +2,10 @@
import logging
import sys
import uuid
# import asyncio, threading
# from multiprocessing.pool import ThreadPool
from multiprocessing import Manager, Process

from threading import Thread
import time
import signal
import astropy.units as u
import numpy as np
from astropy.coordinates import Angle
@@ -31,8 +31,6 @@
LvmagpTargetOverTheLimit,
)

import time


class LVMFocuser:
"""
@@ -380,7 +378,9 @@ def __init__(self):
self.pixelscale = usrpars.pixelscale
self.rotationangle = usrpars.rotationangle

def single_exposure(self, exptime):
def single_exposure(self, exptime
# , result=None
):
"""
Take a single exposure
@@ -400,12 +400,18 @@ def single_exposure(self, exptime):
except Exception as e:
self.amqpc.log.error(f"{datetime.datetime.now()} | {e}")
raise

# if result is not None:
# try:
# result.append(path['0'])
# except Exception as e:
# result.put(path['0'])

self.amqpc.log.debug(
f"{datetime.datetime.now()} | Guider {self.camname} exposure done"
)

return path["0"]
return path['0']

def test_exposure(self, exptime):
"""
@@ -662,32 +668,8 @@ def __get_fwhm(self):
"""
exptime = usrpars.af_exptime
imgcmd_w, imgcmd_e = None, None

# pool = ThreadPool(processes=2)
# a_agw = pool.apply_async(self.agw.single_exposure, (exptime,))
# a_age = pool.apply_async(self.age.single_exposure, (exptime,))

# p_agw = Process(
# target=self.agw.single_exposure,
# args=(exptime,),
# )
# p_age = Process(
# target=self.age.single_exposure,
# args=(exptime,),
# )

try:
if self.name != "phot":
# imgcmd_w, imgcmd_e = (
# a_agw.get(),
# a_age.get()
# )

# p_agw.start()
# p_age.start()
# p_agw.join()
# p_age.join()

imgcmd_w, imgcmd_e = (
self.agw.single_exposure(exptime=exptime),
self.age.single_exposure(exptime=exptime)
@@ -778,6 +760,51 @@ def goto_eq(
for iter in range(usrpars.aqu_max_iter + 1):

# take an image for astrometry

# result = Queue()
# processes = []
# processes.append(
# Process(
# target=self.agw.single_exposure,
# args=(usrpars.aqu_exptime, result),
# )
# )
# processes.append(
# Process(
# target=self.age.single_exposure,
# args=(usrpars.aqu_exptime, result),
# )
# )
# for p in processes:
# p.start()
# for p in processes:
# p.join()
# print(result)

# result = list()
# threads = []
# threads.append(
# Thread(
# target=self.agw.single_exposure,
# args=(usrpars.aqu_exptime, result),
# )
# )
# threads.append(
# Thread(
# target=self.age.single_exposure,
# args=(usrpars.aqu_exptime, result),
# )
# )
# for t in threads:
# t.start()
# for t in threads:
# t.join()
# guideimgpath = result

self.amqpc.log.debug(
f"{datetime.datetime.now()} | (lvmagp) Astrometry..."
)

guideimgpath = (
self.agw.single_exposure(usrpars.aqu_exptime),
self.age.single_exposure(usrpars.aqu_exptime),
@@ -835,14 +862,12 @@ def goto_eq(
comp_ra_arcsec = (target_ra - ra2000).arcsecond
comp_dec_arcsec = (target_dec - dec2000).arcsecond

self.amqpc.log.info(
f"{datetime.datetime.now()} | (lvmagp) Astrometry result"+
f"Img_ra2000={ra2000.to_string(unit=u.hour)}"+
f"Img_dec2000={dec2000.to_string(unit=u.degree)}"+
f"Img_pa={pa_d:.3f} deg"+
f"offset_ra={comp_ra_arcsec:.3f} arcsec"+
f"offset_dec={comp_dec_arcsec:.3f} arcsec"
)
self.amqpc.log.info(f"{datetime.datetime.now()} | (lvmagp) Astrometry result")
self.amqpc.log.info(f"Img_ra2000={ra2000.to_string(unit=u.hour)}")
self.amqpc.log.info(f"Img_dec2000={dec2000.to_string(unit=u.degree)}")
self.amqpc.log.info(f"Img_pa={pa_d:.3f} deg")
self.amqpc.log.info(f"offset_ra={comp_ra_arcsec:.3f} arcsec")
self.amqpc.log.info(f"offset_dec={comp_dec_arcsec:.3f} arcsec")

# Compensation // Compensation for K-mirror based on astrometry result?
# may be by offset method..
@@ -1041,7 +1066,10 @@ def dither(self, delta_x=None, delta_y=None, delta_pa=None):
pass


def guide_on(self, useteldata=False, guide_parameters=None):
def handler(self, signum, frame):
self.guide_off()

def guide_on(self, timeout=None, useteldata=False, guide_parameters=None):
'''
Start guiding, or modify parameters of running guide loop. <--- modify????
guide_parameters is a dictionary containing additional parameters for
@@ -1060,18 +1088,32 @@ def guide_on(self, useteldata=False, guide_parameters=None):
if self.ag_on:
pass #raise lvmagpguidealreadyrunning ?????

self.ag_task = True
self.amqpc.log.debug(
f"{datetime.datetime.now()} | (lvmagp) Autoguide Start"
)

signal.signal(signal.SIGINT, self.handler)
if timeout is not None:
signal.signal(signal.SIGALRM, self.handler)
signal.alarm(timeout)

try:
self.autoguide_supervisor(useteldata)
self._ag_task
t = Thread(target=self.autoguide_supervisor, args=(useteldata, ))
t.setDaemon(True)
t.start()

except Exception as e:
self.amqpc.log.error(f"{datetime.datetime.now()} | {e}")
raise

finally:
self.ag_task = None

return self.amqpc.log.debug(f"{datetime.datetime.now()} | Guide stopped")
# if self.ag_break:
# self.amqpc.log.debug(
# f"{datetime.datetime.now()} | (lvmagp) Autoguide Done"
# )
# finally:
# self.ag_task = None

# return self.amqpc.log.debug(f"{datetime.datetime.now()} | Guide stopped")


def guide_off(self):

0 comments on commit 14d4325

Please sign in to comment.