/**
* KKMulticopterFlashTool, a avrdude GUI for flashing KK boards and other
* equipment.
* Copyright (C) 2011 Christian Moll
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.lazyzero.kkMulticopterFlashTool.gui;
import static lu.tudor.santec.i18n.Translatrix._;
import java.awt.Dialog.ModalityType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import avr8_burn_o_mat.AvrdudeProgrammer;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.lazyzero.kkMulticopterFlashTool.KKMulticopterFlashTool;
import de.lazyzero.kkMulticopterFlashTool.utils.MultiFlashSettings;
import de.lazyzero.kkMulticopterFlashTool.utils.PortScanner;
public class ProgrammerPanel extends JPanel implements ActionListener, FocusListener {
private static final long serialVersionUID = 1L;
public static final String PROGRAMMER_CHANGED = "PROGRAMMER_CHANGED";
private JComboBox programmerCombobox;
private AvrdudeProgrammer programmer;
private Vector<AvrdudeProgrammer> programmers;
private String port;
private String rate;
private KKMulticopterFlashTool parent;
private CellConstraints cc;
private JLabel programmerLabel;
private JLabel portLabel;
private JComboBox portComboBox;
private JTextField baudRateTextField;
private JLabel baudRateLabel;
private JCheckBox baudRateChangeCB;
private JCheckBox multiFlashCB;
private Vector<String> availablePorts;
private JButton multiFlashButton;
private boolean multiFlash = false;
private MultiFlashSettings mfs;
public ProgrammerPanel(KKMulticopterFlashTool parent, Vector<AvrdudeProgrammer> programmers) {
this.parent = parent;
this.programmers = programmers;
init();
}
private void init() {
this.mfs = new MultiFlashSettings();
//create the CellContraints
cc = new CellConstraints();
// create the Layout for Panel this
String panelColumns = "pref,3dlu,80dlu,3dlu,pref,3dlu,50dlu,3dlu,pref,fill:pref:grow,3dlu,pref";
String panelRows = "pref,3dlu,pref";
FormLayout panelLayout = new FormLayout(panelColumns, panelRows);
this.setLayout(panelLayout);
this.setBorder(new TitledBorder(_("programmer.settings")));
programmerLabel = new JLabel(_("programmer"));
programmerCombobox = new JComboBox(programmers);
if (programmer!=null){
programmerCombobox.setSelectedItem(programmer);
} else {
programmerCombobox.setSelectedIndex(0);
programmer = (AvrdudeProgrammer)programmerCombobox.getSelectedItem();
parent.setProgrammer(programmer);
}
programmerCombobox.addActionListener(this);
portLabel = new JLabel(_("port"));
availablePorts = PortScanner.listProgrammerPorts();
portComboBox = new JComboBox(availablePorts);
updateSerialPorts();
// portComboBox.addFocusListener(this);
portComboBox.addActionListener(this);
// portComboBox.setEditable(true);
baudRateChangeCB = new JCheckBox(_("port.enableRate"), true);
baudRateChangeCB.addActionListener(this);
baudRateLabel = new JLabel(_("port.rate"));
baudRateTextField = new JTextField(rate);
baudRateTextField.addFocusListener(this);
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
baudRateTextField.setEnabled(true);
} else {
baudRateTextField.setEnabled(false);
}
multiFlashCB = new JCheckBox(_("multiflash.enable"), false);
multiFlashCB.addActionListener(this);
multiFlashButton = new JButton(_("multiflash.configure"));
multiFlashButton.addActionListener(this);
multiFlashButton.setEnabled(false);
this.add(programmerLabel,cc.xy(1, 1));
this.add(programmerCombobox, cc.xyw(3, 1, 10));
this.add(portLabel, cc.xy(1, 3));
this.add(portComboBox, cc.xy(3, 3));
this.add(baudRateLabel, cc.xy(5, 3));
this.add(baudRateTextField, cc.xy(7, 3));
this.add(baudRateChangeCB, cc.xy(9, 3));
this.add(multiFlashCB, cc.xy(10, 3));
this.add(multiFlashButton, cc.xy(12, 3));
}
private void updateSerialPorts() {
Thread t = new Thread() {
public void run() {
String selectedItem;
Vector<String> list;
while(true) {
selectedItem = (String)portComboBox.getSelectedItem();
list = PortScanner.listProgrammerPorts();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String port = iterator.next();
if (!availablePorts.contains(port)) {
System.out.println("add port to list: " + port);
availablePorts.add(port);
portComboBox.setModel(new DefaultComboBoxModel(availablePorts));
portComboBox.setSelectedItem(selectedItem);
}
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
}
private void openMultiFlashConfigDialog() {
MultiFlashConfigDialog mfd = new MultiFlashConfigDialog(this.mfs);
mfd.setModalityType(ModalityType.APPLICATION_MODAL);
mfd.setVisible(true);
}
public JPanel getPanel() {
return this;
}
@Override
public void actionPerformed(ActionEvent action) {
if (action.getSource().equals(programmerCombobox)){
programmer = (AvrdudeProgrammer)programmerCombobox.getSelectedItem();
parent.setProgrammer(programmer);
parent.firePropertyChange(PROGRAMMER_CHANGED, 0, 1);
System.out.println("Programmer switched to: "+programmer.getType());
System.out.println(programmer.getId());
System.out.println(programmer.getType());
System.out.println(programmer.getDesc());
if (programmer.getId().equals("arduinousblinker")) {
multiFlashCB.setEnabled(true);
multiFlashButton.setEnabled(multiFlashCB.isSelected());
setMultiFlash(multiFlashCB.isSelected());
} else {
multiFlashButton.setEnabled(false);
multiFlashCB.setEnabled(false);
setMultiFlash(false);
}
} else if (action.getSource().equals(baudRateChangeCB)) {
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
baudRateTextField.setEnabled(true);
} else {
baudRateTextField.setEnabled(false);
}
} else if (action.getSource().equals(portComboBox)) {
port=(String)portComboBox.getSelectedItem();
if (!port.equals("usb")) {
baudRateChangeCB.setEnabled(true);
} else {
baudRateChangeCB.setEnabled(false);
}
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
baudRateTextField.setEnabled(true);
} else {
baudRateTextField.setEnabled(false);
}
System.out.println("port is now: " + port);
} else if (action.getSource().equals(multiFlashCB)) {
multiFlashButton.setEnabled(multiFlashCB.isSelected());
setMultiFlash(multiFlashCB.isSelected());
} else if (action.getSource().equals(multiFlashButton)) {
openMultiFlashConfigDialog();
}
}
@Override
public void focusGained(FocusEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent focus) {
if (focus.getSource().equals(portComboBox)) {
port=(String)portComboBox.getSelectedItem();
if (!port.equals("usb")) {
baudRateChangeCB.setEnabled(true);
} else {
baudRateChangeCB.setEnabled(false);
}
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
baudRateTextField.setEnabled(true);
} else {
baudRateTextField.setEnabled(false);
}
System.out.println("port is now: " + port);
} else if (focus.getSource().equals(baudRateTextField)) {
rate=baudRateTextField.getText();
System.out.println("rate is now: " + rate);
}
}
public void setPort(String port) {
this.port = port.trim();
this.portComboBox.setSelectedItem(port);
if (!port.equals("usb")) {
baudRateChangeCB.setEnabled(true);
} else {
baudRateChangeCB.setEnabled(false);
}
System.out.println("Port is set to: " + port);
}
public String getPort() {
return port;
}
public void setRate(String rate) {
this.rate = rate.trim();
this.baudRateTextField.setText(this.rate);
System.out.println("Rate is set to: " + rate);
}
public String getRate() {
return rate;
}
public void setDefaultRate(boolean b) {
baudRateChangeCB.setSelected(b);
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
baudRateTextField.setEnabled(true);
} else {
baudRateTextField.setEnabled(false);
}
}
private void setMultiFlash(boolean selected) {
this.multiFlash = selected;
}
public boolean isMultiFlash() {
return this.multiFlash;
}
public boolean isDefaultRate() {
return baudRateChangeCB.isSelected();
}
public boolean useBaudRate() {
if (!baudRateChangeCB.isSelected() && baudRateChangeCB.isEnabled()) {
return true;
} else {
return false;
}
}
public void setProgrammer(String id) {
Iterator<AvrdudeProgrammer> iter = programmers.iterator();
for (; iter.hasNext();) {
AvrdudeProgrammer progger = iter.next();
if (progger.getId().equals(id)){
programmer = progger;
parent.setProgrammer(programmer);
programmerCombobox.setSelectedItem(programmer);
}
}
}
}