This commit adds the SourcePPSAPDO class for holding information from a
Source Programmable Power Supply APDO. It can be read and written and
printed and all that fun stuff.
The i member in SinkConfig now has its dimension, and thus its unit,
set by the new idim member. It's a bit clunky, but the other
alternative I thought of is even clunkier.
This commit adds support for the new, yet-to-be-released typec_virtual
PDO reported from the firmware. This was done by adding a
TypeCVirtualPDO class, code to load them from text, and support for them
in the calculation functions. New tests have been written for all the
new code as well.
Now there are two functions to perform calculations on PDO lists:
calculate_pdp and follows_power_rules. calculate_pdp calculates an
estimate of the power supply's PDP, and follows_power_rules tries to
determine if the power supply follows the USB PD Power Rules. Either
one could run into problems that cannot be detected, but for the
problems that can be detected there's a whole mound of new test code.
The intended behavior for Sink.get_source_cap() when no
Source_Capabilities are read was to return an empty list. This wasn't
done before, instead raising a ValueError when read_pdo() tried to parse
"No Source_Capabilities" as an UnknownPDO. Now we're a bit more
cautious, and the bug is fixed.
Now there are namedtuples for PDO types, and two functions to help with
reading PDOs from the Sink. They're all tested, and our test coverage
is now at 98%(!).
Rather than having one method doing double-duty as getter and setter,
with ugly syntax, why not use a property? Now the Sink's output can
simply be read and written as a boolean.
The README has been updated to show how to manipulate the new SinkConfig
objects, as well as what the output really looks like now.
Since it's a class used for little more than storage, with no
interesting non-magic instance methods, it makes sense for SinkConfig to
be a namedtuple. The rest of its code was mostly just boilerplate,
after all. What remains makes it do everything we need with only slight
changes to its behavior (most notably, SinkConfig must be instantiated
with all its arguments now).
Any command sent with send_command could be invalid. It makes sense for
that method to throw an exception if the command isn't recognized so I
don't have to duplicate that effort in the methods for all commands
introduced after firmware version 1.0. This commit moves the command
validity checking to Sink.send_command.
Now when the `output` command is unsupported by the Sink, the library
raises a different exception than if unknown text is printed. This
allows feature testing, which is great.
Added code to set_v and set_i to check if the Sink gave any error
message when running those commands, raising exceptions if it did.
This makes two of the three new tests pass. The other one will need
support from the Sink itself, which currently doesn't care if the
voltage is over 20 V or the current is over 5 A. That is to say that
the third test will automatically start passing if the Sink is running
firmware 1.0.1, which is yet to be released.
Before, we sent ^D, but didn't read past the prompt that appeared. This
put us one command behind the most recent, causing all manner of mayhem.
It's all fixed now I believe, but this really shows the need for unit
testing. I'm working on that.
This removes any garbage that the Sink may have in its buffer, e.g.
partially entered commands or nonsense that appeared when moving the
device to/from a VM.
One extra dependency is pulled in for Python versions older than 3.6,
but other than that it's pretty easy to support them. It definitely
works on 2.7 now, and should work on older 3.x versions (but that's
untested).
Now the port is not part of the API, there's a method to close it,
__init__ can take a string in addition to the objects it used to take,
and the class is a context manager for the with statement. I can
confidently say that these are all great changes.
The timeout was a dirty hack from the start. It was long enough that
commands have finished running by the time it completes, but it wasn't
the right way to see when a command finished running. The right way is
to look for the PDBS) prompt, which is what we do now.
This makes the Sink.set_tmpcfg method run noticeably faster. Neat.