001package jmri.jmrix.lenz.messageformatters;
002
003import jmri.jmrix.Message;
004import jmri.jmrix.lenz.XNetConstants;
005import jmri.jmrix.lenz.XNetMessage;
006import jmri.jmrix.lenz.XPressNetMessageFormatter;
007
008/**
009 * Message Formatter for XPressNet programming read request messages
010 * @author Paul Bender Copyright (C) 2024
011 */
012public class XNetProgReadMessageFormatter implements XPressNetMessageFormatter {
013
014    private static final String X_NET_MESSAGE_REQUEST_SERVICE_MODE_READ_DIRECT_V_36 = "XNetMessageRequestServiceModeReadDirectV36";
015
016
017    @Override
018    public boolean handlesMessage(Message m) {
019        return m instanceof XNetMessage &&
020            m.getElement(0) == XNetConstants.PROG_READ_REQUEST &&
021                (m.getElement(1) == XNetConstants.PROG_READ_MODE_REGISTER ||
022             m.getElement(1) == XNetConstants.PROG_READ_MODE_CV ||
023             m.getElement(1) == XNetConstants.PROG_READ_MODE_PAGED ||
024                        (m.getElement(1) >= XNetConstants.PROG_READ_MODE_CV_V36
025                        && m.getElement(1) <= XNetConstants.PROG_READ_MODE_CV_V36 + 3));
026    }
027
028    @Override
029    public String formatMessage(Message m) {
030        switch (m.getElement(1)) {
031            case XNetConstants.PROG_READ_MODE_REGISTER:
032                return Bundle.getMessage("XNetMessageRequestServiceModeReadRegister", m.getElement(2));
033            case XNetConstants.PROG_READ_MODE_CV:
034                return Bundle.getMessage("XNetMessageRequestServiceModeReadDirect", m.getElement(2));
035            case XNetConstants.PROG_READ_MODE_PAGED:
036                return Bundle.getMessage("XNetMessageRequestServiceModeReadPaged", m.getElement(2));
037            case XNetConstants.PROG_READ_MODE_CV_V36:
038                return Bundle.getMessage(X_NET_MESSAGE_REQUEST_SERVICE_MODE_READ_DIRECT_V_36, (m.getElement(2) == 0 ? 1024 : m.getElement(2)));
039            case XNetConstants.PROG_READ_MODE_CV_V36 + 1:
040                return Bundle.getMessage(X_NET_MESSAGE_REQUEST_SERVICE_MODE_READ_DIRECT_V_36, (256 + m.getElement(2)));
041            case XNetConstants.PROG_READ_MODE_CV_V36 + 2:
042                return Bundle.getMessage(X_NET_MESSAGE_REQUEST_SERVICE_MODE_READ_DIRECT_V_36, (512 + m.getElement(2)));
043            case XNetConstants.PROG_READ_MODE_CV_V36 + 3:
044                return Bundle.getMessage(X_NET_MESSAGE_REQUEST_SERVICE_MODE_READ_DIRECT_V_36, (768 + m.getElement(2)));
045            default:
046                throw new IllegalArgumentException("Unknown Programming Read Message");
047        }
048    }
049}