class TestSite (object): def setup (self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) def teardown (self): self.manager.shutdown() def test_times (self): site = self.manager.getProxy(Site) try: print print "local:", site.localtime() print "UT :", site.ut() print "JD :", site.JD() print "MJD :", site.MJD() print "LST :", site.LST() print "GST :", site.GST() except Exception, e: printException(e)
class TestFilterWheel(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass(FakeFilterWheel, "fake", {"device": "/dev/ttyS0"}) self.manager.addClass(FilterWheel, "filter", { "driver": "/FakeFilterWheel/0", "filters": "U B V R I" }) #self.manager.addClass(SBIG, "sbig", {"device": Device.USB}) #self.manager.addClass(FilterWheel, "filter", {"driver": "/SBIG/0", # "filters": "R G B LUNAR CLEAR"}) def teardown(self): self.manager.shutdown() def test_filters(self): f = self.manager.getProxy(FilterWheel) filters = f.getFilters() for filter in filters: f.setFilter(filter) assert f.getFilter() == filter def test_get_filters(self): f = self.manager.getProxy(FilterWheel) filters = f.getFilters() assert isinstance(filters, tuple) or isinstance(filters, list)
class TestSite(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20" }) def teardown(self): self.manager.shutdown() def test_times(self): site = self.manager.getProxy(Site) try: print print "local:", site.localtime() print "UT :", site.ut() print "JD :", site.JD() print "MJD :", site.MJD() print "LST :", site.LST() print "GST :", site.GST() except Exception, e: printException(e)
class TestFakeCamera(FakeHardwareTest, CameraTest): def setup(self): self.manager = Manager(port=8000) from chimera.instruments.fakecamera import FakeCamera self.manager.addClass(FakeCamera, "fake") self.CAMERA = "/FakeCamera/0" FiredEvents = {} self.setupEvents() def teardown(self): self.manager.shutdown()
class TestFakeCamera(FakeHardwareTest, CameraTest): def setup (self): self.manager = Manager(port=8000) from chimera.instruments.fakecamera import FakeCamera self.manager.addClass(FakeCamera, "fake") self.CAMERA = "/FakeCamera/0" FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
class TestRealCamera(RealHardwareTest, CameraTest): def setup(self): self.manager = Manager(port=8000) from chimera.instruments.sbig import SBIG self.manager.addClass(SBIG, "sbig") self.CAMERA = "/SBIG/0" FiredEvents = {} self.setupEvents() def teardown(self): self.manager.shutdown()
class TestRealFilterWheel(RealHardwareTest, FilterWheelTest): def setup(self): self.manager = Manager() from chimera.instruments.sbig import SBIG self.manager.addClass(SBIG, "sbig", {"filters": "R G B LUNAR CLEAR"}) self.FILTER_WHEEL = "/SBIG/0" FiredEvents = {} self.setupEvents() def teardown(self): self.manager.shutdown()
class TestRealCamera(RealHardwareTest, CameraTest): def setup (self): self.manager = Manager(port=8000) from chimera.instruments.sbig import SBIG self.manager.addClass(SBIG, "sbig") self.CAMERA = "/SBIG/0" FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
class TestFakeFilterWheel(FakeHardwareTest, FilterWheelTest): def setup(self): self.manager = Manager(port=8000) from chimera.instruments.fakefilterwheel import FakeFilterWheel self.manager.addClass(FakeFilterWheel, "fake", {"device": "/dev/ttyS0", "filters": "U B V R I"}) self.FILTER_WHEEL = "/FakeFilterWheel/0" FiredEvents = {} self.setupEvents() def teardown(self): self.manager.shutdown()
class TestRealFocuser(RealHardwareTest, FocuserTest): def setup (self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896"}) from chimera.instruments.optectcfs import OptecTCFS self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS4"}) self.FOCUSER = "******" def teardown (self): self.manager.shutdown()
class TestFakeFocuser(FakeHardwareTest, FocuserTest): def setup(self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896"}) from chimera.instruments.fakefocuser import FakeFocuser self.manager.addClass(FakeFocuser, "fake", {"device": "/dev/ttyS0"}) self.FOCUSER = "******" def teardown (self): self.manager.shutdown()
class TestFakeFilterWheel(FakeHardwareTest, FilterWheelTest): def setup(self): self.manager = Manager(port=8000) from chimera.instruments.fakefilterwheel import FakeFilterWheel self.manager.addClass(FakeFilterWheel, "fake", { "device": "/dev/ttyS0", "filters": "U B V R I" }) self.FILTER_WHEEL = "/FakeFilterWheel/0" FiredEvents = {} self.setupEvents() def teardown(self): self.manager.shutdown()
class TestRealFocuser(RealHardwareTest, FocuserTest): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896" }) from chimera.instruments.optectcfs import OptecTCFS self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS4"}) self.FOCUSER = "******" def teardown(self): self.manager.shutdown()
class TestFakeFocuser(FakeHardwareTest, FocuserTest): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896" }) from chimera.instruments.fakefocuser import FakeFocuser self.manager.addClass(FakeFocuser, "fake", {"device": "/dev/ttyS0"}) self.FOCUSER = "******" def teardown(self): self.manager.shutdown()
class TestRealDome(RealHardwareTest, DomeTest): def setup (self): self.manager = Manager() self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.domelna40cm import DomeLNA40cm from chimera.instruments.meade import Meade self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.manager.addClass(DomeLNA40cm, "lna40", {"device": "/dev/ttyS9", "telescope": "/Meade/0", "mode": "Stand"}) self.TELESCOPE = "/Meade/meade" self.DOME = "/DomeLNA40cm/0" FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown() def test_stress_dome_track (self): # just for manual and visual testing raise SkipTest()
class TestRealTelescope(RealHardwareTest, TelescopeTest): def setup (self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.meade import Meade self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.TELESCOPE = "/Meade/0" #self.TELESCOPE = "150.162.110.3:7666/TheSkyTelescope/0" self.tel = self.manager.getProxy(self.TELESCOPE) FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
class TestFakeTelescope(FakeHardwareTest, TelescopeTest): def setup(self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.faketelescope import FakeTelescope self.manager.addClass(FakeTelescope, "fake") self.TELESCOPE = "/FakeTelescope/0" self.tel = self.manager.getProxy(self.TELESCOPE) FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
def test_log(self): class Simple(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) def answer(self): try: raise ChimeraException("I'm an Exception, sorry.") except ChimeraException: self.log.exception("from except: wow, exception caught.") raise ChimeraException("I'm a new Exception, sorry again") manager = Manager() manager.addClass(Simple, "simple") simple = manager.getProxy(Simple) try: simple.answer() except ChimeraException, e: assert e.cause != None log.exception("wow, something wrong")
def test_log (self): class Simple (ChimeraObject): def __init__ (self): ChimeraObject.__init__(self) def answer (self): try: raise ChimeraException("I'm an Exception, sorry.") except ChimeraException: self.log.exception("from except: wow, exception caught.") raise ChimeraException("I'm a new Exception, sorry again") manager = Manager() manager.addClass(Simple, "simple") simple = manager.getProxy(Simple) try: simple.answer() except ChimeraException, e: assert e.cause != None log.exception("wow, something wrong")
class TestFocuser(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) self.manager.addClass(FakeFocuser, "fake", {"device": "/dev/ttyS0"}) self.manager.addClass(Focuser, "focus", {"driver": "/FakeFocuser/0"}) #self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS0"}) #self.manager.addClass(Focuser, "focus", {"driver": "/OptecTCFS/0"}) def teardown(self): self.manager.shutdown() def test_get_position(self): focus = self.manager.getProxy(Focuser) assert focus.getPosition() >= 0 def test_move(self): focus = self.manager.getProxy(Focuser) start = focus.getPosition() delta = int(random.Random().random() * 1000) # assumes IN moving to lower values focus.moveIn(delta) assert focus.getPosition() == start - delta # assumes OUT moving to larger values start = focus.getPosition() focus.moveOut(delta) assert focus.getPosition() == start + delta # TO focus.moveTo(1000) assert focus.getPosition() == 1000 # TO where? assert_raises(InvalidFocusPositionException, focus.moveTo, 1e9)
class TestFakeDome(FakeHardwareTest, DomeTest): def setup (self): self.manager = Manager() self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) from chimera.instruments.faketelescope import FakeTelescope from chimera.instruments.fakedome import FakeDome self.manager.addClass(FakeTelescope, "fake") self.manager.addClass(FakeDome, "dome", {"telescope": "/FakeTelescope/0", "mode": "Track"}) self.TELESCOPE = "/FakeTelescope/0" self.DOME = "/FakeDome/0" FiredEvents = {} self.setupEvents() def teardown (self): self.manager.shutdown()
class TestCamera(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(SBIG, "sbig", {"device": Device.USB}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/sbig"}) self.manager.addClass(FakeCamera, "fake", {"device": Device.USB}) self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/fake"}) @callback(self.manager) def exposeBeginClbk(request): print print time.time(), "Expose begin for request %s." % request @callback(self.manager) def exposeCompleteClbk(request): print time.time(), "Expose complete for request %s." % request @callback(self.manager) def readoutBeginClbk(request): print time.time( ), "Readout begin for request %s." % request["filename"] @callback(self.manager) def readoutCompleteClbk(request): print time.time( ), "Readout complete for request %s." % request["filename"] @callback(self.manager) def abortCompleteClbk(): print time.time(), "Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += abortCompleteClbk def teardown(self): self.manager.shutdown() def test_simple(self): cam = self.manager.getProxy(Camera) assert cam.isExposing() == False def test_expose(self): cam = self.manager.getProxy(Camera) frames = 0 try: frames = cam.expose(exptime=2, frames=2, interval=0.5, filename="autogen-expose.fits") except Exception, e: log.exception("problems") assert len(frames) == 2 assert isinstance(frames[0], Proxy) assert isinstance(frames[1], Proxy)
class TestPointVerify (object): def setup (self): self.manager = Manager(port=8000) # real self.manager.addClass(SBIG, "sbig", {"device": "USB"}) self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20"}) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(PointVerify, "Point") def teardown (self): self.manager.shutdown() del self.manager def test_point (self): point = self.manager.getProxy(PointVerify)
class TestTelescope (object): def setup (self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896", # "utc_offset": "-3"}) self.manager.addClass(Site, "lna", {"name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20", "utc_offset": "-3"}) #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) #self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(FakeTelescope, "fake") self.manager.addClass(Telescope, "fake", {"driver": "/FakeTelescope/fake"}) #self.manager.addClass(Telescope, "meade", # {"driver": "200.131.64.134:7666/TheSkyTelescope/0"}) self.tel = self.manager.getProxy(Telescope) def teardown (self): self.manager.shutdown() def test_slew (self): ra = self.tel.getRa() dec = self.tel.getDec() dest_ra = (ra+"1 00 00") dest_dec = (dec+"15 00 00") @callback(self.manager) def slewBeginClbk(target): assert target.ra == dest_ra assert target.dec == dest_dec @callback(self.manager) def slewCompleteClbk(position): assertEpsEqual(position.ra, dest_ra, 60) assertEpsEqual(position.dec, dest_dec, 60) self.tel.slewBegin += slewBeginClbk self.tel.slewComplete += slewCompleteClbk self.tel.slewToRaDec((dest_ra, dest_dec)) def test_slew_abort (self): last_ra = self.tel.getRa() last_dec = self.tel.getDec() dest_ra = last_ra + "01 00 00" dest_dec = last_dec + "10 00 00" @callback(self.manager) def abortCompleteClbk(position): assert last_ra < position.ra < dest_ra assert last_dec < position.dec < dest_dec self.tel.abortComplete += abortCompleteClbk # async slew def slew(): self.tel = self.manager.getProxy(Telescope) self.tel.slewToRaDec((dest_ra, dest_dec)) pool = ThreadPool() pool.queueTask(slew) # wait thread to be scheduled time.sleep(2) # abort and test (on abortCompleteClbk). self.tel.abortSlew() pool.joinAll() def test_sync (self): # get current position, drift the scope, and sync on the first # position (like done when aligning the telescope). real_ra = self.tel.getRa() real_dec = self.tel.getDec() @callback(self.manager) def syncCompleteClbk(position): assert position.ra == real_ra assert position.dec == real_dec self.tel.syncComplete += syncCompleteClbk # drift to "real" object coordinate self.tel.slewToRaDec((real_ra+"01 00 00", real_dec+"01 00 00")) self.tel.syncRaDec((real_ra, real_dec)) def test_park (self): # FIXME: make a real test. return def printPosition(): print self.tel.getPositionRaDec(), self.tel.getPositionAltAz() sys.stdout.flush() print ra = self.tel.getRa() dec = self.tel.getDec() print "current position:", self.tel.getPositionRaDec() print "moving to:", (ra-"01 00 00"), (dec-"01 00 00") self.tel.slewToRaDec((ra-"01 00 00", dec-"01 00 00")) for i in range(10): printPosition() time.sleep(0.5) print "parking..." sys.stdout.flush() self.tel.park() t0 = time.time() wait = 30 for i in range(10): printPosition() time.sleep(0.5) while time.time() < t0+wait: print "\rwaiting ... ", sys.stdout.flush() time.sleep(1) print "unparking..." sys.stdout.flush() self.tel.unpark() for i in range(10): printPosition() time.sleep(0.5)
class TestSite(object): def setup(self): self.manager = Manager(port=8000) #self.manager.addClass(Site, "lna", {"name": "LNA", # "latitude": "-22 32 03", # "longitude": "-45 34 57", # "altitude": "1896"} self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20" }) def teardown(self): self.manager.shutdown() def test_times(self): site = self.manager.getProxy(Site) try: print() print("local:", site.localtime()) print("UT :", site.ut()) print("JD :", site.JD()) print("MJD :", site.MJD()) print("LST :", site.LST()) print("GST :", site.GST()) except Exception as e: printException(e) def test_sidereal_clock(self): return True site = self.manager.getProxy(Site) times = [] real_times = [] for i in range(100): t0 = time.clock() t0_r = time.time() print("\r%s" % site.LST(), end=' ') times.append(time.clock() - t0) real_times.append(time.time() - t0_r) print() print(sum(times) / len(times)) print(sum(real_times) / len(real_times)) def test_astros(self): site = self.manager.getProxy(Site) try: print() print("local :", site.localtime()) print() print("moonrise :", site.moonrise()) print("moonset :", site.moonset()) print("moon pos :", site.moonpos()) print("moon phase:", site.moonphase()) print() print("sunrise:", site.sunrise()) print("sunset :", site.sunset()) print("sun pos:", site.sunpos()) print() sunset_twilight_begin = site.sunset_twilight_begin() sunset_twilight_end = site.sunset_twilight_end() sunset_twilight_duration = relativedelta(sunset_twilight_end, sunset_twilight_begin) sunrise_twilight_begin = site.sunrise_twilight_begin() sunrise_twilight_end = site.sunrise_twilight_end() sunrise_twilight_duration = relativedelta(sunrise_twilight_end, sunrise_twilight_begin) print("next sunset twilight begins at:", sunset_twilight_begin) print("next sunset twilight ends at:", sunset_twilight_end) print("sunset twilight duration :", sunset_twilight_duration) print() print("next sunrise twilight begins at:", sunrise_twilight_begin) print("next sunrise twilight ends at:", sunrise_twilight_end) print("sunrise twilight duration :", sunrise_twilight_duration) except Exception as e: printException(e)
class TestAutofocus(object): def setup(self): self.manager = Manager(port=8000) # real self.manager.addClass(SBIG, "sbig", {"device": "USB"}) self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) self.manager.addClass( Site, "lna", { "name": "UFSC", "latitude": "-27 36 13 ", "longitude": "-48 31 20", "altitude": "20", "utc_offset": "-3" }) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6"}) self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) self.manager.addClass(PointVerify, "Point") def teardown(self): self.manager.shutdown() del self.manager def test_point(self): point = self.manager.getProxy(PointVerify)
class TestMeade (object): def setup (self): self.manager = Manager(port=8000) self.manager.addClass(Site, "lna", {"name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3"}) self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS0"}) @callback(self.manager) def slewBeginClbk(target): print time.time(), "Slew begin. target=%s" % str(target) @callback(self.manager) def slewCompleteClbk(position): print time.time(), "Slew complete. position=%s" % str(position) @callback(self.manager) def parkCompleteClbk(position): print time.time(), "Park complete. position=%s" % str(position) @callback(self.manager) def unparkCompleteClbk(position): print time.time(), "Unpark complete. position=%s" % str(position) self.m = self.manager.getProxy(Meade) self.m.slewBegin += slewBeginClbk self.m.slewComplete += slewCompleteClbk self.m.parkComplete += parkCompleteClbk self.m.unparkComplete += unparkCompleteClbk def test_print_info (self): m = self.m print "align mode:", m.getAlignMode() print "ra :", m.getRa() print "dec:", m.getDec() print "az :", m.getAz() print "alt:", m.getAlt() print "lat :", m.getLat() print "long:", m.getLong() print "date:" , m.getDate() print "time:" , m.getLocalTime() print "to utc:", m.getUTCOffset() print "lst:", m.getLocalSiderealTime() print "tracking rate:", m.getCurrentTrackingRate () def test_set_info (self): m = self.m try: m.setLat("-22 32 03") m.setLong("-45 34 57") m.setDate(time.time()) m.setLocalTime(time.time()) m.setUTCOffset(3) m.setLat(Coord.fromDMS("-22 32 03")) m.setLong(Coord.fromDMS("-45 34 57")) m.setDate(dt.date.today()) m.setLocalTime(dt.datetime.now().time()) m.setUTCOffset(3) except Exception: log.exception("error") def printCoord (self, header=False): m = self.m if header: print "%20s %20s %20s %20s %20s" % ("LST", "RA", "DEC", "AZ", "ALT") print "%20s %20s %20s %20s %20s" % (m.getLocalSiderealTime(), m.getRa(), m.getDec(), m.getAz(), m.getAlt()) def test_sync (self): # FIXME m = self.m print "syncing..." m.sync ("10 00 00", "00 00 00") def test_slew_rate (self): m = self.m print print "current slew rate:", m.getSlewRate() for rate in SlewRate: m.setSlewRate(rate) print "current slew rate:", m.getSlewRate() def test_movement (self): m = self.m print for rate in SlewRate: print "moving to East at %s rate:" % rate, t = time.time () m.moveEast (5, rate) print time.time () - t print "moving to West at %s rate:" % rate, t = time.time () m.moveWest (5, rate) print time.time () - t print "moving to North at %s rate:" % rate, t = time.time () m.moveNorth (5, rate) print time.time () - t print "moving to South at %s rate:" % rate, t = time.time () m.moveSouth (5, rate) print time.time () - t print print def test_align_mode (self): m = self.m for mode in AlignMode: print "current align mode:", m.getAlignMode() print "switching to:", mode m.setAlignMode (mode) print "current align mode:", m.getAlignMode() print def test_tracking (self): m = self.m print m.setAlignMode (AlignMode.POLAR) print "current align mode:", m.getAlignMode() print "setting new date and time..." self.test_set_info() print self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print "stopping tracking..." sys.stdout.flush() m.stopTracking() start = time.time () finish = start + 30 print "waiting", sys.stdout.flush () while time.time() < finish: time.sleep (1) print "re-starting tracking..." sys.stdout.flush() m.startTracking() print "using old date and time..." print self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print print "setting new date and time..." self.test_set_info() print for i in range(10): self.printCoord () time.sleep (1) def test_park (self): m = self.m print print "="*50 print "Park and unpark test" print "="*50 print "Initial conditions (post power-on):" self.test_print_info() print print "Starting the scope..." self.test_set_info() print print "Scope location, date, time updated, new conditions:" self.test_print_info() print print "Pooling telescope position:" ra = m.getRa() self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print print "Slewing... to %s -70:00:00" % ra m.slewToRaDec (Position.fromRaDec(ra, "-70:00:00")) print print "Parking the scope at %s (lst: %s)" % (time.strftime("%c"), m.getLocalSiderealTime()) m.park () print print "Pooling telescope position:" self.printCoord(header=True) for i in range(10): self.printCoord () time.sleep (1) print start = time.time () finish = start + (2*60) # wait 30 minutes print "Waiting ", while time.time() < finish: update_scroll_spinner() time.sleep (0.2) print print "Unparking the scope at %s (lst: %s)" % (time.strftime("%c"), m.getLocalSiderealTime()) m.unpark () print print "Pooling telescope position:" for i in range(10): self.printCoord () time.sleep (1) print "="*50 def test_slew_to_az_alt (self): # FIXME m = self.m self.printCoord() m.slewToAltAz(("40:00:00", "180:00:00")) self.printCoord() def test_slew_to_ra_dec (self): m = self.m print self.printCoord (header=True) ra = m.getRa() m.slewToRaDec (Position.fromRaDec(ra, "-70:00:00")) #m.slewToRaDec (Position.fromRaDec("13h25m38.903s", "-11:12:24.928")) self.printCoord() def test_move_calibration (self): print "Calibrating movement..." self.m.calibrateMove() for rate in SlewRate: start = self.m.getPositionRaDec() print rate, start, "moving 30\" E..." self.m.moveEast(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" W..." self.m.moveWest(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" N..." self.m.moveNorth(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() start = self.m.getPositionRaDec() print rate, start, "moving 30\" S..." self.m.moveSouth(30, rate) end = self.m.getPositionRaDec() print rate, end, "real =", end.angsep(start).arcsec() print
class TestManager(object): def setup(self): self.manager = Manager() def teardown(self): self.manager.shutdown() del self.manager def test_add_start(self): # add by class assert self.manager.addClass(Simple, "simple", start=True) # already started assert_raises(InvalidLocationException, self.manager.addClass, Simple, "simple") assert_raises(NotValidChimeraObjectException, self.manager.addClass, NotValid, "nonono") assert_raises(InvalidLocationException, self.manager.addClass, Simple, "") # by location assert self.manager.addLocation('/ManagerHelper/h', path=[os.path.dirname(__file__)]) assert_raises(ClassLoaderException, self.manager.addLocation, '/What/h') assert_raises(InvalidLocationException, self.manager.addLocation, 'foo') # start with error #assert self.manager.addLocation('/ManagerHelperWithError/h', start=False) #assert_raises(ChimeraObjectException, self.manager.start, '/ManagerHelperWithError/h') # start who? assert_raises(InvalidLocationException, self.manager.start, "/Who/am/I") # exceptional cases # __init__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithInitException/h", [os.path.dirname(__file__)]) # __start__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithStartException/h", [os.path.dirname(__file__)]) # __main__ #assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithMainException/h") def test_remove_stop(self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.remove, 'Simple/what') assert_raises(InvalidLocationException, self.manager.remove, 'foo') # stop who? assert_raises(InvalidLocationException, self.manager.stop, 'foo') # ok assert self.manager.remove('/Simple/simple') == True # __stop__ error assert self.manager.addLocation("/ManagerHelperWithStopException/h", path=[os.path.dirname(__file__)]) assert_raises(ChimeraObjectException, self.manager.stop, '/ManagerHelperWithStopException/h') # another path to stop assert_raises(ChimeraObjectException, self.manager.remove, '/ManagerHelperWithStopException/h') # by index assert self.manager.addClass(Simple, "simple") assert self.manager.remove('/Simple/0') == True def test_proxy(self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.getProxy, 'wrong') assert_raises(InvalidLocationException, self.manager.getProxy, 'Simple/simple') # ok assert self.manager.getProxy('/Simple/simple') assert self.manager.getProxy('/Simple/0') # calling p = self.manager.getProxy('/Simple/0') assert isinstance(p, Proxy) assert p.answer() == 42 # oops assert_raises(AttributeError, p.wrong) def test_manager(self): assert self.manager.addClass(Simple, "simple") p = self.manager.getProxy(Simple) assert p m = p.getManager() assert m.GUID() == self.manager.GUID()
import logging logging.getLogger("chimera").setLevel(logging.INFO) from chimera.core.manager import Manager from minimo import Minimo manager = Manager(host='localhost', port=8000) manager.addClass(Minimo, "m", config={"option1": "blah blah"}, start=True) manager.wait()
from chimera.core.main import chimera from chimera.core.proxy import Proxy from chimera.core.manager import Manager # our example object from minimo import Minimo # create a new manager (default host (localhost), defaulr port 7666 or try next 4 from default) manager = Manager() # # 1. Adding objects and getting a proxy # # just add a min Minimoescope class (returns a valid proxy) minimo = manager.addClass(Minimo, "min", start=True) # synchronous "doFoo" minimo.doFoo("ra dec") # # 2. There are other ways to get proxy # # from manager (this ensure that the object exists on the manager, see ChimeraProxy below) minimo = manager.getProxy("/Minimo/min") minimo.doFoo("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy("/Minimo/0") minimo.doFoo("ra dec")
class SiteController(object): def __init__(self, args=[], wait=True): self.wait = wait self.options, self.args = self.parseArgs(args) if self.options.verbose == 1: chimera.core.log.setConsoleLevel(logging.INFO) #log.setConsoleLevel(logging.INFO) if self.options.verbose > 1: chimera.core.log.setConsoleLevel(logging.DEBUG) #log.setConsoleLevel(logging.DEBUG) self.manager = None self.paths = {"instruments": [], "controllers": []} # add system and plugins paths Path = ChimeraPath() self.paths["instruments"].extend(Path.instruments) self.paths["controllers"].extend(Path.controllers) def parseArgs(self, args): def check_location(option, opt_str, value, parser): try: l = Location(value) except InvalidLocationException: raise optparse.OptionValueError("%s isnt't a valid location." % value) eval('parser.values.%s.append ("%s")' % (option.dest, value)) def check_includepath(option, opt_str, value, parser): if not value or not os.path.isdir(os.path.abspath(value)): raise optparse.OptionValueError( "Couldn't found %s include path." % value) eval('parser.values.%s.append ("%s")' % (option.dest, value)) parser = optparse.OptionParser( prog="chimera", version=_chimera_version_, description=_chimera_description_, usage="chimera --help for more information") manag_group = optparse.OptionGroup(parser, "Basic options") manag_group.add_option( "-H", "--host", action="store", dest="pyro_host", type="string", help="Host name/IP address to run as; [default=%default]", metavar="HOST") manag_group.add_option( "-P", "--port", action="store", dest="pyro_port", type="string", help="Port on which to listen for requests; [default=%default]", metavar="PORT") config_group = optparse.OptionGroup(parser, "Configuration") config_group.add_option( "--config", dest="config_file", help="Start Chimera using configuration from FILE.", metavar="FILE") config_group.add_option( "--daemon", action="store_true", dest='daemon', help= "Run Chimera in Daemon mode (will detach from current terminal).") misc_group = optparse.OptionGroup(parser, "General") misc_group.add_option( "--dry-run", action="store_true", dest="dry", help= "Only list all configured objects (from command line and configuration files) without starting the system." ) misc_group.add_option( "-v", "--verbose", action="count", dest='verbose', help="Increase log level (multiple v's to increase even more).") inst_group = optparse.OptionGroup( parser, "Instruments and Controllers Management") inst_group.add_option( "-i", "--instrument", action="callback", callback=check_location, dest="instruments", type="string", help="Load the instrument defined by LOCATION." "This option could be set many times to load multiple instruments.", metavar="LOCATION") inst_group.add_option( "-c", "--controller", action="callback", callback=check_location, dest="controllers", type="string", help="Load the controller defined by LOCATION." "This option could be set many times to load multiple controllers.", metavar="LOCATION") inst_group.add_option("-I", "--instruments-dir", action="callback", callback=check_includepath, dest="inst_dir", type="string", help="Append PATH to instruments load path.", metavar="PATH") inst_group.add_option("-C", "--controllers-dir", action="callback", callback=check_includepath, dest="ctrl_dir", type="string", help="Append PATH to controllers load path.", metavar="PATH") parser.add_option_group(manag_group) parser.add_option_group(config_group) parser.add_option_group(misc_group) parser.add_option_group(inst_group) parser.set_defaults(instruments=[], controllers=[], config_file=SYSTEM_CONFIG_DEFAULT_FILENAME, inst_dir=[], ctrl_dir=[], drv_dir=[], dry=False, verbose=0, daemon=False, pyro_host=MANAGER_DEFAULT_HOST, pyro_port=MANAGER_DEFAULT_PORT) return parser.parse_args(args) def startup(self): if self.options.daemon: # detach log.info("FIXME: Daemon...") # system config try: self.config = SystemConfig.fromFile(self.options.config_file) except (InvalidLocationException, IOError) as e: log.exception(e) log.error( "There was a problem reading your configuration file. (%s)" % e) sys.exit(1) # manager if not self.options.dry: log.info("Starting system.") log.info("Chimera: %s" % _chimera_version_) log.info("Chimera prefix: %s" % ChimeraPath().root()) log.info("Python: %s" % platform.python_version()) log.info("System: %s" % ' '.join(platform.uname())) try: self.manager = Manager(**self.config.chimera) except ChimeraException as e: log.error( "Chimera is already running on this machine. Use chimera-admin to manage it." ) sys.exit(1) log.info("Chimera: running on " + self.manager.getHostname() + ":" + str(self.manager.getPort())) log.info("Chimera: reading configuration from %s" % os.path.realpath(self.options.config_file)) # add site object if not self.options.dry: for site in self.config.sites: self.manager.addClass(Site, site.name, site.config, True) # search paths log.info( "Setting objects include path from command line parameters...") for _dir in self.options.inst_dir: self.paths["instruments"].append(_dir) for _dir in self.options.ctrl_dir: self.paths["controllers"].append(_dir) # init from config log.info("Trying to start instruments...") for inst in self.config.instruments + self.options.instruments: if self.options.dry: print(inst) else: self._add(inst, path=self.paths["instruments"], start=True) log.info("Trying to start controllers...") for ctrl in self.config.controllers + self.options.controllers: if self.options.dry: print(ctrl) else: self._add(ctrl, path=self.paths["controllers"], start=True) log.info("System up and running.") # ok, let's wait manager work if self.wait and not self.options.dry: self.manager.wait() def _add(self, location, path, start): try: self.manager.addLocation(location, path, start) except Exception as e: printException(e) def shutdown(self): log.info("Shutting down system.") self.manager.shutdown()
class TestAutofocus(object): def setup(self): self.manager = Manager(port=8000) # fake self.manager.addClass(FakeCamera, "fake") self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/fake"}) self.manager.addClass(FakeFocuser, "fake") self.manager.addClass(Focuser, "focus", {"driver": "/FakeFocuser/0"}) # real #self.manager.addClass(SBIG, "sbig", {"device": "USB"}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) #self.manager.addClass(OptecTCFS, "optec", {"device": "/dev/ttyS0"}) #self.manager.addClass(Focuser, "focus", {"driver": "/OptecTCFS/0"}) #self.manager.addClass(Autofocus, "autofocus", {"camera" : "200.131.64.203:7666/Camera/0", # "focuser": "******"}) self.manager.addClass(Autofocus, "autofocus", { "camera": "/Camera/0", "focuser": "******" }) @callback(self.manager) def exposeBeginClbk(exp_time): print time.time(), "Expose begin for %.3f s." % exp_time @callback(self.manager) def exposeCompleteClbk(): print time.time(), "Expose complete." @callback(self.manager) def readoutBeginClbk(frame): print time.time(), "Readout begin for %s." % frame @callback(self.manager) def readoutCompleteClbk(frame): print time.time(), "Readout complete for %s." % frame @callback(self.manager) def abortCompleteClbk(): print time.time(), "Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += abortCompleteClbk def teardown(self): self.manager.shutdown() del self.manager def test_focus(self): autofocus = self.manager.getProxy(Autofocus) best_focus = autofocus.focus(debug="/home/henrique/ph/basic-run")
def test_autolock(self): class Minimo(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) self.t0 = time.time() def doUnlocked(self): time.sleep(1) t = time.time() - self.t0 print "[unlocked] - %s - %.3f" % (threading.currentThread().getName(), t) return t @lock def doLocked(self): time.sleep(1) t = time.time() - self.t0 print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) return t # def doLockedWith (self): # with self: # time.sleep(1) # t = time.time()-self.t0 # print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) # return t def doTest(obj): """Rationale: We use 5 threads for each method (locked and unlocked). As unlocked methods isn't serialized, they runs 'at the same instant', while locked methods will be serialized and will run only when the previous one finishes. Each method simulate a load (sleep of 1s) and then returns the time of completion (with an arbitrary zero point to give small numbers). The deviation from the mean of unlocked methods termination times should be nearly zero, as every methods runs at the same time. For locked ones, the termination time will be a linear function with the slope equals to the load (sleep in this case), and as we use 10 threads for the locked case, the deviation will be ~ 2.872. We use a simple equals_eps to handle load factors that may influence scheduler performance and timmings. """ unlocked = [] locked = [] def getObj(o): """ Copy Proxy to share between threads. """ if isinstance(o, Proxy): return copy.copy(o) return o def runUnlocked(): unlocked.append(getObj(obj).doUnlocked()) def runLocked(): locked.append(getObj(obj).doLocked()) # def runLockedWith(): # locked.append(getObj(obj).doLockedWith()) threads = [] print for i in range(10): t1 = threading.Thread(target=runUnlocked, name="unlocked-%d" % i) t2 = threading.Thread(target=runLocked, name=" lock-%d" % i) # t3 = threading.Thread(target=runLockedWith, name=" with-%d" % i) t1.start() t2.start() # t3.start() threads += [t1, t2] for t in threads: t.join() unlocked_mean = sum(unlocked) / len(unlocked) locked_mean = sum(locked) / len(locked) unlocked_sigma = sqrt(sum([(unlocked_mean - u) ** 2 for u in unlocked]) / len(unlocked)) locked_sigma = sqrt(sum([(locked_mean - l) ** 2 for l in locked]) / len(locked)) def equals_eps(a, b, eps=1e-3): return abs(a - b) <= eps print "unlocked: mean: %.6f sigma: %.6f" % (unlocked_mean, unlocked_sigma) print "locked : mean: %.6f sigma: %.6f" % (locked_mean, locked_sigma) assert equals_eps(unlocked_sigma, 0.0, 0.5) assert equals_eps(locked_sigma, 2.875, 1.0) # direct metaobject m = Minimo() doTest(m) # proxy manager = Manager() manager.addClass(Minimo, "m", start=True) p = manager.getProxy(Minimo) doTest(p) manager.shutdown()
class TestEvents(object): def setup(self): self.manager = Manager() def teardown(self): self.manager.shutdown() del self.manager def test_publish(self): assert self.manager.addClass(Publisher, "p") != False assert self.manager.addClass(Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 1 assert p.getCounter() == 1 assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 # unsubscribe p.fooDone -= s.fooDoneClbk p.fooDone -= p.fooDoneClbk assert p.foo() == 42 time.sleep(0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 def test_performance(self): assert self.manager.addClass(Publisher, "p") != False assert self.manager.addClass(Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk for check in range(1): start = time.time() for i in range(100): p.foo() end = time.time() time.sleep(5) results = s.getResults() dt = [(t - t0) * 1000 for t0, t in results] mean = sum(dt) / len(dt) sigma = math.sqrt(sum([(t - mean)**2 for t in dt]) / len(dt)) print("#" * 25) print("# %d events (%.3f s)" % (len(dt), (end - start))) print("# %.2f events/s" % (len(dt) / (end - start))) print("# min : %-6.3f ms" % min(dt)) print("# max : %-6.3f ms" % max(dt)) print("# mean : %-6.3f ms" % mean) print("# sigma : %-6.3f ms" % sigma) print("#" * 25)
class TestDome(object): def setup(self): self.manager = Manager() self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyUSB0"}) #self.manager.addClass(Telescope, "tel", {"driver": "/Meade/meade"}) #self.manager.addClass(DomeLNA40cm, "lna40", {"device": "/dev/ttyS0"}) #self.manager.addClass(Dome, "dome", {"driver": "/DomeLNA40cm/0", # "telescope": "/Telescope/0"}) self.manager.addClass(FakeTelescope, "fake") self.manager.addClass(Telescope, "tel", {"driver": "/FakeTelescope/0"}) self.manager.addClass(FakeDome, "fake") self.manager.addClass(Dome, "dome", { "driver": "/FakeDome/0", "telescope": "/Telescope/0" }) @callback(self.manager) def slewBeginClbk(target): print print time.time(), "[dome] Slew begin. target=%s" % str(target) print @callback(self.manager) def slewCompleteClbk(position): print print time.time( ), "[dome] Slew complete. position=%s" % str(position) print @callback(self.manager) def abortCompleteClbk(position): print print time.time( ), "[dome] Abort slew at position=%s" % str(position) print @callback(self.manager) def slitOpenedClbk(position): print print time.time( ), "[dome] Slit opened with dome at at position=%s" % str(position) print @callback(self.manager) def slitClosedClbk(position): print print time.time( ), "[dome] Slit closed with dome at at position=%s" % str(position) print dome = self.manager.getProxy(Dome) dome.slewBegin += slewBeginClbk dome.slewComplete += slewCompleteClbk dome.abortComplete += abortCompleteClbk dome.slitOpened += slitOpenedClbk dome.slitClosed += slitClosedClbk def test_stress_dome_track(self): dome = self.manager.getProxy(Dome) tel = self.manager.getProxy(Telescope) dome.track() for i in range(25): ra = "%d %d 00" % (random.randint(0, 23), random.randint(0, 59)) dec = "%d %d 00" % (random.randint(-90, 0), random.randint(0, 59)) tel.slewToRaDec((ra, dec)) time.sleep(random.randint(0, 10)) dome.sync() def test_stress_dome_slew(self): dome = self.manager.getProxy(Dome) for i in range(25): az = random.randint(0, 359) dome.slewToAz(az) assert dome.getAz() == az def test_get_az(self): dome = self.manager.getProxy(Dome) assert dome.getAz() >= 0 def test_slew_to_az(self): dome = self.manager.getProxy(Dome) start = dome.getAz() delta = 20 dome.slewToAz(start + delta) assert dome.getAz() == (start + delta) def test_slit(self): dome = self.manager.getProxy(Dome) dome.openSlit() assert dome.isSlitOpen() == True dome.closeSlit() assert dome.isSlitOpen() == False
class TestEvents (object): def setup (self): self.manager = Manager() def teardown (self): self.manager.shutdown() del self.manager def test_publish (self): assert self.manager.addClass (Publisher, "p") != False assert self.manager.addClass (Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 1 assert p.getCounter() == 1 assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 # unsubscribe p.fooDone -= s.fooDoneClbk p.fooDone -= p.fooDoneClbk assert p.foo() == 42 time.sleep (0.5) # delay to get messages delivered assert s.getCounter() == 2 assert p.getCounter() == 2 def test_performance (self): assert self.manager.addClass (Publisher, "p") != False assert self.manager.addClass (Subscriber, "s") != False p = self.manager.getProxy("/Publisher/p") assert isinstance(p, Proxy) s = self.manager.getProxy("/Subscriber/s") assert isinstance(s, Proxy) p.fooDone += s.fooDoneClbk for check in range (1): start = time.time() for i in range (100): p.foo() end = time.time() time.sleep (5) results = s.getResults() dt = [ (t - t0)*1000 for t0, t in results] mean = sum (dt) / len(dt) sigma = math.sqrt(sum([ (t - mean)**2 for t in dt]) / len(dt)) print "#"*25 print "# %d events (%.3f s)" % (len(dt), (end-start)) print "# %.2f events/s" % (len(dt)/(end-start)) print "# min : %-6.3f ms" % min(dt) print "# max : %-6.3f ms" % max(dt) print "# mean : %-6.3f ms" % mean print "# sigma : %-6.3f ms" % sigma print "#"*25
class TestManager (object): def setup (self): self.manager = Manager() def teardown (self): self.manager.shutdown() del self.manager def test_add_start (self): # add by class assert self.manager.addClass(Simple, "simple", start=True) # already started assert_raises(InvalidLocationException, self.manager.addClass, Simple, "simple") assert_raises(NotValidChimeraObjectException, self.manager.addClass, NotValid, "nonono") assert_raises(InvalidLocationException, self.manager.addClass, Simple, "") # by location assert self.manager.addLocation('/ManagerHelper/h', path=[os.path.dirname(__file__)]) assert_raises(ClassLoaderException, self.manager.addLocation, '/What/h') assert_raises(InvalidLocationException, self.manager.addLocation, 'foo') # start with error #assert self.manager.addLocation('/ManagerHelperWithError/h', start=False) #assert_raises(ChimeraObjectException, self.manager.start, '/ManagerHelperWithError/h') # start who? assert_raises(InvalidLocationException, self.manager.start, "/Who/am/I") # exceptional cases # __init__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithInitException/h", [os.path.dirname(__file__)]) # __start__ assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithStartException/h", [os.path.dirname(__file__)]) # __main__ #assert_raises(ChimeraObjectException, self.manager.addLocation, "/ManagerHelperWithMainException/h") def test_remove_stop (self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.remove, 'Simple/what') assert_raises(InvalidLocationException, self.manager.remove, 'foo') # stop who? assert_raises(InvalidLocationException, self.manager.stop, 'foo') # ok assert self.manager.remove('/Simple/simple') == True # __stop__ error assert self.manager.addLocation("/ManagerHelperWithStopException/h", path=[os.path.dirname(__file__)]) assert_raises(ChimeraObjectException, self.manager.stop, '/ManagerHelperWithStopException/h') # another path to stop assert_raises(ChimeraObjectException, self.manager.remove, '/ManagerHelperWithStopException/h') # by index assert self.manager.addClass(Simple, "simple") assert self.manager.remove('/Simple/0') == True def test_proxy (self): assert self.manager.addClass(Simple, "simple") # who? assert_raises(InvalidLocationException, self.manager.getProxy, 'wrong') assert_raises(InvalidLocationException, self.manager.getProxy, 'Simple/simple') # ok assert self.manager.getProxy ('/Simple/simple') assert self.manager.getProxy ('/Simple/0') # calling p = self.manager.getProxy ('/Simple/0') assert isinstance(p, Proxy) assert p.answer() == 42 # oops assert_raises (AttributeError, p.wrong) def test_manager (self): assert self.manager.addClass(Simple, "simple") p = self.manager.getProxy(Simple) assert p m = p.getManager() assert m.GUID() == self.manager.GUID()
def test_autolock(self): class Minimo(ChimeraObject): def __init__(self): ChimeraObject.__init__(self) self.t0 = time.time() def doUnlocked(self): time.sleep(1) t = time.time() - self.t0 print("[unlocked] - %s - %.3f" % (threading.currentThread().getName(), t)) return t @lock def doLocked(self): time.sleep(1) t = time.time() - self.t0 print("[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t)) return t # def doLockedWith (self): # with self: # time.sleep(1) # t = time.time()-self.t0 # print "[ locked ] - %s - %.3f" % (threading.currentThread().getName(), t) # return t def doTest(obj): """Rationale: We use 5 threads for each method (locked and unlocked). As unlocked methods isn't serialized, they runs 'at the same instant', while locked methods will be serialized and will run only when the previous one finishes. Each method simulate a load (sleep of 1s) and then returns the time of completion (with an arbitrary zero point to give small numbers). The deviation from the mean of unlocked methods termination times should be nearly zero, as every methods runs at the same time. For locked ones, the termination time will be a linear function with the slope equals to the load (sleep in this case), and as we use 10 threads for the locked case, the deviation will be ~ 2.872. We use a simple equals_eps to handle load factors that may influence scheduler performance and timmings. """ unlocked = [] locked = [] def getObj(o): """ Copy Proxy to share between threads. """ if isinstance(o, Proxy): return copy.copy(o) return o def runUnlocked(): unlocked.append(getObj(obj).doUnlocked()) def runLocked(): locked.append(getObj(obj).doLocked()) # def runLockedWith(): # locked.append(getObj(obj).doLockedWith()) threads = [] print() for i in range(10): t1 = threading.Thread(target=runUnlocked, name="unlocked-%d" % i) t2 = threading.Thread(target=runLocked, name=" lock-%d" % i) #t3 = threading.Thread(target=runLockedWith, name=" with-%d" % i) t1.start() t2.start() #t3.start() threads += [t1, t2] for t in threads: t.join() unlocked_mean = sum(unlocked) / len(unlocked) locked_mean = sum(locked) / len(locked) unlocked_sigma = sqrt( sum([(unlocked_mean - u)**2 for u in unlocked]) / len(unlocked)) locked_sigma = sqrt( sum([(locked_mean - l)**2 for l in locked]) / len(locked)) def equals_eps(a, b, eps=1e-3): return abs(a - b) <= eps print("unlocked: mean: %.6f sigma: %.6f" % (unlocked_mean, unlocked_sigma)) print("locked : mean: %.6f sigma: %.6f" % (locked_mean, locked_sigma)) assert equals_eps(unlocked_sigma, 0.0, 0.5) assert equals_eps(locked_sigma, 2.875, 1.0) # direct metaobject m = Minimo() doTest(m) # proxy manager = Manager() manager.addClass(Minimo, "m", start=True) p = manager.getProxy(Minimo) doTest(p) manager.shutdown()
class TestAutoMap(object): def setup(self): self.manager = Manager(port=8000) self.manager.addClass( Site, "lna", { "name": "LNA", "latitude": "-22 32 03", "longitude": "-45 34 57", "altitude": "1896", "utc_offset": "-3" }) # fake self.manager.addClass(FakeTelescope, "fake", {"skip_init": False}) self.manager.addClass(Telescope, "fake", {"driver": "/FakeTelescope/0"}) self.manager.addClass(FakeCamera, "fake") self.manager.addClass(Camera, "cam", {"driver": "/FakeCamera/0"}) self.manager.addClass(FakeDome, "fake") self.manager.addClass(Dome, "dome", { "driver": "/FakeDome/0", "mode": "Track", "telescope": "/Telescope/0" }) # real #self.manager.addClass(Meade, "meade", {"device": "/dev/ttyS6", "skip_init": False}) #self.manager.addClass(Telescope, "meade", {"driver": "/Meade/meade"}) #self.manager.addClass(SBIG, "sbig", {"device": "USB"}) #self.manager.addClass(Camera, "cam", {"driver": "/SBIG/0"}) #self.manager.addClass(DomeLNA40cm, "lna40", {"device": "/dev/ttyS0"}) #self.manager.addClass(Dome, "dome", {"driver": "/DomeLNA40cm/0", # "mode": "Track", # "telescope": "/Telescope/0"}) @callback(self.manager) def exposeBeginClbk(exp_time): print time.time(), "[cam] Expose begin for %.3f s." % exp_time @callback(self.manager) def exposeCompleteClbk(): print time.time(), "[cam] Expose complete." @callback(self.manager) def readoutBeginClbk(frame): print time.time(), "[cam] Readout begin for %s." % frame @callback(self.manager) def readoutCompleteClbk(frame): print time.time(), "[cam] Readout complete for %s." % frame @callback(self.manager) def camAbortCompleteClbk(): print time.time(), "[cam] Abort complete." cam = self.manager.getProxy(Camera) cam.exposeBegin += exposeBeginClbk cam.exposeComplete += exposeCompleteClbk cam.readoutBegin += readoutBeginClbk cam.readoutComplete += readoutCompleteClbk cam.abortComplete += camAbortCompleteClbk @callback(self.manager) def slewBeginClbk(target): print time.time(), "[tel] Slew begin. target=%s" % str(target) @callback(self.manager) def slewCompleteClbk(position): print time.time( ), "[tel] Slew complete. position=%s" % str(position) @callback(self.manager) def telAbortCompleteClbk(position): print time.time( ), "[tel] Abort complete. position=%s" % str(position) self.tel = self.manager.getProxy(Telescope) self.tel.slewBegin += slewBeginClbk self.tel.slewComplete += slewCompleteClbk self.tel.abortComplete += telAbortCompleteClbk @callback(self.manager) def domeSlewBeginClbk(target): print print time.time(), "[dome] Slew begin. target=%s" % str(target) @callback(self.manager) def domeSlewCompleteClbk(position): print time.time( ), "[dome] Slew complete. position=%s" % str(position) @callback(self.manager) def domeAbortCompleteClbk(position): print time.time( ), "[dome] Abort slew at position=%s" % str(position) dome = self.manager.getProxy(Dome) dome.slewBegin += domeSlewBeginClbk dome.slewComplete += domeSlewCompleteClbk dome.abortComplete += domeAbortCompleteClbk def teardown(self): self.manager.shutdown() del self.manager def test_map(self): tel = self.manager.getProxy(Telescope) cam = self.manager.getProxy(Camera) dome = self.manager.getProxy(Dome) site = self.manager.getProxy(Site)
from chimera.core.proxy import Proxy from chimera.core.manager import Manager # our example object from minimo import Minimo # create a new manager (default host (localhost), defaulr port 7666 or try next 4 from default) manager = Manager() # # 1. Adding objects and getting a proxy # # just add a min Minimoescope class (returns a valid proxy) minimo = manager.addClass(Minimo, "min", start=True) # synchronous "doFoo" minimo.doFoo ("ra dec") # # 2. There are other ways to get proxy # # from manager (this ensure that the object exists on the manager, see ChimeraProxy below) minimo = manager.getProxy ("/Minimo/min") minimo.doFoo ("ra dec") # if you don't know the name of the instance no problem, pass an index starting with 0 minimo = manager.getProxy ("/Minimo/0") minimo.doFoo ("ra dec")