001package jmri.jmrit.dispatcher;
002
003import jmri.InstanceManager;
004import jmri.Sensor;
005import jmri.SensorManager;
006import jmri.jmrit.dispatcher.ActiveTrain.TrainDetection;
007import jmri.jmrit.dispatcher.ActiveTrain.TrainLengthUnits;
008import jmri.jmrit.dispatcher.DispatcherFrame.TrainsFrom;
009
010/**
011 * TrainInfo is a temporary object specifying New Train information just read
012 * from disk, or to be written to disk
013 * <p>
014 * Used in conjunction with TrainInfoFile.java to save and retrieve New Train
015 * information
016 * <p>
017 * When adding a new item of New Train information, modifications need to be
018 * made to TrainInfoFile.java and dispatcher-traininfo.DTD as well as this
019 * module.
020 *
021 * @author Dave Duchamp Copyright (C) 2009
022 */
023public class TrainInfo {
024
025    public TrainInfo() {
026    }
027
028    // instance variables for both manual and automatic operation
029    private int version = 1;
030    private boolean dynamicTransit = false;
031    private boolean dynamicTransitCloseLoopIfPossible = false;
032    private String transitName = "";
033    private String transitId = "";
034    private String trainName = "";
035    private String rosterID = "";
036    private String trainUserName = "";
037    private String dccAddress = "3";
038    private boolean trainInTransit = false;
039    private String startBlockName = "";
040    private String viaBlockName = "";
041    private String startBlockId = "";
042    private int startBlockSeq = -1;
043    private String destinationBlockName = "";
044    private String destinationBlockId = "";
045    private int destinationBlockSeq = -1;
046    private boolean trainFromRoster = true;
047    private boolean trainFromTrains = false;
048    private boolean trainFromUser = false;
049    private boolean trainFromSetLater = false;
050    private int priority = 5;
051    private boolean autoRun = false;
052    private boolean resetWhenDone = false;
053    private boolean allocateAllTheWay = false;
054    private int allocationMethod = 3;
055    private boolean reverseAtEnd = false;
056    private int delayedStart = ActiveTrain.NODELAY;
057    private int delayedRestart = ActiveTrain.NODELAY;
058    private int departureTimeHr = 8;
059    private int departureTimeMin = 00;
060    private String delaySensorName = null;
061    private boolean resetStartSensor = true;
062
063    private String restartSensorName = null;
064    private boolean resetRestartSensor = true;
065    private int restartDelayMin = 0;
066
067    private int reverseDelayedRestart = ActiveTrain.NODELAY;
068    private String reverseRestartSensorName = null;
069    private boolean reverseResetRestartSensor = true;
070    private int reverseRestartDelayMin = 0;
071
072    private String trainType = "";
073    private boolean terminateWhenDone = false;
074    private String nextTrain = "None";
075    private boolean loadAtStartup = false;
076
077    // instance variables for automatic operation
078    private float speedFactor = 1.0f;
079    private float maxSpeed = 1.0f;
080    private float minReliableOperatingSpeed = 0.0f;
081    private String rampRate = Bundle.getMessage("RAMP_NONE");
082    private TrainDetection trainDetection = TrainDetection.TRAINDETECTION_WHOLETRAIN;
083    private boolean runInReverse = false;
084    private boolean soundDecoder = false;
085    private float maxTrainLength = 100.0f;
086    private float maxTrainLengthMeters = 30.0f;
087    private TrainLengthUnits trainLengthUnits = TrainLengthUnits.TRAINLENGTH_SCALEFEET; // units used to enter value
088    private boolean useSpeedProfile = false;
089    private boolean stopBySpeedProfile = false;
090    private float stopBySpeedProfileAdjust = 1.0f;
091    private int fNumberLight = 0;
092    private int fNumberBell = 1;
093    private int fNumberHorn = 2;
094
095    private float waitTime = 3.0f; //seconds:  required only by dispatcher system to pause train at beginning of transit (station)
096
097    private String blockName = ""; //required only by Dispatcher System to inhibit running of transit if this block is occupied
098
099
100    //
101    // Access methods for manual and automatic instance variables
102    //
103    public void setVersion(int ver) {
104        version = ver;
105    }
106    public int getVersion() {
107        return version;
108    }
109
110    public void setTransitName(String s) {
111        transitName = s;
112    }
113
114    public String getTransitName() {
115        return transitName;
116    }
117
118    public void setTransitId(String s) {
119        transitId = s;
120    }
121
122    public String getTransitId() {
123        return transitId;
124    }
125
126    public void setDynamicTransit(boolean b) {
127        dynamicTransit = b;
128    }
129
130    public boolean getDynamicTransit() {
131        return dynamicTransit;
132    }
133
134    public void setDynamicTransitCloseLoopIfPossible(boolean b) {
135        dynamicTransitCloseLoopIfPossible = b;
136    }
137
138    public boolean getDynamicTransitCloseLoopIfPossible() {
139        return dynamicTransitCloseLoopIfPossible;
140    }
141    public void setTrainName(String s) {
142        trainName = s;
143    }
144
145    public String getTrainName() {
146        return trainName;
147    }
148
149    public void setRosterId(String s) {
150        rosterID = s;
151    }
152
153    public String getRosterId() {
154        return rosterID;
155    }
156
157    public void setTrainUserName(String s) {
158        trainUserName = s;
159    }
160
161    public String getTrainUserName() {
162        return trainUserName;
163    }
164
165    public void setDccAddress(String s) {
166        dccAddress = s;
167    }
168
169    public String getDccAddress() {
170        return dccAddress;
171    }
172
173    public void setTrainInTransit(boolean b) {
174        trainInTransit = b;
175    }
176
177    public boolean getTrainInTransit() {
178        return trainInTransit;
179    }
180
181    public void setStartBlockName(String s) {
182        startBlockName = s;
183    }
184
185    public String getStartBlockName() {
186        return startBlockName;
187    }
188
189    public void setViaBlockName(String s) {
190        viaBlockName = s;
191    }
192
193    public String getViaBlockName() {
194        return viaBlockName;
195    }
196
197    public void setStartBlockId(String s) {
198        startBlockId = s;
199    }
200
201    public String getStartBlockId() {
202        return startBlockId;
203    }
204
205    public void setStartBlockSeq(int i) {
206        startBlockSeq = i;
207    }
208
209    public int getStartBlockSeq() {
210        return startBlockSeq;
211    }
212
213    public void setDestinationBlockName(String s) {
214        destinationBlockName = s;
215    }
216
217    public String getDestinationBlockName() {
218        return destinationBlockName;
219    }
220
221    public void setDestinationBlockId(String s) {
222        destinationBlockId = s;
223    }
224
225    public String getDestinationBlockId() {
226        return destinationBlockId;
227    }
228
229    public void setDestinationBlockSeq(int i) {
230        destinationBlockSeq = i;
231    }
232
233    public int getDestinationBlockSeq() {
234        return destinationBlockSeq;
235    }
236
237    public void setTrainsFrom(TrainsFrom value) {
238        trainFromRoster = false;
239        trainFromTrains = false;
240        trainFromUser = false;
241        trainFromSetLater = false;
242        switch (value) {
243            case TRAINSFROMROSTER:
244                trainFromRoster = true;
245                break;
246            case TRAINSFROMOPS:
247                trainFromTrains = true;
248                break;
249            case TRAINSFROMUSER:
250                trainFromUser = true;
251                break;
252            case TRAINSFROMSETLATER:
253            default:
254                trainFromSetLater = true;
255        }
256    }
257
258    public TrainsFrom getTrainsFrom() {
259        if (trainFromRoster) {
260            return TrainsFrom.TRAINSFROMROSTER;
261        } else if (trainFromTrains) {
262            return TrainsFrom.TRAINSFROMOPS;
263        } else if (trainFromUser) {
264            return TrainsFrom.TRAINSFROMUSER;
265        }
266        return TrainsFrom.TRAINSFROMSETLATER;
267    }
268
269    public void setTrainFromRoster(boolean b) {
270        trainFromRoster = b;
271    }
272
273    public boolean getTrainFromRoster() {
274        return trainFromRoster;
275    }
276
277    public void setTrainFromTrains(boolean b) {
278        trainFromTrains = b;
279    }
280
281    public boolean getTrainFromTrains() {
282        return trainFromTrains;
283    }
284
285    public void setTrainFromUser(boolean b) {
286        trainFromUser = b;
287    }
288
289    public boolean getTrainFromUser() {
290        return trainFromUser;
291    }
292
293    public void setTrainFromSetLater(boolean b) {
294        trainFromSetLater = b;
295    }
296
297    public boolean getTrainFromSetLater() {
298        return trainFromSetLater;
299    }
300
301    public void setTerminateWhenDone(boolean b) {
302        terminateWhenDone = b;
303    }
304
305    public boolean getTerminateWhenDone() {
306        return terminateWhenDone;
307    }
308
309    public void setNextTrain(String s) {
310        nextTrain = s;
311    }
312
313    public String getNextTrain() {
314        return nextTrain;
315    }
316
317
318    public void setPriority(int pri) {
319        priority = pri;
320    }
321
322    public int getPriority() {
323        return priority;
324    }
325
326    public void setAutoRun(boolean b) {
327        autoRun = b;
328    }
329
330    public boolean getAutoRun() {
331        return autoRun;
332    }
333
334    public void setResetWhenDone(boolean b) {
335        resetWhenDone = b;
336    }
337
338    public boolean getResetWhenDone() {
339        return resetWhenDone;
340    }
341
342    public void setAllocateAllTheWay(boolean b) {
343        allocateAllTheWay = b;
344    }
345
346    public boolean getAllocateAllTheWay() {
347        return allocateAllTheWay;
348    }
349
350    public void setAllocationMethod(int i) {
351        allocationMethod = i;
352    }
353
354    public int getAllocationMethod() {
355        return allocationMethod;
356    }
357
358    public void setUseSpeedProfile(boolean b) {
359        useSpeedProfile = b;
360    }
361
362    public boolean getUseSpeedProfile() {
363        return useSpeedProfile;
364    }
365
366    public void setStopBySpeedProfile(boolean b) {
367        stopBySpeedProfile = b;
368    }
369
370    public boolean getStopBySpeedProfile() {
371        return stopBySpeedProfile;
372    }
373
374    public void setStopBySpeedProfileAdjust(float f) {
375        stopBySpeedProfileAdjust = f;
376    }
377
378    public float getStopBySpeedProfileAdjust() {
379        return stopBySpeedProfileAdjust;
380    }
381
382    public void setReverseAtEnd(boolean b) {
383        reverseAtEnd = b;
384    }
385
386    public boolean getReverseAtEnd() {
387        return reverseAtEnd;
388    }
389
390    public void setDelayedStart(int ds) {
391        delayedStart = ds;
392    }
393
394    /**
395     * delayed start code for this train
396     *
397     * @return one of ActiveTrain.NODELAY,TIMEDDELAY,SENSORDELAY
398     */
399    public int getDelayedStart() {
400        return delayedStart;
401    }
402
403    public void setDepartureTimeHr(int hr) {
404        departureTimeHr = hr;
405    }
406
407    public int getDepartureTimeHr() {
408        return departureTimeHr;
409    }
410
411    public void setDepartureTimeMin(int min) {
412        departureTimeMin = min;
413    }
414
415    public int getDepartureTimeMin() {
416        return departureTimeMin;
417    }
418
419    public void setDelaySensorName(String sen) {
420        delaySensorName = sen;
421    }
422
423    public String getDelaySensorName() {
424        return delaySensorName;
425    }
426
427    public void setReverseDelayedRestart(int ds) {
428        reverseDelayedRestart = ds;
429    }
430
431    /**
432     * return restart code for this train, only used for continuous running
433     *
434     * @return one of ActiveTrain.NODELAY,TIMEDDELAY,SENSORDELAY
435     */
436    public int getReverseDelayedRestart() {
437        return reverseDelayedRestart;
438    }
439
440    public void setReverseRestartSensorName(String value) {
441        reverseRestartSensorName = value;
442    }
443
444    public String getReverseRestartSensorName() {
445        return reverseRestartSensorName;
446    }
447
448    public void setReverseResetRestartSensor(boolean value) {
449        reverseResetRestartSensor = value;
450    }
451
452    public boolean getReverseResetRestartSensor() {
453        return reverseResetRestartSensor;
454    }
455
456    public Sensor getReverseRestartSensor() {
457        if (reverseRestartSensorName == null) {
458            return null;
459        }
460        return jmri.InstanceManager.sensorManagerInstance().getSensor(reverseRestartSensorName);
461    }
462
463    public void setReverseRestartDelayMin(int value) {
464        reverseRestartDelayMin = value;
465    }
466
467    public int getReverseRestartDelayMin() {
468        return reverseRestartDelayMin;
469    }
470
471    /**
472     * retrieve the startup delay sensor using the delay sensor name
473     *
474     * @return delay sensor, or null if delay sensor name not set
475     */
476    public Sensor getDelaySensor() {
477        if (delaySensorName == null) {
478            return null;
479        }
480        return InstanceManager.getDefault(SensorManager.class).getSensor(delaySensorName);
481    }
482
483    public boolean getResetStartSensor() {
484        return resetStartSensor;
485    }
486
487    public void setResetStartSensor(boolean b) {
488        resetStartSensor = b;
489    }
490
491    public void setTrainType(String s) {
492        trainType = s;
493    }
494
495    public String getTrainType() {
496        return trainType;
497    }
498
499    public void setDelayedRestart(int ds) {
500        delayedRestart = ds;
501    }
502
503    /**
504     * return restart code for this train, only used for continuous running
505     *
506     * @return one of ActiveTrain.NODELAY,TIMEDDELAY,SENSORDELAY
507     */
508    public int getDelayedRestart() {
509        return delayedRestart;
510    }
511
512    public void setRestartSensorName(String sen) {
513        restartSensorName = sen;
514    }
515
516    public String getRestartSensorName() {
517        return restartSensorName;
518    }
519
520    /**
521     * retrieve the restart sensor using the restart sensor name
522     *
523     * @return restart sensor, or null if the restart sensor name not set
524     */
525    public Sensor getRestartSensor() {
526        if (restartSensorName == null) {
527            return null;
528        }
529        return jmri.InstanceManager.sensorManagerInstance().getSensor(restartSensorName);
530    }
531
532    public boolean getResetRestartSensor() {
533        return resetRestartSensor;
534    }
535
536    public void setResetRestartSensor(boolean b) {
537        resetRestartSensor = b;
538    }
539
540    /**
541     * number of minutes to delay between restarting for continuous runs
542     *
543     * @param s number of minutes to delay
544     */
545    public void setRestartDelayMin(int s) {
546        restartDelayMin = s;
547    }
548
549    public int getRestartDelayMin() {
550        return restartDelayMin;
551    }
552
553    public boolean getLoadAtStartup() {
554        return loadAtStartup;
555    }
556
557    public void setLoadAtStartup(boolean loadAtStartup) {
558        this.loadAtStartup = loadAtStartup;
559    }
560
561    //
562    // Access methods for automatic operation instance variables
563    //
564    public void setSpeedFactor(float f) {
565        speedFactor = f;
566    }
567
568    public Float getSpeedFactor() {
569        return speedFactor;
570    }
571
572    public void setMaxSpeed(float f) {
573        maxSpeed = f;
574    }
575
576    public Float getMaxSpeed() {
577        return maxSpeed;
578    }
579
580    public void setMinReliableOperatingSpeed(float f) {
581        minReliableOperatingSpeed = f;
582    }
583
584    public float getMinReliableOperatingSpeed() {
585        return minReliableOperatingSpeed;
586    }
587
588    public void setRampRate(String s) {
589        rampRate = s;
590    }
591
592    public String getRampRate() {
593        return rampRate;
594    }
595
596    /**
597     * Set the detection get
598     * @param b {@link ActiveTrain.TrainDetection}
599     */
600    public void setTrainDetection(TrainDetection b) {
601        trainDetection = b;
602    }
603
604    /**
605     * Get the detection type
606     * @return  {@link ActiveTrain.TrainDetection}
607     */
608    public TrainDetection getTrainDetection() {
609        return trainDetection;
610    }
611
612    /**
613     * @deprecated use {@link #setTrainDetection}
614     * @param b true or false
615     */
616    @Deprecated (since="5.7.6",forRemoval=true)
617    public void setResistanceWheels(boolean b) {
618        if (b) {
619            trainDetection = TrainDetection.TRAINDETECTION_WHOLETRAIN;
620        } else {
621            trainDetection = TrainDetection.TRAINDETECTION_HEADONLY;
622        }
623    }
624
625    /**
626     * @deprecated use {@link #getTrainDetection}
627     * @return true or false
628     */
629    @Deprecated (since="5.7.6",forRemoval=true)
630    public boolean getResistanceWheels() {
631        if (trainDetection == TrainDetection.TRAINDETECTION_WHOLETRAIN) {
632            return true;
633        }
634        return false;
635    }
636
637    public void setRunInReverse(boolean b) {
638        runInReverse = b;
639    }
640
641    public boolean getRunInReverse() {
642        return runInReverse;
643    }
644
645    public void setSoundDecoder(boolean b) {
646        soundDecoder = b;
647    }
648
649    public boolean getSoundDecoder() {
650        return soundDecoder;
651    }
652
653    /**
654     * Sets F number for the Light
655     * @param value F Number.
656     */
657    public void setFNumberLight(int value) {
658        fNumberLight = value;
659    }
660
661    /**
662     * returns the F number for the Light
663     * @return F Number
664     */
665    public int getFNumberLight() {
666        return fNumberLight;
667    }
668
669    /**
670     * Sets F number for the Bell
671     * @param value F Number.
672     */
673    public void setFNumberBell(int value) {
674        fNumberBell = value;
675    }
676
677    /**
678     * returns the F number for the Bell
679     * @return F Number
680     */
681    public int getFNumberBell() {
682        return fNumberBell;
683    }
684
685    /**
686     * Sets F number for the Horn
687     * @param value F Number.
688     */
689    public void setFNumberHorn(int value) {
690        fNumberHorn = value;
691    }
692
693    /**
694     * returns the F number for the Horn
695     * @return F Number
696     */
697    public int getFNumberHorn() {
698        return fNumberHorn;
699    }
700
701    /**
702     * @deprecated use {@link #setMaxTrainLengthScaleMeters}
703     *               or {@link #setMaxTrainLengthScaleMeters}
704     * @param f train length
705     */
706    @Deprecated (since="5.9.7",forRemoval=true)
707    public void setMaxTrainLength(float f) {
708        maxTrainLength = f;
709    }
710
711    /**
712     * @deprecated use {@link #getMaxTrainLengthScaleMeters}
713     *              or {@link #getMaxTrainLengthScaleFeet}
714     * @return train length of in units of the writing application
715     */
716    @Deprecated (since="5.9.7",forRemoval=true)
717    public float getMaxTrainLength() {
718        return maxTrainLength;
719    }
720
721    /**
722     * Sets the max train length expected during run
723     * @param f scale Meters.
724     */
725    public void setMaxTrainLengthScaleMeters(float f) {
726        maxTrainLengthMeters = f;
727    }
728
729    /**
730     * Gets the Max train length expected during run
731     * @return scale meters
732     */
733    public float getMaxTrainLengthScaleMeters() {
734        return maxTrainLengthMeters;
735    }
736
737    /**
738     * Sets the max train length expected
739     * @param f scale Meters.
740     */
741    public void setMaxTrainLengthScaleFeet(float f) {
742        maxTrainLengthMeters = f / 3.28084f;
743    }
744
745    /**
746     * Gets the Max train length expected during route
747     * @return scale meters
748     */
749    public float getMaxTrainLengthScaleFeet() {
750        return maxTrainLengthMeters * 3.28084f;
751    }
752
753   /**
754     * Sets the gui units used to enter or display (The units are always held in scale meters)
755     * @param value {@link ActiveTrain.TrainLengthUnits}
756     */
757    public void setTrainLengthUnits(TrainLengthUnits value) {
758        trainLengthUnits = value;
759    }
760
761    /**
762     * Get the GUI units entered (The data is held in scale Meters)
763     * @return  {@link ActiveTrain.TrainLengthUnits}
764     */
765    public TrainLengthUnits getTrainLengthUnits() {
766        return trainLengthUnits;
767    }
768
769    public void setWaitTime(float f) { waitTime = f; }
770
771    public float getWaitTime() {
772        return waitTime;
773    }
774
775    public void setBlockName(String s) { blockName = s; }
776
777    public String getBlockName() { return blockName; }
778
779}