59: Show Evelyn status indices in Mission Control Overview
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
schema: spec-driven
|
||||
created: 2026-08-05
|
||||
@@ -0,0 +1,28 @@
|
||||
## Context
|
||||
|
||||
Before this change, `Evelyn` declared `@NotNull String getStatusReport()`, `EvelynImpl` returned `"Hello World!"`, and no other local source called it. Mission Control presents parallel Production and Test tab sets. The API and reference implementations must remain separated by package.
|
||||
|
||||
## Goals / Non-Goals
|
||||
|
||||
**Goals:** Define a typed immutable measurement contract, replace the text API, and render each environment's Evelyn history in its corresponding existing Overview tab without disturbing the Production/Test tabs or styling.
|
||||
|
||||
**Non-Goals:** Real index calculation, persistence, refresh/polling after view creation, environment discovery, dependency resolution, final Nenjim environment wiring, and automated tests.
|
||||
|
||||
## Decisions
|
||||
|
||||
- Add `EvelynStatusIndexPoint` beside the Evelyn public API as an immutable value type. Use `Instant` for the timestamp and `BigDecimal` for each named index so time semantics are explicit and decimal values retain precision. A map or six-element list was rejected because it would lose compile-time names and completeness.
|
||||
- Replace, rather than supplement, `getStatusReport()` with `@NotNull List<EvelynStatusIndexPoint> getStatusIndexHistory()`. The implementation returns an immutable hardcoded list in chronological order; callers must also tolerate an empty list. Keeping the text API was rejected because the issue intentionally replaces that contract.
|
||||
- Make `EvelynMissionControlImpl` accept separate Production and Test Evelyn references. Fetch each reference's history while constructing its corresponding Overview so the two tabs remain independent even when the reference implementations currently return identical hardcoded values.
|
||||
- Construct a distinct chart, axes, series, and data nodes for each Overview. Sharing a JavaFX `Node` is not valid because a node cannot have two parents.
|
||||
- Have `NenjimHubImpl` create two separate `EvelynImpl` instances as temporary Production and Test placeholders and pass both to Mission Control. Future Nenjim wiring will supply the actual environment-specific Evelyn references; environment discovery and dependency resolution are outside issue #59.
|
||||
- Use a time-capable numeric X-axis derived from each point's timestamp and a numeric Y-axis. Compute the largest absolute index magnitude across all series and use its negative and positive values as equal bounds; use a small symmetric fallback span when history is empty or all values are zero so zero remains visible. JavaFX chart construction remains in the reference implementation.
|
||||
|
||||
## Risks / Trade-offs
|
||||
|
||||
- [Hardcoded history can look authoritative] → Keep values clearly sample-only and isolate them in `EvelynImpl` for later replacement.
|
||||
- [One extreme index compresses the other lines] → Accept a shared scale because direct comparison and a common zero baseline are required.
|
||||
- [Breaking API removal affects downstream consumers outside this repository] → Publish the typed replacement in the same release and call out the method migration.
|
||||
|
||||
## Migration Plan
|
||||
|
||||
Add the value type, replace the interface method and reference implementation, construct distinct Production and Test Overview charts from their corresponding Evelyn references, and compile the project. Roll back the API and Overview changes together if needed; no stored data requires migration.
|
||||
@@ -0,0 +1,27 @@
|
||||
## Why
|
||||
|
||||
Evelyn exposes only an unstructured textual status report, which prevents Mission Control from plotting status changes over time. A typed historical API will make the six status indexes directly consumable by the existing Overview views.
|
||||
|
||||
## What Changes
|
||||
|
||||
- **BREAKING** Replace `Evelyn.getStatusReport()` with `List<EvelynStatusIndexPoint> getStatusIndexHistory()`.
|
||||
- Add a typed measurement point containing a timestamp and the six Evelyn status indexes.
|
||||
- Initially provide oldest-to-newest hardcoded sample history from the reference implementation.
|
||||
- Give Mission Control separate Production and Test `Evelyn` references and plot each reference's history in its corresponding Overview tab using separate chart instances with dynamic Y-axes symmetric around a visible zero.
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `evelyn-status-index-history`: Typed historical status-index access and Mission Control visualization.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
None.
|
||||
|
||||
## Impact
|
||||
|
||||
- Affects the Evelyn public API and reference implementation in `com.fanitas.evelyn.core`.
|
||||
- Affects Evelyn Mission Control's existing Overview content and introduces explicit Production/Test Evelyn wiring.
|
||||
- Removes the textual status-report API; the repository currently has no callers beyond its declaration and implementation.
|
||||
- Adds no persistence, real index calculation, environment discovery, dependency resolution, external dependency, or automated tests.
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
## Purpose
|
||||
|
||||
Provide typed historical Evelyn status measurements and make all six indexes visible over time in Mission Control.
|
||||
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: Evelyn provides historical status-index measurements
|
||||
Evelyn SHALL expose a non-null list of typed measurement points ordered from oldest to newest. Each point SHALL contain a timestamp, Evelyn Price Index, EVE_SYRUP Pool Depth Index, EVE_SYRUP Pool Balance Index, AAZDKK_USDT Pool Balance Index, AAZDKK_USDT Pool Price Index, and AAZDKK_USDT Pool Depth Index; the list MAY be empty.
|
||||
|
||||
#### Scenario: Status-index history is requested
|
||||
- **WHEN** a caller requests Evelyn's status-index history
|
||||
- **THEN** Evelyn returns a non-null, oldest-to-newest list whose points contain a timestamp and all six index values
|
||||
|
||||
### Requirement: Evelyn Mission Control visualizes status-index measurements
|
||||
Evelyn Mission Control SHALL display historical measurements from separate Production and Test Evelyn references in their corresponding Overview tabs as six-line graphs, with timestamp on the X-axis and index value on the Y-axis. Each environment SHALL retrieve its own history and SHALL have a separate graph instance with a dynamic Y-axis range that is symmetric around zero and always displays zero as the desired state. The two histories MAY contain identical values but SHALL remain separate data sources.
|
||||
|
||||
#### Scenario: Production and Test Overviews are created with history
|
||||
- **WHEN** Mission Control creates the Production and Test Overview views
|
||||
- **THEN** it retrieves history from the corresponding Production and Test Evelyn references and creates a separate six-line graph for each environment whose symmetric Y-axis contains zero
|
||||
|
||||
#### Scenario: An environment has empty history
|
||||
- **WHEN** Mission Control creates an environment's Overview view and that environment's Evelyn history is empty
|
||||
- **THEN** it displays an empty six-series graph for that environment whose Y-axis still contains zero without substituting the other environment's history
|
||||
@@ -0,0 +1,15 @@
|
||||
## 1. Typed Status History
|
||||
|
||||
- [x] 1.1 Add the immutable `EvelynStatusIndexPoint` API value type with an `Instant` timestamp and six named `BigDecimal` index values.
|
||||
- [x] 1.2 Replace `Evelyn.getStatusReport()` with the non-null `getStatusIndexHistory()` list contract.
|
||||
- [x] 1.3 Implement an immutable, oldest-to-newest hardcoded sample history in `EvelynImpl`.
|
||||
|
||||
## 2. Mission Control Overview
|
||||
|
||||
- [x] 2.1 Update Mission Control to accept separate Production and Test Evelyn references and fetch each reference's history for its corresponding Overview tab.
|
||||
- [x] 2.2 Update NenjimHub to supply two separate `EvelynImpl` placeholder instances and keep distinct six-series chart instances for the two histories.
|
||||
- [x] 2.3 Configure a dynamic symmetric Y-axis around zero, including a usable zero-containing fallback range for empty or all-zero history.
|
||||
|
||||
## 3. Verification
|
||||
|
||||
- [x] 3.1 Compile the project and manually confirm each Overview tab renders its corresponding Evelyn history in a separate chart without adding automated tests.
|
||||
@@ -0,0 +1,25 @@
|
||||
# evelyn-status-index-history Specification
|
||||
|
||||
## Purpose
|
||||
|
||||
Provide typed historical Evelyn status measurements and make all six indexes visible over time in Mission Control.
|
||||
|
||||
## Requirements
|
||||
|
||||
### Requirement: Evelyn provides historical status-index measurements
|
||||
Evelyn SHALL expose a non-null list of typed measurement points ordered from oldest to newest. Each point SHALL contain a timestamp, Evelyn Price Index, EVE_SYRUP Pool Depth Index, EVE_SYRUP Pool Balance Index, AAZDKK_USDT Pool Balance Index, AAZDKK_USDT Pool Price Index, and AAZDKK_USDT Pool Depth Index; the list MAY be empty.
|
||||
|
||||
#### Scenario: Status-index history is requested
|
||||
- **WHEN** a caller requests Evelyn's status-index history
|
||||
- **THEN** Evelyn returns a non-null, oldest-to-newest list whose points contain a timestamp and all six index values
|
||||
|
||||
### Requirement: Evelyn Mission Control visualizes status-index measurements
|
||||
Evelyn Mission Control SHALL display historical measurements from separate Production and Test Evelyn references in their corresponding Overview tabs as six-line graphs, with timestamp on the X-axis and index value on the Y-axis. Each environment SHALL retrieve its own history and SHALL have a separate graph instance with a dynamic Y-axis range that is symmetric around zero and always displays zero as the desired state. The two histories MAY contain identical values but SHALL remain separate data sources.
|
||||
|
||||
#### Scenario: Production and Test Overviews are created with history
|
||||
- **WHEN** Mission Control creates the Production and Test Overview views
|
||||
- **THEN** it retrieves history from the corresponding Production and Test Evelyn references and creates a separate six-line graph for each environment whose symmetric Y-axis contains zero
|
||||
|
||||
#### Scenario: An environment has empty history
|
||||
- **WHEN** Mission Control creates an environment's Overview view and that environment's Evelyn history is empty
|
||||
- **THEN** it displays an empty six-series graph for that environment whose Y-axis still contains zero without substituting the other environment's history
|
||||
@@ -2,8 +2,10 @@ package com.fanitas.evelyn.core;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface Evelyn {
|
||||
void executeService() throws Exception;
|
||||
|
||||
@NotNull String getStatusReport();
|
||||
@NotNull List<EvelynStatusIndexPoint> getStatusIndexHistory();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.fanitas.evelyn.core;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.util.Objects;
|
||||
|
||||
public record EvelynStatusIndexPoint(
|
||||
Instant timestamp,
|
||||
BigDecimal evelynPriceIndex,
|
||||
BigDecimal eveSyrupPoolDepthIndex,
|
||||
BigDecimal eveSyrupPoolBalanceIndex,
|
||||
BigDecimal aazdkkUsdtPoolBalanceIndex,
|
||||
BigDecimal aazdkkUsdtPoolPriceIndex,
|
||||
BigDecimal aazdkkUsdtPoolDepthIndex
|
||||
) {
|
||||
public EvelynStatusIndexPoint {
|
||||
Objects.requireNonNull(timestamp);
|
||||
Objects.requireNonNull(evelynPriceIndex);
|
||||
Objects.requireNonNull(eveSyrupPoolDepthIndex);
|
||||
Objects.requireNonNull(eveSyrupPoolBalanceIndex);
|
||||
Objects.requireNonNull(aazdkkUsdtPoolBalanceIndex);
|
||||
Objects.requireNonNull(aazdkkUsdtPoolPriceIndex);
|
||||
Objects.requireNonNull(aazdkkUsdtPoolDepthIndex);
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import com.r35157.libs.valuetypes.basic.TradingPair;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -48,8 +49,34 @@ public class EvelynImpl implements Evelyn {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull String getStatusReport() {
|
||||
return "Hello World!";
|
||||
public @NotNull List<EvelynStatusIndexPoint> getStatusIndexHistory() {
|
||||
return List.of(
|
||||
statusIndexPoint("2026-08-02T12:00:00Z", "-0.20", "-0.35", "0.15", "0.30", "-0.10", "0.25"),
|
||||
statusIndexPoint("2026-08-03T12:00:00Z", "-0.10", "-0.20", "0.10", "0.20", "-0.05", "0.15"),
|
||||
statusIndexPoint("2026-08-04T12:00:00Z", "0.00", "-0.10", "0.05", "0.10", "0.00", "0.05"),
|
||||
statusIndexPoint("2026-08-05T12:00:00Z", "0.10", "0.05", "-0.05", "0.00", "0.05", "-0.10"),
|
||||
statusIndexPoint("2026-08-06T12:00:00Z", "0.20", "0.15", "-0.10", "-0.10", "0.10", "-0.20")
|
||||
);
|
||||
}
|
||||
|
||||
private static EvelynStatusIndexPoint statusIndexPoint(
|
||||
String timestamp,
|
||||
String evelynPriceIndex,
|
||||
String eveSyrupPoolDepthIndex,
|
||||
String eveSyrupPoolBalanceIndex,
|
||||
String aazdkkUsdtPoolBalanceIndex,
|
||||
String aazdkkUsdtPoolPriceIndex,
|
||||
String aazdkkUsdtPoolDepthIndex
|
||||
) {
|
||||
return new EvelynStatusIndexPoint(
|
||||
Instant.parse(timestamp),
|
||||
new BigDecimal(evelynPriceIndex),
|
||||
new BigDecimal(eveSyrupPoolDepthIndex),
|
||||
new BigDecimal(eveSyrupPoolBalanceIndex),
|
||||
new BigDecimal(aazdkkUsdtPoolBalanceIndex),
|
||||
new BigDecimal(aazdkkUsdtPoolPriceIndex),
|
||||
new BigDecimal(aazdkkUsdtPoolDepthIndex)
|
||||
);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,17 +1,32 @@
|
||||
package com.r35157.evelyn.emc.impl.ref;
|
||||
|
||||
import com.fanitas.evelyn.core.Evelyn;
|
||||
import com.fanitas.evelyn.core.EvelynStatusIndexPoint;
|
||||
import com.r35157.evelyn.emc.EvelynMissionControl;
|
||||
import com.r35157.libs.javafx.JavaFxRuntime;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.chart.LineChart;
|
||||
import javafx.scene.chart.NumberAxis;
|
||||
import javafx.scene.chart.XYChart;
|
||||
import javafx.scene.control.Tab;
|
||||
import javafx.scene.control.TabPane;
|
||||
import javafx.scene.layout.StackPane;
|
||||
import javafx.stage.Stage;
|
||||
import javafx.util.StringConverter;
|
||||
|
||||
public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionControl {
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
||||
public EvelynMissionControlImpl(/*T evelyn*/) {
|
||||
//this.evelyn = Objects.requireNonNull(evelyn);
|
||||
public final class EvelynMissionControlImpl implements EvelynMissionControl {
|
||||
|
||||
public EvelynMissionControlImpl(Evelyn evelynProd, Evelyn evelynTest) {
|
||||
this.evelynProd = Objects.requireNonNull(evelynProd);
|
||||
this.evelynTest = Objects.requireNonNull(evelynTest);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -26,9 +41,9 @@ public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionContr
|
||||
window.show();
|
||||
}
|
||||
|
||||
private TabPane createMissionControlTabs(String color) {
|
||||
private TabPane createMissionControlTabs(String color, List<EvelynStatusIndexPoint> statusIndexHistory) {
|
||||
TabPane tabs = new TabPane(
|
||||
createMissionControlTab("Overview", color),
|
||||
createOverviewTab(color, statusIndexHistory),
|
||||
createMissionControlTab("Portfolio", color),
|
||||
createMissionControlTab("Perps", color),
|
||||
createMissionControlTab("Spot", color),
|
||||
@@ -42,6 +57,85 @@ public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionContr
|
||||
return tabs;
|
||||
}
|
||||
|
||||
private Tab createOverviewTab(String color, List<EvelynStatusIndexPoint> statusIndexHistory) {
|
||||
StackPane content = new StackPane(createStatusIndexChart(statusIndexHistory));
|
||||
content.setStyle("-fx-background-color: " + color + ";");
|
||||
|
||||
Tab tab = new Tab("Overview", content);
|
||||
tab.setStyle("-fx-background-color: " + color + ";");
|
||||
return tab;
|
||||
}
|
||||
|
||||
private LineChart<Number, Number> createStatusIndexChart(List<EvelynStatusIndexPoint> history) {
|
||||
long min = history.stream()
|
||||
.mapToLong(point -> point.timestamp().toEpochMilli())
|
||||
.min()
|
||||
.orElse(0L);
|
||||
|
||||
long max = history.stream()
|
||||
.mapToLong(point -> point.timestamp().toEpochMilli())
|
||||
.max()
|
||||
.orElse(0L);
|
||||
|
||||
double padding = 0;
|
||||
NumberAxis xAxis = new NumberAxis(min - padding, max + padding, (max - min) / 4.0);
|
||||
xAxis.setLabel("Time");
|
||||
xAxis.setTickLabelFormatter(TIMESTAMP_FORMATTER);
|
||||
xAxis.setForceZeroInRange(false);
|
||||
|
||||
double yBound = calculateYBound(history);
|
||||
NumberAxis yAxis = new NumberAxis(-yBound, yBound, yBound / 5.0);
|
||||
yAxis.setLabel("Index value");
|
||||
yAxis.setForceZeroInRange(true);
|
||||
|
||||
LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis);
|
||||
chart.setTitle("Evelyn Status Index History");
|
||||
chart.setCreateSymbols(false);
|
||||
chart.setAnimated(false);
|
||||
chart.getData().add(createSeries("Evelyn Price Index", history, EvelynStatusIndexPoint::evelynPriceIndex));
|
||||
chart.getData().add(createSeries("EVE_SYRUP Pool Depth Index", history, EvelynStatusIndexPoint::eveSyrupPoolDepthIndex));
|
||||
chart.getData().add(createSeries("EVE_SYRUP Pool Balance Index", history, EvelynStatusIndexPoint::eveSyrupPoolBalanceIndex));
|
||||
chart.getData().add(createSeries("AAZDKK_USDT Pool Balance Index", history, EvelynStatusIndexPoint::aazdkkUsdtPoolBalanceIndex));
|
||||
chart.getData().add(createSeries("AAZDKK_USDT Pool Price Index", history, EvelynStatusIndexPoint::aazdkkUsdtPoolPriceIndex));
|
||||
chart.getData().add(createSeries("AAZDKK_USDT Pool Depth Index", history, EvelynStatusIndexPoint::aazdkkUsdtPoolDepthIndex));
|
||||
return chart;
|
||||
}
|
||||
|
||||
private XYChart.Series<Number, Number> createSeries(
|
||||
String name,
|
||||
List<EvelynStatusIndexPoint> history,
|
||||
Function<EvelynStatusIndexPoint, BigDecimal> valueExtractor
|
||||
) {
|
||||
XYChart.Series<Number, Number> series = new XYChart.Series<>();
|
||||
series.setName(name);
|
||||
for (EvelynStatusIndexPoint point : history) {
|
||||
series.getData().add(new XYChart.Data<>(
|
||||
point.timestamp().toEpochMilli(),
|
||||
valueExtractor.apply(point)
|
||||
));
|
||||
}
|
||||
return series;
|
||||
}
|
||||
|
||||
private double calculateYBound(List<EvelynStatusIndexPoint> history) {
|
||||
BigDecimal maxAbsoluteValue = BigDecimal.ZERO;
|
||||
for (EvelynStatusIndexPoint point : history) {
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.evelynPriceIndex());
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.eveSyrupPoolDepthIndex());
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.eveSyrupPoolBalanceIndex());
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.aazdkkUsdtPoolBalanceIndex());
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.aazdkkUsdtPoolPriceIndex());
|
||||
maxAbsoluteValue = max(maxAbsoluteValue, point.aazdkkUsdtPoolDepthIndex());
|
||||
}
|
||||
|
||||
double bound = maxAbsoluteValue.doubleValue();
|
||||
return bound == 0.0 ? EMPTY_Y_BOUND : bound;
|
||||
}
|
||||
|
||||
private BigDecimal max(BigDecimal currentMaximum, BigDecimal candidate) {
|
||||
return currentMaximum.max(candidate.abs());
|
||||
}
|
||||
|
||||
private Tab createMissionControlTab(String title, String color) {
|
||||
StackPane content = new StackPane();
|
||||
content.setStyle("-fx-background-color: " + color + ";");
|
||||
@@ -53,15 +147,18 @@ public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionContr
|
||||
}
|
||||
|
||||
private TabPane createRootTabs() {
|
||||
List<EvelynStatusIndexPoint> statusIndexHistoryProd = List.copyOf(evelynProd.getStatusIndexHistory());
|
||||
List<EvelynStatusIndexPoint> statusIndexHistoryTest = List.copyOf(evelynTest.getStatusIndexHistory());
|
||||
|
||||
Tab productionTab = new Tab(
|
||||
"Production",
|
||||
createMissionControlTabs(PRODUCTION_COLOR)
|
||||
createMissionControlTabs(PRODUCTION_COLOR, statusIndexHistoryProd)
|
||||
);
|
||||
productionTab.setStyle("-fx-background-color: " + PRODUCTION_COLOR + ";");
|
||||
|
||||
Tab testTab = new Tab(
|
||||
"Test",
|
||||
createMissionControlTabs(TEST_COLOR)
|
||||
createMissionControlTabs(TEST_COLOR, statusIndexHistoryTest)
|
||||
);
|
||||
testTab.setStyle("-fx-background-color: " + TEST_COLOR + ";");
|
||||
|
||||
@@ -73,4 +170,22 @@ public final class EvelynMissionControlImpl/*<T>*/ implements EvelynMissionContr
|
||||
|
||||
private static final String PRODUCTION_COLOR = "#ffd6d6";
|
||||
private static final String TEST_COLOR = "#d8f3dc";
|
||||
private static final double EMPTY_Y_BOUND = 1.0;
|
||||
private static final DateTimeFormatter TIMESTAMP_TICK_FORMATTER =
|
||||
DateTimeFormatter.ofPattern("HH:mm dd/MM/yy")
|
||||
.withZone(ZoneId.of("Europe/Copenhagen"));
|
||||
private static final StringConverter<Number> TIMESTAMP_FORMATTER = new StringConverter<>() {
|
||||
@Override
|
||||
public String toString(Number timestamp) {
|
||||
return TIMESTAMP_TICK_FORMATTER.format(Instant.ofEpochMilli(timestamp.longValue()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Number fromString(String value) {
|
||||
throw new UnsupportedOperationException("Timestamp axis labels are display-only");
|
||||
}
|
||||
};
|
||||
|
||||
private final Evelyn evelynProd;
|
||||
private final Evelyn evelynTest;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.r35157.nenjim.hubd.impl.ref;
|
||||
|
||||
import com.fanitas.evelyn.core.Evelyn;
|
||||
import com.fanitas.evelyn.core.impl.ref.EvelynImpl;
|
||||
import com.r35157.evelyn.emc.EvelynMissionControl;
|
||||
import com.r35157.evelyn.emc.impl.ref.EvelynMissionControlImpl;
|
||||
import com.r35157.jupiterperpsalarm.impl.ref.JupiterPerpsAlarmImpl;
|
||||
@@ -57,7 +59,9 @@ public class NenjimHubImpl implements NenjimHub {
|
||||
|
||||
private void startAutoRunProcesses() throws Exception {
|
||||
startJupiterPerpsAlarm(); // TODO: Hardcoded/hacky way to auto-start but good enough for now.
|
||||
startEvelynMissionControl();
|
||||
Evelyn evelynProd = new EvelynImpl();
|
||||
Evelyn evelynTest = new EvelynImpl();
|
||||
startEvelynMissionControl(evelynProd, evelynTest);
|
||||
startNenjimComposer();
|
||||
startNenjimProcessManager();
|
||||
startNenjimTestTool();
|
||||
@@ -138,10 +142,10 @@ public class NenjimHubImpl implements NenjimHub {
|
||||
thread.start();
|
||||
}
|
||||
|
||||
private void startEvelynMissionControl() {
|
||||
private void startEvelynMissionControl(Evelyn evelynProd, Evelyn evelynTest) {
|
||||
Thread thread = new Thread(() -> {
|
||||
try {
|
||||
EvelynMissionControl emc = new EvelynMissionControlImpl();
|
||||
EvelynMissionControl emc = new EvelynMissionControlImpl(evelynProd, evelynTest);
|
||||
emc.start();
|
||||
} catch (Throwable throwable) {
|
||||
throwable.printStackTrace();
|
||||
|
||||
Reference in New Issue
Block a user