package bin; import kernel.peripherals.Drive; import lib.CLIAppBase; import kernel.peripherals.Peripherals.Peripheral; using tink.CoreApi; using Lambda; @:build(macros.Binstore.includeBin("Disk", ["disk"])) class Disk extends CLIAppBase { public function new() { registerSyncSubcommand("ls", (args) -> { Peripheral.getAllDrives().foreach(drive -> { var addr = drive.getAddr(); var label = drive.getDiskLabel(); var id = drive.getDiskID(); if (drive.isDiskPresent()) { if (drive.hasAudio()) { handle.writeLine('${addr} => ${label} [AUDIO]'); } else { handle.writeLine('${addr} => ${label} (${id})'); } } else { handle.writeLine('${addr} => [NO DISK]'); } return true; }); }); registerSyncSubcommand("play", (args) -> { return audioDiskPlayPause(args.getString("addr"), true); }, [Peripheral("addr", Drive.TYPE_NAME)]); registerSyncSubcommand("stop", (args) -> { return audioDiskPlayPause(args.getString("addr"), false); }, [Peripheral("addr", Drive.TYPE_NAME)]); registerSyncSubcommand("eject", (args) -> { var driveAddr = args.getString("addr"); var drive = Peripheral.getDrive(driveAddr); if (!drive.isDiskPresent()) { handle.writeLine("No disk in drive: " + driveAddr); return false; } drive.ejectDisk(); return true; }, [Peripheral("addr", Drive.TYPE_NAME)]); registerSyncSubcommand("label", (args) -> { var driveAddr = args.getString("addr"); var drive = Peripheral.getDrive(driveAddr); var label:Null = args.getString("label"); if (!drive.isDiskPresent()) { handle.writeLine("No disk in drive: " + driveAddr); } if (label == null || label == "") { handle.writeLine(drive.getDiskLabel()); } else { var err = drive.setDiskLabel(label); if (err != null) { handle.writeLine("Failed to set lable"); return false; } } return true; }, [Peripheral("addr", Drive.TYPE_NAME), Optional(String("label"))]); } private function audioDiskPlayPause(driveAddr:String, play:Bool):Bool { var drive = Peripheral.getDrive(driveAddr); if (drive == null) { handle.writeLine("Drive not found: " + driveAddr); return false; } if (!drive.isDiskPresent()) { handle.writeLine("No disk in drive: " + driveAddr); return false; } if (!drive.hasAudio()) { handle.writeLine("Disk in drive: " + driveAddr + " does not have audio"); return false; } if (play) { drive.playAudio(); } else { drive.stopAudio(); } return true; } }