-
Notifications
You must be signed in to change notification settings - Fork 331
/
ex_set_turnouts.shtml
197 lines (167 loc) · 7.67 KB
/
ex_set_turnouts.shtml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta name="generator" content=
"HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 15.17), see www.w3.org">
<!-- Copyright Bob Jacobsen 2008 -->
<!-- $Id$ -->
<title>JMRI: Scripting Example - Setting Turnouts</title>
<!-- Style -->
<meta http-equiv="Content-Type" content=
"text/html; charset=us-ascii">
<link rel="stylesheet" type="text/css" href="/css/default.css"
media="screen">
<link rel="stylesheet" type="text/css" href="/css/print.css"
media="print">
<link rel="icon" href="/images/jmri.ico" type="image/png">
<link rel="home" title="Home" href="/"><!-- /Style -->
</head>
<body>
<!--#include virtual="/Header" -->
<div id="mBody">
<!--#include virtual="Sidebar" -->
<div id="mainContent">
<!-- Page Body -->
<h2>JMRI: Scripts To Go...<br>
Setting the Default State of Turnouts</h2>
<div class="section">
<p>(Example contributed by Jerry Britton)</p>
<p>My layout, the <a href="http://jbritton.pennsyrr.com/"
target="new">Pennsylvania Railroad Eastern Region</a>,
already features over a hundred turnouts, with many more to
come. At this time, and for the foreseeable future, the
turnouts do not provide feedback; it's an expense I am not
ready to incur.</p>
<p>I've developed <a href=
"http://jbritton.pennsyrr.com/control_panels.ws4d" target=
"new">PanelPro panels</a> for a pair of dispatchers to use
to control the railroad. PanelPro issues turnout commands
via LocoNet (Digitrax system). Turnouts are powered by
Tortoise switch machines which are controlled by NCE
SwitchIt stationary decoders which monitor LocoNet for
commands.</p>
<p>The problem is, without detection on the turnouts
themselves, every time PanelPro is opened for the first
time, all of the turnouts show a "?" state, meaning
PanelPro doesn't know their current state.</p>
<p>Until now, I've invested a considerable amount of time
to manually click on each and every turnout to set its
state -- any state -- then set it to the desired state.
I've suggested that a default state field be added to the
Turnout Table -- and maybe we'll see that in the future --
but for now my need may be met via a script. Perhaps you'll
have a need it can meet as well.</p>
<p>The reason for this web page is that I am a model
railroader that uses JMRI. Our very talented programming
team is made up of programmers that are also model
railroaders. When I asked "How do I...", I received far
more information than I needed or desired. I have no
interest in becoming a programmer or learning exactly how
it "works". I just have a need that I would like to be met
with a minimal amount of effort. It was a classic example
of asking for the time and being instructed how to build a
watch!</p>
<p>So here it is, a down and dirty script that you can
copy, make simple edits for your own use, and start using
immediately -- without having to know "how" it works.</p>
</div>
<div class="section">
<h2>The Script</h2>
<pre>
class setStartup(jmri.jmrit.automat.AbstractAutomaton) :
def init(self):
return
def handle(self):
self.waitMsec(10000) # time is in milliseconds
turnouts.provideTurnout("1").setState(CLOSED)
self.waitMsec(1000)
turnouts.provideTurnout("17").setState(CLOSED)
self.waitMsec(1000)
turnouts.provideTurnout("9").setState(CLOSED)
self.waitMsec(1000)
return False # all done, don't repeat again
setStartup().start() # create one of these, and start it running
</pre>
</div>
<div class="section">
<h2>Making Use of the Script</h2>
<p>You should "copy" and "paste" the sample script into a
new text document. Be sure the file is indeed saved as a
generic text document, and not something like a Microsoft
Word file. The file suffix should be ".py" for Python, the
command language used by JMRI.</p>
<p>Save the file where JMRI can access it. I save mine in
the same directory as my PanelPro files.</p>
<p>It is VERY IMPORTANT that you keep the formatting of the
script the way it is -- with leading tabs. The Python
language uses tabs as part of its command structure.</p>
<p>This first part of the script you should include "as
is". No changes are necessary:</p>
<pre>
class setStartup(jmri.jmrit.automat.AbstractAutomaton) :
def init(self):
return
def handle(self):
self.waitMsec(10000) # time is in milliseconds
</pre>
<p>The following part of the script is what you need to
modify for your own use. Below are commands to set the
state for three turnouts; each consists of two lines.</p>
<p>The first line includes a number in quotations which is
the turnout number (decoder ID) that you wish to send the
command to. The state in parenthesis at the end of the line
(CLOSED or THROWN) is the position you want the turnout set
to.</p>
<p>The second line adds a delay between commands, in
milliseconds. If you have a lot of turnouts to set, your
power supply would likely not be able to handle throwing
them all at once. The delay allows the activations to be
spread out over time. Dozens of turnouts may be set over a
period of a minute or two.</p>
<p>So "paste" multiple instances of the two line commands
into your script as desired. You may also add comment lines
(beginning with a "#") to document sections of your
layout.</p>
<pre>
turnouts.provideTurnout("1").setState(CLOSED)
self.waitMsec(1000)
turnouts.provideTurnout("17").setState(CLOSED)
self.waitMsec(1000)
turnouts.provideTurnout("9").setState(CLOSED)
self.waitMsec(1000)
</pre>
<p>The closing part of the script should also be left "as
is":</p>
<pre>
return False # all done, don't repeat again
setStartup().start() # create one of these, and start it running
</pre>
</div>
<div class="section">
<h2>Implementing the Script</h2>
<p>With track power on, you can execute the script by
selecting Run Script from the PanelPro menu of JMRI. There
will be a delay before script execution begins, but then
you will see your turnouts throwing one by one.</p>
<p>You can also select the script to run automatically when
PanelPro is launched by selecting the script file in
Advanced Preferences. Be sure track power is on before
launching PanelPro in this case.</p>
</div>
<div class="section">
<h2>Credit Where Credit Is Due</h2>
<p>My unending praise goes to the many developers who
provide JMRI to the model railroad community. However, in
the case of meeting my need in setting the default state of
turnouts, I wish to extend my gratitude to "breezlys" of
the JMRI Forum community; he provided the sample script,
which I believe he interpreted and modified from JMRI's
sample scripts.</p>
<p>-- Page authored by Jerry Britton, March 2006.</p>
<!--#include virtual="/Footer" -->
</div><!-- closes #mainContent-->
</div><!-- closes #mBody-->
</div>
</body>
</html>