コード例 #1
0
ファイル: test_pocs.py プロジェクト: panoptes/POCS
def test_run_power_down_interrupt(observatory):
    def start_pocs():
        pocs = POCS(observatory, messaging=True)
        pocs.initialize()
        pocs.observatory.scheduler.fields_list = [{'name': 'KIC 8462852',
                                                   'position': '20h06m15.4536s +44d27m24.75s',
                                                   'priority': '100',
                                                   'exp_time': 2,
                                                   'min_nexp': 1,
                                                   'exp_set_size': 1,
                                                   }]
        pocs.logger.info('Starting observatory run')
        pocs.run()

    pocs_process = Process(target=start_pocs)
    pocs_process.start()

    pub = PanMessaging.create_publisher(6500)
    sub = PanMessaging.create_subscriber(6511)

    while True:
        msg_type, msg_obj = sub.receive_message()
        if msg_type == 'STATUS':
            current_state = msg_obj.get('state', {})
            if current_state == 'pointing':
                pub.send_message('POCS-CMD', 'shutdown')
                break

    pocs_process.join()
    assert pocs_process.is_alive() is False
コード例 #2
0
ファイル: test_pocs.py プロジェクト: panoptes/POCS
def test_run_wait_until_safe(db, observatory):
    os.environ['POCSTIME'] = '2016-08-13 23:00:00'

    def start_pocs():
        observatory.config['simulator'] = ['camera', 'mount', 'night']

        pocs = POCS(observatory,
                    messaging=True, safe_delay=15)
        pocs.db.current.remove({})
        pocs.initialize()
        pocs.logger.info('Starting observatory run')
        assert pocs.is_weather_safe() is False
        pocs.send_message('RUNNING')
        pocs.run(run_once=True, exit_when_done=True)
        assert pocs.is_weather_safe() is True

    pub = PanMessaging.create_publisher(6500)
    sub = PanMessaging.create_subscriber(6511)

    pocs_process = Process(target=start_pocs)
    pocs_process.start()

    # Wait for the running message
    while True:
        msg_type, msg_obj = sub.receive_message()
        if msg_obj is None:
            time.sleep(2)
            continue

        if msg_obj.get('message', '') == 'RUNNING':
            time.sleep(2)
            # Insert a dummy weather record to break wait
            db.insert_current('weather', {'safe': True})

        if msg_type == 'STATUS':
            current_state = msg_obj.get('state', {})
            if current_state == 'pointing':
                pub.send_message('POCS-CMD', 'shutdown')
                break

        time.sleep(0.5)

    pocs_process.join()
    assert pocs_process.is_alive() is False
コード例 #3
0
ファイル: follow_sensor.py プロジェクト: panoptes/POCS
def main(sensor=None, watch_key=None, channel=None, port=6511, format=False, **kwargs):
    sub = PanMessaging.create_subscriber(port)

    i = 0
    while True:
        data = None
        try:
            msg_channel, msg_data = sub.receive_message()
        except KeyError:
            continue
        else:
            if msg_channel != channel:
                continue

            try:
                data = msg_data['data'][sensor]
            except KeyError:
                continue

            if watch_key in data:
                data = data[watch_key]

        if data is not None:
            if format and hasattr(data, 'items'):
                for k, v in data.items():
                    try:
                        if i % 15 == 0:
                            print(" {:17s} |".format(k), end='')
                        else:
                            print("{:18.02f} |".format(v), end='')
                    except ValueError:
                        print(k, ': ', v)
                    except TypeError:
                        print(k, ': ', v)

                print("")
            else:
                print(data)

        i += 1
コード例 #4
0
ファイル: core.py プロジェクト: panoptes/POCS
        def check_message_loop(cmd_queue):
            cmd_subscriber = PanMessaging.create_subscriber(cmd_port + 1)

            poller = zmq.Poller()
            poller.register(cmd_subscriber.socket, zmq.POLLIN)

            try:
                while self._do_cmd_check:
                    # Poll for messages
                    sockets = dict(poller.poll(500))  # 500 ms timeout

                    if cmd_subscriber.socket in sockets and \
                            sockets[cmd_subscriber.socket] == zmq.POLLIN:

                        msg_type, msg_obj = cmd_subscriber.receive_message(flags=zmq.NOBLOCK)

                        # Put the message in a queue to be processed
                        if msg_type == 'POCS-CMD':
                            cmd_queue.put(msg_obj)

                    time.sleep(1)
            except KeyboardInterrupt:
                pass
コード例 #5
0
ファイル: core.py プロジェクト: zacharyt20/POCS
 def create_forwarder(port):
     try:
         PanMessaging.create_forwarder(port, port + 1)
     except Exception:
         pass
コード例 #6
0
ファイル: core.py プロジェクト: zacharyt20/POCS
    def _setup_messaging(self):

        cmd_port = self.config['messaging']['cmd_port']
        msg_port = self.config['messaging']['msg_port']

        def create_forwarder(port):
            try:
                PanMessaging.create_forwarder(port, port + 1)
            except Exception:
                pass

        cmd_forwarder_process = multiprocessing.Process(
            target=create_forwarder, args=(
                cmd_port,), name='CmdForwarder')
        cmd_forwarder_process.start()

        msg_forwarder_process = multiprocessing.Process(
            target=create_forwarder, args=(
                msg_port,), name='MsgForwarder')
        msg_forwarder_process.start()

        self._do_cmd_check = True
        self._cmd_queue = multiprocessing.Queue()
        self._sched_queue = multiprocessing.Queue()

        self._msg_publisher = PanMessaging.create_publisher(msg_port)

        def check_message_loop(cmd_queue):
            cmd_subscriber = PanMessaging.create_subscriber(cmd_port + 1)

            poller = zmq.Poller()
            poller.register(cmd_subscriber.socket, zmq.POLLIN)

            try:
                while self._do_cmd_check:
                    # Poll for messages
                    sockets = dict(poller.poll(500))  # 500 ms timeout

                    if cmd_subscriber.socket in sockets and \
                            sockets[cmd_subscriber.socket] == zmq.POLLIN:

                        msg_type, msg_obj = cmd_subscriber.receive_message(flags=zmq.NOBLOCK)

                        # Put the message in a queue to be processed
                        if msg_type == 'POCS-CMD':
                            cmd_queue.put(msg_obj)

                    time.sleep(1)
            except KeyboardInterrupt:
                pass

        self.logger.debug('Starting command message loop')
        check_messages_process = multiprocessing.Process(
            target=check_message_loop, args=(self._cmd_queue,))
        check_messages_process.name = 'MessageCheckLoop'
        check_messages_process.start()
        self.logger.debug('Command message subscriber set up on port {}'.format(cmd_port))

        self._processes = {
            'check_messages': check_messages_process,
            'cmd_forwarder': cmd_forwarder_process,
            'msg_forwarder': msg_forwarder_process,
        }
コード例 #7
0
    def send_message(self, msg, channel='environment'):
        if self.messaging is None:
            self.messaging = PanMessaging.create_publisher(6510)

        self.messaging.send_message(channel, msg)
コード例 #8
0
ファイル: start_messenger.py プロジェクト: panoptes/POCS
#!/usr/bin/env python

from pocs.utils.messaging import PanMessaging

from_port = 6510
to_port = 6511

print("Starting message forwarding, hit Ctrl-c to stop")
print("Port: {} -> {}".format(from_port, to_port))

try:
    f = PanMessaging.create_forwarder(from_port, to_port)
except KeyboardInterrupt:
    print("Shutting down and exiting...")
コード例 #9
0
def pub():
    messaging = PanMessaging.create_publisher(12345, bind=False, connect=True)
    time.sleep(2)  # Wait for publisher to start up
    yield messaging
    messaging.close()
コード例 #10
0
def sub():
    messaging = PanMessaging.create_subscriber(54321)

    yield messaging
    messaging.close()
コード例 #11
0
 def start_forwarder():
     PanMessaging.create_forwarder(12345, 54321)
コード例 #12
0
ファイル: weather.py プロジェクト: panoptes/POCS
    def send_message(self, msg, channel='weather'):
        if self.messaging is None:
            self.messaging = PanMessaging.create_publisher(6510)

        self.messaging.send_message(channel, msg)