use of me.retrodaredevil.solarthing.solar.outback.command.MateCommand in project solarthing by wildmountainfarms.
the class MateCommandActionNode method createAction.
@Override
public Action createAction(ActionEnvironment actionEnvironment) {
MateCommandEnvironment mateCommandEnvironment = actionEnvironment.getInjectEnvironment().get(MateCommandEnvironment.class);
SourceEnvironment sourceEnvironment = actionEnvironment.getInjectEnvironment().get(SourceEnvironment.class);
Queue<? super SourcedCommand<MateCommand>> queue = mateCommandEnvironment.getQueue();
OpenSource source = sourceEnvironment.getSource();
return Actions.createRunOnce(() -> queue.add(new SourcedCommand<>(source, mateCommand)));
}
use of me.retrodaredevil.solarthing.solar.outback.command.MateCommand in project solarthing by wildmountainfarms.
the class MateCommandSender method onDataReceive.
public void onDataReceive(boolean firstData, boolean stale) {
if (firstData && !stale) {
SourcedCommand<MateCommand> sourcedCommand = commandProvider.pollCommand();
if (sourcedCommand != null) {
MateCommand command = sourcedCommand.getCommand();
if (!allowedCommands.contains(command)) {
LOGGER.warn(SolarThingConstants.SUMMARY_MARKER, "Command: " + command + " is not allowed!");
return;
}
/*
I can confirm that if you don't send the command in the correct time window, the Mate will not receive it
This solution is only here because instantType is not always reliable.
*/
LOGGER.info(SolarThingConstants.SUMMARY_MARKER, "Sending command: " + command);
try {
Thread.sleep(10);
for (int i = 0; i <= 20; i++) {
// send this over the period of 0.8 second so we can be sure it got received
if (i != 0) {
Thread.sleep(100);
}
command.send(outputStream);
}
} catch (IOException | InterruptedException e) {
LOGGER.warn(SolarThingConstants.SUMMARY_MARKER, "Unable to send command: " + command, e);
return;
}
LOGGER.info(SolarThingConstants.SUMMARY_MARKER, "Sent command: " + command + " at " + System.currentTimeMillis());
onCommandExecute.onCommandExecute(sourcedCommand);
}
} else if (firstData) {
LOGGER.info("Not going to (possibly) send commands now because stale=true!");
}
}
use of me.retrodaredevil.solarthing.solar.outback.command.MateCommand in project solarthing by wildmountainfarms.
the class OutbackMateMain method connectMate.
@SuppressWarnings("SameReturnValue")
public static int connectMate(MateProgramOptions options, File dataDirectory) throws Exception {
LOGGER.info(SolarThingConstants.SUMMARY_MARKER, "Beginning mate program");
AnalyticsManager analyticsManager = new AnalyticsManager(options.isAnalyticsEnabled(), dataDirectory);
analyticsManager.sendStartUp(ProgramType.MATE);
LOGGER.debug("IO Bundle File: " + options.getIOBundleFile());
IOConfig ioConfig = ConfigUtil.parseIOConfig(options.getIOBundleFile(), OutbackConstants.MATE_CONFIG);
try (ReloadableIOBundle ioBundle = new ReloadableIOBundle(ioConfig::createIOBundle)) {
EnvironmentUpdater[] environmentUpdaterReference = new EnvironmentUpdater[1];
PacketHandlerInit.Result handlersResult = PacketHandlerInit.initHandlers(options, () -> environmentUpdaterReference[0], Collections.singleton(new MateAnalyticsHandler(analyticsManager)));
PacketListReceiverHandlerBundle bundle = handlersResult.getBundle();
List<PacketListReceiver> packetListReceiverList = new ArrayList<>(Arrays.asList(OutbackDuplicatePacketRemover.INSTANCE, new FXEventUpdaterListReceiver(bundle.getEventHandler().getPacketListReceiverAccepter(), options.getFXWarningIgnoreMap()), new MXEventUpdaterListReceiver(bundle.getEventHandler().getPacketListReceiverAccepter()), new FXStatusListUpdater(new DailyIdentifier(options.getZoneId()))));
List<EnvironmentUpdater> environmentUpdaters = new ArrayList<>();
for (DataRequester dataRequester : options.getDataRequesterList()) {
DataRequesterResult result = dataRequester.create(new RequestObject(bundle.getEventHandler().getPacketListReceiverAccepter()));
packetListReceiverList.add(result.getStatusPacketListReceiver());
environmentUpdaters.add(result.getEnvironmentUpdater());
}
final List<CommandProvider<MateCommand>> commandProviders;
if (options.hasCommands()) {
packetListReceiverList.add(new AvailableCommandsListUpdater(options.getCommandInfoList(), false));
Queue<SourcedCommand<MateCommand>> queue = new LinkedList<>();
// if there are no commands, this should remain empty
commandProviders = new ArrayList<>();
final CommandProvider<MateCommand> commandProvider = () -> {
handlersResult.getUpdateCommandActions().run();
return queue.poll();
};
commandProviders.add(commandProvider);
environmentUpdaters.add((source, injectEnvironmentBuilder) -> {
injectEnvironmentBuilder.add(new MateCommandEnvironment(queue));
});
} else {
commandProviders = Collections.emptyList();
}
environmentUpdaterReference[0] = new EnvironmentUpdaterMultiplexer(environmentUpdaters);
packetListReceiverList.add(new DataIdentifiablePacketListChecker());
packetListReceiverList.add(new DaySummaryLogListReceiver());
packetListReceiverList.addAll(bundle.createDefaultPacketListReceivers());
return SolarMain.initReader(requireNonNull(ioBundle.getInputStream()), ioBundle::reload, new MatePacketCreator49(MateProgramOptions.getIgnoreCheckSum(options)), new TimedPacketReceiver(Duration.ofMillis(250), new PacketListReceiverMultiplexer(packetListReceiverList), new MateCommandSender(// if commands aren't allowed, commandProviders will be empty, so this will do nothing
new CommandProviderMultiplexer<>(commandProviders), ioBundle.getOutputStream(), ALLOWED_COMMANDS, new OnMateCommandSent(new PacketListReceiverMultiplexer(bundle.getEventHandler().getPacketListReceiverAccepter(), bundle.getEventHandler().getPacketListReceiverPacker(), bundle.getEventHandler().getPacketListReceiverHandler())))));
}
}
Aggregations