001package jmri.jmrix.zimo.swing.monitor;
002
003import java.util.Date;
004import javax.swing.JCheckBox;
005import jmri.jmrix.zimo.Mx1Listener;
006import jmri.jmrix.zimo.Mx1Message;
007import jmri.jmrix.zimo.Mx1SystemConnectionMemo;
008import jmri.jmrix.zimo.swing.Mx1PanelInterface;
009import org.slf4j.Logger;
010import org.slf4j.LoggerFactory;
011
012/**
013 * Swing action to create and register a MonFrame object.
014 *
015 * @author Bob Jacobsen Copyright (C) 2001, 2008
016 * @author kcameron Copyright (C) 2011 copied from SerialMonPane.java
017 * @author Daniel Boudreau Copyright (C) 2012 added human readable format
018 */
019public class Mx1MonPanel extends jmri.jmrix.AbstractMonPane implements Mx1Listener, Mx1PanelInterface {
020
021    public Mx1MonPanel() {
022        super();
023    }
024
025    @Override
026    public String getHelpTarget() {
027        return "package.jmri.jmrix.zimo.swing.monitor.Mx1MonPanel";
028    } // NOI18N
029
030    @Override
031    public String getTitle() {
032        StringBuilder x = new StringBuilder();
033        if (memo != null) {
034            x.append(memo.getUserName());
035        } else {
036            x.append("Mx1_"); // NOI18N
037        }
038        x.append(": "); // NOI18N
039        x.append("Command Monitor"); // I18N
040        return x.toString();
041    }
042
043    @Override
044    public void dispose() {
045        if (memo.getMx1TrafficController() != null) {
046            memo.getMx1TrafficController().removeMx1Listener(~0, this);
047        }
048        // and unwind swing
049        super.dispose();
050    }
051
052    @Override
053    public void init() {
054    }
055
056    Mx1SystemConnectionMemo memo;
057
058    @Override
059    public void initContext(Object context) {
060        if (context instanceof Mx1SystemConnectionMemo) {
061            initComponents((Mx1SystemConnectionMemo) context);
062        }
063    }
064
065    JCheckBox includePoll = new JCheckBox("Include Poll Messages"); // NOI18N
066
067    @Override
068    public void initComponents(Mx1SystemConnectionMemo memo) {
069        this.memo = memo;
070        // connect to the LnTrafficController
071        if (memo.getMx1TrafficController() == null) {
072            log.error("No traffic controller is available"); // NOI18N
073            return;
074        }
075        memo.getMx1TrafficController().addMx1Listener(~0, this);
076    }
077
078    Date previousTimeStamp;
079
080    public synchronized void notifyXmit(Date timestamp, Mx1Message m) {
081        logMessage(timestamp, m, "Tx:");
082    }
083
084    public synchronized void notifyFailedXmit(Date timestamp, Mx1Message m) {
085
086        logMessage(timestamp, m, "FAILED:");
087    }
088
089    public synchronized void notifyRcv(Date timestamp, Mx1Message m) {
090
091        String prefix = "Rx:"; // NOI18N
092        logMessage(timestamp, m, prefix);
093    }
094
095    @Override
096    public synchronized void message(Mx1Message l) {  // receive a MX-1 message and log it
097        // display the raw data if requested
098        StringBuilder raw = new StringBuilder("packet: ");
099        if (rawCheckBox.isSelected()) {
100            int len = l.getNumDataElements();
101            for (int i = 0; i < len; i++) {
102                raw.append(Integer.toHexString(l.getElement(i))).append(" ");
103            }
104        }
105
106        // display the decoded data
107        nextLine(l.getStringMsg() + "\n", raw.toString());
108    }
109
110    private void logMessage(Date timestamp, Mx1Message m, String src) { // receive a Mrc message and log it
111        StringBuilder raw = new StringBuilder("");
112        for (int i = 0; i < m.getNumDataElements(); i++) {
113            if (i > 0) {
114                raw.append(" ");
115            }
116            raw.append(jmri.util.StringUtil.twoHexFromInt(m.getElement(i) & 0xFF));
117        }
118
119        // display the decoded data
120        // we use Mx1Message to format
121        nextLineWithTime(timestamp, src + " " + m.toString() + "\n", raw.toString());
122    }
123
124    /**
125     * Nested class to create one of these using old-style defaults.
126     * 
127     * @deprecated since 4.19.7; use {@link Mx1MonPanelAction} instead
128     */
129    @Deprecated
130    static public class Default extends jmri.jmrix.zimo.swing.Mx1NamedPaneAction {
131
132        public Default() {
133            super("Mx1 Command Monitor",
134                    new jmri.util.swing.sdi.JmriJFrameInterface(),
135                    Mx1MonPanel.class.getName(),
136                    jmri.InstanceManager.getDefault(Mx1SystemConnectionMemo.class)); // NOI18N
137        }
138    }
139
140    private final static Logger log = LoggerFactory.getLogger(Mx1MonPanel.class);
141
142}