Skip to content

Commit

Permalink
pulled in user submissions
Browse files Browse the repository at this point in the history
  • Loading branch information
adammhaile committed Dec 24, 2016
1 parent f92235b commit e57c371
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 42 deletions.
2 changes: 1 addition & 1 deletion bibliopixel/__init__.py
Expand Up @@ -3,4 +3,4 @@

from . import animation, colors, font, gamma, led, log, util

__version__ = VERSION = '2.0.10'
__version__ = VERSION = '3.0.0b'
21 changes: 13 additions & 8 deletions bibliopixel/drivers/serial_driver.py
Expand Up @@ -80,12 +80,17 @@ class DriverSerial(DriverBase):
deviceIDS = {}
deviceVers = []

def __init__(self, type, num, dev="", c_order=ChannelOrder.RGB, SPISpeed=2, gamma=None, restart_timeout=3, deviceID=None, hardwareID="1D50:60AB"):
def __init__(self, type, num, dev="",
c_order=ChannelOrder.RGB, SPISpeed=2,
gamma=None, restart_timeout=3,
deviceID=None, hardwareID="1D50:60AB",
baudrate=115200):
super(DriverSerial, self).__init__(num, c_order=c_order, gamma=gamma)

if SPISpeed < 1 or SPISpeed > 24 or not (type in SPIChipsets):
SPISpeed = 1

self.baudrate = baudrate
self._hardwareID = hardwareID
self._SPISpeed = SPISpeed
self._com = None
Expand Down Expand Up @@ -182,7 +187,7 @@ def _connect(self):
self.dev, devID, self.devVer)

try:
self._com = serial.Serial(self.dev, timeout=5)
self._com = serial.Serial(self.dev, baudrate=self.baudrate, timeout=5)
except serial.SerialException as e:
ports = DriverSerial.findSerialDevices(self._hardwareID)
error = "Invalid port specified. No COM ports available."
Expand Down Expand Up @@ -220,12 +225,12 @@ def _connect(self):
raise e

@staticmethod
def setDeviceID(dev, id):
def setDeviceID(dev, id, baudrate=115200):
if id < 0 or id > 255:
raise ValueError("ID must be an unsigned byte!")

try:
com = serial.Serial(dev, timeout=5)
com = serial.Serial(dev, baudrate=baudrate, timeout=5)

packet = util.generate_header(CMDTYPE.SETID, 1)
packet.append(id)
Expand All @@ -243,10 +248,10 @@ def setDeviceID(dev, id):
raise IOError("Problem connecting to serial device.")

@staticmethod
def getDeviceID(dev):
def getDeviceID(dev, baudrate=115200):
packet = util.generate_header(CMDTYPE.GETID, 0)
try:
com = serial.Serial(dev, timeout=5)
com = serial.Serial(dev, baudrate=baudrate, timeout=5)
com.write(packet)
resp = ord(com.read(1))
return resp
Expand All @@ -255,10 +260,10 @@ def getDeviceID(dev):
return -1

@staticmethod
def getDeviceVer(dev):
def getDeviceVer(dev, baudrate=115200):
packet = util.generate_header(CMDTYPE.GETVER, 0)
try:
com = serial.Serial(dev, timeout=0.5)
com = serial.Serial(dev, baudrate=baudrate, timeout=0.5)
com.write(packet)
ver = 0
resp = com.read(1)
Expand Down
95 changes: 62 additions & 33 deletions bibliopixel/drivers/spi_driver_base.py
Expand Up @@ -5,73 +5,102 @@
from .. import log


class SPIInterface:
FILE = 0
PY_SPI = 1
PI_GPIO = 2


class DriverSPIBase(DriverBase):
"""Base driver for controling SPI devices on systems like the Raspberry Pi and BeagleBone"""

def __init__(self, num, c_order=ChannelOrder.GRB, use_py_spi=True,
def __init__(self, num, c_order=ChannelOrder.GRB, interface=SPIInterface.PY_SPI,
dev="/dev/spidev0.0", SPISpeed=2, open=open, gamma=None):
super().__init__(num, c_order=c_order, gamma=gamma)

self.dev = dev
self.use_py_spi = use_py_spi
self.interface = interface
self.numSPI = -1 # ID of SPI device
self.numCS = -1 # ID of Chip Select
self._spiSpeed = SPISpeed

# File based SPI requires a bytearray so we have to overwrite _buf
if self.use_py_spi:
a, b = -1, -1
d = self.dev.replace("/dev/spidev", "")
s = d.split('.')
if len(s) == 2:
a = int(s[0])
b = int(s[1])
self._bootstrapSPIDev()

if a < 0 or b < 0:
error = "When using py-spidev, the given device must be in the format /dev/spidev*.*"
log.error(error)
raise ValueError(error)
# if SpiInterface is not File we need a specific format for the python api
if self.interface != SPIInterface.FILE and (self.numSPI < 0 or self.numCS < 0):
error = "When using py-spidev, the given device must be in the format /dev/spidev*.*"
log.error(error)
raise ValueError(error)

# File based SPI requires a bytearray so we have to overwrite _buf
if self.use_py_spi:
self._bootstrapSPIDev()
import spidev
self.spi = spidev.SpiDev()
self.spi.open(a, b)
self.spi.open(self.numSPI, self.numCS)
self.spi.max_speed_hz = int(self._spiSpeed * 1000000.0)
log.info('py-spidev speed @ %.1f MHz',
(float(self.spi.max_speed_hz) / 1000000.0))
else:
elif self.interface == SPIInterface.PI_GPIO:
# @TODO support chip select http://abyz.co.uk/rpi/pigpio/python.html#spi_open
AUX_SPI = 8
flags = (1 << AUX_SPI)
import pigpio
self.pi = pigpio.pi()
self.spi = self.pi.spi_open(self.numSPI, int(self._spiSpeed * 1000000.0), flags)
log.info('py-spidev speed @ %.1f MHz', (float(self.spi.max_speed_hz) / 1000000.0))
elif self.interface == SPIInterface.FILE:
self._buf = bytearray(self._buf)
self.spi = open(self.dev, "wb")
else:
raise ValueError('invalid interface type: "%s" not found ' % self.interface)

def _bootstrapSPIDev(self):
self.numSPI, self.numCS = -1, -1
d = self.dev.replace("/dev/spidev", "")
s = d.split('.')
if len(s) == 2:
self.numSPI = int(s[0])
self.numCS = int(s[1])

import os.path
import sys
if self.use_py_spi:
if self.interface == SPIInterface.PY_SPI:
try:
import spidev
except:
error = "Unable to import spidev. Please install. pip install spidev"
log.error(error)
raise ImportError(error)

if not os.path.exists(self.dev):
error = "Cannot find SPI device. Please see https://github.com/maniacallabs/bibliopixel/wiki/SPI-Setup for details."
log.error(error)
raise IOError(error)

# permissions check
try:
open(self.dev)
except IOError as e:
if e.errno == 13:
elif self.interface == SPIInterface.PI_GPIO:
try:
import pigpio
except:
error = "Unable to import pigpio. Please install pigpio http://abyz.co.uk/rpi/pigpio/download.html"
log.error(error)
raise ImportError(error)
if self.interface in [SPIInterface.PY_SPI, SPIInterface.FILE]:
if not os.path.exists(self.dev):
error = "Cannot find SPI device. Please see https://github.com/maniacallabs/bibliopixel/wiki/SPI-Setup for details."
log.error(error)
raise IOError(error)
else:
raise e

# permissions check
try:
open(self.dev)
except IOError as e:
if e.errno == 13:
error = "Cannot find SPI device. Please see https://github.com/maniacallabs/bibliopixel/wiki/SPI-Setup for details."
log.error(error)
raise IOError(error)
else:
raise e

def _send_packet(self):
if self.use_py_spi:
if self.interface == SPIInterface.PY_SPI:
self.spi.xfer2(self._packet)
else:
elif self.interface == SPIInterface.PI_GPIO:
self.pi.spi_write(self.spi, self._packet)
elif self.interface == SPIInterface.FILE:
self.spi.write(self._packet)
self.spi.flush()

Expand Down

0 comments on commit e57c371

Please sign in to comment.