001package jmri.jmrix.lenz.messageformatters; 002 003import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; 004import jmri.jmrix.Message; 005import jmri.jmrix.lenz.XNetConstants; 006import jmri.jmrix.lenz.XNetReply; 007import jmri.jmrix.lenz.XPressNetMessageFormatter; 008 009/** 010 * Format replies for XPressNet Command Station Stack Search Results. 011 * 012 * @author Paul Bender Copyright (C) 2025 013 */ 014public class XNetStackSearchReplyFormatter implements XPressNetMessageFormatter { 015 016 017 @Override 018 public boolean handlesMessage(Message m) { 019 return m instanceof XNetReply && 020 m.getElement(0) == XNetConstants.LOCO_INFO_RESPONSE && 021 (m.getElement(1) == XNetConstants.LOCO_SEARCH_NO_RESULT || 022 m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_DH || 023 m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_MU || 024 m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_MU_BASE || 025 m.getElement(1) == XNetConstants.LOCO_SEARCH_RESPONSE_N); 026 } 027 028 @SuppressFBWarnings(value = "BC_UNCONFIRMED_CAST", justification = "cast is checked in handlesMessage") 029 @Override 030 public String formatMessage(Message m) { 031 if(!handlesMessage(m)){ 032 throw new IllegalArgumentException("Message not supported by this formatter"); 033 } 034 XNetReply r = (XNetReply) m; 035 StringBuilder text = new StringBuilder(Bundle.getMessage("XNetReplyLocoLabel") + " "); 036 switch (r.getElement(1)) { 037 case XNetConstants.LOCO_SEARCH_RESPONSE_N: 038 text.append(Bundle.getMessage("XNetReplySearchNormalLabel")).append(" "); 039 text.append(r.getThrottleMsgAddr()); 040 break; 041 case XNetConstants.LOCO_SEARCH_RESPONSE_DH: 042 text.append(Bundle.getMessage("XNetReplySearchDHLabel")).append(" "); 043 text.append(r.getThrottleMsgAddr()); 044 break; 045 case XNetConstants.LOCO_SEARCH_RESPONSE_MU_BASE: 046 text.append(Bundle.getMessage("XNetReplySearchMUBaseLabel")).append(" "); 047 text.append(r.getThrottleMsgAddr()); 048 break; 049 case XNetConstants.LOCO_SEARCH_RESPONSE_MU: 050 text.append(Bundle.getMessage("XNetReplySearchMULabel")).append(" "); 051 text.append(r.getThrottleMsgAddr()); 052 break; 053 case XNetConstants.LOCO_SEARCH_NO_RESULT: 054 text.append(Bundle.getMessage("XNetReplySearchFailedLabel")).append(" "); 055 text.append(r.getThrottleMsgAddr()); 056 break; 057 default: 058 // Should never happen 059 throw new IllegalArgumentException("Message not supported by this formatter"); 060 } 061 return text.toString(); 062 } 063 064}