diff --git a/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetryFrame.java b/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetryFrame.java index 4483bc611c7d3d4467030c87c87735a20421c7b9..bb7e24efa9c4f863a4c6212eb57e937bf61ed0d4 100644 --- a/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetryFrame.java +++ b/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetryFrame.java @@ -17,11 +17,22 @@ import java.util.Set; * @since mk18 (GIPSY DANGER) */ public class TelemetryFrame { + public static final String KEY_TIME = "time"; + public static final String KEY_TIME_NS = "time_ns"; + public static final String KEY_SYMBOLS = "symbols"; + private final HashSet symbols = new HashSet<>(); private final Instant time; public TelemetryFrame(JSONObject json) { - throw new UnsupportedOperationException(); + time = Instant.ofEpochMilli(json.getLong(KEY_TIME)); + // TODO: Support time_ns + + JSONArray arr = json.getJSONArray(KEY_SYMBOLS); + for (int i = 0; i < arr.length(); i++) { + JSONObject symJson = arr.getJSONObject(i); + symbols.add(new TelemetrySymbol(symJson)); + } } public TelemetryFrame(Instant time) { @@ -34,14 +45,14 @@ public class TelemetryFrame { public JSONObject toJson() { JSONObject frameJson = new JSONObject(); - frameJson.put("time", time.toEpochMilli()); - frameJson.put("time_ns", time.getNano()); + frameJson.put(KEY_TIME, time.toEpochMilli()); + frameJson.put(KEY_TIME_NS, time.getNano()); JSONArray symbolsArray = new JSONArray(); for (TelemetrySymbol s : symbols) { symbolsArray.put(s.toJson()); } if (symbolsArray.length() > 0) { - frameJson.put("symbols", symbolsArray); + frameJson.put(KEY_SYMBOLS, symbolsArray); } return frameJson; } diff --git a/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetrySymbol.java b/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetrySymbol.java index 8a70c0177c85074c1e3ef35982b3b981512fb435..ac7e1147701f5dded204f5c8d0d4c9c5e89dcb89 100644 --- a/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetrySymbol.java +++ b/lc-esp-sdk/src/main/java/lc/esp/sdk/telemetry/TelemetrySymbol.java @@ -33,6 +33,15 @@ public class TelemetrySymbol { private final boolean isLos; private final boolean isPrimary; + public TelemetrySymbol(JSONObject obj) { + name = obj.getString(KEY_NAME); + value = obj.getString(KEY_VALUE); + uom = obj.optString(KEY_UOM); + uot = obj.optString(KEY_UOT); + isLos = obj.getBoolean(KEY_LOS); + isPrimary = obj.getBoolean(KEY_PRIMARY); + } + public TelemetrySymbol(String name, Serializable value, boolean isPrimary) { this.name = name; this.value = value; diff --git a/lc-historian-service/build.gradle b/lc-historian-service/build.gradle new file mode 100644 index 0000000000000000000000000000000000000000..6a541835cbc6741d472d98c3e7626f1860ec1271 --- /dev/null +++ b/lc-historian-service/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'java' + id 'application' +} + +group 'leighco' +version '1.0' + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':lc-esp-sdk') + implementation project(':lc-mecha-http-client') + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' +} + +test { + useJUnitPlatform() +} + + +application { + mainClass = 'lc.historian.service.HistorianService' +} diff --git a/lc-historian-service/src/main/java/lc/historian/service/HistorianService.java b/lc-historian-service/src/main/java/lc/historian/service/HistorianService.java new file mode 100644 index 0000000000000000000000000000000000000000..67236bb33a1815478c0ec580db1c1a0b5aadcbfe --- /dev/null +++ b/lc-historian-service/src/main/java/lc/historian/service/HistorianService.java @@ -0,0 +1,48 @@ +package lc.historian.service; + +import lc.esp.sdk.*; +import lc.esp.sdk.telemetry.TelemetryFrame; +import lc.mecha.log.MechaLogger; +import lc.mecha.log.MechaLoggerFactory; +import lc.mecha.util.BasicallyDangerous; +import lc.mecha.util.UniversalJob; + +public class HistorianService extends BasicallyDangerous { + private static final MechaLogger logger = MechaLoggerFactory.getLogger(HistorianService.class); + + public static void main(String[] args) { + UniversalJob.banner(logger, "Historian mk1"); + new HistorianService().run(); + } + + @Override + public void runDangerously() throws Exception { + + ESPAddress telemDest = new ESPAddress("leighco", "prod", + "minecraft", "neweden", ESPAddressClass.TOPIC, + ESPMessageClass.TELEMETRY); + + try (ESPClient esp = new ESPClient()) { + esp.start(); + try (ESPSession session = esp.createSession()) { + try (ESPConsumer consumer = session.createConsumer(telemDest)) { + //noinspection InfiniteLoopStatement + while (true) { + ESPMessage msg = consumer.receive(); + + publish(msg); + + + logger.info("Got message: {}", msg); + } + } + } + } + } + + private void publish(ESPMessage msg) { + TelemetryFrame tf = new TelemetryFrame(msg.getPayload()); + + logger.info("Built telemetry frame: {}", tf); + } +} diff --git a/settings.gradle b/settings.gradle index 1ed47fe651ec9824c5fd1f3b2ff23b9d5a351f7d..9eb52dea6bf26af2b19b4fc0d9a30214f3b13128 100644 --- a/settings.gradle +++ b/settings.gradle @@ -61,4 +61,5 @@ include 'lc-junk' include 'qody:qody-vision-service' include 'lc-esp-hello-service' include 'lc-esp-hello-client' +include 'lc-historian-service'