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 { return cc.Peripheral.getNames().toArray(); } public function isPresent(addr: String): Bool { return cc.Peripheral.isPresent(addr); } public function getTypes(addr: String): Array { if (!cc.Peripheral.isPresent(addr)) { return []; } return cc.Peripheral.getType(addr).toArray(); } private function findAddrByType(type: String): Array { return getAllAddresses().filter(addr -> getTypes(addr).contains(type)); } private function safeGetAddr(addr: String, type: String): Null { 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, methods: Array}> { if (!isPresent(addr)) { return null; } var types = getTypes(addr); var methodsMap = cc.Peripheral.getMethods(addr).toArray(); var methods: Array = []; for (method in methodsMap) { methods.push(method); } return { types: types, methods: methods }; } public function getScreen(addr: String): Null { var addr = safeGetAddr(addr, Screen.TYPE_NAME); if (addr == null) return null; return new Screen(addr); } public function getAllScreens(): Array { return [ for (addr in findAddrByType(Screen.TYPE_NAME)) new Screen(addr)]; } public function getModem(addr: String): Null { var addr = safeGetAddr(addr, Modem.TYPE_NAME); if (addr == null) return null; return new Modem(addr); } public function getAllModems(): Array { return [ for (addr in findAddrByType(Modem.TYPE_NAME)) new Modem(addr)]; } public function getDrive(addr: String): Null { var addr = safeGetAddr(addr, Drive.TYPE_NAME); if (addr == null) return null; return new Drive(addr); } public function getAllDrives(): Array { 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 { var addr = safeGetAddr(addr, Printer.TYPE_NAME); if (addr == null) return null; return new Printer(addr); } public function getAllPrinters(): Array { return [ for (addr in findAddrByType(Printer.TYPE_NAME)) new Printer(addr)]; } public function getEnergyStorage(addr: String): Null { var addr = safeGetAddr(addr, EnergyStorage.TYPE_NAME); if (addr == null) return null; return new EnergyStorage(addr); } public function getAllEnergyStorages(): Array { return [ for (addr in findAddrByType(EnergyStorage.TYPE_NAME)) new EnergyStorage(addr)]; } }