use of me.retrodaredevil.io.serial.JSerialIOBundle in project solarthing by wildmountainfarms.
the class SerialIOConfig method createIOBundle.
@Override
public IOBundle createIOBundle() throws Exception {
SerialConfig serialConfig = this.serialConfig;
if (serialConfig == null) {
serialConfig = defaultSerialConfig;
if (serialConfig == null) {
throw new NullPointerException("serialConfig is null! This is likely because the injection didn't work properly.");
}
}
String port = this.port;
if (port == null) {
throw new NullPointerException("null is not a valid value for the port!");
}
SerialPort serialPort = JSerialIOBundle.createSerialPortFromName(port);
return new JSerialIOBundle(serialPort, serialConfig, new JSerialIOBundle.Config(200, 65536, 65536));
}
use of me.retrodaredevil.io.serial.JSerialIOBundle 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.io.serial.JSerialIOBundle in project solarthing by wildmountainfarms.
the class CheckMain method doModbus.
private static boolean doModbus(@NotNull String port, int startingAddress, boolean scan, SerialConfig serialConfig, Function<ModbusSlave, BatteryVoltage> slaveToReadTable) throws SerialPortException {
System.out.println("Going to open serial port using default serial configuration...");
try (JSerialIOBundle ioBundle = JSerialIOBundle.createPort(port, serialConfig)) {
System.out.println("Successfully opened serial port...");
ModbusSlaveBus bus = new IOModbusSlaveBus(ioBundle, new RtuDataEncoder());
MutableAddressModbusSlave modbusSlave = new MutableAddressModbusSlave(startingAddress, bus);
BatteryVoltage readTable = slaveToReadTable.apply(modbusSlave);
int maxAddress = scan ? 247 : startingAddress;
for (int currentAddress = startingAddress; currentAddress <= maxAddress; currentAddress++) {
modbusSlave.setAddress(currentAddress);
System.out.println("Checking on address: " + currentAddress);
try {
float batteryVoltage = readTable.getBatteryVoltage();
System.out.println("Success! Battery Voltage: " + batteryVoltage);
return true;
} catch (ModbusTimeoutException e) {
System.err.println("Got timeout. This means that the modbus address is incorrect or that the cable is not functioning properly.");
} catch (ModbusRuntimeException e) {
e.printStackTrace();
System.err.println("Got some sort of modbus error. Info logged above");
}
}
System.err.println("Did not find a device");
return false;
}
}
Aggregations