big Peripheal refactor

This commit is contained in:
Djeeberjr 2023-06-04 20:52:24 +02:00
parent 2051f486d4
commit fd2b53167e
10 changed files with 86 additions and 72 deletions

View File

@ -9,7 +9,7 @@ using Lambda;
class Disk extends CLIAppBase {
public function new() {
registerSyncSubcommand("ls", (args)->{
Peripheral.instance.getDrives().foreach(drive -> {
Peripheral.instance.getAllDrives().foreach(drive -> {
var addr = drive.getAddr();
var label = drive.getDiskLabel();
var id = drive.getDiskID();

View File

@ -19,7 +19,7 @@ class Net extends CLIAppBase {
});
registerSyncSubcommand("iface", (args)->{
var modems = Peripheral.instance.getModems();
var modems = Peripheral.instance.getAllModems();
for (modem in modems) {
handle.writeLine(modem.name());

View File

@ -31,7 +31,7 @@ class Net {
@:allow(kernel.Init)
private function new() {
this.interfaces = [for (e in Peripheral.instance.getModems()) e ]; // TODO: is this the way to do it?
this.interfaces = [for (e in Peripheral.instance.getAllModems()) e ]; // TODO: is this the way to do it?
this.interfaces.push(Loopback.instance);
for (interf in interfaces){
@ -279,7 +279,7 @@ class Net {
data: null,
};
for (modem in Peripheral.instance.getModems()) {
for (modem in Peripheral.instance.getAllModems()) {
if (!modem.isWireless()) continue;
modem.send(Net.BRODCAST_PORT, Net.instance.networkID, pack);
}

View File

@ -64,7 +64,7 @@ class Routing {
private function brodcastRoutingTable() {
var pack = newRoutDiscoverPackage();
for (modem in Peripheral.instance.getModems()) {
for (modem in Peripheral.instance.getAllModems()) {
modem.send(Net.BRODCAST_PORT, Net.instance.networkID, pack);
}
}

View File

@ -1,8 +1,11 @@
package kernel.peripherals;
import cc.Peripheral;
using tink.CoreApi;
class Drive implements IPeripheral {
public static inline final TYPE_NAME:String = "drive";
public final onDiskInsert:Signal<Noise>;
public final onDiskEject:Signal<Noise>;
@ -12,9 +15,9 @@ class Drive implements IPeripheral {
private final onDiskEjectTrigger:SignalTrigger<Noise> = Signal.trigger();
@:allow(kernel.peripherals)
private function new(native: cc.periphs.Disk,addr: String) {
private function new(addr: String) {
this.addr = addr;
this.native = native;
this.native = Peripheral.wrap(addr);
this.onDiskInsert = this.onDiskInsertTrigger.asSignal();
this.onDiskEject = this.onDiskEjectTrigger.asSignal();

View File

@ -1,5 +1,6 @@
package kernel.peripherals;
import cc.Peripheral;
import kernel.log.Log;
import kernel.net.Package;
import kernel.net.INetworkInterface;
@ -7,6 +8,8 @@ import kernel.net.INetworkInterface;
using tink.CoreApi;
class Modem implements INetworkInterface implements IPeripheral {
public static inline final TYPE_NAME:String = "modem";
public final addr:String;
public var onMessage(default, null):Signal<{pack:Package,dist:Null<Float>}>;
@ -14,9 +17,9 @@ class Modem implements INetworkInterface implements IPeripheral {
private final native:cc.periphs.Modem.Modem;
@:allow(kernel.peripherals)
private function new(nativePeripherals:cc.periphs.Modem.Modem, addr:String) {
private function new(addr:String) {
this.onMessage = onMessageTrigger.asSignal();
this.native = nativePeripherals;
this.native = Peripheral.wrap(addr);
this.addr = addr;
KernelEvents.instance.onModemMessage.handle(params ->{

View File

@ -17,93 +17,96 @@ class Peripheral {
**/
public static var instance:Peripheral;
private var screens: Array<Screen> = [];
private var modes: Array<Modem> = [];
private var drives:Array<Drive> = [];
private var redstone:Array<Redstone> = [];
private var printers:Array<Printer> = [];
@:allow(kernel.Init)
private function new() {
KernelEvents.instance.onPeripheral.handle(this.updatePeripherals);
KernelEvents.instance.onPeripheralDetach.handle(this.updatePeripherals);
updatePeripherals();
redstone = [ for(side in [Side.Top,Side.Right,Side.Left,Side.Front,Side.Bottom,Side.Back]) new Redstone(side) ];
}
private function updatePeripherals() {
findScreens();
findModems();
findDrives();
public function getAllAddresses(): Array<String> {
return cc.Peripheral.getNames().toArray();
}
/**
Get all connected screens.
**/
public function getScreens():ReadOnlyArray<Screen> {
return this.screens;
public function isPresent(addr: String): Bool {
return cc.Peripheral.isPresent(addr);
}
private function findScreens():Void {
var allScreens = cc.Peripheral.getNames().toArray().filter(s -> cc.Peripheral.getType(s) == "monitor");
this.screens = allScreens.map(s -> return new Screen((cc.Peripheral.wrap(s) : Dynamic), s));
public function getTypes(addr: String): Array<String> {
if (!cc.Peripheral.isPresent(addr)) {
return [];
}
return cc.Peripheral.getType(addr).toArray();
}
public function getScreen(addr: String): Screen {
return this.screens.find(item -> item.getAddr() == addr);
private function findAddrByType(type: String): Array<String> {
return getAllAddresses().filter(addr -> getTypes(addr).contains(type));
}
/**
Get all connected modems.
**/
public function getModems():ReadOnlyArray<Modem> {
return this.modes;
private function safeGetAddr(addr: String, type: String): Null<String> {
if (!isPresent(addr)) {
return null;
}
var types = getTypes(addr);
if (!types.contains(type)) {
return null;
}
return addr;
}
public function getScreen(addr: String): Null<Screen> {
var addr = safeGetAddr(addr, Screen.TYPE_NAME);
if (addr == null) return null;
return new Screen(addr);
}
public function getAllScreens(): Array<Screen> {
return [ for (addr in findAddrByType(Screen.TYPE_NAME)) new Screen(addr)];
}
public function getModem(addr: String): Null<Modem> {
return this.modes.find(item -> item.getAddr() == addr);
var addr = safeGetAddr(addr, Modem.TYPE_NAME);
if (addr == null) return null;
return new Modem(addr);
}
private function findModems():Void {
var allModems = cc.Peripheral.getNames().toArray().filter(s -> cc.Peripheral.getType(s) == "modem");
this.modes = allModems.map(s -> return new Modem((cc.Peripheral.wrap(s) : Dynamic), s));
}
/**
Get all connected drives.
**/
public function getDrives(): ReadOnlyArray<Drive> {
return this.drives;
public function getAllModems(): Array<Modem> {
return [ for (addr in findAddrByType(Modem.TYPE_NAME)) new Modem(addr)];
}
public function getDrive(addr: String): Null<Drive> {
return this.drives.find(item -> item.getAddr() == addr);
var addr = safeGetAddr(addr, Drive.TYPE_NAME);
if (addr == null) return null;
return new Drive(addr);
}
private function findDrives() {
var allDrives = cc.Peripheral.getNames().toArray().filter(s -> cc.Peripheral.getType(s) == "drive");
this.drives = allDrives.map(s -> return new Drive((cc.Peripheral.wrap(s) : Dynamic), s));
public function getAllDrives(): Array<Drive> {
return [ for (addr in findAddrByType(Drive.TYPE_NAME)) new Drive(addr)];
}
/**
Get redstone peripheral.
**/
public function getRedstone(side: String): Redstone {
return this.redstone.find(item -> item.getAddr() == side);
// TODO: maybe handle restone differently to not duplicate event listeners
return new Redstone(side);
}
/**
Get all connected printers.
**/
public function getPrinters():ReadOnlyArray<Printer> {
return this.printers;
public function getPrinter(addr: String):Null<Printer> {
var addr = safeGetAddr(addr, Printer.TYPE_NAME);
if (addr == null) return null;
return new Printer(addr);
}
private function findPrinters() {
var allPrinters = cc.Peripheral.getNames().toArray().filter(s -> cc.Peripheral.getType(s) == "printer");
this.printers = allPrinters.map(s -> return new Printer((cc.Peripheral.wrap(s) : Dynamic), s));
public function getAllPrinters(): Array<Printer> {
return [ for (addr in findAddrByType(Printer.TYPE_NAME)) new Printer(addr)];
}
public function getEnergyStorage(addr: String): Null<EnergyStorage> {
var addr = safeGetAddr(addr, EnergyStorage.TYPE_NAME);
if (addr == null) return null;
return new EnergyStorage(addr);
}
public function getAllEnergyStorages(): Array<EnergyStorage> {
return [ for (addr in findAddrByType(EnergyStorage.TYPE_NAME)) new EnergyStorage(addr)];
}
}

View File

@ -1,15 +1,17 @@
package kernel.peripherals;
import cc.Peripheral;
import lib.Rect;
import lib.Pos;
class Printer implements IPeripheral {
public static inline final TYPE_NAME:String = "printer";
private final native:cc.periphs.Printer.Printer;
private final addr:String;
public function new(native: cc.periphs.Printer.Printer, addr: String) {
this.native = native;
public function new(addr: String) {
this.native = Peripheral.wrap(addr);
this.addr = addr;
}

View File

@ -1,5 +1,6 @@
package kernel.peripherals;
import cc.Peripheral;
import lib.Pos;
import cc.Term.TerminalSize;
import kernel.ui.TermWriteable;
@ -9,6 +10,8 @@ import lib.Color;
using tink.CoreApi;
class Screen implements TermWriteable implements IPeripheral {
public static inline final TYPE_NAME:String = "monitor";
private final nativ:cc.periphs.Monitor.Monitor;
private final addr:String;
@ -17,10 +20,10 @@ class Screen implements TermWriteable implements IPeripheral {
public final onResize:Signal<Vec2<Int>>;
@:allow(kernel.peripherals)
private function new(nativePeripherals:cc.periphs.Monitor.Monitor, addr:String) {
private function new(addr:String) {
this.onResize = onResizeTrigger.asSignal();
this.nativ = nativePeripherals;
this.nativ = Peripheral.wrap(addr);
this.addr = addr;
KernelEvents.instance.onMonitorResize.handle(addr -> {

View File

@ -134,7 +134,7 @@ class WindowManager {
}
public function getOutputs():ReadOnlyArray<String> {
var arr = Peripheral.instance.getScreens().map(screen -> return screen.getAddr());
var arr = Peripheral.instance.getAllScreens().map(screen -> return screen.getAddr());
arr.push("main");
return arr;
}