add a neopixel driver
This commit is contained in:
@@ -21,6 +21,10 @@ class PayloadBuilder:
|
|||||||
""" Add a uint16_t """
|
""" Add a uint16_t """
|
||||||
self.buf.extend((num&0xFFFF).to_bytes(length=2, byteorder=self.endian, signed=False))
|
self.buf.extend((num&0xFFFF).to_bytes(length=2, byteorder=self.endian, signed=False))
|
||||||
|
|
||||||
|
def u24(self, num:int):
|
||||||
|
""" Add a uint24_t (for use with RGB colors) """
|
||||||
|
self.buf.extend((num&0xFFFFFF).to_bytes(length=3, byteorder=self.endian, signed=False))
|
||||||
|
|
||||||
def u32(self, num:int):
|
def u32(self, num:int):
|
||||||
""" Add a uint32_t """
|
""" Add a uint32_t """
|
||||||
self.buf.extend((num&0xFFFFFFFF).to_bytes(length=4, byteorder=self.endian, signed=False))
|
self.buf.extend((num&0xFFFFFFFF).to_bytes(length=4, byteorder=self.endian, signed=False))
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ class PayloadParser:
|
|||||||
slice = self._slice(2)
|
slice = self._slice(2)
|
||||||
return int.from_bytes(slice, byteorder=self.endian, signed=False)
|
return int.from_bytes(slice, byteorder=self.endian, signed=False)
|
||||||
|
|
||||||
|
def u24(self) -> int:
|
||||||
|
""" Read a uint24_t """
|
||||||
|
slice = self._slice(3)
|
||||||
|
return int.from_bytes(slice, byteorder=self.endian, signed=False)
|
||||||
|
|
||||||
def u32(self) -> int:
|
def u32(self) -> int:
|
||||||
""" Read a uint32_t """
|
""" Read a uint32_t """
|
||||||
slice = self._slice(4)
|
slice = self._slice(4)
|
||||||
|
|||||||
+1
-1
@@ -7,9 +7,9 @@ from gex.Unit import Unit
|
|||||||
from gex.Client import Client
|
from gex.Client import Client
|
||||||
|
|
||||||
# import all the units
|
# import all the units
|
||||||
from gex.units.Pin import Pin
|
|
||||||
from gex.units.DOut import DOut
|
from gex.units.DOut import DOut
|
||||||
from gex.units.DIn import DIn
|
from gex.units.DIn import DIn
|
||||||
|
from gex.units.Neopixel import Neopixel
|
||||||
|
|
||||||
|
|
||||||
# General, low level
|
# General, low level
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import gex
|
||||||
|
|
||||||
|
class Neopixel(gex.Unit):
|
||||||
|
"""
|
||||||
|
Raw access to a neopixel strip.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def _type(self):
|
||||||
|
return 'NEOPIXEL'
|
||||||
|
|
||||||
|
def get_len(self):
|
||||||
|
""" Get the neopixel strip length """
|
||||||
|
resp = self.query(0x04)
|
||||||
|
pp = gex.PayloadParser(resp)
|
||||||
|
return pp.u16()
|
||||||
|
|
||||||
|
def load(self, colors, reverse=True):
|
||||||
|
"""
|
||||||
|
Load colors to the strip.
|
||||||
|
|
||||||
|
The numbers are normally 0xRRGGBB
|
||||||
|
If 'reverse' is false, they're treated as little-endian: 0xBBGGRR.
|
||||||
|
"""
|
||||||
|
pb = gex.PayloadBuilder(endian='big' if reverse else 'little')
|
||||||
|
for c in colors:
|
||||||
|
pb.u24(c)
|
||||||
|
self.send(0x01, pb.close())
|
||||||
|
|
||||||
|
def clear(self):
|
||||||
|
"""
|
||||||
|
Reset the strip (set all to black)
|
||||||
|
"""
|
||||||
|
self.send(0x00)
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
import gex
|
|
||||||
|
|
||||||
class Pin(gex.Unit):
|
|
||||||
def _type(self):
|
|
||||||
return 'PIN'
|
|
||||||
|
|
||||||
def on_event(self, event:int, payload):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def off(self):
|
|
||||||
self.send(0x00)
|
|
||||||
|
|
||||||
def on(self):
|
|
||||||
self.send(0x01)
|
|
||||||
|
|
||||||
def toggle(self):
|
|
||||||
self.send(0x02)
|
|
||||||
@@ -14,13 +14,6 @@ if False:
|
|||||||
|
|
||||||
client.bulk_write(gex.MSG_INI_WRITE, buf)
|
client.bulk_write(gex.MSG_INI_WRITE, buf)
|
||||||
|
|
||||||
if False:
|
|
||||||
led = gex.Pin(client, 'LED')
|
|
||||||
|
|
||||||
for i in range(0,10):
|
|
||||||
led.toggle()
|
|
||||||
time.sleep(.1)
|
|
||||||
|
|
||||||
if False:
|
if False:
|
||||||
leds = gex.DOut(client, 'strip')
|
leds = gex.DOut(client, 'strip')
|
||||||
|
|
||||||
@@ -48,7 +41,7 @@ if False:
|
|||||||
leds.toggle(0xFF)
|
leds.toggle(0xFF)
|
||||||
time.sleep(.1)
|
time.sleep(.1)
|
||||||
|
|
||||||
if True:
|
if False:
|
||||||
btn = gex.DIn(client, 'btn')
|
btn = gex.DIn(client, 'btn')
|
||||||
strip = gex.DOut(client, 'strip')
|
strip = gex.DOut(client, 'strip')
|
||||||
|
|
||||||
@@ -56,3 +49,13 @@ if True:
|
|||||||
b = btn.read()
|
b = btn.read()
|
||||||
strip.write((b << 2) | ((~b) & 1))
|
strip.write((b << 2) | ((~b) & 1))
|
||||||
time.sleep(.02)
|
time.sleep(.02)
|
||||||
|
|
||||||
|
if True:
|
||||||
|
neo = gex.Neopixel(client, 'npx')
|
||||||
|
|
||||||
|
print('We have %d neopixels.\n' % neo.get_len())
|
||||||
|
for i in range(0,512):
|
||||||
|
j = i if i < 256 else 255-(i-256)
|
||||||
|
neo.load([0x660000+j, 0x3300FF-j, 0xFFFF00-(j<<8), 0x0000FF+(j<<8)-j])
|
||||||
|
time.sleep(.005)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user