171 lines
4.3 KiB
Haxe
171 lines
4.3 KiB
Haxe
package kernel.peripherals;
|
|
|
|
import kernel.log.Log;
|
|
import kernel.peripherals.Modem;
|
|
import kernel.peripherals.Screen;
|
|
|
|
using lua.Table;
|
|
using Lambda;
|
|
using tink.CoreApi;
|
|
|
|
/**
|
|
Class responseable for retrieving peripherals.
|
|
**/
|
|
class Peripheral {
|
|
public static function getAllAddresses():Array<String> {
|
|
return cc.Peripheral.getNames().toArray();
|
|
}
|
|
|
|
public static function isPresent(addr:String):Bool {
|
|
return cc.Peripheral.isPresent(addr);
|
|
}
|
|
|
|
public static function getTypes(addr:String):Array<String> {
|
|
if (!cc.Peripheral.isPresent(addr)) {
|
|
return [];
|
|
}
|
|
|
|
return cc.Peripheral.getType(addr).toArray();
|
|
}
|
|
|
|
public static function findAddrByType(type:String):Array<String> {
|
|
return getAllAddresses().filter(addr -> getTypes(addr).contains(type));
|
|
}
|
|
|
|
private static 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 static function inspect(addr:String):Null<{types:Array<String>, methods:Array<String>}> {
|
|
if (!isPresent(addr)) {
|
|
return null;
|
|
}
|
|
|
|
var types = getTypes(addr);
|
|
var methods = cc.Peripheral.getMethods(addr).toArray();
|
|
|
|
return {
|
|
types: types,
|
|
methods: methods
|
|
};
|
|
}
|
|
|
|
/**
|
|
Cast peripheral to a specific type.
|
|
This is a temporary solution, maybe forever.
|
|
**/
|
|
public static 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 Speaker.TYPE_NAME:
|
|
return getSpeaker(addr);
|
|
case Redstone.TYPE_NAME:
|
|
return getRedstone(addr);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public static function getScreen(addr:String):Null<Screen> {
|
|
var addr = safeGetAddr(addr, Screen.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Screen(addr);
|
|
}
|
|
|
|
public static function getAllScreens():Array<Screen> {
|
|
return [for (addr in findAddrByType(Screen.TYPE_NAME)) new Screen(addr)];
|
|
}
|
|
|
|
public static function getModem(addr:String):Null<Modem> {
|
|
var addr = safeGetAddr(addr, Modem.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Modem(addr);
|
|
}
|
|
|
|
public static function getAllModems():Array<Modem> {
|
|
return [for (addr in findAddrByType(Modem.TYPE_NAME)) new Modem(addr)];
|
|
}
|
|
|
|
public static function getDrive(addr:String):Null<Drive> {
|
|
var addr = safeGetAddr(addr, Drive.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Drive(addr);
|
|
}
|
|
|
|
public static function getAllDrives():Array<Drive> {
|
|
return [for (addr in findAddrByType(Drive.TYPE_NAME)) new Drive(addr)];
|
|
}
|
|
|
|
public static function getRedstone(side:String):Redstone {
|
|
// TODO: maybe handle restone differently to not duplicate event listeners
|
|
return new Redstone(side);
|
|
}
|
|
|
|
public static function getPrinter(addr:String):Null<Printer> {
|
|
var addr = safeGetAddr(addr, Printer.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Printer(addr);
|
|
}
|
|
|
|
public static function getAllPrinters():Array<Printer> {
|
|
return [for (addr in findAddrByType(Printer.TYPE_NAME)) new Printer(addr)];
|
|
}
|
|
|
|
public static function getEnergyStorage(addr:String):Null<EnergyStorage> {
|
|
var addr = safeGetAddr(addr, EnergyStorage.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new EnergyStorage(addr);
|
|
}
|
|
|
|
public static function getAllEnergyStorages():Array<EnergyStorage> {
|
|
return [for (addr in findAddrByType(EnergyStorage.TYPE_NAME)) new EnergyStorage(addr)];
|
|
}
|
|
|
|
public static function getComputer(addr:String):Null<Computer> {
|
|
var addr = safeGetAddr(addr, Computer.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Computer(addr);
|
|
}
|
|
|
|
public static function getAllComputers():Array<Computer> {
|
|
return [for (addr in findAddrByType(Computer.TYPE_NAME)) new Computer(addr)];
|
|
}
|
|
|
|
public static function getSpeaker(addr:String):Null<Speaker> {
|
|
var addr = safeGetAddr(addr, Speaker.TYPE_NAME);
|
|
if (addr == null)
|
|
return null;
|
|
return new Speaker(addr);
|
|
}
|
|
|
|
public static function getAllSpeakers():Array<Speaker> {
|
|
return [for (addr in findAddrByType(Speaker.TYPE_NAME)) new Speaker(addr)];
|
|
}
|
|
}
|