blob: 34719530a26ff51bccf7f3499151ed7827714149 [file] [log] [blame]
/*
* Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.araplox;
import android.hardware.I2cManager;
import android.hardware.I2cTransaction;
import android.util.Log;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
public class AFE4400Thread extends Thread {
// The 7-bit slave address
private static final int address = (0x50 >> 1);
private static final String TAG = "araplox";
private static final String preferredI2cBus = "/dev/i2c-4";
private Mlx90620Listener listener;
private I2cManager i2c;
private volatile boolean stopped;
private DataOutputStream buf = null;
private static final I2cTransaction[] setupWrites = {
WriteReg(0x00, 0x00, 0x00, 0x00), //AFE4400_CONTROL0
WriteReg(0x01, 0x00, 0x17, 0xD4), //AFE4400_LED2STC
WriteReg(0x02, 0x00, 0x1D, 0xAE), //AFE4400_LEDENDC
WriteReg(0x03, 0x00, 0x17, 0x70), //AFE4400_LED2LEDSTC
WriteReg(0x04, 0x00, 0x1D, 0xAF), //AFE4400_LED2LEDENDC
WriteReg(0x05, 0x00, 0x00, 0x00), //AFE4400_ALED2STC
WriteReg(0x06, 0x00, 0x06, 0x3E), //AFE4400_ALED2ENDC
WriteReg(0x07, 0x00, 0x08, 0x34), //AFE4400_LED1STC
WriteReg(0x08, 0x00, 0x0E, 0x0E), //AFE4400_LED1ENDC
WriteReg(0x09, 0x00, 0x07, 0xD0), //AFE4400_LED1LEDSTC
WriteReg(10, 0x00, 0x0E, 0x0F), //AFE4400_LED1LEDENDC
WriteReg(11, 0x00, 0x0F, 0xA0), //AFE4400_ALED1STC
WriteReg(12, 0x00, 0x15, 0xDE), //AFE4400_ALED1ENDC
WriteReg(13, 0x00, 0x00, 0x02), //AFE4400_LED2CONVST
WriteReg(14, 0x00, 0x07, 0xCF), //AFE4400_LED2CONVEND
WriteReg(15, 0x00, 0x07, 0xD2), //AFE4400_ALED2CONVST
WriteReg(16, 0x00, 0x0F, 0x9F), //AFE4400_ALED2CONVEND
WriteReg(17, 0x00, 0x0F, 0xA2), //AFE4400_LED1CONVST
WriteReg(18, 0x00, 0x17, 0x6F), //AFE4400_LED1CONVEND
WriteReg(19, 0x00, 0x17, 0x72), //AFE4400_ALED1CONVST
WriteReg(20, 0x00, 0x1F, 0x3F), //AFE4400_ALED1CONVEND
WriteReg(21, 0x00, 0x00, 0x00),//AFE4400_ADCRSTSTCT0
WriteReg(22, 0x00, 0x00, 0x00),//AFE4400_ADCRSTENDCT0
WriteReg(23, 0x00, 0x07, 0xD0),//AFE4400_ADCRSTSTCT1
WriteReg(24, 0x00, 0x07, 0xD0),//AFE4400_ADCRSTENDCT1
WriteReg(25, 0x00, 0x0F, 0XA0),//AFE4400_ADCRSTSTCT2
WriteReg(26, 0x00, 0x0F, 0XA0),//AFE4400_ADCRSTENDCT2
WriteReg(27, 0x00, 0x17, 0x70),//AFE4400_ADCRSTSTCT3
WriteReg(28, 0x00, 0x17, 0x70),//AFE4400_ADCRSTENDCT3
WriteReg(29, 0x00, 0x1F, 0x3F),//AFE4400_PRPCOUNT
WriteReg(30, 0x00, 0x01, 0x01),//AFE4400_CONTROL1
WriteReg(31, 0x00, 0x00, 0x00),//AFE4400_SPARE1
WriteReg(32, 0x00, 0x00, 0x00),//AFE4400_TIAGAIN
WriteReg(33, 0x00, 0x00, 0x0A),//AFE4400_TIA_AMB_GAIN
WriteReg(34, 0x01, 0x14, 0x29),//AFE4400_LEDCNTRL
WriteReg(35, 0x02, 0x01, 0x00),//AFE4400_CONTROL2
WriteReg(36, 0x00, 0x00, 0x00),//AFE4400_SPARE2
WriteReg(37, 0x00, 0x00, 0x00),//AFE4400_SPARE3
WriteReg(38, 0x00, 0x00, 0x00),//AFE4400_SPARE4
WriteReg(39, 0x00, 0x00, 0x00),//AFE4400_RESERVED1
WriteReg(40, 0x00, 0x00, 0x00),//AFE4400_RESERVED2
WriteReg(41, 0x00, 0x00, 0x00),//AFE4400_ALARM
WriteReg(42, 0x00, 0x00, 0x00),//AFE4400_LED2VAL
WriteReg(43, 0x00, 0x00, 0x00),//AFE4400_ALED2VAL
WriteReg(44, 0x00, 0x00, 0x00),//AFE4400_LED1VAL
WriteReg(45, 0x00, 0x00, 0x00),//AFE4400_ALED1VAL
WriteReg(46, 0x00, 0x00, 0x00),//AFE4400_LED2-ALED2VAL
WriteReg(47, 0x00, 0x00, 0x00),//AFE4400_LED1-ALED1VAL
WriteReg(48, 0x00, 0x00, 0x00),//AFE4400_DIAG
// Setup SPI_READ
WriteReg(0, 0x00, 0x00, 0x01),//AFE4400_DIAG
};
public AFE4400Thread(Mlx90620Listener listener, I2cManager i2c) {
this.listener = listener;
this.i2c = i2c;
this.stopped = false;
try {
this.buf = new DataOutputStream(new FileOutputStream("/sdcard/plox.dat"));
} catch (FileNotFoundException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void run() {
String[] buses = i2c.getI2cBuses();
if (buses.length == 0) {
setText("no I2C buses found :(");
return;
}
String bus = buses[0];
for (String b: buses) {
if (b.equals(preferredI2cBus)) {
bus = b;
}
}
Log.i(TAG, "[pulse ox app] Using I2C bus: " + bus);
int nsecs = 0;
while (nsecs > 0) {
setText("starting in " + nsecs + "...");
nsecs--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
I2cTransaction[] results;
for (I2cTransaction txn: setupWrites) {
try {
results = i2c.performTransactions(bus, address, txn);
} catch (IOException e) {
setText("transaction error: " + e);
return;
}
}
while (!isStopped()) {
results = null;
boolean stop = true;
String updateString = "";
byte[] data;
int LED1VAL;
int LED2VAL;
I2cTransaction[] txns0 = {
I2cTransaction.newWrite(0x01, // Select SPI device 1
0x2e, // LED2-ALED2VAL
0xff, 0xff, 0xff), // 3 dummy bytes
I2cTransaction.newRead(4),
};
I2cTransaction[] txns1 = {
I2cTransaction.newWrite(0x01, // Select SPI device 1
0x2f, // LED2-ALED2VAL
0xff, 0xff, 0xff), // 3 dummy bytes
I2cTransaction.newRead(4),
};
try {
if (stop) {
for (I2cTransaction txn: txns0) {
results = i2c.performTransactions(bus, address, txn);
}
} else {
results = i2c.performTransactions(bus, address, txns0);
}
} catch (IOException e) {
setText("error while reading back: " + e);
return;
}
if (stop)
data = results[0].data;
else
data = results[1].data;
LED1VAL = (((int)data[1]) << 16) |
(((int)data[2] & 0xFF) << 8) |
(((int)data[3] & 0xFF));
try {
if (stop) {
for (I2cTransaction txn: txns1) {
results = i2c.performTransactions(bus, address, txn);
}
} else {
results = i2c.performTransactions(bus, address, txns1);
}
} catch (IOException e) {
setText("error while reading back: " + e);
return;
}
if (stop)
data = results[0].data;
else
data = results[1].data;
LED2VAL = (((int)data[1]) << 16) |
(((int)data[2] & 0xFF) << 8) |
(((int)data[3] & 0xFF));
try {
this.buf.writeInt(LED1VAL);
this.buf.writeInt(LED2VAL);
} catch (IOException e) {
Log.e(TAG, "IOException: " + e);
}
updateString = String.format("%8d %8d", LED1VAL, LED2VAL);
setText(updateString);
// try {
// Thread.sleep(50);
// } catch (InterruptedException e) {
// Log.e(TAG, e.toString());
// }
}
try {
this.buf.close();
} catch (IOException e) {
Log.e(TAG, "IOException: " + e);
}
}
private static I2cTransaction WriteReg(int reg, int b1, int b2, int b3) {
return I2cTransaction.newWrite(0x01, reg, b1, b2, b3);
}
// ------------------------------------------------------------
private void setText(String text) {
this.listener.updateAFE4400Status(text);
}
public void requestStop() {
this.stopped = true;
}
public boolean isStopped() {
return this.stopped;
}
}