Skip to main content

Python DSL for interacting with SMBus-compatible i2c devices

Project description

i2cdevice

Build Status Coverage Status PyPi Package Python Versions

i2cdevice is a python domain-specific language aimed at dealing with common SMBus/i2c device interaction patterns.

This project aims to make group-up implementations of Python libraries for i2c devices easier, simpler and inherently self-documenting.

It does this by separating a detailed description of the hardware registers and how they should be manipulated into a stuctured definition language.

This project does not aim to help you make a public API for Python devices- that should be built on top of the fundamentals presented here.

Using This Library

You should generally aim for a 1:1 representation of the hardware registers in the device you’re implementing, even if you don’t plan to use all the functionality. Having the full register set implemented allows for the easy addition of new features in future.

Checkout the libraries listed below for real-world examples.

Features

  • Classes for describing devices, registers and individual bit fields within registers in a fashion which maps closely with the datasheet

  • Value translation from real world numbers (such as 512ms) to register values (such as 0b111) and back again

  • Read registers into a namedtuple of fields using get

  • Write multiple register fields in a transaction using set with keyword arguments

  • Support for treating multiple-bytes as a single value, or single register with multiple values

Built With i2cdevice

Examples

The below example defines the ALS_CONTROL register on an ltr559, with register address 0x80.

It has 3 fields; gain - which is mapped to real world values - and sw_reset/mode which are single bit flags.

ALS_CONTROL = Register('ALS_CONTROL', 0x80, fields=(
    BitField('gain', 0b00011100, values_map={1: 0b000, 2: 0b001, 4: 0b011, 8:0b011, 48:0b110, 96:0b111}),
    BitField('sw_reset', 0b00000010),
    BitField('mode', 0b00000001)
))

A lookup table is not required for values, however, a function can be used to translate values from and to a format that the device understands.

The below example uses i2cdevice._byte_swap to change the endianness of two 16bit values before they are stored/retrieved.

# This will address 0x88, 0x89, 0x8A and 0x8B as a continuous 32bit register
ALS_DATA = Register('ALS_DATA', 0x88, fields=(
    BitField('ch1', 0xFFFF0000, bitwidth=16, values_in=_byte_swap, values_out=_byte_swap),
    BitField('ch0', 0x0000FFFF, bitwidth=16, values_in=_byte_swap, values_out=_byte_swap)
), read_only=True, bitwidth=32)

A “Register” and its “BitField”s define a set of rules and logic for detailing with the hardware register which is intepreted by the device class. Registers are declared on a device using the registers=() keyword argument:

I2C_ADDR = 0x23
ltr559 = Device(I2C_ADDR, bit_width=8, registers=(
    ALS_CONTROL,
    ALS_DATA
))

Reading Registers

One configured a register’s fields can be read into a namedtuple using the get method:

register_values = ltr559.get('ALS_CONTROL')
gain = register_values.gain
sw_reset = register_values.sw_reset
mode = register_values.mode

Writing Registers

The namedtuple returned from get is immutable and does not attempt to map values back to the hardware, in order to write one or more fields to a register you must use set with a keyword argument for each field:

ltr559.set('ALS_CONTROL',
           gain=4,
           sw_reset=1)

This will read the register state from the device, update the bitfields accordingly and write the result back.

0.0.7

  • BugFix: Prevent .get from reading multiple times (thanks @dkao)

  • Enhancement: Better error output (thanks Kamil Klimek)

0.0.6

  • New API methods set and get

0.0.5

  • Bump to stable release

0.0.4

  • Bugfixes

0.0.3

  • Added License

0.0.2

  • Major Refactor

0.0.1

  • Initial Release

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

i2cdevice-0.0.7.tar.gz (7.3 kB view details)

Uploaded Source

Built Distributions

i2cdevice-0.0.7-py3-none-any.whl (7.2 kB view details)

Uploaded Python 3

i2cdevice-0.0.7-py2-none-any.whl (7.2 kB view details)

Uploaded Python 2

File details

Details for the file i2cdevice-0.0.7.tar.gz.

File metadata

  • Download URL: i2cdevice-0.0.7.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/43.0.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for i2cdevice-0.0.7.tar.gz
Algorithm Hash digest
SHA256 fb6dafcbf654a9de732adb51c99a0aded31cfa924ea0b78b1583944c00a9235c
MD5 c69568277a0ff858a1b1a70cfba4ddc7
BLAKE2b-256 89618b234494fa4f8f551ab82c319417a2bb44cc32573764fe97dc3b2acb050c

See more details on using hashes here.

File details

Details for the file i2cdevice-0.0.7-py3-none-any.whl.

File metadata

  • Download URL: i2cdevice-0.0.7-py3-none-any.whl
  • Upload date:
  • Size: 7.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/43.0.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for i2cdevice-0.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 a80e59e280a7992691f9e30705f24bc650c9e694ba781277d47bef02d2b0276c
MD5 8587ab9bd78a34715eb8feaed18fb16d
BLAKE2b-256 d7dc589f7a79ce13286e878d3894657ec8d6f21756b04b9435edc4030a7fb4b8

See more details on using hashes here.

File details

Details for the file i2cdevice-0.0.7-py2-none-any.whl.

File metadata

  • Download URL: i2cdevice-0.0.7-py2-none-any.whl
  • Upload date:
  • Size: 7.2 kB
  • Tags: Python 2
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/43.0.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for i2cdevice-0.0.7-py2-none-any.whl
Algorithm Hash digest
SHA256 247e536e6a5398d87db8f9a3a0c0c11f0f12f84ec58f4e43b0cd325a19ec23bc
MD5 a64adc75c3189196383ab2a455a8d72d
BLAKE2b-256 1f365e75f6d87c292d610cc301945c61af513c2076bf548fff650e64aae70f0e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page