#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
-import threading
-import inspect
-import os
-import logging
-import struct
-import fcntl
-from ctypes import *
-from time import sleep
-
-DEBUG=0
-I2C_FILENAME = "/dev/i2c-2"
-logger = logging.getLogger(__name__)
-
-class i2c:
- libc = CDLL("libc.so.6")
- I2C_SLAVE = 0x0703 # Use this slave address
- __single = None
- __lock = threading.Lock()
- __parent_owner = None
-
- def __init__(self, addr):
- with i2c.__lock:
- count = 0
- while(i2c.__single):
- parent = inspect.stack()[1][3]
- count += 1
- sleep(0.001)
- if DEBUG:
- if count > 10:
- parent_owner = "%s (%d), %s()" % (self.__parent_owner[1], self.__parent_owner[2], self.__parent_owner[3])
- logger.warning("Error: (%s) I2C blocked %fs by %s!", parent, count*0.001, parent_owner)
- i2c.__parent_owner = inspect.stack()[1]
- i2c.__single = True
- self.dev = i2c.libc.open(I2C_FILENAME, os.O_RDWR)
- if self.dev < 0:
- raise IOError("open")
- fcntl.flock(self.dev, fcntl.LOCK_EX)
- err = i2c.libc.ioctl(self.dev, i2c.I2C_SLAVE, addr>>1)
- if err < 0:
- raise IOError("ioctl")
-
- def write(self, s):
- num_write = i2c.libc.write(self.dev, s, len(s))
- if num_write != len(s):
- self.close()
- raise IOError("write: %d" % (num_write))
-
- def read(self, num):
- buf = create_string_buffer(num)
- num_read = i2c.libc.read(self.dev, buf, num)
- if num_read != num:
- self.close()
- raise IOError("read: %d" % (num_read))
- return buf.raw
-
- def close(self):
- if self.dev:
- i2c.libc.close(self.dev)
- self.dev = None
- #i2c.__parent_owner = None
- i2c.__single = None
-
- def __del__(self):
- self.close()
-
-
-def i2c_write_reg(addr, reg, buf):
- dev = i2c(addr)
- s = struct.pack(">B", reg) + buf
- dev.write(s)
- dev.close()
-
-
-def i2c_read_reg(addr, reg, num=1):
- dev = i2c(addr)
- s = struct.pack(">B", reg)
- dev.write(s)
- s = dev.read(num)
- dev.close()
- return s
-
+from pyshared.i2c import *
if __name__ == "__main__":
import struct