Пример #1
0
    def update_boot_status(self) -> (float, int):
        '''
        Run on boot. Updates boot count and uptime, and returns
        the current boot count and previous uptime.
        '''
        Msg(RequestType.COMMAND_LIST,
            [StorageCmd.STORE, 'LAUNCH', True]).send(SOCKET_PATH,
                                                     STORAGE_SOCKET_PATH)

        # update boot count
        boot_count = Msg(RequestType.COMMAND_LIST,
                         [StorageCmd.LOAD, 'BOOT_COUNT']).send_and_recv(
                             SOCKET_PATH, STORAGE_SOCKET_PATH).data
        # The first time this won't be in the DB
        boot_count = boot_count or 0
        boot_count += 1
        Msg(RequestType.COMMAND_LIST,
            [StorageCmd.STORE, 'BOOT_COUNT', boot_count]).send(
                SOCKET_PATH, STORAGE_SOCKET_PATH)

        uptime = Msg(RequestType.COMMAND_LIST,
                     [StorageCmd.LOAD, 'UPTIME']).send_and_recv(
                         SOCKET_PATH, STORAGE_SOCKET_PATH).data

        Msg(RequestType.COMMAND_LIST,
            [StorageCmd.STORE, 'UPTIME', 0]).send(SOCKET_PATH,
                                                  STORAGE_SOCKET_PATH)

        return uptime, boot_count
Пример #2
0
    def start(self):
        time.sleep(3)
        low_power = Msg(RequestType.COMMAND, PowerCmd.LOW_POWER).send_and_recv(
            SOCKET_PATH, POWER_SOCKET_PATH).data

        try:
            ground_cmd = Msg(RequestType.COMMAND,
                             CommsCmd.RECV_TLM_PKT).send_and_recv(
                                 SOCKET_PATH, COMMS_SOCKET_PATH, timeout=5)
        except:
            # No data from ground
            pass

        if not low_power:

            send_beacon = Msg(RequestType.COMMAND,
                              CommsCmd.SEND_TLM_PKT).send_and_recv(
                                  SOCKET_PATH, COMMS_SOCKET_PATH).data

            # We only want to deploy once
            did_deploy = Msg(RequestType.COMMAND_LIST,
                             [StorageCmd.LOAD, 'DEPLOYED']).send_and_recv(
                                 SOCKET_PATH, STORAGE_SOCKET_PATH).data

            if not did_deploy:
                from pfl_modes.deployment import Deployment
                return Deployment

        return Safe
Пример #3
0
    def handle(self):
        msg = pickle.loads(self.request.recv(1024))
        if self.handle_default(msg):
            return

        if msg.data == CommsCmd.EXTEND_ANT:
            result = self.deploy_antenna()
            logging.info('antenna deployment result: {}'.format(result))
            self.request.sendall(pickle.dumps(Msg(RequestType.DATA, result)), )
        elif msg.data == CommsCmd.SEND_TLM_PKT:
            result = self.beacon()
            logging.info('Beacon result: {}'.format(result))
            self.request.sendall(pickle.dumps(Msg(RequestType.DATA, result)))
Пример #4
0
 def handle(self):
     msg = pickle.loads(self.request.recv(1024))
     if self.handle_default(msg):
         return
     if msg.data[0] == ADCSCmd.IS_TUMBLING:
         result = self.is_tumbling()
         self.request.sendall(pickle.dumps(Msg(RequestType.DATA, result)))
     elif msg.data[0] == ADCSCmd.DETUMBLE:
         result = self.detumble()
         self.request.sendall(pickle.dumps(Msg(RequestType.DATA, result)))
     elif msg.data[0] == ADCSCmd.POINT:
         result = self.point(msg.data[1])
         self.request.sendall(pickle.dumps(Msg(RequestType.DATA, result)))
Пример #5
0
    def start(self):
        # wait 15 mins
        DEPLOY_WAIT = 1  # will actually be 15 mins
        logging.info(
            'Waiting {} secs to deploy antenna...'.format(DEPLOY_WAIT))
        time.sleep(DEPLOY_WAIT)
        # deploy antenna
        # check IMU for spin decrease
        self.deploy_antenna()
        # update launch status
        uptime, boot_count = self.update_boot_status()
        logging.info('Boot count {}, previous uptime {}'.format(
            boot_count, uptime))

        # wait 30 mins
        BEACON_WAIT = 1  # this will be 30 mins
        logging.info('Waiting {} secs to begin beacon...'.format(BEACON_WAIT))
        self.beacon()

        # wait for ground signal

        # Write status successful deployment

        Msg(RequestType.COMMAND_LIST,
            [StorageCmd.STORE, 'DEPLOYED', 1]).send(SOCKET_PATH,
                                                    STORAGE_SOCKET_PATH)

        from pfl_modes.detumble import Detumble
        return Detumble
Пример #6
0
 def handle(self):
     msg = pickle.loads(self.request.recv(1024))
     logging.debug('{} received {} from {}'.format(SOCKET_PATH,
                                                   msg.req_type,
                                                   self.client_address))
     if msg.req_type == RequestType.RESTART:
         # Kill ourselves and let the watchdog restart us
         raise Exception('Power going down for restart')
     elif msg.req_type == RequestType.PING:
         self.request.sendall(
             pickle.dumps(Msg(RequestType.PING_RESP, None)), )
     elif msg.req_type == RequestType.COMMAND:
         print('Executing command: {}'.format(msg.data))
         if msg.data == PowerCmd.LOW_POWER:
             result = self.is_low_power()
             self.request.sendall(
                 pickle.dumps(Msg(RequestType.DATA, result)))
Пример #7
0
def server_ping(server):
    with FastSocket(SOCKET_PATH, server.SOCKET_PATH, timeout=60) as sock:
        sock.sendall(pickle.dumps(Msg(RequestType.PING, None)))

        try:
            sock.recv(1024)
            return True
        except OSError:
            return False
Пример #8
0
    def start(self):
        # Check IMU rates
        # if low IMU
            # finish detumble 
        # if power:
            # power on mag coils
            # check receiver
            # if valid ground input
                # finish detumble
        # if timed out:
            # finish detumble
        # check_receiver
            # record telem
            # beacon

        is_tumbling = Msg(
            RequestType.COMMAND, 
            [ADCSCmd.IS_TUMBLING]
        ).send_and_recv(SOCKET_PATH, ADCS_SOCKET_PATH)

        if not is_tumbling:
            self.finish_detumble()

        low_power = Msg(
            RequestType.COMMAND,
            PowerCmd.LOW_POWER
        ).send_and_recv(SOCKET_PATH, POWER_SOCKET_PATH)

        if not low_power:
            detumble = Msg(
                RequestType.COMMAND,
                [ADCSCmd.COILS_ON]
            ).send_and_recv(SOCKET_PATH, ADCS_SOCKET_PATH)

            send_beacon = Msg(
                RequestType.COMMAND,
                [CommsCmd.SEND_TLM_PKT]
            ).send_and_recv(SOCKET_PATH, ADCS_SOCKET_PATH)

        from pfl_modes.safe_mode import Safe
        return Safe
Пример #9
0
    def handle(self):
        msg = pickle.loads(self.request.recv(MAX_FILE_SIZE))
        if self.handle_default(msg):
            return True

        if msg.data[0] == StorageCmd.STORE:
            with shelve.open(DB_PATH, 'c') as db:
                # Make sure we don't have None as saved data,
                # we should explicitly write zero instead
                assert (msg.data[1] and msg.data[2] != None)
                db[msg.data[1]] = msg.data[2]

        elif msg.data[0] == StorageCmd.LOAD:
            with shelve.open(DB_PATH, 'r') as db:
                try:
                    msg = db[msg.data[1]]
                except KeyError:
                    logging.warn('No entry {} in storage'.format(msg.data[1]))
                    msg = None
                self.request.sendall(pickle.dumps(Msg(RequestType.DATA, msg)))
Пример #10
0
 def handle_default(self, msg):
     '''
     Does default handling, returns true if
     msg was handled
     '''
     logging.debug('{} received {} from {}'.format(
         self.server.server_address, msg.req_type, self.client_address))
     if msg.req_type == RequestType.RESTART:
         # Kill ourselves and let the watchdog restart us
         logging.error('{} going down for restart'.format(self.SOCKET_PATH))
         self.server._BaseServer__shutdown_request = True
         return True
     elif msg.req_type == RequestType.PING:
         self.request.sendall(
             pickle.dumps(Msg(RequestType.PING_RESP, None)), )
         return True
     elif msg.req_type == RequestType.COMMAND:
         print('Executing command: {}'.format(msg.data))
         return False
     elif msg.req_type == RequestType.COMMAND_LIST:
         print('Executing command: {} with args {}'.format(
             msg.data[0], msg.data[1:]))
         return False
Пример #11
0
 def beacon(self) -> bool:
     return Msg(
         RequestType.COMMAND,
         CommsCmd.SEND_TLM_PKT,
     ).send_and_recv(SOCKET_PATH, COMMS_SOCKET_PATH, timeout=60 * 5)
Пример #12
0
 def deploy_antenna(self) -> bool:
     return Msg(
         RequestType.COMMAND,
         CommsCmd.EXTEND_ANT,
     ).send_and_recv(SOCKET_PATH, COMMS_SOCKET_PATH, timeout=60 * 5)