Exemplo n.º 1
0
class DeviceConnection(object):
    def __init__(self,
                 mode='uart_usb',
                 address=I2C_ADDRESS,
                 port=UART_PORT,
                 bus=I2C_BUS):
        """Initialize UART or I2C connection to slave microcontroller"""

        self._mode = mode
        self.address = address
        self.port = port

        if mode == 'uart_usb':
            self._con = serial.Serial(
                port=self.port,
                baudrate=UART_BAUDRATE,
                bytesize=serial.EIGHTBITS,
                stopbits=serial.STOPBITS_ONE,
                parity=serial.PARITY_NONE,
                rtscts=False,
                dsrdtr=False,
                timeout=UART_TIMEOUT_MS / 1000,
                write_timeout=5,
            )
        else:
            self._con = SMBus(bus)
            time.sleep(1)

    def disconnect(self):
        """Disconnect UART or I2C connection"""

        self._con.close()

    def get_register(self, register_address, format_bytes=False):
        """Get single register from slave microcontroller"""

        if format_bytes:
            return self.get_registers(register_address,
                                      register_len=1,
                                      format_bytes=format_bytes)
        else:
            return self.get_registers(register_address,
                                      register_len=1,
                                      format_bytes=format_bytes)[0]

    def get_registers(self,
                      register_address,
                      register_len=1,
                      format_bytes=False):
        """Get multiple registers from slave microcontroller"""

        if COMM_DEBUG:
            print("request register '%02x' len '%i'" %
                  (register_address, register_len * 2))

        if self._mode == 'uart_usb':

            self._con.write(b'R%02x%02x\n' %
                            (register_address, register_len * 2))
            response = self._con.read_until(
                terminator=serial.LF).decode('ascii').strip()

            if COMM_DEBUG:
                print("raw response '%s'" % response)

            if not response.startswith('ACK'):
                raise Exception("response error")

            response = response.split('ACK')[1]

            registers = []
            if not format_bytes:
                registers = [
                    int(response[i:i + 4], 16)
                    for i in range(0, len(response), 4)
                ]
            else:
                registers = [
                    int(response[i:i + 2], 16)
                    for i in range(0, len(response), 2)
                ]

            if COMM_DEBUG:
                print("decoded response '%s'" % registers)

            return registers

        else:
            response = self._con.read_i2c_block_data(self.address,
                                                     register_address,
                                                     register_len * 2)

            if COMM_DEBUG:
                print("raw response '%s'" % response)

            registers = []
            for i in range(0, register_len * 2, 2):
                registers.append((response[i] << 8) + response[i + 1])

            if COMM_DEBUG:
                print("decoded response '%s'" % registers)

            return registers

    def set_register(self, register_address, register_value):
        """Set single register on slave microcontroller"""

        return self.set_registers(register_address, [register_value])

    def set_registers(self,
                      register_address,
                      register_values,
                      format_bytes=False):
        """Set multiple registers on slave microcontroller"""

        if self._mode == 'uart_usb':

            out_str = ""
            if format_bytes:
                for register_value in register_values:
                    out_str += str("%02x" % register_value)
            else:
                for register_value in register_values:
                    out_str += str("%04x" % register_value)

            if COMM_DEBUG:
                print("set registers raw '%02x - %s'" %
                      (register_address, out_str))

            self._con.write(b'W%02x%s\n' %
                            (register_address, out_str.encode('ascii')))
            response = self._con.read_until(
                terminator=serial.LF).decode('ascii').strip()

            if COMM_DEBUG:
                print("raw response '%s'" % response)

            if not response.startswith('ACK'):
                raise Exception("response error")

            return response

        else:
            out_bytes = []
            if format_bytes:
                out_bytes = register_values
            else:
                for register_value in register_values:
                    out_bytes.extend([(register_value & 0xFF00) >> 8,
                                      (register_value & 0x00FF)])

            if COMM_DEBUG:
                print("set registers raw '%02x - %s'" %
                      (register_address, out_bytes))

            self._con.write_i2c_block_data(self.address, register_address,
                                           out_bytes)
Exemplo n.º 2
0
from smbus import SMBus
import sqlite3
import datetime

db = sqlite3.connect("external")
cur = db.cursor()

#cur.execute("create table if not exists tbli2c(i2cID integer primary key autoincrement,message text,create_dt current_timestamp)")
#db.commit()
addr = 0x8
bus = SMBus(1)

num = 1

print("Enter 1 for ON or 0 for OFF")
while num == 1:
    ledstate = input(">>>>>    ")
    if ledstate == "1":
        bus.write_byte(addr, 0x1)
        block = bus.read_byte_data(8, 1)
        print(block)
        sql = """insert into tbli2c(message,create_dt) values(?,?);"""
        data_sql = (block, datetime.datetime.now())
        cur.execute(sql, data_sql)
        db.commit()
    elif ledstate == "0":
        bus.write(addr, 0x0)
    else:
        num = 0