WarpPI/teavm/src/main/java/it/cavallium/warppi/teavm/TeaVMPlatform.java

234 lines
6.2 KiB
Java
Raw Normal View History

2018-09-04 12:12:41 +02:00
package it.cavallium.warppi.teavm;
2018-06-09 19:37:34 +02:00
2019-08-09 20:51:31 +02:00
import java.io.IOException;
import java.io.InputStream;
2018-09-04 12:12:41 +02:00
import java.net.URL;
2019-11-01 18:04:01 +01:00
import java.util.ArrayList;
2018-09-04 12:12:41 +02:00
import java.util.HashMap;
2019-08-09 20:51:31 +02:00
import java.util.List;
2018-09-04 12:12:41 +02:00
import java.util.Map;
2018-06-09 19:37:34 +02:00
2019-11-01 18:04:01 +01:00
import it.cavallium.warppi.boot.StartupArguments;
import it.cavallium.warppi.device.DeviceStateDevice;
import it.cavallium.warppi.device.display.BacklightOutputDevice;
import it.cavallium.warppi.device.display.NoDisplaysAvailableException;
import it.cavallium.warppi.device.display.NullBacklightOutputDevice;
import it.cavallium.warppi.device.input.KeyboardInputDevice;
import it.cavallium.warppi.device.input.TouchInputDevice;
import it.cavallium.warppi.gui.graphicengine.html.HtmlDeviceState;
import it.cavallium.warppi.gui.graphicengine.html.HtmlDisplayOutputDevice;
import org.teavm.jso.browser.Window;
import org.teavm.jso.dom.html.HTMLDocument;
import it.cavallium.warppi.Platform;
2019-02-27 23:29:03 +01:00
import it.cavallium.warppi.device.display.DisplayOutputDevice;
2018-09-04 12:12:41 +02:00
import it.cavallium.warppi.gui.graphicengine.GraphicEngine;
import it.cavallium.warppi.gui.graphicengine.html.HtmlEngine;
import it.cavallium.warppi.util.Error;
2018-06-09 19:37:34 +02:00
2018-09-04 12:12:41 +02:00
public class TeaVMPlatform implements Platform {
private final TeaVMConsoleUtils cu;
private final TeaVMGpio gi;
private final TeaVMStorageUtils su;
private final String on;
2018-10-15 23:10:44 +02:00
private final TeaVMImageUtils pu;
private final TeaVMSettings settings;
2018-10-06 16:37:44 +02:00
private Boolean runningOnRaspberryOverride = null;
2019-11-01 18:04:01 +01:00
private StartupArguments args;
private DisplayOutputDevice displayOutputDevice;
private DeviceStateDevice deviceStateDevice;
private TouchInputDevice touchInputDevice;
private KeyboardInputDevice keyboardInputDevice;
2018-09-04 12:12:41 +02:00
public TeaVMPlatform() {
cu = new TeaVMConsoleUtils();
gi = new TeaVMGpio();
su = new TeaVMStorageUtils();
2018-10-15 23:10:44 +02:00
pu = new TeaVMImageUtils();
2018-09-04 12:12:41 +02:00
on = "JavaScript";
settings = new TeaVMSettings();
2018-09-04 12:12:41 +02:00
}
2018-09-22 11:17:30 +02:00
2018-09-04 12:12:41 +02:00
@Override
public ConsoleUtils getConsoleUtils() {
return cu;
}
@Override
public Gpio getGpio() {
return gi;
}
@Override
public StorageUtils getStorageUtils() {
return su;
}
@Override
2018-10-15 23:10:44 +02:00
public ImageUtils getImageUtils() {
2018-09-04 12:12:41 +02:00
return pu;
2018-06-09 19:37:34 +02:00
}
@Override
public TeaVMSettings getSettings() {
return settings;
}
2018-09-04 12:12:41 +02:00
@Override
2018-09-22 11:17:30 +02:00
public void setThreadName(final Thread t, final String name) {}
2018-06-09 19:37:34 +02:00
2018-09-04 12:12:41 +02:00
@Override
2018-09-22 11:17:30 +02:00
public void setThreadDaemon(final Thread t) {}
2018-06-09 19:37:34 +02:00
2018-09-04 12:12:41 +02:00
@Override
2018-09-22 11:17:30 +02:00
public void setThreadDaemon(final Thread t, final boolean value) {}
2018-06-09 19:37:34 +02:00
2018-09-04 12:12:41 +02:00
@Override
2018-09-22 11:17:30 +02:00
public void exit(final int value) {
2018-09-04 12:12:41 +02:00
System.err.println("====================PROGRAM END====================");
}
@Override
public void gc() {
2018-09-22 11:17:30 +02:00
2018-09-04 12:12:41 +02:00
}
@Override
public boolean isJavascript() {
return true;
}
@Override
public String getOsName() {
return on;
}
2018-09-22 11:17:30 +02:00
2018-09-04 12:12:41 +02:00
private boolean shift, alpha;
2018-09-22 11:17:30 +02:00
2018-09-04 12:12:41 +02:00
@Override
2018-09-22 11:17:30 +02:00
public void alphaChanged(final boolean alpha) {
2018-09-04 12:12:41 +02:00
this.alpha = alpha;
2018-09-22 11:17:30 +02:00
final HTMLDocument doc = Window.current().getDocument();
doc.getBody().setClassName((shift ? "shift " : "") + (alpha ? "alpha" : ""));
2018-09-04 12:12:41 +02:00
}
@Override
2018-09-22 11:17:30 +02:00
public void shiftChanged(final boolean shift) {
2018-09-04 12:12:41 +02:00
this.shift = shift;
2018-09-22 11:17:30 +02:00
final HTMLDocument doc = Window.current().getDocument();
doc.getBody().setClassName((shift ? "shift " : "") + (alpha ? "alpha" : ""));
2018-09-04 12:12:41 +02:00
}
@Override
public Semaphore newSemaphore() {
return new TeaVMSemaphore(0);
}
@Override
2018-09-22 11:17:30 +02:00
public Semaphore newSemaphore(final int i) {
2018-09-04 12:12:41 +02:00
return new TeaVMSemaphore(i);
}
@Override
2018-09-22 11:17:30 +02:00
public URLClassLoader newURLClassLoader(final URL[] urls) {
2018-09-04 12:12:41 +02:00
return new TeaVMURLClassLoader(urls);
}
@Override
2018-09-22 11:17:30 +02:00
public void throwNewExceptionInInitializerError(final String text) {
2018-09-04 12:12:41 +02:00
throw new NullPointerException();
}
@Override
2018-09-22 11:17:30 +02:00
public String[] stacktraceToString(final Error e) {
2018-06-09 19:37:34 +02:00
return e.getMessage().toUpperCase().replace("\r", "").split("\n");
}
2019-08-09 20:51:31 +02:00
/**
* Fetches the list of resource files containing DSL rules to load from the <code>/rules.list</code> resource on the server.
* <p>
* The <code>/rules.list</code> resource must exist and be a text file with zero or more lines.
* Each line specifies the name of another resource containing DSL source code.
* Blank lines aren't allowed, and resource names are interpreted exactly as written (without stripping
* leading/trailing spaces, etc.)
*/
2018-09-04 12:12:41 +02:00
@Override
2019-08-09 20:51:31 +02:00
public List<String> getRuleFilePaths() throws IOException {
try (final InputStream listStream = getStorageUtils().getResourceStream("/rules.list")) {
return getStorageUtils().readAllLines(listStream);
}
}
2018-10-06 16:37:44 +02:00
@Override
public void setRunningOnRaspberry(boolean b) {
}
2018-09-11 01:12:54 +02:00
@Override
public boolean isRunningOnRaspberry() {
return false;
}
2019-11-01 18:04:01 +01:00
@Override
public TouchInputDevice getTouchInputDevice() {
return touchInputDevice;
}
@Override
public KeyboardInputDevice getKeyboardInputDevice() {
return keyboardInputDevice;
}
@Override
public DisplayOutputDevice getDisplayOutputDevice() {
return this.displayOutputDevice;
}
@Override
public BacklightOutputDevice getBacklightOutputDevice() {
return new NullBacklightOutputDevice();
}
@Override
public DeviceStateDevice getDeviceStateDevice() {
return this.deviceStateDevice;
}
@Override
public void setArguments(StartupArguments args) {
this.args = args;
this.chooseDevices();
}
private void chooseDevices() {
List<DisplayOutputDevice> availableDevices = new ArrayList<>();
List<DisplayOutputDevice> guiDevices = new ArrayList<>();
guiDevices.add(new HtmlDisplayOutputDevice());
List<DisplayOutputDevice> consoleDevices = new ArrayList<>();
if (args.isMSDOSModeEnabled() || args.isNoGUIEngineForced()) {
availableDevices.addAll(consoleDevices);
}
if (!args.isNoGUIEngineForced()) {
availableDevices.addAll(guiDevices);
}
if (availableDevices.size() == 0) {
throw new NoDisplaysAvailableException();
}
if (this.displayOutputDevice == null) this.displayOutputDevice = availableDevices.get(0);
if (displayOutputDevice instanceof HtmlDisplayOutputDevice) {
//this.touchInputDevice = new HtmlTouchInputDevice((HtmlEngine) displayOutputDevice.getGraphicEngine());
this.keyboardInputDevice = null;
this.deviceStateDevice = new HtmlDeviceState((HtmlEngine) displayOutputDevice.getGraphicEngine());
}
}
2018-06-09 19:37:34 +02:00
}