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 * Format Ops Mode Request messages for display
011 *
012 * @author Paul Bender Copyright (C) 2024
013 */
014public class XNetOpsModeRequestMessageFormatter implements XPressNetMessageFormatter{
015    @Override
016    public boolean handlesMessage(Message m) {
017        return m instanceof XNetMessage &&
018                m.getElement(0)  == XNetConstants.OPS_MODE_PROG_REQ;
019    }
020
021    @Override
022    public String formatMessage(Message m) {
023            if(m.getElement(1)==   XNetConstants.OPS_MODE_PROG_WRITE_REQ){
024                if ((m.getElement(4) & 0xEC) == 0xEC || (m.getElement(4) & 0xE4) == 0xE4) {
025                    return getWriteString(m);
026                } else if ((m.getElement(4) & 0xE8) == 0xE8) {
027                    return getVerifyString(m);
028                }
029            }
030        throw new IllegalArgumentException("Unknown Ops Mode Request Type");
031    }
032
033    private static String getVerifyString(Message m) {
034        String message;
035        if ((m.getElement(6) & 0x10) == 0x10) {
036            message = "XNetMessageOpsModeBitVerify";
037        } else {
038            message = "XNetMessageOpsModeBitWrite";
039        }
040        return Bundle.getMessage(message, ((m.getElement(6) & 0x08) >> 3), (1 + m.getElement(5) + ((m.getElement(4) & 0x03) << 8)), (m.getElement(6) & 0x07), LenzCommandStation.calcLocoAddress(m.getElement(2), m.getElement(3)));
041    }
042
043    private static String getWriteString(Message m) {
044        String message = "";
045        if ((m.getElement(4) & 0xEC) == 0xEC) {
046            message = "XNetMessageOpsModeByteWrite";
047        } else if ((m.getElement(4) & 0xE4) == 0xE4) {
048            message = "XNetMessageOpsModeByteVerify";
049        }
050        return Bundle.getMessage(message, m.getElement(6), (1 + m.getElement(5) + ((m.getElement(4) & 0x03) << 8)), LenzCommandStation.calcLocoAddress(m.getElement(2), m.getElement(3)));
051    }
052
053}