001package jmri.jmrix.powerline.cp290; 002 003/** 004 * Constants and functions specific to the CP290 interface 005 * 006 * @author Bob Jacobsen Copyright (C) 2008 007 * @author Ken Cameron, (C) 2009, add sensors from poll replies 008 */ 009public class Constants { 010 011 private Constants() {} // class only supplies static methods 012 013 public static final int CMD_ON = 0x02; 014 public static final int CMD_OFF = 0x03; 015 public static final int CMD_DIM_R = 0x04; 016 public static final int CMD_DIM_S = 0x05; 017 018 /** 019 * Translate Function to Text. 020 * @param cmd command value 021 * @param level dim value 022 * @return formatted command as text 023 */ 024 public static String commandToText(int cmd, int level) { 025 String cmdText; 026 switch (cmd) { 027 case CMD_ON: 028 cmdText = "ON"; 029 break; 030 case CMD_OFF: 031 cmdText = "OFF"; 032 break; 033 case CMD_DIM_R: 034 cmdText = "recvDIM"; 035 cmdText = cmdText + " "; 036 break; 037 case CMD_DIM_S: 038 cmdText = "sendDIM"; 039 int v2 = (level * 100) / 16; 040 cmdText = cmdText + " " + v2 + "%"; 041 break; 042 default: 043 cmdText = "Unk Cmd: " + cmd; 044 break; 045 } 046 return (cmdText); 047 } 048 049 /** 050 * Translate House Code to text 051 * @param hC housecode value 052 * @return housecode as text 053 */ 054 public static String houseCodeToText(int hC) { 055 String hCode; 056 switch (hC) { 057 case 0x06: 058 hCode = "A"; 059 break; 060 case 0x0E: 061 hCode = "B"; 062 break; 063 case 0x02: 064 hCode = "C"; 065 break; 066 case 0x0A: 067 hCode = "D"; 068 break; 069 case 0x01: 070 hCode = "E"; 071 break; 072 case 0x09: 073 hCode = "F"; 074 break; 075 case 0x05: 076 hCode = "G"; 077 break; 078 case 0x0D: 079 hCode = "H"; 080 break; 081 case 0x07: 082 hCode = "I"; 083 break; 084 case 0x0F: 085 hCode = "J"; 086 break; 087 case 0x03: 088 hCode = "K"; 089 break; 090 case 0x0B: 091 hCode = "L"; 092 break; 093 case 0x00: 094 hCode = "M"; 095 break; 096 case 0x08: 097 hCode = "N"; 098 break; 099 case 0x04: 100 hCode = "O"; 101 break; 102 case 0x0C: 103 hCode = "P"; 104 break; 105 default: 106 hCode = "Unk hC:" + hC; 107 break; 108 } 109 return hCode; 110 } 111 112 /** 113 * Translate Device Bits to Text 114 * @param hByte high byte 115 * @param lByte low byte 116 * @return text version of bytes 117 */ 118 public static String deviceToText(int hByte, int lByte) { 119 int mask = 0x01; 120 int x = lByte; 121 StringBuilder dev = new StringBuilder(); 122 for (int i = 8; i > 0; i--) { 123 if ((x & mask) != 0) { 124 dev.append(" " + i); 125 } 126 mask = mask << 1; 127 } 128 mask = 0x01; 129 x = hByte; 130 for (int i = 16; i > 8; i--) { 131 if ((x & mask) != 0) { 132 dev.append(" " + i); 133 } 134 mask = mask << 1; 135 } 136 return dev.toString(); 137 } 138 139 /** 140 * Translate status to text 141 * @param s status value 142 * @return status value as text 143 */ 144 public static String statusToText(int s) { 145 String stat = ""; 146 switch (s) { 147 case 0: 148 stat = "Interface Powered Off"; 149 break; 150 case 1: 151 stat = "Cmd Ok"; 152 break; 153 default: 154 stat = "Unk Status: " + s; 155 break; 156 } 157 return (stat); 158 } 159 160 /** 161 * Format a message nicely 162 * @param m message 163 * @return message contents as text 164 */ 165 public static String toMonitorString(jmri.jmrix.Message m) { 166 // check for valid length 167 String val = "???"; 168 int len = m.getNumDataElements(); 169 boolean goodSync = true; 170 boolean goodCheckSum = true; 171 int sum = 0; 172 String cmd; 173 String stat; 174 String hCode; 175 String bCode; 176 String dev; 177 switch (len) { 178 case 7: 179 for (int i = 0; i < 6; i++) { 180 if ((m.getElement(i) & 0xFF) != 0xFF) { 181 goodSync = false; 182 } 183 } 184 val = statusToText(m.getElement(6)); 185 break; 186 case 12: 187 for (int i = 0; i < 6; i++) { 188 if ((m.getElement(i) & 0xFF) != 0xFF) { 189 goodSync = false; 190 } 191 } 192 for (int i = 7; i < 11; i++) { 193 sum = (sum + (m.getElement(i) & 0xFF)) & 0xFF; 194 } 195 stat = statusToText(m.getElement(6)); 196 cmd = commandToText(m.getElement(7) & 0x0F, -1); 197 hCode = houseCodeToText((m.getElement(7) >> 4) & 0x0F); 198 dev = deviceToText(m.getElement(8), m.getElement(9)); 199 bCode = houseCodeToText((m.getElement(10) >> 4) & 0x0F); 200 if (sum != (m.getElement(11) & 0xFF)) { 201 goodCheckSum = false; 202 } 203 val = "Cmd Echo: " + cmd + " stat: " + stat + " House: " + hCode + " Device:" + dev + " base: " + bCode; 204 if (!goodSync) { 205 val = val + " BAD SYNC"; 206 } 207 if (!goodCheckSum) { 208 val = val + " BAD CHECKSUM: " + (m.getElement(11) & 0xFF) + " vs " + sum; 209 } 210 break; 211 case 22: 212 for (int i = 0; i < 16; i++) { 213 if ((m.getElement(i) & 0xFF) != 0xFF) { 214 goodSync = false; 215 } 216 } 217 for (int i = 17; i < 21; i++) { 218 sum = (sum + (m.getElement(i) & 0xFF)) & 0xFF; 219 } 220 cmd = commandToText((m.getElement(17) & 0x0F), ((m.getElement(17) & 0xF0) >> 4)); 221 hCode = houseCodeToText((m.getElement(18) >> 4) & 0x0F); 222 dev = deviceToText(m.getElement(19), m.getElement(20)); 223 if (sum != (m.getElement(21) & 0xFF)) { 224 goodCheckSum = false; 225 } 226 val = cmd + " House: " + hCode + " Device:" + dev; 227 if (!goodSync) { 228 val = val + " BAD SYNC"; 229 } 230 if (!goodCheckSum) { 231 val = val + " BAD CHECKSUM: " + (m.getElement(21) & 0xFF) + " vs " + sum; 232 } 233 break; 234 default: 235 val = "UNK " + m.toString(); 236 break; 237 } 238 return val; 239 } 240 241}