use of com.automatak.dnp3.ControlRelayOutputBlock in project solarnetwork-node by SolarNetwork.
the class OutstationServceTests method handleCROBMissingIndex.
@Test
public void handleCROBMissingIndex() {
// given
TestOutstationService service = createOutstationService();
final String controlId = "/foo/switch";
ControlConfig cConfig = new ControlConfig(null, controlId, ControlType.Binary);
service.setControlConfigs(new ControlConfig[] { cConfig });
// when
replayAll();
ControlRelayOutputBlock crob = new ControlRelayOutputBlock(ControlCode.LATCH_ON, (short) 1, 0, 0, CommandStatus.SUCCESS);
CommandStatus status = service.getCommandHandler().operateCROB(crob, 123123123, OperateType.DirectOperate);
// then
assertThat("Command rejected because control index out of range", status, equalTo(CommandStatus.NOT_AUTHORIZED));
}
use of com.automatak.dnp3.ControlRelayOutputBlock in project solarnetwork-node by SolarNetwork.
the class OutstationServceTests method handleCROBLatchOff.
@Test
public void handleCROBLatchOff() {
// given
TestOutstationService service = createOutstationService();
final String controlId = "/foo/switch";
ControlConfig cConfig = new ControlConfig(null, controlId, ControlType.Binary);
service.setControlConfigs(new ControlConfig[] { cConfig });
Capture<Instruction> instrCaptor = Capture.newInstance();
expect(instructionService.executeInstruction(capture(instrCaptor))).andAnswer(new IAnswer<InstructionStatus>() {
@Override
public InstructionStatus answer() throws Throwable {
return createStatus(instrCaptor.getValue(), Completed);
}
});
// when
replayAll();
ControlRelayOutputBlock crob = new ControlRelayOutputBlock(ControlCode.LATCH_OFF, (short) 1, 0, 0, CommandStatus.SUCCESS);
CommandStatus status = service.getCommandHandler().operateCROB(crob, 0, OperateType.DirectOperate);
// then
assertThat("Command OK", status, equalTo(CommandStatus.SUCCESS));
Instruction instr = instrCaptor.getValue();
assertThat("Instruction", instr.getTopic(), equalTo(InstructionHandler.TOPIC_SET_CONTROL_PARAMETER));
assertThat("Control ID param", instr.getParameterValue(controlId), equalTo(Boolean.FALSE.toString()));
}
use of com.automatak.dnp3.ControlRelayOutputBlock in project solarnetwork-node by SolarNetwork.
the class OutstationServceTests method handleCROBLatchOn.
@Test
public void handleCROBLatchOn() {
// GIVEN
TestOutstationService service = createOutstationService();
final String controlId = "/foo/switch";
ControlConfig cConfig = new ControlConfig(null, controlId, ControlType.Binary);
service.setControlConfigs(new ControlConfig[] { cConfig });
Capture<Instruction> instrCaptor = Capture.newInstance();
expect(instructionService.executeInstruction(capture(instrCaptor))).andAnswer(new IAnswer<InstructionStatus>() {
@Override
public InstructionStatus answer() throws Throwable {
return createStatus(instrCaptor.getValue(), Completed);
}
});
// WHEN
replayAll();
ControlRelayOutputBlock crob = new ControlRelayOutputBlock(ControlCode.LATCH_ON, (short) 1, 0, 0, CommandStatus.SUCCESS);
CommandStatus status = service.getCommandHandler().operateCROB(crob, 0, OperateType.DirectOperate);
// THEN
assertThat("Command OK", status, equalTo(CommandStatus.SUCCESS));
Instruction instr = instrCaptor.getValue();
assertThat("Instruction", instr.getTopic(), equalTo(InstructionHandler.TOPIC_SET_CONTROL_PARAMETER));
assertThat("Control ID param", instr.getParameterValue(controlId), equalTo(Boolean.TRUE.toString()));
}
use of com.automatak.dnp3.ControlRelayOutputBlock in project solarnetwork-node by SolarNetwork.
the class OutstationServceTests method handleCROBLatchOnWithTaskExecutor.
@Test
public void handleCROBLatchOnWithTaskExecutor() throws InterruptedException {
// given
TestOutstationService service = createOutstationService();
CapturingExecutorService executor = new CapturingExecutorService(newSingleThreadExecutor());
service.setTaskExecutor(new TaskExecutorAdapter(executor));
final String controlId = "/foo/switch";
ControlConfig cConfig = new ControlConfig(null, controlId, ControlType.Binary);
service.setControlConfigs(new ControlConfig[] { cConfig });
Capture<Instruction> instrCaptor = Capture.newInstance();
expect(instructionService.executeInstruction(capture(instrCaptor))).andAnswer(new IAnswer<InstructionStatus>() {
@Override
public InstructionStatus answer() throws Throwable {
return createStatus(instrCaptor.getValue(), Completed);
}
});
// when
replayAll();
ControlRelayOutputBlock crob = new ControlRelayOutputBlock(ControlCode.LATCH_ON, (short) 1, 0, 0, CommandStatus.SUCCESS);
CommandStatus status = service.getCommandHandler().operateCROB(crob, 0, OperateType.DirectOperate);
// wait for bg task
executor.shutdown();
executor.awaitTermination(2, TimeUnit.SECONDS);
// then
assertThat("Command OK", status, equalTo(CommandStatus.SUCCESS));
Instruction instr = instrCaptor.getValue();
assertThat("Instruction", instr.getTopic(), equalTo(InstructionHandler.TOPIC_SET_CONTROL_PARAMETER));
assertThat("Control ID param", instr.getParameterValue(controlId), equalTo(Boolean.TRUE.toString()));
assertThat("Instruction handled in background", executor.getCapturedFutures(), hasSize(1));
}
use of com.automatak.dnp3.ControlRelayOutputBlock in project solarnetwork-node by SolarNetwork.
the class MasterDemo method run.
static void run(DNP3Manager manager) throws Exception {
// Create a tcp channel class that will connect to the loopback
Channel channel = manager.addTCPClient("client", LogMasks.NORMAL | LogMasks.APP_COMMS, ChannelRetry.getDefault(), "127.0.0.1", "0.0.0.0", 20000, new Slf4jChannelListener());
// You can modify the defaults to change the way the master behaves
MasterStackConfig config = new MasterStackConfig();
// Create a master instance, pass in a simple singleton to print received values to the console
Master master = channel.addMaster("master", PrintingSOEHandler.getInstance(), DefaultMasterApplication.getInstance(), config);
// do an integrity scan every 2 seconds
// master.addPeriodicScan(Duration.ofSeconds(2), Header.getIntegrity());
master.enable();
// all this cruft just to read a line of text in Java. Oh the humanity.
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
while (true) {
System.out.println("Enter something to issue a command or type <quit> to exit");
String line = in.readLine();
switch(line) {
case ("quit"):
return;
case ("crob"):
ControlRelayOutputBlock crob = new ControlRelayOutputBlock(ControlCode.LATCH_ON, (short) 1, 100, 100, CommandStatus.SUCCESS);
master.selectAndOperateCROB(crob, 0).thenAccept(// asynchronously print the result of the command operation
(CommandTaskResult result) -> System.out.println(result));
break;
case ("scan"):
master.scan(Header.getEventClasses());
break;
default:
System.out.println("Unknown command: " + line);
break;
}
}
}
Aggregations