001package jmri.jmrix.loconet.alm;
002
003import jmri.jmrix.loconet.LnConstants;
004import jmri.jmrix.loconet.LocoNetMessage;
005
006/**
007 * ALM Message Helper.
008 *
009 * @author Bob Milhaupt    Copyright (C) 2022
010 */
011public class Alm {
012    private Alm () {
013        throw new IllegalStateException("Utility class"); // NOI18N
014    }
015
016    private static final LocoNetMessage almcapq = new LocoNetMessage(new int[] {
017        LnConstants.OPC_IMM_PACKET_2, 16, 1, 0,0,0,0,0,
018        0,0,0,0,0,0,0,0});
019
020    private static final int[] capqmask = {255, 255, 255, 255, 255, 255, 255, 255,
021    255, 255, 255,255, 255, 255, 0, 0};
022
023    private static final LocoNetMessage capCsRr = new LocoNetMessage(new int[] {
024        0xE6, 0x10, 0x01, 0x00, 0x40, 0x02, 0x03, 0x02,
025        0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
026    });
027
028    private static final int[] csCapabilitiesMasks = {
029        0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x7d, 0, 0x7f,
030        0x67, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x00 };
031
032    private static final LocoNetMessage drcDs74 = new LocoNetMessage(new int[] {
033        0xE6, 0x10, 0x02, 0x00, 0x10, 0x00, 0x00, 0x02,
034        0x08, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
035    });
036
037    private static final int[] ds74CapabilitiesMasks = {
038        0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
039        0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
040
041    private static final LocoNetMessage drcDs78v = new LocoNetMessage(new int[] {
042        0xE6, 0x10, 0x02, 0x00, 0x20, 0x00, 0x00, 0x02,
043        0x08, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
044    });
045
046    private static final LocoNetMessage drcSe74 = new LocoNetMessage(new int[] {
047        0xE6, 0x10, 0x02, 0x00, 0x10, 0x00, 0x00, 0x02,
048        0x08, 0x46, 0x00, 0x46, 0x08, 0x7C, 0x01, 0x00
049    });
050
051    private static final LocoNetMessage drcPm74 = new LocoNetMessage(new int[] {
052        0xE6, 0x10, 0x02, 0x00, 0x01, 0x00, 0x00, 0x02,
053        0x04, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
054    });
055
056    private static final LocoNetMessage drcBdl716 = new LocoNetMessage(new int[] {
057        0xE6, 0x10, 0x02, 0x00, 0x02, 0x00, 0x01, 0x02,
058        0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
059    });
060
061    private static final LocoNetMessage almchga = new LocoNetMessage (new int[] {
062        0xEE, 0x10, 2, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
063    private static final int[] almchgam = {
064        255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0};
065
066    private static final LocoNetMessage almgetr = new LocoNetMessage (new int[] {
067        0xEE, 0x10, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
068    private static final int[] almgetrm = {
069        255, 255, 255, 255, 0, 0x7E, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0};
070
071    public static boolean isCsCapsRpt(LocoNetMessage l) {
072        return l.equals(capCsRr, csCapabilitiesMasks);
073    }
074
075    public static boolean isDs74CapsRpt(LocoNetMessage l) {
076        return l.equals(drcDs74, ds74CapabilitiesMasks);
077    }
078
079    public static boolean isDs78vCapsRpt(LocoNetMessage l) {
080        return l.equals(drcDs78v, ds74CapabilitiesMasks);
081    }
082
083    public static boolean isSe74CapsRpt(LocoNetMessage l) {
084        return l.equals(drcSe74, ds74CapabilitiesMasks);
085    }
086
087    public static boolean isPm74CapsRpt(LocoNetMessage l) {
088        return l.equals(drcPm74, ds74CapabilitiesMasks);
089    }
090
091    public static boolean isBdl716CapsRpt(LocoNetMessage l) {
092        log.info("dsgsgs {}", l.toString());
093        return l.equals(drcBdl716, ds74CapabilitiesMasks);
094    }
095
096    public static boolean isDevBAW(LocoNetMessage l) {
097        return (getAlmMsgType(l) == AlmMsgTypes.ALM_BAW);
098    }
099
100    public static boolean isDs7xRQ(LocoNetMessage l) {
101        return getAlmMsgType(l) == AlmMsgTypes.ALM_RDQ;
102    }
103
104    static AlmMsgTypes getAlmMsgType(LocoNetMessage m) {
105        // Verify message basics
106        if (((m.getOpCode() != LnConstants.OPC_IMM_PACKET_2)
107                && (m.getOpCode() != LnConstants.OPC_ALM_READ))
108                || (m.getElement(1) != 0x10) || (m.getNumDataElements()!=16)) {
109            return AlmMsgTypes.NOT_ALM_MSG;
110        }
111
112        // check routes capabilities query
113        if (m.equals(almcapq)) {
114            return AlmMsgTypes.ALM_ROUTCAPQ;
115        }
116        if (m.equals(almcapq, capqmask)) {
117            return AlmMsgTypes.ALM_ROUTCAPREP;
118        }
119        if (m.equals(almchga, almchgam)) {
120            return AlmMsgTypes.ALM_BAW;
121        }
122        if (m.equals(almgetr, almgetrm)) {
123            return AlmMsgTypes.ALM_RDQ;
124        }
125        if (m.equals(capCsRr, csCapabilitiesMasks)) {
126            return AlmMsgTypes.ALM_ROUTECSCAPREP;
127        }
128        return AlmMsgTypes.NOT_ALM_MSG;
129    }
130    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Alm.class);
131}