001package jmri.jmrix.nce.boosterprog;
002
003import javax.swing.*;
004import jmri.AddressedProgrammer;
005import jmri.ProgListener;
006import jmri.ProgrammerException;
007import jmri.jmrix.nce.NceSystemConnectionMemo;
008
009import java.awt.*;
010
011/**
012 * Panel for configuring an NCE booster.
013 *
014 * @author ken cameron Copyright (C) 2010 Derived from BoosterProgFrame by
015 * @author Bob Jacobsen Copyright (C) 2004
016 */
017public class BoosterProgPanel extends jmri.jmrix.nce.swing.NcePanel {
018
019    JTextField start = new JTextField(6);
020    JTextField length = new JTextField(12);
021    JLabel status = new JLabel();
022
023    public BoosterProgPanel() {
024        super();
025    }
026
027    /**
028     * {@inheritDoc}
029     */
030    @Override
031    public void initContext(Object context) {
032        if (context instanceof NceSystemConnectionMemo) {
033            try {
034                initComponents((NceSystemConnectionMemo) context);
035            } catch (Exception e) {
036                log.warn("BoosterProg initContext", e);
037            }
038        }
039    }
040
041    /**
042     * {@inheritDoc}
043     */
044    @Override
045    public String getHelpTarget() {
046        return "package.jmri.jmrix.nce.boosterprog.BoosterProgPanel";
047    }
048
049    /**
050     * {@inheritDoc}
051     */
052    @Override
053    public String getTitle() {
054        StringBuilder x = new StringBuilder();
055        if (memo != null) {
056            x.append(memo.getUserName());
057        } else {
058            x.append("NCE_");
059        }
060        x.append(": ");
061        x.append(Bundle.getMessage("TitleBoosterProg"));
062        return x.toString();
063    }
064
065    /**
066     * {@inheritDoc}
067     */
068    @Override
069    public void initComponents(NceSystemConnectionMemo m) {
070        this.memo = m;
071
072        // general GUI config
073        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
074
075        // install items in GUI, one line at a time
076        // box of entries
077        JPanel box = new JPanel();
078        box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
079
080        JPanel p = new JPanel();
081        p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
082        JLabel warn = new JLabel(Bundle.getMessage("Warn1"));
083        warn.setAlignmentX(Component.LEFT_ALIGNMENT);
084        p.add(warn);
085        warn = new JLabel(Bundle.getMessage("Warn2"));
086        warn.setAlignmentX(Component.LEFT_ALIGNMENT);
087        p.add(warn);
088        box.add(p);
089
090        box.add(Box.createRigidArea(new Dimension(0,5)));
091
092        p = new JPanel();
093        p.setLayout(new FlowLayout());
094        JButton b = new JButton(Bundle.getMessage("ButtonSet"));
095        p.add(new JLabel(Bundle.getMessage("LabelStart")));
096        start.setText("30");
097        p.add(start);
098        p.add(Box.createHorizontalGlue());
099        p.add(b);
100        b.addActionListener(e -> setStartPushed());
101        box.add(p);
102
103        p = new JPanel();
104        p.setLayout(new FlowLayout());
105        b = new JButton(Bundle.getMessage("ButtonSet"));
106        p.add(new JLabel(Bundle.getMessage("LabelDuration")));
107        length.setText("420");
108        p.add(length);
109        p.add(Box.createHorizontalGlue());
110        p.add(b);
111        b.addActionListener(e -> setDurationPushed());
112        box.add(p);
113
114        add(box);
115        add(Box.createVerticalGlue());
116
117        p = new JPanel();
118        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
119        p.add(new JLabel(Bundle.getMessage("StatusLabel") + " "));
120        p.add(status);
121        status.setText(Bundle.getMessage("StatusOK"));
122        p.setAlignmentX(Component.LEFT_ALIGNMENT);
123        add(p);
124    }
125
126    private AddressedProgrammer p = null;
127
128    private void getProgrammer() {
129        p = memo.getProgrammerManager().getAddressedProgrammer(true, 0);
130    }
131
132    private void releaseProgrammer() {
133        if (p != null) {
134            memo.getProgrammerManager().releaseAddressedProgrammer(p);
135        }
136        p = null;
137    }
138
139    void setStartPushed() {
140        getProgrammer();
141        status.setText(Bundle.getMessage("StatusProgramming"));
142        int val = Integer.parseInt(start.getText());
143
144        try {
145            p.writeCV("255", val, new ProgListener() {
146                @Override
147                public void programmingOpReply(int value, int retval) {
148                    status.setText(Bundle.getMessage("StatusOK"));
149                }
150            });
151        } catch (ProgrammerException e) {
152            status.setText(Bundle.getMessage("StatusError") + e);
153        } finally {
154            releaseProgrammer();
155        }
156    }
157
158    void setStart(int val) {
159        getProgrammer();
160
161        try {
162            p.writeCV("255", val, new ProgListener() {
163                @Override
164                public void programmingOpReply(int value, int retval) {
165                }
166            });
167        } catch (ProgrammerException ignored) {
168        } finally {
169            releaseProgrammer();
170        }
171    }
172
173    void setDuration(final int val) {
174        getProgrammer();
175
176        try {
177            p.writeCV("253", val / 256, new ProgListener() {
178                @Override
179                public void programmingOpReply(int value, int retval) {
180                    synchronized (this) {
181                        try {
182                            wait(1500);  // needed for booster to reset
183                        } catch (InterruptedException i) {
184                            Thread.currentThread().interrupt(); // retain if needed later
185                        }
186                    }
187                    try {
188                        p.writeCV("254", val % 256, new ProgListener() {
189                            @Override
190                            public void programmingOpReply(int value, int retval) {
191                            }
192                        });
193                    } catch (ProgrammerException ignored) {
194                    } finally {
195                        releaseProgrammer();
196                    }
197                }
198            });
199        } catch (ProgrammerException e) {
200            releaseProgrammer();
201        }
202    }
203
204    void setDurationPushed() {
205        getProgrammer();
206        status.setText(Bundle.getMessage("StatusProgramming"));
207        int val = Integer.parseInt(length.getText()) / 256;
208
209        try {
210            p.writeCV("253", val, new ProgListener() {
211                @Override
212                public void programmingOpReply(int value, int retval) {
213                    synchronized (this) {
214                        try {
215                            wait(1500);  // needed for booster to reset
216                        } catch (InterruptedException ignored) {
217                        }
218                    }
219                    durationPart2();
220                }
221            });
222        } catch (ProgrammerException e) {
223            status.setText(Bundle.getMessage("StatusError") + e);
224            releaseProgrammer();
225        }
226    }
227
228    void durationPart2() {
229        status.setText(Bundle.getMessage("StatusProgramming"));
230        int val = Integer.parseInt(length.getText()) % 256;
231
232        try {
233            p.writeCV("254", val, new ProgListener() {
234                @Override
235                public void programmingOpReply(int value, int retval) {
236                    status.setText(Bundle.getMessage("StatusOK"));
237                }
238            });
239        } catch (ProgrammerException e) {
240            status.setText(Bundle.getMessage("StatusError") + e);
241        } finally {
242            releaseProgrammer();
243        }
244    }
245
246    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BoosterProgPanel.class);
247
248}