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}