4 * Abstract class that implements common methods for all I2C sensors.
6 * Extend this class to implement new I2C sensors.
8 * @author Lawrie Griffiths (lawrie.griffiths@ntlworld.com)
11 public abstract class I2CSensor implements SensorConstants {
15 String productID = " ";
16 String sensorType = " ";
17 char [] versionChars = StringUtils.getCharacters(version);
18 char [] productIDChars = StringUtils.getCharacters(productID);
19 char [] sensorTypeChars = StringUtils.getCharacters(sensorType);
20 byte [] byteBuff = new byte[8];
21 byte [] buf1 = new byte[1];
23 public I2CSensor(I2CPort port)
27 port.setType(TYPE_LOWSPEED);
31 * Executes an I2C read transaction and waits for the result.
33 * @param register I2C register, e.g 0x41
34 * @param buf Buffer to return data
35 * @param len Length of the return data
36 * @return status zero=success, non-zero=failure
38 public int getData(int register, byte [] buf, int len) {
39 int ret = port.i2cStart(address, register, len, buf, len, 0);
41 if (ret != 0) return ret;
43 while (port.i2cBusy() != 0) {
51 * Executes an I2C write transaction.
53 * @param register I2C register, e.g 0x42
54 * @param buf Buffer containing data to send
55 * @param len Length of data to send
56 * @return status zero=success, non-zero=failure
58 public int sendData(int register, byte [] buf, int len) {
59 int ret = port.i2cStart(address, register, len, buf, len, 1);
60 if (ret != 0) return ret;
62 while (port.i2cBusy() != 0) {
70 * Executes an I2C write transaction.
72 * @param register I2C register, e.g 0x42
73 * @param value single byte to send
74 * @return status zero=success, non-zero=failure
76 public int sendData(int register, byte value) {
78 return sendData(register, buf1, 1);
82 * Return the sensor version number.
84 * @return 8-byte string
86 public String getVersion() {
87 int ret = getData(0x00, byteBuff, 8);
89 for(int i=0;i<8;i++) {
90 versionChars[i] = (ret == 0 ? (char) byteBuff[i] : ' ');
96 * Return the sensor product identifier.
98 * @return 8-byte string
100 public String getProductID() {
101 int ret = getData(0x08, byteBuff, 8);
103 for(int i=0;i<8;i++) {
104 productIDChars[i] = (ret == 0 ? (char) byteBuff[i] : ' ');
110 * Return the sensor type.
112 * @return 8-byte string
114 public String getSensorType() {
115 int ret = getData(0x10, byteBuff, 8);
117 for(int i=0;i<8;i++) {
118 sensorTypeChars[i] = (ret == 0 ? (char) byteBuff[i] : ' ');
123 public void setAddress(int addr) {