001package jmri.jmrix.can.cbus;
002
003/**
004 * CbusConstants.java
005 *
006 * Constants to represent CBUS protocol
007 *
008 * @author Andrew Crosland Copyright (C) 2008, 2021
009 */
010public final class CbusConstants {
011
012    // Class only supplies static methods
013    private CbusConstants(){}
014
015    /**
016     * Handle used by service mode programmer
017     */
018    public static final int SERVICE_HANDLE = 255;
019
020    public static final int DEFAULT_STANDARD_ID = 0x7a;
021    public static final int DEFAULT_EXTENDED_ID = 0x7a;
022
023    /**
024     * Get a String Array of valid CBUS CAN IDs for use with fixed IDs.
025     * CBUS dev guide 6b was 120-127, 6c is 100-127.
026     * @return list of CAN IDs from 100 to 127
027     */
028    public static String[] getValidFixedCanIds() {
029        final byte MAX = 28;
030        String[] result = new String[MAX];
031        for (int i = 0; i < MAX; i++) {
032            result[i] = String.valueOf(i + 100);
033        }
034        return result;
035    }
036
037    /**
038     * Get the Default JMRI CAN ID for new CBUS connections, 126, in String format.
039     */
040    public static final String DEFAULT_JMRI_CAN_ID_STRING = "126";
041
042    /**
043     * CBUS Manufacturer definitions
044     * Where the manufacturer already has an NMRA code, this is used
045     */
046    public static final int MANU_DEV = 13;
047    public static final int SPROG_DCC = 44;         // http://www.merg.co.uk
048    public static final int MANU_ROCRAIL = 70;      // http://www.rocrail.net
049    public static final int MANU_SPECTRUM = 80;     // http://animatedmodeler.com  (Spectrum Engineering)
050    public static final int MANU_MERG = 165;        // http://www.merg.co.uk
051    public static final int MANU_RME = 248;
052    public static final int MANU_SYSPIXIE = 249;
053    public static final int MANU_VLCB = 250;
054
055    /**
056     * SPROG DCC module types
057     * 
058     * Must agree with firmware cbusdefs.h include file from MERGDEV repo
059     */
060    public static final int MTYP_CANPiSPRG3 = 1;    // Pi-SPROG 3 (not v2) firmware on Pi-SPROG One hardware
061    public static final int MTYP_CANSPROG3P = 2;    // Sprog 3 Plus, Pi-SPROG 3v2 and Pi-SPROG 3 Plus common firmware
062    public static final int MTYP_CANSPROG = 3;
063    public static final int MTYP_SBOOST = 4;
064    //public static final int Unsupported = 5;
065    public static final int MTYP_CANSOLNOID = 8;   // Servo I/O module similar to MERG CANSOLIIO
066    public static final int MTYP_CANSERVOIO = 50;   // Servo I/O module similar to MERG CANMIO-SVO
067    public static final int MTYP_CANISB = 100;
068    public static final int MTYP_CANSOLIO = 101;    // Solenoid I/O module with inputs
069
070    /**
071     * CBUS Opcodes
072     *
073     * Note that VLCB op-codes that are additions to CBUS have a VLCB_ prefix.
074     * Any code using VLCB op-codes must ensure that the participating node is a VLCB node.
075     */
076    // Opcodes with no data
077    public static final int CBUS_ACK = 0x00;
078    public static final int CBUS_NAK = 0x01;
079    public static final int CBUS_HLT = 0x02;
080    public static final int CBUS_BON = 0x03;
081    public static final int CBUS_TOF = 0x04;
082    public static final int CBUS_TON = 0x05;
083    public static final int CBUS_ESTOP = 0x06;
084    public static final int CBUS_ARST = 0x07;
085    public static final int CBUS_RTOF = 0x08;
086    public static final int CBUS_RTON = 0x09;
087    public static final int CBUS_RESTP = 0x0A;
088
089    public static final int CBUS_RSTAT = 0x0C;
090    public static final int CBUS_QNN = 0x0D;
091
092    public static final int CBUS_RQNP = 0x10;
093    public static final int CBUS_RQMN = 0x11;
094
095    // Opcodes with 1 data
096    public static final int CBUS_KLOC = 0x21;
097    public static final int CBUS_QLOC = 0x22;
098    public static final int CBUS_DKEEP = 0x23;
099
100    public static final int CBUS_DBG1 = 0x30;
101
102    public static final int CBUS_EXTC = 0x3F;
103
104    // Opcodes with 2 data
105    public static final int CBUS_RLOC = 0x40;
106    public static final int CBUS_QCON = 0x41;
107    public static final int CBUS_SNN = 0x42;
108    public static final int CBUS_ALOC = 0x43;
109    public static final int CBUS_STMOD = 0x44;
110    public static final int CBUS_PCON = 0x45;
111    public static final int CBUS_KCON = 0x46;
112    public static final int CBUS_DSPD = 0x47;
113    public static final int CBUS_DFLG = 0x48;
114    public static final int CBUS_DFNON = 0x49;
115    public static final int CBUS_DFNOF = 0x4A;
116    public static final int CBUS_SSTAT = 0x4C;
117    public static final int CBUS_NNRSM = 0x4F;
118    public static final int CBUS_RQNN = 0x50;
119    public static final int CBUS_NNREL = 0x51;
120    public static final int CBUS_NNACK = 0x52;
121    public static final int CBUS_NNLRN = 0x53;
122    public static final int CBUS_NNULN = 0x54;
123    public static final int CBUS_NNCLR = 0x55;
124    public static final int CBUS_NNEVN = 0x56;
125    public static final int CBUS_NERD = 0x57;
126    public static final int CBUS_RQEVN = 0x58;
127    public static final int CBUS_WRACK = 0x59;
128    public static final int CBUS_RQDAT = 0x5A;
129    public static final int CBUS_RQDDS = 0x5B;
130    public static final int CBUS_BOOTM = 0x5C;
131    public static final int CBUS_ENUM = 0x5D;
132    public static final int CBUS_NNRST = 0x5E;
133    public static final int CBUS_EXTC1 = 0x5F;
134
135    // Opcodes with 3 data
136    public static final int CBUS_DFUN = 0x60;
137    public static final int CBUS_GLOC = 0x61;
138    public static final int CBUS_ERR = 0x63;
139
140    public static final int CBUS_CMDERR = 0x6F;
141
142    public static final int CBUS_EVNLF = 0x70;
143    public static final int CBUS_NVRD = 0x71;
144    public static final int CBUS_NENRD = 0x72;
145    public static final int CBUS_RQNPN = 0x73;
146    public static final int CBUS_NUMEV = 0x74;
147    public static final int CBUS_CANID = 0x75;
148    public static final int VLCB_MODE = 0x76;
149    public static final int VLCB_RQSD = 0x78;
150
151    public static final int CBUS_EXTC2 = 0x7F;
152
153    // Opcodes with 4 data
154    public static final int CBUS_RDCC3 = 0x80;
155    public static final int CBUS_WCVO = 0x82;
156    public static final int CBUS_WCVB = 0x83;
157    public static final int CBUS_QCVS = 0x84;
158    public static final int CBUS_PCVS = 0x85;
159    public static final int VLCB_RDGN = 0x87;
160    public static final int VLCB_NVSETRD = 0x8E;
161
162    public static final int CBUS_ACON = 0x90;
163    public static final int CBUS_ACOF = 0x91;
164    public static final int CBUS_AREQ = 0x92;
165    public static final int CBUS_ARON = 0x93;
166    public static final int CBUS_AROF = 0x94;
167    public static final int CBUS_EVULN = 0x95;
168    public static final int CBUS_NVSET = 0x96;
169    public static final int CBUS_NVANS = 0x97;
170    public static final int CBUS_ASON = 0x98;
171    public static final int CBUS_ASOF = 0x99;
172    public static final int CBUS_ASRQ = 0x9A;
173    public static final int CBUS_PARAN = 0x9B;
174    public static final int CBUS_REVAL = 0x9C;
175    public static final int CBUS_ARSON = 0x9D;
176    public static final int CBUS_ARSOF = 0x9E;
177    public static final int CBUS_EXTC3 = 0x9F;
178
179    // OPcodes with 5 data
180    public static final int CBUS_RDCC4 = 0xA0;
181    public static final int CBUS_WCVS = 0xA2;
182    public static final int CBUS_VCVS = 0xA4;
183    public static final int VLCB_HEARTB = 0xAB;
184    public static final int VLCB_SD = 0xAC;
185    public static final int VLCB_GRSP = 0xAF;
186
187    public static final int CBUS_ACON1 = 0xB0;
188    public static final int CBUS_ACOF1 = 0xB1;
189    public static final int CBUS_REQEV = 0xB2;
190    public static final int CBUS_ARON1 = 0xB3;
191    public static final int CBUS_AROF1 = 0xB4;
192    public static final int CBUS_NEVAL = 0xB5;
193    public static final int CBUS_PNN = 0xB6;
194    public static final int CBUS_ASON1 = 0xB8;
195    public static final int CBUS_ASOF1 = 0xB9;
196    public static final int CBUS_ARSON1 = 0xBD;
197    public static final int CBUS_ARSOF1 = 0xBE;
198    public static final int CBUS_EXTC4 = 0xBF;
199
200    // Opcodes with 6 data
201    public static final int CBUS_RDCC5 = 0xC0;
202    public static final int CBUS_WCVOA = 0xC1;
203    public static final int CBUS_CABDAT = 0xC2;
204    public static final int VLCB_DGN = 0xC7;
205    public static final int CBUS_FCLK = 0xCF;
206
207    public static final int CBUS_ACON2 = 0xD0;
208    public static final int CBUS_ACOF2 = 0xD1;
209    public static final int CBUS_EVLRN = 0xD2;
210    public static final int CBUS_EVANS = 0xD3;
211    public static final int CBUS_ARON2 = 0xD4;
212    public static final int CBUS_AROF2 = 0xD5;
213
214    public static final int CBUS_ASON2 = 0xD8;
215    public static final int CBUS_ASOF2 = 0xD9;
216
217    public static final int CBUS_ARSON2 = 0xDD;
218    public static final int CBUS_ARSOF2 = 0xDE;
219    public static final int CBUS_EXTC5 = 0xDF;
220
221    // Opcodes with 7 data
222    public static final int CBUS_RDCC6 = 0xE0;
223    public static final int CBUS_PLOC = 0xE1;
224    public static final int CBUS_NAME = 0xE2;
225    public static final int CBUS_STAT = 0xE3;
226    public static final int VLCB_ENACK = 0xE6;
227    public static final int VLCB_ESD = 0xE7;
228    public static final int CBUS_DTXC = 0xE9; // Defined by RFC0005 - Long message
229    public static final int VLCB_LM = 0xEA;   // VLCB Long message
230
231    public static final int CBUS_PARAMS = 0xEF;
232
233    public static final int CBUS_ACON3 = 0xF0;
234    public static final int CBUS_ACOF3 = 0xF1;
235    public static final int CBUS_ENRSP = 0xF2;
236    public static final int CBUS_ARON3 = 0xF3;
237    public static final int CBUS_AROF3 = 0xF4;
238    public static final int CBUS_EVLRNI = 0xF5;
239    public static final int CBUS_ACDAT = 0xF6;
240    public static final int CBUS_ARDAT = 0xF7;
241    public static final int CBUS_ASON3 = 0xF8;
242    public static final int CBUS_ASOF3 = 0xF9;
243    public static final int CBUS_DDES = 0xFA;
244    public static final int CBUS_DDRS = 0xFB;
245    public static final int CBUS_DDWS = 0xFC;
246
247    public static final int CBUS_ARSON3 = 0xFD;
248    public static final int CBUS_ARSOF3 = 0xFE;
249    public static final int CBUS_EXTC6 = 0xFF;
250
251    /**
252     * Extended opcodes, currently only used by the bootloader
253     * <p>
254     * These are all responses from the bootloader
255     */
256    public static final int CBUS_EXT_BOOT_ERROR = 0x00;
257    public static final int CBUS_EXT_BOOT_OK = 0x01;
258    public static final int CBUS_EXT_BOOTC = 0x02;
259    public static final int CBUS_EXT_BOOT_OUT_OF_RANGE = 0x03;
260    public static final int CBUS_EXT_DEVID = 0x05;
261    public static final int CBUS_EXT_BOOTID = 0x06;
262
263    /**
264     * Bootloader commands
265     *
266     * These are used in the data payload of bootloader control frames.
267     */
268    public static final int CBUS_BOOT_NOP = 0x00;
269    public static final int CBUS_BOOT_RESET = 0x01;
270    public static final int CBUS_BOOT_INIT = 0x02;
271    public static final int CBUS_BOOT_CHECK = 0x03;
272    public static final int CBUS_BOOT_TEST = 0x04;
273    public static final int CBUS_BOOT_DEVID = 0x05;
274    public static final int CBUS_BOOT_BOOTID = 0x06;
275    public static final int CBUS_BOOT_ENABLES = 0x07;
276
277    /**
278     * Bootloader protocol
279     *
280     * These define options for the bootloader mode
281     */
282    public static final int CBUS_BOOT_MODE_WRT_UNLCK  = 0x01;   // Unlock write and erase
283    public static final int CBUS_BOOT_MODE_ERASE_ONLY = 0x02;   // Erase without write
284    public static final int CBUS_BOOT_MODE_AUTO_ERASE = 0x04;   // Enable auto erase before write
285    public static final int CBUS_BOOT_MODE_AUTO_INC   = 0x08;   // Enable auto inc the address
286    public static final int CBUS_BOOT_MODE_ACK        = 0x10;   // Acknowledge mode
287
288    /**
289     * Programming modes
290     */
291    public static final int CBUS_PROG_DIRECT_BYTE = 0;
292    public static final int CBUS_PROG_DIRECT_BIT = 1;
293    public static final int CBUS_PROG_PAGED = 2;
294    public static final int CBUS_PROG_REGISTER = 3;
295    public static final int CBUS_PROG_ADDRESS = 4;
296    public static final int CBUS_OPS_BYTE = 5;
297    
298    /**
299     * Error codes returned by CBUS_ERR
300     */
301    public static final int ERR_LOCO_STACK_FULL = 1;
302    public static final int ERR_LOCO_ADDRESS_TAKEN = 2;
303    public static final int ERR_SESSION_NOT_PRESENT = 3;
304    public static final int ERR_CONSIST_EMPTY = 4;
305    public static final int ERR_LOCO_NOT_FOUND = 5;
306    public static final int ERR_CAN_BUS_ERROR = 6;
307    public static final int ERR_INVALID_REQUEST = 7;
308    public static final int ERR_SESSION_CANCELLED = 8;
309
310    /**
311     * Status codes for OPC_SSTAT
312     */
313    public static final int SSTAT_NO_ACK = 1;
314    public static final int SSTAT_OVLD = 2;
315    public static final int SSTAT_WR_ACK = 3;
316    public static final int SSTAT_BUSY = 4;
317    public static final int SSTAT_CV_ERROR = 5;
318
319    /**
320     * Event types
321     */
322    public static final int EVENT_ON = 0;
323    public static final int EVENT_OFF = 1;
324    public static final int EVENT_EITHER = 2;
325    public static final int EVENT_NEITHER = 3;
326
327    /**
328     * Event directions
329     */
330    public static final int EVENT_DIR_UNSET = 0;
331    public static final int EVENT_DIR_IN = 1;
332    public static final int EVENT_DIR_OUT = 2;
333    public static final int EVENT_DIR_EITHER = 3;
334
335    /**
336     * CBUS Priorities
337     */
338    public static final int DEFAULT_DYNAMIC_PRIORITY = 2;
339    public static final int DEFAULT_MINOR_PRIORITY = 3;
340
341    /**
342     * Function bits for group1
343     */
344    public static final int CBUS_F0 = 16;
345    public static final int CBUS_F1 = 1;
346    public static final int CBUS_F2 = 2;
347    public static final int CBUS_F3 = 4;
348    public static final int CBUS_F4 = 8;
349
350    /**
351     * Function bits for group2
352     */
353    public static final int CBUS_F5 = 1;
354    public static final int CBUS_F6 = 2;
355    public static final int CBUS_F7 = 4;
356    public static final int CBUS_F8 = 8;
357
358    /**
359     * Function bits for group3
360     */
361    public static final int CBUS_F9 = 1;
362    public static final int CBUS_F10 = 2;
363    public static final int CBUS_F11 = 4;
364    public static final int CBUS_F12 = 8;
365
366    /**
367     * Function bits for group4
368     */
369    public static final int CBUS_F13 = 1;
370    public static final int CBUS_F14 = 2;
371    public static final int CBUS_F15 = 4;
372    public static final int CBUS_F16 = 8;
373    public static final int CBUS_F17 = 0x10;
374    public static final int CBUS_F18 = 0x20;
375    public static final int CBUS_F19 = 0x40;
376    public static final int CBUS_F20 = 0x80;
377
378    /**
379     * Function bits for group5
380     */
381    public static final int CBUS_F21 = 1;
382    public static final int CBUS_F22 = 2;
383    public static final int CBUS_F23 = 4;
384    public static final int CBUS_F24 = 8;
385    public static final int CBUS_F25 = 0x10;
386    public static final int CBUS_F26 = 0x20;
387    public static final int CBUS_F27 = 0x40;
388    public static final int CBUS_F28 = 0x80;
389
390    /**
391     * Function bits for group6
392     */
393    public static final int CBUS_F29 = 1;
394    public static final int CBUS_F30 = 2;
395    public static final int CBUS_F31 = 4;
396    public static final int CBUS_F32 = 8;
397    public static final int CBUS_F33 = 16;
398    public static final int CBUS_F34 = 32;
399    public static final int CBUS_F35 = 64;
400    public static final int CBUS_F36 = 128;
401
402    static final int[] CBUS_FUNCTION_BITS = new int[]{ CBUS_F0,
403        CBUS_F1, CBUS_F2, CBUS_F3, CBUS_F4, CBUS_F5, CBUS_F6, CBUS_F7,
404        CBUS_F8, CBUS_F9, CBUS_F10, CBUS_F11, CBUS_F12, CBUS_F13, CBUS_F14,
405        CBUS_F15, CBUS_F16, CBUS_F17, CBUS_F18, CBUS_F19, CBUS_F20, CBUS_F21,
406        CBUS_F22, CBUS_F23, CBUS_F24, CBUS_F25, CBUS_F26, CBUS_F27, CBUS_F28,
407        CBUS_F29, CBUS_F30, CBUS_F31, CBUS_F32, CBUS_F33, CBUS_F34, CBUS_F35, CBUS_F36 };
408
409    /**
410     * Throttle modes
411     */
412    public static final int CBUS_SS_128 = 0;
413    public static final int CBUS_SS_14 = 1;
414    public static final int CBUS_SS_28_INTERLEAVE = 2;
415    public static final int CBUS_SS_28 = 3;
416
417    /**
418     * Number of function buttons on a throttle
419     */
420    public static int MAX_FUNCTIONS = 32; 
421    
422    /**
423     * Number of slots supported by the command station
424     */
425    public static final int CBUS_MAX_SLOTS = 32;
426}