Skip to content

Commit

Permalink
api v3.4.0 commit
Browse files Browse the repository at this point in the history
  • Loading branch information
scaryghost committed Mar 7, 2018
1 parent ddf09cc commit 03dae0d
Show file tree
Hide file tree
Showing 27 changed files with 324 additions and 140 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Then, add the compile element to the dependencies closure in the module's ``buil

```gradle
dependencies {
compile 'com.mbientlab:metawear:3.3.0'
compile 'com.mbientlab:metawear:3.4.0'
}
```

Expand Down
4 changes: 2 additions & 2 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ android {
defaultConfig {
minSdkVersion 18
targetSdkVersion 27
versionCode 54
versionName "3.3.0"
versionCode 55
versionName "3.4.0"
}
buildTypes {
release {
Expand Down
11 changes: 10 additions & 1 deletion library/src/main/java/com/mbientlab/metawear/Data.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,21 @@ public interface Data {
* @return Array of valid classes
*/
Class<?>[] types();

/**
* Converts the data bytes to a usable data type
* @param clazz Class type to convert to
* @param clazz Class type to convert the value to
* @param <T> Runtime type the return value is casted as
* @return Data value as the specified type
* @throws ClassCastException if the data cannot be casted to desired type
*/
<T> T value(Class<T> clazz);
/**
* Extra information attached to this data sample
* @param clazz Class type to convert the value to
* @param <T> Runtime type the return value is casted as
* @return Extra data casted as the specified type
* @throws ClassCastException if the data cannot be casted to the desired type
*/
<T> T extra(Class<T> clazz);
}
6 changes: 6 additions & 0 deletions library/src/main/java/com/mbientlab/metawear/DataToken.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,10 @@
* @author Eric Tsai
*/
public interface DataToken {
/**
* Creates a <code>DataToken</code> copy that represents a portion of the original data
* @param offset Byte to start copying from
* @param length Number of bytes to copy
*/
DataToken slice(byte offset, byte length);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
package com.mbientlab.metawear.builder;

import com.mbientlab.metawear.CodeBlock;
import com.mbientlab.metawear.Data;
import com.mbientlab.metawear.DataToken;
import com.mbientlab.metawear.Subscriber;
import com.mbientlab.metawear.builder.filter.*;
Expand Down Expand Up @@ -269,9 +270,29 @@ interface Action {
* @return Object representing the output of the packer
*/
RouteComponent pack(byte count);

/**
* Add additional information to the payload to reconstruct timestamps from streamed data
* @return Object representing the output of the accounter
* Types of information the accounter processor can append to the data
* @author Eric Tsai
*/
enum AccountType {
/**
* Append a looping counter to all data.
* The counter's value is accessed by calling {@link Data#extra(Class)} with the <code>Long</code> type
*/
COUNT,
/** Extra information used to calculate actual timestamps for streamed data */
TIME
}
/**
* Variant of {@link #account(AccountType)} that defaults to recalculating timestamps
* @return Object representing the accounter output
*/
RouteComponent account();
/**
* Add additional information to the payload to assist in checking if streamed data is lost
* @param type Type of information to append to the data<
* @return Object representing the accounter output
*/
RouteComponent account(AccountType type);
}
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,13 @@ protected float scale(MetaWearBoardPrivate mwPrivate) {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp, DataPrivate.ClassToObject mapper) {
ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
short[] unscaled = new short[]{buffer.getShort(), buffer.getShort(), buffer.getShort()};
final float scale= scale(mwPrivate);
final Acceleration value= new Acceleration(unscaled[0] / scale, unscaled[1] / scale, unscaled[2] / scale);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public float scale() {
return scale;
Expand Down Expand Up @@ -196,11 +196,11 @@ public DataTypeBase copy(DataTypeBase input, Constant.Module module, byte regist
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
int mask = mwPrivate.lookupModuleInfo(ACCELEROMETER).revision >= FLAT_REVISION ? 0x4 : 0x2;
final boolean isFlat = (data[0] & mask) == mask;

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(Boolean.class)) {
Expand Down Expand Up @@ -233,10 +233,10 @@ public DataTypeBase copy(DataTypeBase input, Constant.Module module, byte regist
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final SensorOrientation orientation = SensorOrientation.values()[((data[0] & 0x6) >> 1) + 4 * ((data[0] & 0x8) >> 3)];

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(SensorOrientation.class)) {
Expand Down Expand Up @@ -274,7 +274,7 @@ private boolean highG(CartesianAxis axis, byte value) {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final byte highFirst = (byte) ((data[0] & 0x1c) >> 2);
final LowHighResponse castedData = new LowHighResponse(
(data[0] & 0x1) == 0x1,
Expand All @@ -284,7 +284,7 @@ public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final
highG(CartesianAxis.Z, highFirst),
(data[0] & 0x20) == 0x20 ? Sign.NEGATIVE : Sign.POSITIVE);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(LowHighResponse.class)) {
Expand Down Expand Up @@ -322,15 +322,15 @@ private boolean detected(CartesianAxis axis, byte value) {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final AnyMotion castedData = new AnyMotion(
(data[0] & 0x40) == 0x40 ? Sign.NEGATIVE : Sign.POSITIVE,
detected(CartesianAxis.X, data[0]),
detected(CartesianAxis.Y, data[0]),
detected(CartesianAxis.Z, data[0])
);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(AnyMotion.class)) {
Expand Down Expand Up @@ -363,7 +363,7 @@ public DataTypeBase copy(DataTypeBase input, Constant.Module module, byte regist
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
TapType type = null;
if ((data[0] & 0x1) == 0x1) {
type = TapType.DOUBLE;
Expand All @@ -372,7 +372,7 @@ public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final
}

final Tap castedData = new Tap(type, (data[0] & 0x20) == 0x20 ? Sign.NEGATIVE : Sign.POSITIVE);
return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(Tap.class)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,12 @@ public DataTypeBase[] createSplits() {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp, DataPrivate.ClassToObject mapper) {
ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
final float scale= scale(mwPrivate);
final Acceleration value= new Acceleration(buffer.getShort() / scale, buffer.getShort() / scale, buffer.getShort() / scale);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public float scale() {
return scale;
Expand Down Expand Up @@ -249,12 +249,12 @@ public Number convertToFirmwareUnits(MetaWearBoardPrivate mwPrivate, Number valu
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
int offset = (data[0] & 0x06) >> 1;
int index = 4 * (data[0] & 0x01) + ((offset == 2 || offset == 3) ? offset ^ 0x1 : offset);
final SensorOrientation orientation = SensorOrientation.values()[index];

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(SensorOrientation.class)) {
Expand Down Expand Up @@ -300,13 +300,13 @@ private Sign direction(CartesianAxis axis, byte value) {
return (value & mask) == mask ? Sign.NEGATIVE : Sign.POSITIVE;
}
@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final Movement castedData = new Movement(
new boolean[] {exceedsThreshold(CartesianAxis.X, data[0]), exceedsThreshold(CartesianAxis.Y, data[0]), exceedsThreshold(CartesianAxis.Z, data[0])},
new Sign[] {direction(CartesianAxis.X, data[0]), direction(CartesianAxis.Y, data[0]), direction(CartesianAxis.Z, data[0])}
);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(Movement.class)) {
Expand Down Expand Up @@ -357,13 +357,13 @@ private TapType type(byte value) {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final Tap castedData = new Tap(
new boolean[] {active(CartesianAxis.X, data[0]), active(CartesianAxis.Y, data[0]), active(CartesianAxis.Z, data[0])},
new Sign[] {polarity(CartesianAxis.X, data[0]), polarity(CartesianAxis.Y, data[0]), polarity(CartesianAxis.Z, data[0])},
type(data[0])
);
return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(Tap.class)) {
Expand Down Expand Up @@ -411,13 +411,13 @@ private Sign direction(CartesianAxis axis, byte value) {
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, Calendar timestamp, DataPrivate.ClassToObject mapper) {
final Movement castedData = new Movement(
new boolean[] {exceedsThreshold(CartesianAxis.X, data[0]), exceedsThreshold(CartesianAxis.Y, data[0]), exceedsThreshold(CartesianAxis.Z, data[0])},
new Sign[] {direction(CartesianAxis.X, data[0]), direction(CartesianAxis.Y, data[0]), direction(CartesianAxis.Z, data[0])}
);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public <T> T value(Class<T> clazz) {
if (clazz.equals(Movement.class)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ public Number convertToFirmwareUnits(MetaWearBoardPrivate mwPrivate, Number valu
}

@Override
public Data createMessage(boolean logData, final MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp) {
return new DataPrivate(timestamp, data) {
public Data createMessage(boolean logData, final MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp, DataPrivate.ClassToObject mapper) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public Class<?>[] types() {
return new Class<?>[] { byte[].class };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public Number convertToFirmwareUnits(MetaWearBoardPrivate mwPrivate, Number valu
}

@Override
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp) {
public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final byte[] data, final Calendar timestamp, DataPrivate.ClassToObject mapper) {
ByteBuffer buffer = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
final ColorAdc wrapper= new ColorAdc(
buffer.getShort() & 0xffff,
Expand All @@ -94,7 +94,7 @@ public Data createMessage(boolean logData, MetaWearBoardPrivate mwPrivate, final
buffer.getShort() & 0xffff
);

return new DataPrivate(timestamp, data) {
return new DataPrivate(timestamp, data, mapper) {
@Override
public Class<?>[] types() {
return new Class<?>[] {ColorAdc.class};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,18 @@
* Created by etsai on 9/4/16.
*/
abstract class DataPrivate implements Data {
interface ClassToObject {
Object apply(Class<?> clazz);
}

private final Calendar timestamp;
private final byte[] dataBytes;
private final ClassToObject mapper;

DataPrivate(Calendar timestamp, byte[] dataBytes) {
DataPrivate(Calendar timestamp, byte[] dataBytes, ClassToObject mapper) {
this.timestamp = timestamp;
this.dataBytes = dataBytes;
this.mapper = mapper;
}

@Override
Expand Down Expand Up @@ -66,6 +72,15 @@ public <T> T value(Class<T> clazz) {
throw new ClassCastException(String.format(Locale.US, "Invalid input class: \'%s\'", clazz.toString()));
}

@Override
public <T> T extra(Class<T> clazz) {
Object value;
if (mapper == null || (value = mapper.apply(clazz)) == null) {
throw new ClassCastException(String.format(Locale.US, "Invalid input class: \'%s\'", clazz.toString()));
}
return clazz.cast(value);
}

@Override
public String toString() {
return String.format(Locale.US, "{timestamp: %s, data: %s}", formattedTimestamp(), Util.arrayToHexString(bytes()));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.mbientlab.metawear.impl;

import com.mbientlab.metawear.builder.RouteComponent;
import com.mbientlab.metawear.builder.filter.ComparisonOutput;
import com.mbientlab.metawear.builder.filter.DifferentialOutput;
import com.mbientlab.metawear.builder.filter.ThresholdOutput;
Expand Down Expand Up @@ -705,22 +706,25 @@ static class Accounter extends DataProcessorConfig {
static final byte ID = 0x11;

final byte length;
final RouteComponent.AccountType type;

Accounter(byte length) {
Accounter(byte length, RouteComponent.AccountType type) {
super(ID);

this.length = length;
this.type = type;
}

Accounter(byte[] config) {
super(config[0]);

length = (byte) (((config[1] >> 4) & 0x3) + 1);
type = RouteComponent.AccountType.values()[config[1] & 0xf];
}

@Override
byte[] build() {
return new byte[] {ID, (byte) (0x1 | ((length - 1) << 4)), 0x3};
return new byte[] {ID, (byte) (type.ordinal() | ((length - 1) << 4)), 0x3};
}

@Override
Expand Down
Loading

0 comments on commit 03dae0d

Please sign in to comment.