Update CayenneMessage: it's now a list of CayenneItems.

pull/3/head
Bertrik Sikken 2017-09-08 01:27:27 +02:00
rodzic 4d9d9bb675
commit 6078b8eaff
3 zmienionych plików z 102 dodań i 33 usunięć

Wyświetl plik

@ -0,0 +1,45 @@
package nl.sikken.bertrik.cayenne;
import java.util.Arrays;
import java.util.Locale;
/**
* Representation of one measurement item in a cayenne message.
*/
public final class CayenneItem {
private final int channel;
private final ECayenneItem type;
private final String[] value;
/**
* Constructor.
*
* @param channel the unique channel
* @param type the type
* @param value the (string) value
*/
public CayenneItem(int channel, ECayenneItem type, String[] value) {
this.channel = channel;
this.type = type;
this.value = value;
}
public int getChannel() {
return channel;
}
public ECayenneItem getType() {
return type;
}
public String[] getValue() {
return value;
}
@Override
public String toString() {
return String.format(Locale.US, "{chan=%d,type=%s,value=%s}", channel, type, Arrays.toString(value));
}
}

Wyświetl plik

@ -2,18 +2,17 @@ package nl.sikken.bertrik.cayenne;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.List;
/**
* A cayenne message containing cayenne data items.
*/
public final class CayenneMessage {
private final Map<Integer,String[]> map = new HashMap<>();
private final List<CayenneItem> items = new ArrayList<>();
/**
* Parses the byte array into a cayenne message.
@ -34,7 +33,8 @@ public final class CayenneMessage {
throw new CayenneException("Invalid cayenne type " + type);
}
final String[] formatted = ct.format(bb);
message.map.put(channel, formatted);
final CayenneItem item = new CayenneItem(channel, ct, formatted);
message.items.add(item);
}
} catch (BufferUnderflowException e) {
throw new CayenneException(e);
@ -43,19 +43,35 @@ public final class CayenneMessage {
}
/**
* @return a map from a channel number to a formatted String[].
* @return an immutable list of measurement items in the order it appears in the raw data
*/
public Map<Integer, String[]> getItems() {
return Collections.unmodifiableMap(map);
public List<CayenneItem> getItems() {
return Collections.unmodifiableList(items);
}
/**
* Finds an item by type.
*
* @param type the desired type
* @return the item, or null if it does not exist
*/
public CayenneItem ofType(ECayenneItem type) {
return items.stream().filter(i -> (i.getType() == type)).findFirst().orElse(null);
}
/**
* Finds an item by channel.
*
* @param channel the desired channel
* @return the item, or null if it does not exist
*/
public CayenneItem ofChannel(int channel) {
return items.stream().filter(i -> (i.getChannel() == channel)).findFirst().orElse(null);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
map.forEach((k,v) -> {
sb.append(String.format(Locale.US, "[%d]='%s',", k, Arrays.toString(v)));
});
return sb.toString();
return Arrays.toString(items.toArray());
}
}

Wyświetl plik

@ -1,7 +1,6 @@
package nl.sikken.bertrik.cayenne;
import java.util.Base64;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
@ -23,11 +22,10 @@ public final class CayenneMessageTest {
public void testTwoTemperatureSensors() throws CayenneException {
final byte[] data = {0x03, 0x67, 0x01, 0x10, 0x05, 0x67, 0x00, (byte) 0xFF};
final CayenneMessage payload = CayenneMessage.parse(data);
LOG.info("payload = {}", payload);
LOG.info("payload: {}", payload);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"27.2"}, items.get(3));
Assert.assertArrayEquals(new String[] {"25.5"}, items.get(5));
Assert.assertArrayEquals(new String[] {"27.2"}, payload.ofChannel(3).getValue());
Assert.assertArrayEquals(new String[] {"25.5"}, payload.ofChannel(5).getValue());
}
/**
@ -40,9 +38,8 @@ public final class CayenneMessageTest {
{0x01, 0x67, (byte) 0xFF, (byte) 0xD7, 0x06, 0x71, 0x04, (byte) 0xD2, (byte) 0xFB, 0x2E, 0x00, 0x00};
final CayenneMessage payload = CayenneMessage.parse(data);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"-4.1"}, items.get(1));
Assert.assertArrayEquals(new String[] {"1.234", "-1.234", "0.000"}, items.get(6));
Assert.assertArrayEquals(new String[] {"-4.1"}, payload.ofChannel(1).getValue());
Assert.assertArrayEquals(new String[] {"1.234", "-1.234", "0.000"}, payload.ofChannel(6).getValue());
}
/**
@ -55,8 +52,7 @@ public final class CayenneMessageTest {
{0x01, (byte) 0x88, 0x06, 0x076, 0x5f, (byte) 0xf2, (byte) 0x96, 0x0a, 0x00, 0x03, (byte) 0xe8};
final CayenneMessage payload = CayenneMessage.parse(data);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"42.3519", "-87.9094", "10.00"}, items.get(1));
Assert.assertArrayEquals(new String[] {"42.3519", "-87.9094", "10.00"}, payload.ofChannel(1).getValue());
}
/**
@ -68,8 +64,8 @@ public final class CayenneMessageTest {
final byte[] data = {1, 104, 100};
final CayenneMessage payload = CayenneMessage.parse(data);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"50.0"}, items.get(1));
// final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"50.0"}, payload.ofChannel(1).getValue());
}
/**
@ -82,10 +78,9 @@ public final class CayenneMessageTest {
final byte[] data = Base64.getDecoder().decode(base64);
final CayenneMessage payload = CayenneMessage.parse(data);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"52.0225", "4.6928", "-2.00"}, items.get(1));
Assert.assertArrayEquals(new String[] {"247.84"}, items.get(2));
Assert.assertArrayEquals(new String[] {"27.0"}, items.get(3));
Assert.assertArrayEquals(new String[] {"52.0225", "4.6928", "-2.00"}, payload.ofChannel(1).getValue());
Assert.assertArrayEquals(new String[] {"247.84"}, payload.ofChannel(2).getValue());
Assert.assertArrayEquals(new String[] {"27.0"}, payload.ofChannel(3).getValue());
}
/**
@ -98,10 +93,23 @@ public final class CayenneMessageTest {
final byte[] data = Base64.getDecoder().decode(base64);
final CayenneMessage payload = CayenneMessage.parse(data);
final Map<Integer, String[]> items = payload.getItems();
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"}, items.get(1));
Assert.assertArrayEquals(new String[] {"4.15"}, items.get(2));
Assert.assertArrayEquals(new String[] {"24.0"}, items.get(3));
// verify we can get at the data by channel
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"}, payload.ofChannel(1).getValue());
Assert.assertArrayEquals(new String[] {"4.15"}, payload.ofChannel(2).getValue());
Assert.assertArrayEquals(new String[] {"24.0"}, payload.ofChannel(3).getValue());
// verify we can also get data by type
Assert.assertArrayEquals(new String[] {"52.0225", "4.6925", "-17.00"},
payload.ofType(ECayenneItem.GPS_LOCATION).getValue());
Assert.assertArrayEquals(new String[] {"4.15"}, payload.ofType(ECayenneItem.ANALOG_INPUT).getValue());
Assert.assertArrayEquals(new String[] {"24.0"}, payload.ofType(ECayenneItem.TEMPERATURE).getValue());
// verify non-existing channel and type
Assert.assertNull(payload.ofChannel(0));
Assert.assertNull(payload.ofType(ECayenneItem.BAROMETER));
// verify toString method
Assert.assertNotNull(payload.toString());
}
/**