Skip to content

Commit

Permalink
Merged: Real-time sample event
Browse files Browse the repository at this point in the history
commit 3dbf47d
Author: Lyrinka Hyacinthoides <[email protected]>
Date:   Fri Jul 21 03:18:02 2023 +0800

    Implemented new sample event

commit 20a947a
Author: Lyrinka Hyacinthoides <[email protected]>
Date:   Fri Jul 21 03:04:31 2023 +0800

    Updated packet format

commit ac89e38
Author: Lyrinka Hyacinthoides <[email protected]>
Date:   Thu Jul 20 07:31:07 2023 +0800

    Preliminary DB interface
  • Loading branch information
lyrinka committed Jul 20, 2023
1 parent 2355c26 commit 62bd4e5
Show file tree
Hide file tree
Showing 9 changed files with 236 additions and 45 deletions.
23 changes: 23 additions & 0 deletions app/src/main/java/app/uvtracker/data/IPersistentDataAccess.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package app.uvtracker.data;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.util.Date;
import java.util.Map;

import app.uvtracker.data.type.Record;

public interface IPersistentDataAccess {

void clearDB();

void writeHourlyAverage(@NonNull Date time, @NonNull Record record);

@Nullable
Record readHourlyAverage(@NonNull Date time);

@NonNull
Map<Date, Record> readAllHourlyAverage();

}
10 changes: 10 additions & 0 deletions app/src/main/java/app/uvtracker/data/type/IFlattenable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app.uvtracker.data.type;

import androidx.annotation.NonNull;

public interface IFlattenable {

@NonNull
String flatten();

}
94 changes: 94 additions & 0 deletions app/src/main/java/app/uvtracker/data/type/Record.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package app.uvtracker.data.type;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import org.json.JSONException;
import org.json.JSONObject;

public class Record implements IFlattenable {

private static final String TAG = Record.class.getSimpleName();

@Nullable
public static Record unflatten(@NonNull String input) {
try {
JSONObject obj = new JSONObject(input);
return new Record(
(float)obj.getDouble("uv"),
(float)obj.getDouble("vis")
);
} catch (JSONException e) {
Log.w(TAG, "Could not parse record " + input);
e.printStackTrace();
return null;
}
}

@NonNull
public static Record decompress(byte uv, byte vis) {
// TODO: maybe extract this conversion out to somewhere?
return new Record(
(float)decompress8(uv) / 10.9375f,
(float)decompress44(vis) * 2.4f
);
}


public final float uvIndex;
public final float illuminance;

@Nullable
private String flattenedString;

public Record(float uvIndex, float illuminance) {
this.uvIndex = round2(uvIndex);
this.illuminance = round2(illuminance);
}

@NonNull
@Override
public String flatten() {
if(this.flattenedString == null)
this.flattenedString = this.flattenCore();
return this.flattenedString;
}

@NonNull
public String flattenCore() {
try {
JSONObject obj = new JSONObject();
obj.put("uv", this.uvIndex);
obj.put("vis", this.illuminance);
return obj.toString();
} catch (JSONException e) {
// As per documented suggestion
throw new RuntimeException(e);
}
}

@NonNull
@Override
public String toString() {
return String.format("{%1$.1flux,%2$.1fuvi}", this.illuminance, this.uvIndex);
}

private static float round2(float input) {
if(Float.isNaN(input)) return 0.0f;
return Math.round(input * 100.0f) / 100.0f;
}

private static int decompress44(byte input0) {
int input = Byte.toUnsignedInt(input0);
int dig = (input & 0xF0) >> 4;
int exp = (input & 0x0F);
return dig << exp;
}

private static int decompress8(byte input0) {
return Byte.toUnsignedInt(input0);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

public interface ISensorConnection extends IConnectable {

// TODO: implement this
// Emits event: NewSampleReceivedEvent

// TODO: more features

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

import androidx.annotation.NonNull;

import app.uvtracker.sensor.pii.connection.application.event.NewSampleReceivedEvent;
import app.uvtracker.sensor.pii.connection.packet.ISensorPacketConnection;
import app.uvtracker.sensor.pii.connection.packet.event.ParsedPacketReceivedEvent;
import app.uvtracker.sensor.pii.connection.shared.event.ConnectionStateChangeEvent;
import app.uvtracker.sensor.pii.event.EventHandler;
import app.uvtracker.sensor.pii.event.EventRegistry;
import app.uvtracker.sensor.pii.event.IEventListener;
import app.uvtracker.sensor.pii.event.IEventSource;
import app.uvtracker.sensor.protocol.packet.in.PacketInNewSample;

public class PIISensorConnectionImpl extends EventRegistry implements ISensorConnection, IEventListener {

Expand All @@ -21,7 +23,8 @@ public class PIISensorConnectionImpl extends EventRegistry implements ISensorCon
public PIISensorConnectionImpl(@NonNull ISensorPacketConnection baseConnection) {
this.packetEventRegistry = new EventRegistry();
this.baseConnection = baseConnection;
this.registerListener(this);
this.baseConnection.registerListener(this);
this.packetEventRegistry.registerListener(this);
}

// Base connection implementation
Expand All @@ -46,7 +49,7 @@ protected void onConnectionStateChange(@NonNull ConnectionStateChangeEvent event
this.dispatch(event);
}

// Specific implementation
// Packet event registry
@EventHandler
protected void onParsedPacketReception(@NonNull ParsedPacketReceivedEvent event) {
this.packetEventRegistry.dispatch(event.getPacket());
Expand All @@ -57,7 +60,10 @@ public IEventSource getPacketEventManager() {
return this.packetEventRegistry;
}


// TODO: implement this
// Packet handling
@EventHandler
protected void onPacketInNewSample(PacketInNewSample packet) {
this.dispatch(new NewSampleReceivedEvent(packet));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package app.uvtracker.sensor.pii.connection.application.event;

import androidx.annotation.NonNull;

import java.util.Date;

import app.uvtracker.data.type.Record;
import app.uvtracker.sensor.protocol.packet.in.PacketInNewSample;

public class NewSampleReceivedEvent {

@NonNull
private final Date localTimestamp;

private final int remoteTimestamp;

@NonNull
private final Record record;

public NewSampleReceivedEvent(@NonNull PacketInNewSample packet) {
this.localTimestamp = new Date();
this.remoteTimestamp = packet.getRemoteTimestamp();
this.record = packet.getRecord();
}

@NonNull
public Date getLocalTimestamp() {
return localTimestamp;
}

public int getRemoteTimestamp() {
return remoteTimestamp;
}

@NonNull
public Record getRecord() {
return record;
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package app.uvtracker.sensor.pii.connection.packet;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

Expand All @@ -21,6 +23,9 @@

public class PIISensorPacketConnectionImpl extends EventRegistry implements ISensorPacketConnection, IEventListener {

@NonNull
private static final String TAG = PIISensorPacketConnectionImpl.class.getSimpleName();

@NonNull
private final ISensorBytestreamConnection baseConnection;

Expand Down Expand Up @@ -67,6 +72,7 @@ public boolean write(@NonNull Packet packet) {
e.printStackTrace();
return false;
}
Log.d(TAG, "Encoded " + packet);
String message = "#" + encoded + "\r\n";
return this.baseConnection.write(message.getBytes(StandardCharsets.US_ASCII));
}
Expand All @@ -80,6 +86,7 @@ protected void onBytesReceived(@NonNull BytesReceivedEvent event) {
if(message.length() > 1 && message.startsWith("#")) {
try {
Packet decoded = IPacketCodec.get().decode(message.substring(1));
Log.d(TAG, "Decoded " + decoded);
this.dispatch(PacketReceivedEvent.fromPacket(decoded));
continue;
}
Expand All @@ -88,6 +95,7 @@ protected void onBytesReceived(@NonNull BytesReceivedEvent event) {
e.printStackTrace();
}
}
Log.d(TAG, "Received " + message);
this.dispatch(new UnrecognizableMessageReceivedEvent(message));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,69 @@

import androidx.annotation.NonNull;

import app.uvtracker.data.type.Record;
import app.uvtracker.sensor.protocol.codec.exception.PacketFormatException;
import app.uvtracker.sensor.protocol.packet.base.Packet;
import app.uvtracker.sensor.protocol.packet.base.PacketIn;
import app.uvtracker.sensor.protocol.util.Packing;

public class PacketInNewSample extends PacketIn {

private final int intensityUV;
private final int remoteTimestamp;

private final int intensityVIS;
@NonNull
private final Record record;

public PacketInNewSample(Packet packetBase) throws PacketFormatException {
super(packetBase);
PacketFormatException.requireLength(packetBase, 6);
this.intensityVIS = Packing.unpack3(this.payload, 0);
this.intensityUV = Packing.unpack3(this.payload, 3);
PacketFormatException.requireLength(packetBase, 7);
this.remoteTimestamp = Packing.unpack4(this.payload, 0) * 60 + Packing.unpack1(this.payload, 4);
this.record = Record.decompress(this.payload[6], this.payload[5]);
}

public int getIntensityUV() {
return intensityUV;
public int getRemoteTimestamp() {
return this.remoteTimestamp;
}

public int getIntensityVIS() {
return intensityVIS;
@NonNull
public Record getRecord() {
return this.record;
}

@Override
@NonNull
public String toString() {
return this.type + String.format("{VIS=%1$d,UV=%2$d}", this.intensityVIS, this.intensityUV);
int day = 0;
int hour = 0;
int minute = 0;
int second = this.remoteTimestamp;
if(second >= 60) {
minute = second / 60;
second = second % 60;
}
if(minute >= 60) {
hour = minute / 60;
minute = minute % 60;
}
if(hour >= 24) {
day = hour / 24;
hour = hour % 24;
}
StringBuilder sb = new StringBuilder();
boolean flag = false;
if(day > 0) {
flag = true;
sb.append(day).append("d");
}
if(flag || hour > 0) {
flag = true;
sb.append(hour).append("h");
}
if(flag || minute > 0) {
sb.append(minute).append("m");
}
sb.append(second).append("s");
return this.type + String.format("{%1$s,%2$s}", sb, this.record);
}

}
Loading

0 comments on commit 62bd4e5

Please sign in to comment.