import serial
import struct
+import threading
dPinToBit = {
"POWER": 6,
# http://dangerousprototypes.com/docs/SPI_(binary)
class BP:
def __init__(self, sDevice):
+ self.lock = threading.Lock()
self.pSerial = serial.Serial(sDevice, baudrate=115200, timeout=0.1)
self.mode_bit_bang()
self.io_state = 0
self.io_dir = 0
def command(self, cmd, num_read):
- self.pSerial.write(cmd)
- return self.pSerial.read(num_read)
+ with self.lock:
+ self.pSerial.write(cmd)
+ return self.pSerial.read(num_read)
def mode_bit_bang(self):
for i in range(20):
return v[0]/1024.0*6.6
# http://codepad.org/qtYpZmIF
- def pwm(self, freq, duty_cycle):
+ def pwm(self, freq, duty_cycle_percent):
lPrescaler = {0:1, 1:8 , 2:64, 3:256}
Fosc = 32e6
Tcy = 2.0 / Fosc
prescaler = lPrescaler[i]
PRy = period * 1.0 / (Tcy * prescaler)
PRy = int(PRy - 1)
- OCR = int(PRy * duty_cycle)
+ OCR = int(PRy * duty_cycle_percent)
if PRy < (2 ** 16 - 1):
break # valid value for PRy, keep values
- cmd = struct.pack(">BBHH", 0b00010010, prescaler, duty_cycle, period)
+ cmd = struct.pack(">BBHH", 0b00010010, i, OCR, PRy)
ret = self.command(cmd, 1)
if ord(ret) != 0x1:
raise Exception()
if ord(ret) != 0x1:
raise Exception()
+ def i2c_ping(self, addr):
+ # 1. Write
+ # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
+ msg = struct.pack(">BHHB", 0x08, 1, 0, addr)
+ ret = self.command(msg, 1)
+
+ if ord(ret[0]) != 0x1:
+ raise Exception("I2C ping failed")
+
def i2c_write(self, addr, reg, s):
# 1. Write
# command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
def i2c_read(self, addr, reg, num_read):
# set reg
- self.i2c_write(addr, reg, "")
+ if reg != None:
+ self.i2c_write(addr, reg, "")
# command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
msg = struct.pack(">BHHB", 0x08, 1, num_read, addr | 0x1)