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}