package kernel.peripherals; using tink.CoreApi; class Drive implements IPeripheral { public final onDiskInsert:Signal; public final onDiskEject:Signal; private final addr:String; private final native:cc.periphs.Disk; private final onDiskInsertTrigger:SignalTrigger = Signal.trigger(); private final onDiskEjectTrigger:SignalTrigger = Signal.trigger(); @:allow(kernel.peripherals) private function new(native: cc.periphs.Disk,addr: String) { this.addr = addr; this.native = native; this.onDiskInsert = this.onDiskInsertTrigger.asSignal(); this.onDiskEject = this.onDiskEjectTrigger.asSignal(); KernelEvents.instance.onDisk.handle((addr) ->{ if (addr == this.addr){ this.onDiskInsertTrigger.trigger(null); } }); KernelEvents.instance.onDiskEject.handle((addr)->{ if (addr == this.addr){ this.onDiskEjectTrigger.trigger(null); } }); } public function getAddr():String { return this.addr; } public inline function isDiskPresent(): Bool { return this.native.isDiskPresent(); } /** The label of the disk, or `null` if either no disk is inserted or the disk doesn't have a label. **/ public inline function getDiskLabel(): Null { return this.native.getDiskLabel(); } public inline function clearDiskLabel() { this.native.setDiskLabel(); } public inline function setDiskLabel(label: String): Null { try { this.native.setDiskLabel(label); return null; } catch (e: Dynamic) { return new Error("Invalid label"); } } public inline function hasData():Bool { return this.native.hasData(); } public inline function hasAudio():Bool { return this.native.hasAudio(); } public inline function getMountPath():Null { return this.getMountPath(); } public inline function getAudioTitle(): Null { return this.native.getAudioTitle(); } public inline function playAudio() { this.native.playAudio(); } public inline function stopAudio() { this.native.stopAudio(); } public inline function ejectDisk() { this.native.ejectDisk(); } public inline function getDiskID(): Int { return this.native.getDiskID(); } }