104 lines
2.5 KiB
Haxe
104 lines
2.5 KiB
Haxe
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<String> = 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;
|
|
}
|
|
}
|