def _GetParam(self, line):  # pylint: disable=invalid-name
        """Sets a parameter for a specified inverter."""
        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use set_targets.')

        targets, args = cmd_client.SelectArgs(line.split(),
                                              self._inverters_selected,
                                              require_some=True,
                                              select_all=True)

        args, param = cmd_client.SelectArgs(args,
                                            INVERTER_PARAMS.keys(),
                                            require_some=True,
                                            select_all=False)

        param = list(args)[0]
        modbus_param = INVERTER_PARAMS[param]
        failed_targets = []

        for target in sorted(targets):
            print 'Getting %s from %s.' % (param, target)
            success = self._inverter_list[InverterNameToId(
                target)].TryGetParam(modbus_param)
            if not success:
                failed_targets.append(target)
        if failed_targets:
            raise GroundPowerClientError('Failed to get value %s from %s.' %
                                         (param, failed_targets))
Beispiel #2
0
    def _GetParam(self, line, message):
        targets, args = cmd_client.SelectArgs(line.split(),
                                              LIGHTS,
                                              require_some=True,
                                              select_all=True)
        param, _ = cmd_client.SelectArgs(args,
                                         LIGHT_PARAMS.keys(),
                                         require_one=True,
                                         select_all=False)

        message.id = LIGHT_PARAMS[param]

        failed_targets = []

        for target in targets:
            print 'Getting %s from %s...' % (param, target)
            success = True

            aio_target = AioNodeNameFromLightNickname(target)
            message.target = aio_node_helper.Value(aio_target)
            success = self._TryGetParam(message,
                                        'kMessageTypeFaaLightGetParam', param,
                                        target, aio_target)

            if not success:
                failed_targets.append(target)

        if failed_targets:
            raise LightClientError('Failed to get %s from %s.' %
                                   (param, failed_targets))
Beispiel #3
0
    def do_set_param(self, line):  # pylint: disable=invalid-name
        """Sets a param for a specified servo, e.g. "set_param R1 XYZ 150"."""
        self._CheckState([
            actuator_types.kActuatorStateInit,
            actuator_types.kActuatorStateError
        ])
        servos, args = cmd_client.SelectArgs(line.split(),
                                             SERVOS,
                                             require_some=True,
                                             select_all=True)
        param, args = cmd_client.SelectArgs(args,
                                            SERVO_PARAMS,
                                            require_one=True,
                                            select_all=False)
        try:
            value = int(args[0], 0)
        except ValueError:
            raise ServoClientError('Invalid value: "%s".' % args[0])

        message = pack_avionics_messages.ServoSetParamMessage()
        message.param = r22_param_helper.Value(param)
        message.value = value

        for target in servos:
            print 'Setting %s to %g on %s...' % (param, value, target)
            message.selected_servos = ServosAsBits([target])
            ack_received = False
            for _ in xrange(self._NUM_RETRIES):
                self._set_param_aio_client.Send(message,
                                                'kMessageTypeServoSetParam',
                                                OPERATOR)
                try:
                    _, header, ack = self._ack_param_aio_client.Recv()
                    if (header.source == aio_node_helper.Value(
                            AioNodeNameFromServoNickname(target))
                            and header.type
                            == message_type.kMessageTypeServoAckParam
                            and ack.param == message.param):
                        if ack.value == message.value:
                            ack_received = True
                            print '%s %s: %g' % (target, param, ack.value)
                            break
                        else:
                            print 'Got response with incorrect value.'
                except socket.timeout:
                    pass

            if not ack_received:
                raise ServoClientError('Failed to get %s from %s; giving up.' %
                                       (param, target))
    def do_stop(self, line):  # pylint: disable=invalid-name
        """Stops specified inverters, e.g. "stop Inv1 Inv2 Inv3"."""
        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use "set_targets".')

        targets, _ = cmd_client.SelectArgs(line.split(),
                                           self._inverters_selected,
                                           require_some=False,
                                           require_all=True,
                                           select_all=True,
                                           require_one=False)

        if not targets:
            raise GroundPowerClientError('No valid arguments selected.')

        if sorted(targets) == sorted(self._inverters_selected):
            for target in self._inverter_stop_sequence:
                try:
                    self._inverter_list[InverterNameToId(target)].SetState(
                        inverter_types.kInverterStatusStopped)
                except GroundPowerClientError:
                    print 'Failed to stop %s.' % target
        else:
            target_order = line.split()
            for target in target_order:
                try:
                    self._inverter_list[InverterNameToId(target)].SetState(
                        inverter_types.kInverterStatusStopped)
                except GroundPowerClientError:
                    print 'Failed to stop %s.' % target
    def do_start(self, line):  # pylint: disable=invalid-name
        """Starts specified inverters, e.g start Inv1 Inv2 Inv3."""
        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use "set_targets".')

        targets, _ = cmd_client.SelectArgs(line.split(),
                                           self._inverters_selected,
                                           require_some=False,
                                           require_all=True,
                                           select_all=True,
                                           require_one=False)

        if not targets:
            raise GroundPowerClientError('No valid arguments selected.')

        if sorted(targets) == sorted(self._inverters_selected):
            for target in self._inverter_start_sequence:
                self._inverter_list[InverterNameToId(target)].SetState(
                    inverter_types.kInverterStatusRunning)
        else:
            target_order = line.split()
            for target in target_order:
                self._inverter_list[InverterNameToId(target)].SetState(
                    inverter_types.kInverterStatusRunning)
Beispiel #6
0
    def do_get_param(self, line):  # pylint: disable=invalid-name
        """Gets a param value for a servo, e.g. "get_param R1 VelocityVp"."""
        s, args = cmd_client.SelectArgs(line.split(),
                                        SERVOS,
                                        require_some=True,
                                        select_all=True)
        param, _ = cmd_client.SelectArgs(args,
                                         SERVO_PARAMS,
                                         require_one=True,
                                         select_all=False)

        msg = pack_avionics_messages.ServoGetParamMessage()
        msg.param = r22_param_helper.Value(param)

        for target in s:
            print 'Getting %s from %s...' % (param, target)
            msg.selected_servos = ServosAsBits([target])
            success = False
            for _ in xrange(self._NUM_RETRIES):
                self._get_param_aio_client.Send(msg,
                                                'kMessageTypeServoGetParam',
                                                OPERATOR)
                try:
                    _, header, ack = self._ack_param_aio_client.Recv()
                    if (header.source == aio_node_helper.Value(
                            AioNodeNameFromServoNickname(target))
                            and header.type
                            == message_type.kMessageTypeServoAckParam
                            and ack.param == msg.param):
                        print '%s %s: 0x%X' % (target, param, ack.value)
                        success = True
                        break
                except socket.timeout:
                    pass

            if not success:
                raise ServoClientError('Failed to get %s from %s; giving up.' %
                                       (param, target))
Beispiel #7
0
    def _SetParam(self, line, message):  # pylint: disable=invalid-name
        """Sets a param for a specified light node."""
        targets, args = cmd_client.SelectArgs(line.split(),
                                              LIGHTS,
                                              require_some=True,
                                              select_all=True)
        param, args = cmd_client.SelectArgs(args,
                                            LIGHT_PARAMS.keys(),
                                            require_one=True,
                                            select_all=False)

        try:
            value = float(args[0])
        except ValueError:
            raise LightClientError('Invalid value: "%s".' % args[0])

        message.id = LIGHT_PARAMS[param]
        message.value = value

        failed_targets = []

        for target in targets:
            print 'Setting %s to %g on %s.' % (param, value, target)

            aio_target = AioNodeNameFromLightNickname(target)
            message.target = aio_node_helper.Value(aio_target)
            success = self._TrySetParam(message,
                                        'kMessageTypeFaaLightSetParam', param,
                                        target, aio_target)

            if not success:
                failed_targets.append(target)

        if failed_targets:
            raise LightClientError('Failed to verify %s from %s.' %
                                   (param, failed_targets))
    def _SetTargets(self, line, **kwargs):
        """Sets inverter targets.

    Args:
      line: User supplied arguments specifying target inverters.
      **kwargs: set_defaults present if defaults should be used.

    Raises:
      GroundPowerClientError: An invalid set of targets was supplied.
    """
        if not kwargs['set_defaults']:
            if self._inverters_selected:
                self._ClearTargets()

            targets_selected, _ = cmd_client.SelectArgs(line.split(),
                                                        DEFAULTS['targets'],
                                                        require_some=True,
                                                        require_all=True,
                                                        select_all=True,
                                                        require_one=False)

            self._inverters_selected = sorted(targets_selected)

            if self._inverters_selected == DEFAULTS['targets']:
                self._inverter_start_sequence = DEFAULTS['start_sequence']
                self._inverter_stop_sequence = DEFAULTS['stop_sequence']
            else:
                self._inverter_start_sequence = sorted(targets_selected)
                self._inverter_stop_sequence = sorted(targets_selected)

        else:
            self._inverters_selected = DEFAULTS['targets']
            self._inverter_start_sequence = DEFAULTS['start_sequence']
            self._inverter_stop_sequence = DEFAULTS['stop_sequence']

        if self._inverters_selected:
            print 'Inverters selected: %s.' % ', '.join(
                sorted(self._inverters_selected))
            print 'Start sequence:     %s.' % ', '.join(
                self._inverter_start_sequence)
            print 'Stop sequence:      %s.' % ', '.join(
                self._inverter_stop_sequence)
            self._ground_power_listener = Listener(
                set(self._inverters_selected))
            self._inverter_list = [
                Inverter(inverter_id, self._ground_power_listener)
                for inverter_id in xrange(inverter_types.kNumInverters)
            ]
Beispiel #9
0
    def do_set_targets(self, line):  # pylint: disable=invalid-name
        """Sets target servos, e.g. "set_targets A2 A4"."""
        self._CheckState([actuator_types.kActuatorStateInit])
        servos_selected, _ = cmd_client.SelectArgs(line.split(),
                                                   SERVOS,
                                                   require_some=True,
                                                   require_all=True,
                                                   select_all=True,
                                                   require_one=False)

        print 'Servos selected: [%s]' % ', '.join(sorted(
            list(servos_selected)))
        self._servos_selected = servos_selected

        self.TryStopThreads()
        self._runner = Runner(servos_selected)
        self._listener = Listener(self._servos_selected, self._runner.StopRun)
    def do_set_stop_sequence(self, line):  # pylint: disable=invalid-name
        """Sets stop sequence for selected inverters."""
        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use "set_targets".')

        targets_selected, _ = cmd_client.SelectArgs(line.split(),
                                                    self._inverters_selected,
                                                    require_some=False,
                                                    require_all=True,
                                                    select_all=False,
                                                    require_one=False)

        if len(targets_selected) != len(self._inverters_selected):
            print 'Stop sequence must contain all selected inverters.'
        else:
            self._inverter_stop_sequence = line.split()
            print 'Setting stop sequence to: %s.' % ', '.join(
                self._inverter_stop_sequence)
    def do_get_faults(self, line):  # pylint: disable=invalid-name
        """Gets faults for specified inverters, e.g "get_faults Inv1 Inv2 Inv3"."""
        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use "set_targets".')

        targets, _ = cmd_client.SelectArgs(line.split(),
                                           self._inverters_selected,
                                           require_some=False,
                                           require_all=True,
                                           select_all=True,
                                           require_one=False)

        if not targets:
            raise GroundPowerClientError('No valid arguments selected.')

        for target in sorted(targets):
            try:
                print self._inverter_list[InverterNameToId(target)].GetFaults()
            except GroundPowerClientError:
                print 'Failed to get faults from %s.' % target
    def _SetParam(self, line, **kwargs):  # pylint: disable=invalid-name
        """Sets a parameter for a specified inverter."""

        if not self._inverters_selected:
            raise GroundPowerClientError(
                'No targets selected. Use "set_targets".')

        targets, args = cmd_client.SelectArgs(line.split(),
                                              self._inverters_selected,
                                              require_some=True,
                                              select_all=True)

        if kwargs:
            param, args = cmd_client.SelectArgs(args, ['value'],
                                                require_one=True,
                                                select_all=False)
            if args:
                try:
                    value = int(args[0])
                except ValueError:
                    raise GroundPowerClientError('Invalid value: ', args[0])

                if value not in range(int(kwargs['lower_lim']),
                                      int(kwargs['upper_lim'])):
                    raise GroundPowerClientError(
                        'Supplied value out of range.')

                if any('scaling' in k for k in kwargs):
                    value = int(kwargs['scaling']) * value
            else:
                value = GetStrandedArgs(line)
            modbus_reg = INVERTER_SET_PARAMS[kwargs['param']]

        else:
            param, args = cmd_client.SelectArgs(args,
                                                INVERTER_SET_PARAMS.keys(),
                                                require_one=True,
                                                select_all=False)

            if args:
                try:
                    value = int(args[0])
                except ValueError:
                    raise GroundPowerClientError('Invalid value: ', args[0])
            else:
                value = GetStrandedArgs(line)
            modbus_reg = INVERTER_SET_PARAMS[param]

        failed_targets = []

        for target in sorted(targets):
            print 'Setting %s to %g on %s.' % (param, value, target)

            success = self._inverter_list[InverterNameToId(
                target)].TrySetParam(modbus_reg, value)
            if not success:
                failed_targets.append(target)

        if failed_targets:
            raise GroundPowerClientError('Failed to verify %s from %s.' %
                                         (param, failed_targets))