Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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()
Пример #5
0
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()
Пример #6
0
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()
Пример #7
0
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()
Пример #8
0
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()
Пример #9
0
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()
Пример #10
0
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()
Пример #11
0
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()
Пример #12
0
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()
Пример #13
0
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()
Пример #14
0
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()
Пример #15
0
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()
Пример #16
0
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()
Пример #17
0
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()
Пример #18
0
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()
Пример #19
0
    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")
Пример #20
0
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()
Пример #21
0
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()
Пример #22
0
    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")
Пример #23
0
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)
Пример #24
0
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()
Пример #25
0
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)
Пример #26
0
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)
Пример #27
0
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)
Пример #28
0
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)
Пример #29
0
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)
Пример #30
0
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
Пример #31
0
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()
Пример #32
0
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()

Пример #33
0
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")
Пример #34
0
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()
Пример #35
0
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")
Пример #36
0
    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()
Пример #37
0
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)
Пример #38
0
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
Пример #39
0
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
Пример #40
0
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()
Пример #41
0
    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()
Пример #42
0
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)
Пример #43
0
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")