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