001package jmri.jmrix.roco.z21.messageformatters;
002
003import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
004import jmri.DccLocoAddress;
005import jmri.jmrix.Message;
006import jmri.jmrix.roco.z21.Z21MessageFormatter;
007import jmri.jmrix.roco.z21.Z21Reply;
008
009/**
010 * Formatter for RailCom replies.
011 *
012 * @author Paul Bender Copyright (C) 2025
013 */
014public class Z21RailComReplyFormatter implements Z21MessageFormatter {
015
016    @Override
017    public boolean handlesMessage(Message m) {
018        return m instanceof Z21Reply && ((Z21Reply) m).getOpCode() == 0x0088;
019    }
020
021    @SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST", justification = "cast is checked in handlesMessage")
022    @Override
023    public String formatMessage(Message m) {
024        if (!handlesMessage(m)) {
025            throw new IllegalArgumentException("Message is not a RailCom reply");
026        }
027        Z21Reply r = (Z21Reply) m;
028        int entries = r.getNumRailComDataEntries();
029        StringBuilder datastring = new StringBuilder();
030        for(int i = 0; i < entries ; i++) {
031            DccLocoAddress address = r.getRailComLocoAddress(i);
032            int rcvCount = r.getRailComRcvCount(i);
033            int errorCount = r.getRailComErrCount(i);
034            int speed = r.getRailComSpeed(i);
035            int options = r.getRailComOptions(i);
036            int qos = r.getRailComQos(i);
037            datastring.append(Bundle.getMessage("Z21_RAILCOM_DATA",address,rcvCount,errorCount,options,speed,qos));
038            datastring.append("\n");
039        }
040        return Bundle.getMessage("Z21_RAILCOM_DATACHANGED",entries,new String(datastring));
041    }
042
043}