001package jmri.jmrix.roco.z21.messageformatters;
002
003import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
004import jmri.jmrix.Message;
005import jmri.jmrix.roco.z21.Z21MessageFormatter;
006import jmri.jmrix.roco.z21.Z21Reply;
007
008
009/**
010 * Formats the Z21 Hardware Info Reply message.
011 *
012 * @author Paul Bender Copyright (C) 2025
013 */
014public class Z21HardwareInfoReplyFormatter implements Z21MessageFormatter {
015
016    @Override
017    public boolean handlesMessage(Message m) {
018        return m instanceof Z21Reply && ((Z21Reply)m).getOpCode() == 0x001A;
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("Z21HardwareInfoReplyFormatter cannot format message that it does not handle");
026        }
027        Z21Reply r = (Z21Reply) m;
028        int hwversion = r.getElement(4) + (r.getElement(5) << 8) +
029                (r.getElement(6) << 16 ) + (r.getElement(7) << 24 );
030        float swversion = (r.getElementBCD(8)/100.0f)+
031                (r.getElementBCD(9))+
032                (r.getElementBCD(10)*100)+
033                (r.getElementBCD(11))*10000;
034        return Bundle.getMessage("Z21ReplyStringVersion",java.lang.Integer.toHexString(hwversion), swversion);
035    }
036
037}