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 128 speed step mode.
011 *
012 * @see jmri.jmrix.lenz.XNetMessage
013 * @see jmri.jmrix.lenz.XPressNetMessageFormatter
014 *
015 * @author Paul Bender Copyright (C) 2024
016 */
017
018public class XNet128SpeedStepModeSpeedAndDirectionFormatter 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_128;
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(FORWARD);
041        } else {
042            direction = Bundle.getMessage(REVERSE);
043        }
044        return "Mobile Decoder Operations Request: " +
045                Bundle.getMessage(X_NET_MESSAGE_SET_SPEED,
046                    LenzCommandStation.calcLocoAddress(m.getElement(2), m.getElement(3)))
047                + " "
048                + (m.getElement(4) & 0x7F) + " " + Bundle.getMessage(X_NET_MESSAGE_SET_DIRECTION, direction) +
049                " " + Bundle.getMessage(SPEED_STEP_MODE_X, 128) + ".";
050    }
051
052}