cc-haxe/src/bin/Disk.hx

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;
}
}