package csp.scj.watchdog;
import csp.Buffer;
import csp.Constants;
import csp.IODevice;
import csp.IOInterface;
import csp.ImmortalEntry;
public class I2CInterface implements IOInterface {
I2CBusController port = null;
public I2CInterface(I2CBusController port) {
this.port = port;
}
@Override
public IODevice getIODevice() {
return port;
}
@Override
public synchronized void write(Buffer buffer) {
int destination = ((buffer.header[0] & 0x00000001) << 4)
| ((buffer.header[1] & 0x000000F0) >>> 4);
port.tx_fifo_data.put(destination * 2);
for (int i = 0; i < buffer.size.length; i++) { // @WCA loop = Constants.CSP_PACKET_SIZE
port.tx_fifo_data.put(buffer.size[i]);
}
// What is the position of the CRC-32 field??
if (Constants.CSP_USE_CRC32) {
// ImmortalEntry.log.addEvent("Writing CRC to buffer...");
for (int i = 0; i < buffer.crc32.length; i++) {
port.tx_fifo_data.put(buffer.crc32[i]);
}
}
// ImmortalEntry.log.addEvent("Writing header to buffer...");
for (int i = 0; i < buffer.header.length; i++) { // @WCA loop = Constants.CSP_HEADER_SIZE
port.tx_fifo_data.put(buffer.header[i]);
}
if (buffer.data != null) {
// ImmortalEntry.log.addEvent("Writing data to buffer...");
for (int i = 0; i < buffer.data.length; i++) { // @WCA loop = Constants.MAX_PAYLOAD_SIZE
port.tx_fifo_data.put(buffer.data[i] >>> 24);
port.tx_fifo_data.put(buffer.data[i] >>> 16);
port.tx_fifo_data.put(buffer.data[i] >>> 8);
port.tx_fifo_data.put(buffer.data[i]);
}
}
port.write(buffer.length);
while ((port.status.get() & I2CBusController.BUS_BUSY) == I2CBusController.BUS_BUSY) {
;
}
port.flushTXBuff();
}
@Override
public synchronized Buffer read() {
if ((port.status.get() & I2CBusController.DATA_RDY) == I2CBusController.DATA_RDY) {
int dataCount = (port.rx_occu.get() & I2CBusController.OCCU_RD) >>> 16;
Buffer buff = ImmortalEntry.bufferPool.getCSPbuffer();
for (int i = 0; i < buff.size.length; i++) { // @WCA loop = 2
buff.size[i] = port.rx_fifo_data.get();
}
int dataSize = dataCount - Constants.HEADER_SIZE;
// What is the position of the CRC-32 field??
if (Constants.CSP_USE_CRC32) {
dataSize = dataSize - 4;
for (int i = 0; i < buff.crc32.length; i++) { // @WCA loop = 4
buff.crc32[i] = port.rx_fifo_data.get();
}
}
for (int i = 0; i < buff.header.length; i++) { // @WCA loop = 4
buff.header[i] = port.rx_fifo_data.get();
}
for (int i = 0; i < (Math.ceil(dataSize / 4)); i++) { // @WCA loop = 7
int a, b, c, d;
a = port.rx_fifo_data.get() << 24;
b = port.rx_fifo_data.get() << 16;
c = port.rx_fifo_data.get() << 8;
d = port.rx_fifo_data.get();
buff.data[i] = a | b | c | d;
}
return buff;
} else {
return null;
}
}
}