Compare commits
3 Commits
86f6dbf302
...
baae1428bd
| Author | SHA1 | Date | |
|---|---|---|---|
|
baae1428bd
|
|||
|
7bd18c1a4c
|
|||
|
99489e37df
|
67
src/bin/exporter/Exporter.hx
Normal file
67
src/bin/exporter/Exporter.hx
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
package bin.exporter;
|
||||||
|
|
||||||
|
import kernel.net.Package.GenericPackage;
|
||||||
|
import kernel.peripherals.exports.RedstoneExport;
|
||||||
|
import kernel.peripherals.Peripherals.Peripheral;
|
||||||
|
import kernel.ps.ProcessHandle;
|
||||||
|
import kernel.ps.IProcess;
|
||||||
|
|
||||||
|
/**
|
||||||
|
A service to expose local peripherals to the network.
|
||||||
|
**/
|
||||||
|
@:build(macros.Binstore.includeBin("Exporter", ["exporter"]))
|
||||||
|
class Exporter implements IProcess {
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public function run(handle:ProcessHandle) {
|
||||||
|
if (handle.args.length < 2) {
|
||||||
|
handle.writeLine("Not enough args: <addr> <type>");
|
||||||
|
handle.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var addr = handle.args[0];
|
||||||
|
var expectedType = handle.args[1];
|
||||||
|
|
||||||
|
// Check if peripheral is present. Not the case for redstone.
|
||||||
|
if (expectedType != kernel.peripherals.Redstone.TYPE_NAME && !Peripheral.isPresent(addr)) {
|
||||||
|
handle.writeLine('Address: $addr not present');
|
||||||
|
handle.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var types = Peripheral.getTypes(addr);
|
||||||
|
|
||||||
|
// Check if the correct type is present. Not the case for redstone.
|
||||||
|
if (expectedType != kernel.peripherals.Redstone.TYPE_NAME && !types.contains(expectedType)) {
|
||||||
|
handle.writeLine('Expected type not machted on address: $addr. Wanted $expectedType got $types');
|
||||||
|
handle.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var peri = Peripheral.getFromType(addr, expectedType);
|
||||||
|
|
||||||
|
if (peri == null) {
|
||||||
|
handle.writeLine('Failed to create peripheral for address: $addr');
|
||||||
|
handle.close(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var handePackFunc:(GenericPackage) -> Bool = null;
|
||||||
|
|
||||||
|
// Cast to RPC class
|
||||||
|
// TODO: There must be a smarter way to do this.
|
||||||
|
switch expectedType {
|
||||||
|
case kernel.peripherals.Redstone.TYPE_NAME:
|
||||||
|
handePackFunc = (p) -> {
|
||||||
|
return RedstoneExport.handlePackage(cast peri, p);
|
||||||
|
};
|
||||||
|
// TODO: More peripherals
|
||||||
|
}
|
||||||
|
|
||||||
|
handle.writeLine('Listening on export:$addr with type $expectedType');
|
||||||
|
|
||||||
|
// Listen for packages
|
||||||
|
kernel.net.Net.registerProto('export:$addr', (p) -> {
|
||||||
|
if (!handePackFunc(p)) {
|
||||||
|
handle.writeLine("Failed handle package on export");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -83,7 +83,7 @@ class Peripheral {
|
|||||||
return getPrinter(addr);
|
return getPrinter(addr);
|
||||||
case Speaker.TYPE_NAME:
|
case Speaker.TYPE_NAME:
|
||||||
return getSpeaker(addr);
|
return getSpeaker(addr);
|
||||||
case "redstone":
|
case Redstone.TYPE_NAME:
|
||||||
return getRedstone(addr);
|
return getRedstone(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package kernel.peripherals;
|
package kernel.peripherals;
|
||||||
|
|
||||||
|
import kernel.peripherals.interfaces.IRedstone;
|
||||||
import haxe.ds.ReadOnlyArray;
|
import haxe.ds.ReadOnlyArray;
|
||||||
import lib.Color;
|
import lib.Color;
|
||||||
|
|
||||||
@@ -41,7 +42,7 @@ abstract BundleMask(Int) from cc.Colors.Color to cc.Colors.Color {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Redstone implements IPeripheral {
|
class Redstone implements IPeripheral implements IRedstone {
|
||||||
public static inline final TYPE_NAME:String = "redstone"; // TODO: there is technically not a type for redstone.
|
public static inline final TYPE_NAME:String = "redstone"; // TODO: there is technically not a type for redstone.
|
||||||
|
|
||||||
public final onChange:Signal<Noise>;
|
public final onChange:Signal<Noise>;
|
||||||
|
|||||||
7
src/kernel/peripherals/exports/RedstoneExport.hx
Normal file
7
src/kernel/peripherals/exports/RedstoneExport.hx
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package kernel.peripherals.exports;
|
||||||
|
|
||||||
|
import macros.rpc.RPCBase;
|
||||||
|
import kernel.peripherals.interfaces.IRedstone;
|
||||||
|
|
||||||
|
@:build(macros.rpc.RPC.buildRPC(IRedstone))
|
||||||
|
class RedstoneExport extends RPCBase {}
|
||||||
17
src/kernel/peripherals/interfaces/IRedstone.hx
Normal file
17
src/kernel/peripherals/interfaces/IRedstone.hx
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package kernel.peripherals.interfaces;
|
||||||
|
|
||||||
|
import cc.Colors.Color;
|
||||||
|
import kernel.peripherals.Redstone.BundleMask;
|
||||||
|
|
||||||
|
interface IRedstone {
|
||||||
|
function setOutput(on:Bool):Void;
|
||||||
|
function getOutput():Bool;
|
||||||
|
function getInput():Bool;
|
||||||
|
function setAnalogOutput(strength:Int):Void;
|
||||||
|
function getAnalogOutput():Int;
|
||||||
|
function getAnalogInput():Int;
|
||||||
|
function setBundledOutput(output:BundleMask):Void;
|
||||||
|
function getBundledOutput():BundleMask;
|
||||||
|
function getBundledInput():BundleMask;
|
||||||
|
function testBundledInput(mask:Color):Bool;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user