コード例 #1
0
class MonsoonHVPMPowerMeter(MonsoonPowerMeter):
    def setup_monsoon(self):
        """Set up monsoon HVPM.

        Args:
            voltage: Voltage output of the power monitor.
            serial: serial number of the power monitor.
        """
        click.secho("Setting up Monsoon {} with {}V...".format(
            self.serial, self.voltage),
                    fg='blue')
        self.monsoon = HVPM.Monsoon()
        self.monsoon.setup_usb(self.serial, pmapi.USB_protocol())
        set_voltage_if_different(self.monsoon, self.voltage)
        self.engine = SampleEngine(self.monsoon)
        self.engine.ConsoleOutput(False)

        if android.is_android_device_available():
            android.reconnect_adb_through_usb()
        self.monsoon_usb_enabled(True)
コード例 #2
0
class MonsoonPowerMeter(PowerMeter):
    """PowerMeter implementation for Monsoon LVPM.

    Make sure the Android device has Passlock disabled.
    Your server and device have to be connected to the same network.
    """
    def __init__(self, voltage=3.8, serial=None):  # noqa: D102,D107
        self.monsoon = None
        self.serial = serial
        self.voltage = voltage
        self.monsoon_reader = None
        self.monsoon_data = None
        self.engine = None
        self.setup_monsoon()

        click.secho("Monsoon is ready.", fg='green')
        if not android.is_android_device_available():
            click.secho("You can now turn the phone on.", fg='blue')
        for i in range(180):
            time.sleep(1)
            if android.is_android_device_available():
                time.sleep(2)
                click.secho("Found a {}!".format(android.get_device_model()),
                            fg='green')
                break
            if i % 15 == 0:
                click.secho("Waiting for an Android device...", fg='blue')
            if i == 180:
                raise Exception("Could not find device.")
        android.connect_adb_through_wifi()
        self.monsoon_usb_enabled(False)
        if android.is_locked():
            click.secho(
                "Device seems to be locked. "
                "Disabling Passlock is recommended!",
                fg='yellow')

    def reinit(self):
        """Reinitialize power meter upon unexpected behavior."""
        warnings.warn("reinit is deprecated and does nothing",
                      DeprecationWarning)

    def setup_monsoon(self):
        """Set up monsoon.

        Args:
            voltage: Voltage output of the power monitor.
            serial: serial number of the power monitor.
        """
        click.secho("Setting up Monsoon {} with {}V...".format(
            self.serial, self.voltage),
                    fg='blue')
        self.monsoon = LVPM.Monsoon()
        self.monsoon.setup_usb(self.serial)
        set_voltage_if_different(self.monsoon, self.voltage)
        self.engine = SampleEngine(self.monsoon)
        self.engine.ConsoleOutput(False)

        if android.is_android_device_available():
            android.reconnect_adb_through_usb()
        self.monsoon_usb_enabled(True)

    def monsoon_usb_enabled(self, enabled):
        """Enable/disable monsoon's usb port."""
        # pylint: disable=too-many-function-args
        # something is conflicting with timeout_decorator
        self.monsoon.setUSBPassthroughMode({
            True:
            operations.USB_Passthrough.On,
            False:
            operations.USB_Passthrough.Off,
        }[enabled])

    def start(self):
        """Start measuring energy consumption."""
        self.monsoon_reader = monsoon_async.MonsoonReader(self.engine, )
        self.monsoon_reader.start()

    def stop(self):
        """Stop measuring."""
        self.monsoon_reader.stop()
        samples = self.engine.getSamples()
        if len(samples) == 3:
            timestamps = samples[0]
            currents = samples[1]
            if timestamps:
                sample_hz = 50000
                delta_time = 1 / sample_hz
                time_deltas = [
                    j - i for i, j in zip(timestamps[:-1], timestamps[1:])
                ]

                energy_consumption = sum(
                    np.array(currents[:-1]) * np.array(time_deltas)) / 1000
                # energy_consumption = sum(currents)*delta_time
                duration = timestamps[-1]
                return energy_consumption, duration, False
        return None, None, True

    def __str__(self):
        """Return the name of this power meter."""
        return "Monsoon"