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}