001package jmri.jmrix.lenz.messageformatters;
002
003import jmri.jmrix.Message;
004import jmri.jmrix.lenz.LenzCommandStation;
005import jmri.jmrix.lenz.XNetConstants;
006import jmri.jmrix.lenz.XNetMessage;
007import jmri.jmrix.lenz.XPressNetMessageFormatter;
008
009/**
010 * Formatter for XPressNet messages that set speed and direction in 14 speed step mode.
011 *
012 * @see XNetMessage
013 * @see XPressNetMessageFormatter
014 *
015 * @author Paul Bender Copyright (C) 2024
016 */
017
018public class XNet14SpeedStepModeSpeedAndDirectionFormatter implements XPressNetMessageFormatter {
019
020    private static final String FORWARD = "Forward";
021    private static final String REVERSE = "Reverse";
022    private static final String X_NET_MESSAGE_SET_SPEED = "XNetMessageSetSpeed";
023    private static final String X_NET_MESSAGE_SET_DIRECTION = "XNetMessageSetDirection";
024    private static final String SPEED_STEP_MODE_X = "SpeedStepModeX";
025
026    @Override
027    public boolean handlesMessage(Message m) {
028        return m instanceof XNetMessage &&
029                ((XNetMessage) m).getElement(0) == XNetConstants.LOCO_OPER_REQ &&
030                        ((XNetMessage) m).getElement(1) == XNetConstants.LOCO_SPEED_14;
031    }
032
033    @Override
034    public String formatMessage(Message m) {
035        if(!handlesMessage(m)) {
036            throw new IllegalArgumentException("Message not supported by this formatter");
037        }
038        String direction;
039        if ((m.getElement(4) & 0x80) != 0) {
040            direction = Bundle.getMessage(X_NET_MESSAGE_SET_DIRECTION, Bundle.getMessage(FORWARD));
041        } else {
042            direction = Bundle.getMessage(X_NET_MESSAGE_SET_DIRECTION, Bundle.getMessage(REVERSE));
043        }
044        return "Mobile Decoder Operations Request: " + Bundle.getMessage(X_NET_MESSAGE_SET_SPEED,
045                LenzCommandStation.calcLocoAddress(m.getElement(2), m.getElement(3)))
046                + " " + (m.getElement(4) & 0x0f)
047                + " " + direction
048                + " " + Bundle.getMessage(SPEED_STEP_MODE_X, 14) + ".";
049    }
050
051}