cc-haxe/src/kernel/peripherals/Peripherals.hx
2023-06-26 19:05:48 +02:00

166 lines
4.0 KiB
Haxe

package kernel.peripherals;
import kernel.peripherals.Modem;
import kernel.peripherals.Screen;
using lua.Table;
using Lambda;
using tink.CoreApi;
/**
Class responseable for retrieving peripherals.
**/
class Peripheral {
/**
Depends on: KernelEvents
**/
public static var instance:Peripheral;
@:allow(kernel.Init)
private function new() {
}
public function getAllAddresses(): Array<String> {
return cc.Peripheral.getNames().toArray();
}
public function isPresent(addr: String): Bool {
return cc.Peripheral.isPresent(addr);
}
public function getTypes(addr: String): Array<String> {
if (!cc.Peripheral.isPresent(addr)) {
return [];
}
return cc.Peripheral.getType(addr).toArray();
}
private function findAddrByType(type: String): Array<String> {
return getAllAddresses().filter(addr -> getTypes(addr).contains(type));
}
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 inspect(addr: String): Null<{ types: Array<String>, methods: Array<String>}> {
if (!isPresent(addr)) {
return null;
}
var types = getTypes(addr);
var methodsMap = cc.Peripheral.getMethods(addr).toArray();
var methods: Array<String> = [];
for (method in methodsMap) {
methods.push(method);
}
return {
types: types,
methods: methods
};
}
/**
Cast peripheral to a specific type.
This is a temporary solution, maybe forever.
**/
public function getFromType(addr: String, type: String): Null<IPeripheral> {
switch (type){
case Computer.TYPE_NAME:
return getComputer(addr);
case Screen.TYPE_NAME:
return getScreen(addr);
case Drive.TYPE_NAME:
return getDrive(addr);
case EnergyStorage.TYPE_NAME:
return getEnergyStorage(addr);
case Modem.TYPE_NAME:
return getModem(addr);
case Printer.TYPE_NAME:
return getPrinter(addr);
case "redstone":
return getRedstone(addr);
}
return null;
}
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> {
var addr = safeGetAddr(addr, Modem.TYPE_NAME);
if (addr == null) return null;
return new Modem(addr);
}
public function getAllModems(): Array<Modem> {
return [ for (addr in findAddrByType(Modem.TYPE_NAME)) new Modem(addr)];
}
public function getDrive(addr: String): Null<Drive> {
var addr = safeGetAddr(addr, Drive.TYPE_NAME);
if (addr == null) return null;
return new Drive(addr);
}
public function getAllDrives(): Array<Drive> {
return [ for (addr in findAddrByType(Drive.TYPE_NAME)) new Drive(addr)];
}
public function getRedstone(side: String): Redstone {
// TODO: maybe handle restone differently to not duplicate event listeners
return new Redstone(side);
}
public function getPrinter(addr: String):Null<Printer> {
var addr = safeGetAddr(addr, Printer.TYPE_NAME);
if (addr == null) return null;
return new Printer(addr);
}
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)];
}
public function getComputer(addr: String): Null<Computer> {
var addr = safeGetAddr(addr, Computer.TYPE_NAME);
if (addr == null) return null;
return new Computer(addr);
}
public function getAllComputers(): Array<Computer> {
return [ for (addr in findAddrByType(Computer.TYPE_NAME)) new Computer(addr)];
}
}