Skip to content

Commit

Permalink
Merge pull request #301 from MMMMMNG/mock-spi-transfer-fix
Browse files Browse the repository at this point in the history
[HACKTOBERFEST] MockSpi Class revision
  • Loading branch information
eitch authored Oct 11, 2023
2 parents a304011 + 80e0b34 commit 87c73c0
Showing 1 changed file with 83 additions and 72 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,134 +49,145 @@
public class MockSpi extends SpiBase implements Spi {

private static final Logger logger = LoggerFactory.getLogger(MockSpi.class);
private final String logPreamble;

protected ArrayDeque<Byte> raw = new ArrayDeque<>();

/**
* <p>Constructor for MockSpi.</p>
*
* @param provider a {@link com.pi4j.io.spi.SpiProvider} object.
* @param config a {@link com.pi4j.io.spi.SpiConfig} object.
* @param config a {@link com.pi4j.io.spi.SpiConfig} object.
*/
public MockSpi(SpiProvider provider, SpiConfig config) {
super(provider, config);
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: OPEN(CHANNEL=" + config.address() + "; BAUD=" + config.baud() + ")");
logger.info("");
logPreamble = "[" + Mock.SPI_PROVIDER_NAME + "::" + this.id + "] ::";
logger.info("{} OPEN(CHANNEL={}; BAUD={})", logPreamble, config.address(), config.baud());
}
/** {@inheritDoc} */

/**
* <p>Lets the tester read all the data in this mocks raw buffer.</p>
* <p>
* It returns all the data that has been accumulated by write() or transfer() calls
* and not yet been consumed by read() or transfer() calls.
*
* @return the bytes in the buffer
*/
public byte[] readEntireMockBuffer() {
var bytes = new byte[raw.size()];
for (int i = 0; !raw.isEmpty(); ++i) {
bytes[i] = raw.pop();
}
logger.info("{} READALL (0x{})", logPreamble, StringUtil.toHexString(bytes));
return bytes;
}

/**
* {@inheritDoc}
*/
@Override
public void close() {
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: CLOSE(CHANNEL=" + config.address() + "; BAUD=" + config.baud() + ")");
logger.info("");
logger.info("{} CLOSE(CHANNEL={}; BAUD={})", logPreamble, config.address(), config.baud());
super.close();
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int transfer(byte[] write, int writeOffset, byte[] read, int readOffset, int numberOfBytes) {
int readIndex = readOffset;
// simply just echo out the write data back to the read buffer
for(int n = writeOffset; n < numberOfBytes - writeOffset; n++){
read[readIndex] = write[n];
readIndex++;
byte[] prepared = new byte[numberOfBytes];
// read the (potentially) prepared mock data
readNoLogging(prepared, 0, numberOfBytes);
//write the provided data for later verification
writeNoLogging(write, writeOffset, numberOfBytes);

// for every byte of the 'write' buffer, transfer a byte
// from the prepared data to the 'read' buffer.
int offsetIndex = readOffset;
for (byte preparedByte : prepared) {
read[offsetIndex++] = preparedByte;
}
// return number of byte returned
return readIndex - readOffset;
logger.info("{} TRANSFER(READ(0x{}), WRITE(0x{})", logPreamble, StringUtil.toHexString(prepared), StringUtil.toHexString(write, writeOffset, numberOfBytes));
// code for 'OK'
return 0;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int write(byte b) {
raw.add(b);
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: WRITE(0x");
logger.info(StringUtil.toHexString(b));
logger.info(")");
logger.info("{} WRITE(0x{})", logPreamble, StringUtil.toHexString(b));
return 0;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int write(byte[] data, int offset, int length) {
writeNoLogging(data, offset, length);
logger.info("{} WRITE(0x{})", logPreamble, StringUtil.toHexString(data, offset, length));
return length;
}

private void writeNoLogging(byte[] data, int offset, int length) {
Objects.checkFromIndexSize(offset, length, data.length);
for(int p = offset; p-offset < length; p++){
for (int p = offset; p - offset < length; p++) {
raw.add(data[p]); // add to internal buffer
}
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: WRITE(0x");
logger.info(StringUtil.toHexString(data, offset, length));
logger.info(")");
return length;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int write(Charset charset, CharSequence data) {
byte[] buffer = data.toString().getBytes(charset);
for(int p = 0; p < buffer.length; p++){
for (int p = 0; p < buffer.length; p++) {
raw.add(buffer[p]); // add to internal buffer
}
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: WRITE(\"");
logger.info(String.valueOf(data));
logger.info("\")");
logger.info("{} WRITE(\"{}\")", logPreamble, data);
return data.length();
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int read() {
if(raw.isEmpty()) return -1;
if (raw.isEmpty()) return -1;
byte b = raw.pop();
logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: READ (0x");
logger.info(StringUtil.toHexString(b));
logger.info(")");
logger.info("{} READ (0x{})", logPreamble, StringUtil.toHexString(b));
return b;
}

/** {@inheritDoc} */
/**
* {@inheritDoc}
*/
@Override
public int read(byte[] buffer, int offset, int length) {
Integer counter = readNoLogging(buffer, offset, length);
if (counter == null) return -1;

logger.info("{} READ (0x{})", logPreamble, StringUtil.toHexString(buffer, offset, length));

return counter;
}

private Integer readNoLogging(byte[] buffer, int offset, int length) {
Objects.checkFromIndexSize(offset, length, buffer.length);

if(raw.isEmpty()) return -1;
if (raw.isEmpty()) return null;
int counter = 0;
for(int p = 0; p < length; p++) {
if(p+offset > buffer.length) break;
if(raw.isEmpty()) break;
for (int p = 0; p < length; p++) {
if (p + offset > buffer.length) break;
if (raw.isEmpty()) break;
buffer[offset + p] = raw.pop();
counter++;
}

logger.info(" [");
logger.info(Mock.SPI_PROVIDER_NAME);
logger.info("::");
logger.info(this.id);
logger.info("] :: READ (0x");
logger.info(StringUtil.toHexString(buffer, offset, length));
logger.info(")");

return counter;
}
}

0 comments on commit 87c73c0

Please sign in to comment.