001// Warnings objectInputStream here about changes to this structure and how it will affect old/new programs:
002//https://howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-objectInputStream-java/
003
004package jmri.jmrit.ctc.ctcserialdata;
005
006import java.util.ArrayList;
007import java.util.HashMap;
008import java.util.HashSet;
009import java.util.List;
010import javax.swing.ButtonGroup;
011import jmri.jmrit.ctc.*;
012
013/**
014 *
015 * @author Gregory J. Bedlek Copyright (C) 2018, 2019
016 */
017public class CodeButtonHandlerData {
018    public static final int SWITCH_NOT_SLAVED = -1;
019
020    public enum LOCK_IMPLEMENTATION {
021// The values in paren's are the RadioGroup values set by "CommonSubs.numberButtonGroup",
022// gotten by calling "CommonSubs.getButtonSelectedInt".
023        GREGS(0), OTHER(1);
024        private final int _mRadioGroupValue;
025        private final static HashMap<Integer, LOCK_IMPLEMENTATION> map = new HashMap<>();
026        private LOCK_IMPLEMENTATION (int radioGroupValue) { _mRadioGroupValue = radioGroupValue; }
027        static { for (LOCK_IMPLEMENTATION value : LOCK_IMPLEMENTATION.values()) { map.put(value._mRadioGroupValue, value); }}
028        public int getInt() { return _mRadioGroupValue; }
029        public static LOCK_IMPLEMENTATION getLockImplementation(int radioGroupValue) { return map.get(radioGroupValue); }
030        public static LOCK_IMPLEMENTATION getLockImplementation(ButtonGroup buttonGroup) { return map.get(ProjectsCommonSubs.getButtonSelectedInt(buttonGroup)); }
031    }
032
033    public enum TURNOUT_TYPE {
034// The values in paren's are the RadioGroup values set by "CommonSubs.numberButtonGroup",
035// gotten by calling "CommonSubs.getButtonSelectedInt".
036        TURNOUT(0), CROSSOVER(1), DOUBLE_CROSSOVER(2);
037        private final int _mRadioGroupValue;
038        private final static HashMap<Integer, TURNOUT_TYPE> map = new HashMap<>();
039        private TURNOUT_TYPE (int radioGroupValue) { _mRadioGroupValue = radioGroupValue; }
040        static { for (TURNOUT_TYPE value : TURNOUT_TYPE.values()) { map.put(value._mRadioGroupValue, value); }}
041        public int getInt() { return _mRadioGroupValue; }
042        public static TURNOUT_TYPE getTurnoutType(int radioGroupValue) { return map.get(radioGroupValue); }
043        public static TURNOUT_TYPE getTurnoutType(ButtonGroup buttonGroup) { return map.get(ProjectsCommonSubs.getButtonSelectedInt(buttonGroup)); }
044    }
045
046    public enum TRAFFIC_DIRECTION {
047        LEFT,
048        BOTH,
049        RIGHT;
050    }
051
052    public CodeButtonHandlerData(int uniqueID, int switchNumber, int signalEtcNumber, int guiColumnNumber) {
053        _mUniqueID = uniqueID;
054        _mSwitchNumber = switchNumber;
055        _mSignalEtcNumber = signalEtcNumber;
056        _mOSSectionSwitchSlavedToUniqueID = SWITCH_NOT_SLAVED;
057        _mGUIColumnNumber = guiColumnNumber;
058        _mSWDI_GUITurnoutType = CodeButtonHandlerData.TURNOUT_TYPE.TURNOUT;
059        _mTUL_LockImplementation = LOCK_IMPLEMENTATION.GREGS;
060    }
061
062//  This number NEVER changes, and is how this object is uniquely identified:
063    public int _mUniqueID = -1;         // FORCE serialization to write out the FIRST unique number 0 into the XML file (to make me happy!)
064    public int _mSwitchNumber;         // Switch Indicators and lever #
065    public int _mSignalEtcNumber;      // Signal Indicators, lever, locktoggle, callon and code button number
066
067    public String myString() { return Bundle.getMessage("CBHD_SwitchNumber") + " " + _mSwitchNumber + ", " + Bundle.getMessage("CBHD_SignalNumberEtc") + " " + _mSignalEtcNumber + Bundle.getMessage("CBHD_ColumnNumber") + " " + _mGUIColumnNumber + (_mGUIGeneratedAtLeastOnceAlready ? "*" : "") + ", [" + _mUniqueID + "]"; }  // NOI18N
068    public String myShortStringNoComma() { return _mSwitchNumber + "/" + _mSignalEtcNumber; }
069
070/*
071Because of "getAllInternalSensorStringFields", ANY JMRI sensor object that we
072create should have "InternalSensor" (case sensitive,
073example: _mCodeButtonInternalSensor) as ANY PART of their variable name and
074declared as type String.  This will insure that the GUI program will write these
075sensors out to a separate file for JMRI to load to automatically create
076these senosrs.  Other sensors that pre-exist within JMRI should NOT have
077that as part of their variable name (ex: _mOSSectionOccupiedExternalSensor).
078
079Also, see CheckJMRIObject's "public static final String EXTERNAL_xxx" definitions
080at the top for "automatic" JMRI object verification.
081*/
082
083    public NBHSensor            _mCodeButtonInternalSensor;
084    public NBHSensor            _mOSSectionOccupiedExternalSensor;              // Required
085    public NBHSensor            _mOSSectionOccupiedExternalSensor2;             // Optional
086    public int                  _mOSSectionSwitchSlavedToUniqueID;
087    public int                  _mGUIColumnNumber;
088    public boolean              _mGUIGeneratedAtLeastOnceAlready;
089    public int                  _mCodeButtonDelayTime;
090//  Signal Direction Indicators:
091    public boolean              _mSIDI_Enabled;
092    public NBHSensor            _mSIDI_LeftInternalSensor;
093    public NBHSensor            _mSIDI_NormalInternalSensor;
094    public NBHSensor            _mSIDI_RightInternalSensor;
095    public int                  _mSIDI_CodingTimeInMilliseconds;
096    public int                  _mSIDI_TimeLockingTimeInMilliseconds;
097    public TRAFFIC_DIRECTION    _mSIDI_TrafficDirection;
098    public ArrayList<NBHSignal> _mSIDI_LeftRightTrafficSignals = new ArrayList<>();
099    public ArrayList<NBHSignal> _mSIDI_RightLeftTrafficSignals = new ArrayList<>();
100//  Signal Direction Lever:
101    public boolean              _mSIDL_Enabled;
102    public NBHSensor            _mSIDL_LeftInternalSensor;
103    public NBHSensor            _mSIDL_NormalInternalSensor;
104    public NBHSensor            _mSIDL_RightInternalSensor;
105//  Switch Direction Indicators:
106    public boolean              _mSWDI_Enabled;
107    public NBHSensor            _mSWDI_NormalInternalSensor;
108    public NBHSensor            _mSWDI_ReversedInternalSensor;
109    public NBHTurnout           _mSWDI_ExternalTurnout;
110    public int                  _mSWDI_CodingTimeInMilliseconds;
111    public boolean              _mSWDI_FeedbackDifferent;
112    public TURNOUT_TYPE         _mSWDI_GUITurnoutType;
113    public boolean              _mSWDI_GUITurnoutLeftHand;
114    public boolean              _mSWDI_GUICrossoverLeftHand;
115//  Switch Direction Lever:
116    public boolean              _mSWDL_Enabled;
117    public NBHSensor            _mSWDL_InternalSensor;
118//  Call On:
119    public boolean              _mCO_Enabled;
120    public NBHSensor            _mCO_CallOnToggleInternalSensor;
121    public ArrayList<CallOnData> _mCO_GroupingsList = new ArrayList<>();
122//  Traffic Locking:
123    public boolean              _mTRL_Enabled;
124    public ArrayList<TrafficLockingData> _mTRL_LeftTrafficLockingRules = new ArrayList<>();
125    public ArrayList<TrafficLockingData> _mTRL_RightTrafficLockingRules = new ArrayList<>();
126//  Turnout Locking:
127    public boolean              _mTUL_Enabled;
128    public NBHSensor            _mTUL_DispatcherInternalSensorLockToggle;
129    public NBHTurnout           _mTUL_ExternalTurnout;
130    public boolean              _mTUL_ExternalTurnoutFeedbackDifferent;
131    public NBHSensor            _mTUL_DispatcherInternalSensorUnlockedIndicator;
132    public boolean              _mTUL_NoDispatcherControlOfSwitch;
133    public boolean              _mTUL_ndcos_WhenLockedSwitchStateIsClosed;
134    public boolean              _mTUL_GUI_IconsEnabled;
135    public LOCK_IMPLEMENTATION  _mTUL_LockImplementation;
136    public NBHTurnout           _mTUL_AdditionalExternalTurnout1;
137    public boolean              _mTUL_AdditionalExternalTurnout1FeedbackDifferent;
138    public NBHTurnout           _mTUL_AdditionalExternalTurnout2;
139    public boolean              _mTUL_AdditionalExternalTurnout2FeedbackDifferent;
140    public NBHTurnout           _mTUL_AdditionalExternalTurnout3;
141    public boolean              _mTUL_AdditionalExternalTurnout3FeedbackDifferent;
142//  Indication Locking (Signals):
143    public boolean              _mIL_Enabled;
144    public ArrayList<NBHSignal>      _mIL_Signals = new ArrayList<>();
145
146}