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}