254 lines
6.3 KiB
Java
254 lines
6.3 KiB
Java
/*
|
|
* Copyright © 2017 Keith Packard <keithp@keithp.com>
|
|
*
|
|
* 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, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
package org.altusmetrum.altosuilib_14;
|
|
|
|
import java.awt.*;
|
|
import java.awt.event.*;
|
|
import java.beans.*;
|
|
import javax.swing.*;
|
|
import javax.swing.event.*;
|
|
import org.altusmetrum.altoslib_14.*;
|
|
|
|
public class AltosUIAccelCal
|
|
extends AltosUIDialog
|
|
implements AltosAccelCalListener, ActionListener
|
|
{
|
|
Frame owner;
|
|
AltosLink link;
|
|
AltosAccelCal cal;
|
|
AltosConfigValues config_values;
|
|
Thread thread;
|
|
Container pane;
|
|
JTextField message;
|
|
JButton antenna_up;
|
|
JButton antenna_down;
|
|
JButton ok;
|
|
JButton cancel;
|
|
boolean success;
|
|
int accel_plus, accel_minus;
|
|
|
|
private void make_visible() {
|
|
pack();
|
|
cal.start();
|
|
setVisible(true);
|
|
}
|
|
|
|
public boolean doit() {
|
|
success = false;
|
|
make_visible();
|
|
return success;
|
|
}
|
|
|
|
public int accel_cal_plus() {
|
|
if (success)
|
|
return accel_plus;
|
|
return AltosLib.MISSING;
|
|
}
|
|
|
|
public int accel_cal_minus() {
|
|
if (success)
|
|
return accel_minus;
|
|
return AltosLib.MISSING;
|
|
}
|
|
|
|
private void setDefaultButton(JButton button) {
|
|
this.getRootPane().setDefaultButton(button);
|
|
}
|
|
|
|
/* AltosAccelCalListener interface */
|
|
public void set_thread(AltosAccelCal cal, Thread thread) {
|
|
this.thread = thread;
|
|
}
|
|
|
|
public void set_phase(AltosAccelCal cal, final int phase) {
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
switch (phase) {
|
|
case AltosAccelCal.phase_antenna_up:
|
|
message.setText(String.format ("Orient antenna upwards and click on %s", up_msg()));
|
|
antenna_up.setEnabled(true);
|
|
setDefaultButton(antenna_up);
|
|
antenna_down.setEnabled(false);
|
|
ok.setEnabled(false);
|
|
break;
|
|
case AltosAccelCal.phase_antenna_down:
|
|
message.setText(String.format("Orient antenna downwards and click on %s", down_msg()));
|
|
antenna_up.setEnabled(false);
|
|
antenna_down.setEnabled(true);
|
|
setDefaultButton(antenna_down);
|
|
ok.setEnabled(false);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
public void cal_done(AltosAccelCal cal, int plus, int minus) {
|
|
accel_plus = plus;
|
|
accel_minus = minus;
|
|
success = true;
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
message.setText(String.format("Calibration succeeded, plus %d minus %d, press OK to continue", accel_plus, accel_minus));
|
|
antenna_up.setEnabled(false);
|
|
antenna_down.setEnabled(false);
|
|
ok.setEnabled(true);
|
|
setDefaultButton(ok);
|
|
}
|
|
});
|
|
}
|
|
|
|
public void message(AltosAccelCal cal, final String msg) {
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
message.setText(msg);
|
|
}
|
|
});
|
|
}
|
|
|
|
public void error(AltosAccelCal cal, String msg) {
|
|
message(cal, msg);
|
|
}
|
|
|
|
/* ActionListener interface */
|
|
public void actionPerformed(ActionEvent e) {
|
|
String cmd = e.getActionCommand();
|
|
|
|
if ("up".equals(cmd)) {
|
|
cal.signal(true);
|
|
antenna_up.setEnabled(false);
|
|
} else if ("down".equals(cmd)) {
|
|
cal.signal(true);
|
|
antenna_down.setEnabled(false);
|
|
this.setDefaultButton(antenna_down);
|
|
} else if ("ok".equals(cmd)) {
|
|
cal.signal(true);
|
|
this.setVisible(false);
|
|
if (success) {
|
|
config_values.set_accel_cal(accel_plus, accel_minus);
|
|
config_values.set_dirty();
|
|
}
|
|
try {
|
|
cal.abort();
|
|
} catch (InterruptedException ie) {
|
|
}
|
|
} else if ("cancel".equals(cmd)) {
|
|
cal.signal(false);
|
|
this.setVisible(false);
|
|
try {
|
|
cal.abort();
|
|
} catch (InterruptedException ie) {
|
|
}
|
|
}
|
|
}
|
|
|
|
public String up_msg() { return config_values.has_radio() ? "Antenna Up" : "Beeper Up"; }
|
|
public String down_msg() { return config_values.has_radio() ? "Antenna Down" : "Beeper Down"; }
|
|
|
|
public AltosUIAccelCal(Frame owner, AltosLink link, AltosConfigValues config_values) {
|
|
super(owner, "Calibrate Accelerometer", true);
|
|
|
|
this.owner = owner;
|
|
this.link = link;
|
|
this.config_values = config_values;
|
|
|
|
pane = getScrollablePane();
|
|
pane.setLayout(new GridBagLayout());
|
|
|
|
GridBagConstraints c = new GridBagConstraints();
|
|
c.insets = new Insets(4,4,4,4);
|
|
|
|
int x = 0;
|
|
int y = 0;
|
|
c.fill = GridBagConstraints.HORIZONTAL;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = x;
|
|
c.gridy = y;
|
|
c.gridwidth = 4;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
message = new JTextField(64);
|
|
pane.add(message, c);
|
|
|
|
y++; x = 0;
|
|
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = x;
|
|
c.gridy = y;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
antenna_up = new JButton(up_msg());
|
|
antenna_up.setActionCommand("up");
|
|
antenna_up.setEnabled(false);
|
|
antenna_up.addActionListener(this);
|
|
pane.add(antenna_up, c);
|
|
|
|
x++;
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = x;
|
|
c.gridy = y;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
antenna_down = new JButton(down_msg());
|
|
antenna_down.setActionCommand("down");
|
|
antenna_down.setEnabled(false);
|
|
antenna_down.addActionListener(this);
|
|
pane.add(antenna_down, c);
|
|
|
|
x++;
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = x;
|
|
c.gridy = y;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
ok = new JButton("OK");
|
|
ok.setActionCommand("ok");
|
|
ok.setEnabled(false);
|
|
ok.addActionListener(this);
|
|
pane.add(ok, c);
|
|
|
|
x++;
|
|
c.fill = GridBagConstraints.NONE;
|
|
c.anchor = GridBagConstraints.WEST;
|
|
c.gridx = x;
|
|
c.gridy = y;
|
|
c.gridwidth = 1;
|
|
c.gridheight = 1;
|
|
c.weightx = 0;
|
|
c.weighty = 0;
|
|
cancel = new JButton("Cancel");
|
|
cancel.setActionCommand("cancel");
|
|
cancel.setEnabled(true);
|
|
cancel.addActionListener(this);
|
|
pane.add(cancel, c);
|
|
|
|
cal = new AltosAccelCal(this.link, this);
|
|
}
|
|
}
|