Replace BooleanFormatter by IntegerFormatter, add some tests

(inspired by https://github.com/ImperialSpaceSociety/ttnhabbridge )
pull/3/head
Bertrik Sikken 2020-02-02 14:22:35 +01:00
rodzic 9dafa1106a
commit e14a4158de
3 zmienionych plików z 77 dodań i 61 usunięć

Wyświetl plik

@ -8,18 +8,18 @@ import java.util.stream.Stream;
import nl.sikken.bertrik.cayenne.formatter.FloatFormatter;
import nl.sikken.bertrik.cayenne.formatter.GpsFormatter;
import nl.sikken.bertrik.cayenne.formatter.IFormatter;
import nl.sikken.bertrik.cayenne.formatter.BooleanFormatter;
import nl.sikken.bertrik.cayenne.formatter.IntegerFormatter;
/**
* Enumeration of possible Cayenne item types.
*/
public enum ECayenneItem {
DIGITAL_INPUT(0, new BooleanFormatter(1, 1, false)),
DIGITAL_OUTPUT(1, new BooleanFormatter(1, 1, false)),
DIGITAL_INPUT(0, new IntegerFormatter(1, 1, false)),
DIGITAL_OUTPUT(1, new IntegerFormatter(1, 1, false)),
ANALOG_INPUT(2, new FloatFormatter(1, 2, 0.01, true)),
ANALOG_OUTPUT(3, new FloatFormatter(1, 2, 0.01, true)),
ILLUMINANCE(101, new FloatFormatter(1, 2, 1.0, false)),
PRESENCE(102, new BooleanFormatter(1, 1, false)),
PRESENCE(102, new IntegerFormatter(1, 1, false)),
TEMPERATURE(103, new FloatFormatter(1, 2, 0.1, true)),
HUMIDITY(104, new FloatFormatter(1, 1, 0.5, false)),
ACCELEROMETER(113, new FloatFormatter(3, 2, 0.001, true)),

Wyświetl plik

@ -1,53 +1,50 @@
package nl.sikken.bertrik.cayenne.formatter;
import java.nio.ByteBuffer;
import java.util.Locale;
/**
* Formatter for cayenne items which represent booleans.
*/
public final class BooleanFormatter extends BaseFormatter {
private final int length;
private final int size;
private final boolean signed;
/**
* Constructor.
*
* @param length the length of the return vector
* @param size the size of each element
* @param signed if the element is signed
*/
public BooleanFormatter(int length, int size, boolean signed) {
this.length = length;
this.size = size;
this.signed = signed;
}
@Override
public Integer[] parse(ByteBuffer bb) {
Integer[] values = new Integer[length];
for (int i = 0; i < length; i++) {
values[i] = (getValue(bb, size, signed) > 0) ? 1 : 0;
}
return values;
}
@Override
public String[] format(Number[] values) {
String[] formatted = new String[length];
for (int i = 0; i < length; i++) {
formatted[i] = String.format(Locale.ROOT, "%d", values[i].intValue());
}
return formatted;
}
@Override
public void encode(ByteBuffer bb, Number[] values) {
for (int i = 0; i < length; i++) {
putValue(bb, 1, values[i].intValue() > 0 ? 1 : 0);
}
}
}
package nl.sikken.bertrik.cayenne.formatter;
import java.nio.ByteBuffer;
import java.util.Locale;
public final class IntegerFormatter extends BaseFormatter {
private final int length;
private final int size;
private final boolean signed;
/**
* Constructor.
*
* @param length the number of elements
* @param size the size of each element
* @param signed if the element is signed
*/
public IntegerFormatter(int length, int size, boolean signed) {
this.length = length;
this.size = size;
this.signed = signed;
}
@Override
public Number[] parse(ByteBuffer bb) {
Integer[] values = new Integer[length];
for (int i = 0; i < length; i++) {
values[i] = getValue(bb, size, signed);
}
return values;
}
@Override
public String[] format(Number[] values) {
String[] formatted = new String[length];
for (int i = 0; i < length; i++) {
formatted[i] = String.format(Locale.ROOT, "%d", values[i].intValue());
}
return formatted;
}
@Override
public void encode(ByteBuffer bb, Number[] values) {
for (int i = 0; i < length; i++) {
putValue(bb, size, values[i].intValue());
}
}
}

Wyświetl plik

@ -186,21 +186,40 @@ public final class CayenneMessageTest {
}
/**
* Verifies encoding of a boolean value.
* Verifies encoding of a digital input.
*
* @throws CayenneException in case of a parsing exception
*/
@Test
public void encodeBoolean() throws CayenneException {
public void testDigitalInput() throws CayenneException {
final CayenneMessage message = new CayenneMessage();
message.add(new CayenneItem(1, ECayenneItem.PRESENCE, 1));
message.add(new CayenneItem(1, ECayenneItem.DIGITAL_INPUT, 1));
final byte[] encoded = message.encode(MAX_BUF_SIZE);
final CayenneMessage decoded = CayenneMessage.parse(encoded);
final CayenneItem item = decoded.getItems().get(0);
Assert.assertEquals(ECayenneItem.DIGITAL_INPUT, item.getType());
Assert.assertEquals(1, item.getValues()[0].intValue());
}
/**
* Verifies encoding/decoding of a presence value (e.g. number of satellites)
*
* @throws CayenneException
*/
@Test
public void testPresence() throws CayenneException {
final CayenneMessage message = new CayenneMessage();
message.add(new CayenneItem(1, ECayenneItem.PRESENCE, 7));
final byte[] encoded = message.encode(MAX_BUF_SIZE);
final CayenneMessage decoded = CayenneMessage.parse(encoded);
final CayenneItem item = decoded.getItems().get(0);
Assert.assertEquals(ECayenneItem.PRESENCE, item.getType());
Assert.assertEquals(1, item.getValues()[0].intValue());
Assert.assertEquals(7, item.getValues()[0].intValue());
Assert.assertEquals("7", item.format()[0]);
}
}