use of me.retrodaredevil.solarthing.packets.handling.implementations.TimedPacketReceiver in project solarthing by wildmountainfarms.
the class CheckMain method scanForMate.
/*
Useful command when testing this:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
*/
private static boolean scanForMate(String port) throws SerialPortException {
System.out.println("Going to open serial port using MATE's default serial configuration...");
try (JSerialIOBundle ioBundle = JSerialIOBundle.createPort(port, OutbackConstants.MATE_CONFIG)) {
System.out.println("Successfully opened serial port...");
boolean[] gotAnyData = new boolean[] { false };
boolean[] parsedData = new boolean[] { false };
PacketListReceiver receiver = (packets) -> {
System.out.println("Got " + packets.size() + " packets");
parsedData[0] = true;
};
// Note that lots of this code logs. Users don't see much of the debug logs because they run the solarthing command, which does INFO logging by default
SolarReader solarReader = new SolarReader(ioBundle.getInputStream(), // we are testing a lot, so we don't care if the checksum is wrong
new MatePacketCreator49(IgnoreCheckSum.IGNORE_AND_USE_CALCULATED), new TimedPacketReceiver(Duration.ofMillis(250), receiver, (firstData, stale) -> gotAnyData[0] = true));
try {
for (int i = 0; i < 40; i++) {
// do this for about 4 seconds
try {
solarReader.update();
} catch (EOFException e) {
// This should never happen
System.err.println("The serial port gave us an EOF. This is unexpected");
return false;
} catch (IOException e) {
System.err.println("Error reading from serial port");
return false;
}
Thread.sleep(100);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
return false;
}
if (parsedData[0]) {
System.out.println("Got data from mate!");
} else if (gotAnyData[0]) {
System.out.println("Got some data, but was unable to parse it.");
} else {
System.out.println("Got no data from mate!");
}
return parsedData[0];
}
}
use of me.retrodaredevil.solarthing.packets.handling.implementations.TimedPacketReceiver 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