package org.openhab.binding.dsmr.internal; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import gnu.io.SerialPort; /** * Class for storing port settings * This class does store 4 serial parameters (baudrate, databits, parity, stopbits) * for use in DSMRPort. * * This class can also convert a string setting (<speed> <databits><parity><stopbits>) * to a DSMRPortSettings object (e.g. 115200 8N1) * * @author M. Volaart * @since 1.9.0 */ public class DSMRPortSettings { /* logger */ private static final Logger logger = LoggerFactory.getLogger(DSMRPortSettings.class); /* Regular expression for validating portsettings parameter */ private static final String PORT_SETTING_REGEX = "(\\d+)\\s+(\\d)([neoNEO])(1\\.5|1|2)"; /* Fixed settings for high speed communication (DSMR V4 and up) */ public static final DSMRPortSettings HIGH_SPEED_SETTINGS = new DSMRPortSettings(115200, SerialPort.DATABITS_8, SerialPort.PARITY_NONE, SerialPort.STOPBITS_1); /* Fixed settings for low speed communication (DSMR V3 and down) */ public static final DSMRPortSettings LOW_SPEED_SETTINGS = new DSMRPortSettings(9600, SerialPort.DATABITS_7, SerialPort.PARITY_EVEN, SerialPort.STOPBITS_1); /* Serial port parameters */ private final int baudrate; private final int databits; private final int parity; private final int stopbits; /** * Construct a new PortSpeed object * * @param baudrate * baudrate of the port * @param databits * no data bits to use (use SerialPort.DATABITS_* constant) * @param parity * parity to use (use SerialPort.PARITY_* constant) * @param stopbits * no stopbits to use (use SerialPort.STOPBITS_* constant) */ public DSMRPortSettings(int baudrate, int databits, int parity, int stopbits) { this.baudrate = baudrate; this.databits = databits; this.parity = parity; this.stopbits = stopbits; } /** * Returns the baudrate * * @return baudrate setting */ public int getBaudrate() { return baudrate; } /** * Returns the number of data bits * * @return databits setting */ public int getDataBits() { return databits; } /** * Returns the parity setting * * @return parity setting */ public int getParity() { return parity; } /** * Returns the number of stop bits * * @return stop bits setting */ public int getStopbits() { return stopbits; } @Override public String toString() { String toString = "Baudrate:" + baudrate + ", databits:" + databits; switch (parity) { case SerialPort.PARITY_EVEN: toString += ", parity:even"; break; case SerialPort.PARITY_MARK: toString += ", parity:mark"; break; case SerialPort.PARITY_NONE: toString += ", parity:none"; break; case SerialPort.PARITY_ODD: toString += ", parity:odd"; break; case SerialPort.PARITY_SPACE: toString += ", parity:space"; break; default: toString += ", parity:<unknown>"; break; } switch (stopbits) { case SerialPort.STOPBITS_1: toString += ", stopbits:1"; break; case SerialPort.STOPBITS_1_5: toString += ", stopbits:1.5"; break; case SerialPort.STOPBITS_2: toString += ", stopbits:2"; break; default: toString += ", stopbits:<unknown>"; break; } return toString; } /** * * @param portSettings * @return */ public static DSMRPortSettings getPortSettingsFromString(String portSettings) { Matcher m = Pattern.compile(PORT_SETTING_REGEX).matcher(portSettings); if (m.find()) { int baudrate = Integer.parseInt(m.group(1)); int databits = Integer.parseInt(m.group(2)); int parity; int stopbits; char parityChar = m.group(3).toUpperCase().charAt(0); switch (parityChar) { case 'E': parity = SerialPort.PARITY_EVEN; break; case 'O': parity = SerialPort.PARITY_ODD; break; case 'N': parity = SerialPort.PARITY_NONE; break; default: logger.error("Invalid parity ({}), ignoring fixed port settings.", parityChar); return null; } String stopbitsString = m.group(4); if (stopbitsString.equals("1")) { stopbits = SerialPort.STOPBITS_1; } else if (stopbitsString.equals("1.5")) { stopbits = SerialPort.STOPBITS_1_5; } else if (stopbitsString.equals("2")) { stopbits = SerialPort.STOPBITS_2; } else { logger.error("Invalid stop bits({}), ignoring fixed port settings.", stopbitsString); return null; } return new DSMRPortSettings(baudrate, databits, parity, stopbits); } else { return null; } } }