/* * Copyright © 2017 Keith Packard * * 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); } }