added exporter service
This commit is contained in:
		
							parent
							
								
									7bd18c1a4c
								
							
						
					
					
						commit
						baae1428bd
					
				
							
								
								
									
										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");
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user