Core library for Amfiprot
Project description
Amfiprot is a communication protocol for embedded devices used and developed by Amfitech. The protocol can be extended with plugins for specific devices implementing the Amfiprot protocol (e.g. the AmfiTrack).
Prerequisites
- Python 3.6 or higher.
Installation
Install (or update) amfiprot
with pip
:
pip install -U amfiprot
Quick start
The basic workflow when using the library is:
- Create a
Connection
to a device connected directly to the host machine (we call this the "root node"). - Search for
Node
s on theConnection
(i.e. nodes connected through the root node) - Create a
Device
using one of the discoveredNode
s. - Start the
Connection
. - Communicate with the
Device
.
Example:
import amfiprot
VENDOR_ID = 0xC17
PRODUCT_ID = 0xD12
if __name__ == "__main__":
conn = amfiprot.USBConnection(VENDOR_ID, PRODUCT_ID)
nodes = conn.find_nodes()
print(f"Found {len(nodes)} node(s).")
for node in nodes:
print(f"[{node.tx_id}] {node.name}")
dev = amfiprot.Device(nodes[0])
conn.start()
cfg = dev.config.read_all()
while True:
if dev.packet_available():
print(dev.get_packet())
The following sections provide a more in-depth explanation.
Discovering and connecting to a root node
After attaching a device to your host machine, you can scan for connected devices (e.g. connected via USB) with:
phys_devs = amfiprot.USBConnection.discover()
for dev in phys_devs:
print(dev)
A connection can then be created using a specific physical device:
conn = amfiprot.USBConnection(dev['vid'], dev['pid'], dev['serial_number'])
Using serial_number
is optional. If none is given, the first device matching the given vendor and product ID is used.
Finding nodes
After creating a connection, we can search for nodes that are connected to the root node (e.g. via RF or UART):
nodes = conn.find_nodes()
find_nodes()
returns a list of Node
instances. A Node
provides a low-level interface to the physical device and can be used to retrieve the uuid
, tx_id
and name
of the device, and send/receive raw packets. It is not recommended to use the Node
directly, but rather attach it to a Device
instance.
Creating a device
A Device
is an abstraction layer on top of a Node
and is created by injecting a Node
in the constructor:
dev = amfiprot.Device(node)
The Device
provides a higher-level interface allowing the user to easily:
- Update the firmware
- Reboot the device
- Read/write configurations
- Read decoded packets
We are still able to access the Node
through the Device
if necessary:
tx_id = dev.node.tx_id
Starting the connection and interacting with the device
Before interacting with the Device
, the Connection
must be started:
conn.start()
This creates a child process that asynchronously sends and receives packets on the specified interface. We can now interact with the Device
in the main process without worrying about blocking:
device_name = dev.name()
print(f"Reading packets from {device_name}...")
while True:
if dev.packet_available():
print(dev.get_packet())
We can access the device configuration through a Configurator
instance which is automatically created as a member (dev.config
) of the Device
:
# Read the entire configuration as a JSON-like object (a list of dicts)
cfg = dev.config.read_all()
# Print all parameters
for category in cfg:
print(f"CATEGORY: {category['name']}")
for parameter in category['parameters']:
print(parameter)
The configuration can be easily saved to and loaded from a .json
file:
import json
# Write configuration to file
with open("config.json", "w") as outfile:
json.dump(cfg, outfile, indent=4)
# Read configuration from file and send to device
with open("config.json", "r") as infile:
new_cfg = json.load(infile)
dev.config.write_all(new_cfg)
Contributions and bug reporting
The Amfiprot Python package is open-source and the source code can be found on our Github repository. Contributions can be made through pull requests to the development
branch. Bug reports and feature requests can be created in the Issues tab.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file amfiprot-0.1.9.tar.gz
.
File metadata
- Download URL: amfiprot-0.1.9.tar.gz
- Upload date:
- Size: 21.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1f5a1af721511b0927c315d904bf004c809466f4a27f5b4ceecff9c19edfa502 |
|
MD5 | 03911a86f9f9b6d6d54ef45a57b348db |
|
BLAKE2b-256 | cc389991cf92b622bfe01be48b71595f060f03fe4186a41dc9fa545affcff8fa |
File details
Details for the file amfiprot-0.1.9-py3-none-any.whl
.
File metadata
- Download URL: amfiprot-0.1.9-py3-none-any.whl
- Upload date:
- Size: 24.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8450290d3468a82f89f99c5b3648bfc980c63cae9a6003e2318d1ce826469726 |
|
MD5 | a63bb930d95cadf9d4c7492f4ca093eb |
|
BLAKE2b-256 | 132eb3bc50f543c8f4c4d16600ca0c1403e5eb0b6b8ab7161b4956fa319aad32 |