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}