Files
cc-haxe/src/kernel/peripherals/Modem.hx
2023-07-30 15:55:22 +02:00

89 lines
2.0 KiB
Haxe

package kernel.peripherals;
import cc.Peripheral;
import kernel.log.Log;
import kernel.net.Package;
import kernel.net.INetworkInterface;
using tink.CoreApi;
class Modem implements INetworkInterface implements IPeripheral {
public static inline final TYPE_NAME:String = "modem";
public final addr:String;
public var onMessage(default, null):Signal<{pack:GenericPackage, dist:Null<Float>}>;
private final onMessageTrigger:SignalTrigger<{pack:GenericPackage, dist:Null<Float>}> = Signal.trigger();
private final native:cc.periphs.Modem.Modem;
@:allow(kernel.peripherals)
private function new(addr:String) {
this.onMessage = onMessageTrigger.asSignal();
this.native = Peripheral.wrap(addr);
this.addr = addr;
KernelEvents.onModemMessage.handle(params -> {
try {
if (params.addr == this.addr) {
var pack:GenericPackage = {
fromID: params.message.fromID,
toID: params.message.toID,
msgID: params.message.msgID,
type: params.message.type,
data: params.message.data,
ttl: params.message.ttl,
};
this.onMessageTrigger.trigger({pack: pack, dist: params.distance});
}
} catch (e:Dynamic) {
Log.error("Error while parsing modem message");
}
});
}
public function isWireless():Bool {
return native.isWireless();
}
public function listen(chan:Int) {
native.open(chan);
}
public function isListening(chan:Int):Bool {
return native.isOpen(chan);
}
public function closeAll() {
native.closeAll();
}
public function send(chan:Int, replyChan:Int, payload:Any) {
native.transmit(chan, replyChan, payload);
}
public function name():String {
return addr;
}
public function close(chan:Int) {
native.close(chan);
}
public function getAddr():String {
return this.addr;
}
public function getType():String {
return TYPE_NAME;
}
public function getBaseRoutingCost():Int {
if (this.native.isWireless()) {
return 2; // Prefere messages over cable
} else {
return 1;
}
}
}