string_ref product;
string_ref callsign;
AltosConfigUI config_ui;
-
+ boolean serial_started;
boolean get_int(String line, String label, int_ref x) {
if (line.startsWith(label)) {
}
void start_serial() throws InterruptedException {
+ serial_started = true;
if (remote) {
- serial_line.set_channel(AltosPreferences.channel(device.getSerial()));
- serial_line.set_callsign(AltosPreferences.callsign());
- serial_line.printf("p\n");
+ serial_line.set_radio();
+ serial_line.printf("p\nE 0\n");
serial_line.flush_input();
}
}
void stop_serial() throws InterruptedException {
+ if (!serial_started)
+ return;
+ serial_started = false;
if (remote) {
serial_line.printf("~");
serial_line.flush_output();
start_serial();
serial_line.printf("c s\nv\n");
for (;;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
get_int(line, "serial-number", serial);
}
void init_ui () throws InterruptedException, TimeoutException {
- config_ui = new AltosConfigUI(owner);
+ config_ui = new AltosConfigUI(owner, remote);
config_ui.addActionListener(this);
set_ui();
}
device.toShortString()),
"Connection Failed",
JOptionPane.ERROR_MESSAGE);
+ try {
+ stop_serial();
+ } catch (InterruptedException ie) {
+ }
serial_line.close();
serial_line = null;
}
start_serial();
serial_line.printf("c m %d\n", main_deploy.get());
serial_line.printf("c d %d\n", apogee_delay.get());
- serial_line.printf("c r %d\n", radio_channel.get());
- serial_line.printf("c f %d\n", radio_calibration.get());
+ if (!remote) {
+ serial_line.printf("c r %d\n", radio_channel.get());
+ serial_line.printf("c f %d\n", radio_calibration.get());
+ }
serial_line.printf("c c %s\n", callsign.get());
serial_line.printf("c w\n");
} catch (InterruptedException ie) {
}
/* Build the UI using a grid bag */
- public AltosConfigUI(JFrame in_owner) {
+ public AltosConfigUI(JFrame in_owner, boolean remote) {
super (in_owner, "Configure TeleMetrum", false);
owner = in_owner;
radio_channel_value = new JComboBox(radio_channel_values);
radio_channel_value.setEditable(false);
radio_channel_value.addItemListener(this);
+ if (remote)
+ radio_channel_value.setEnabled(false);
pane.add(radio_channel_value, c);
/* Radio Calibration */
c.ipady = 5;
radio_calibration_value = new JTextField(String.format("%d", 1186611));
radio_calibration_value.getDocument().addDocumentListener(this);
+ if (remote)
+ radio_calibration_value.setEnabled(false);
pane.add(radio_calibration_value, c);
/* Callsign */
/* Pull the serial number out of the version information */
for (;;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
any_valid = false;
monitor.set_value(state_names[state], state, block - state_block);
for (addr = 0; addr < 0x100;) {
- String line = serial_line.get_reply(1000);
+ String line = serial_line.get_reply(5000);
if (line == null)
throw new TimeoutException();
int[] values = ParseHex(line);
public void run () {
if (remote) {
- serial_line.set_channel(AltosPreferences.channel(device.getSerial()));
- serial_line.set_callsign(AltosPreferences.callsign());
+ serial_line.set_radio();
serial_line.printf("p\nE 0\n");
serial_line.flush_input();
}
public void actionPerformed(ActionEvent e) {
int channel = channels.getSelectedIndex();
reader.set_channel(channel);
- AltosPreferences.set_channel(serial, channel);
}
});
c.gridx = 0;
AltosDevice device;
AltosSerial serial;
boolean remote;
+ boolean serial_started;
final static int None = 0;
final static int Apogee = 1;
final static int Main = 2;
final static int Open = 3;
private void start_serial() throws InterruptedException {
+ serial_started = true;
if (remote) {
- serial.set_channel(AltosPreferences.channel(device.getSerial()));
- serial.set_callsign(AltosPreferences.callsign());
- serial.printf("~\np\n");
+ serial.set_radio();
+ serial.printf("p\nE 0\n");
serial.flush_input();
}
}
private void stop_serial() throws InterruptedException {
+ if (!serial_started)
+ return;
+ serial_started = false;
if (serial == null)
return;
if (remote) {
start_serial();
serial.printf("t\n");
for (;;) {
- String line = serial.get_reply(1000);
+ String line = serial.get_reply(5000);
if (line == null)
throw new TimeoutException();
if (get_string(line, "Igniter: drogue Status: ", status_name))
}
public void close() {
+ try {
+ stop_serial();
+ } catch (InterruptedException ie) {
+ }
serial.close();
serial = null;
}
if (cmd.equals("apogee") && apogee.isSelected()) {
main.setSelected(false);
- if (apogee_status == AltosIgnite.Ready)
- arm.setEnabled(true);
+ arm.setEnabled(true);
}
if (cmd.equals("main") && main.isSelected()) {
apogee.setSelected(false);
- if (main_status == AltosIgnite.Ready)
- arm.setEnabled(true);
+ arm.setEnabled(true);
}
if (cmd.equals("arm")) {
public void flush_input() {
flush_output();
- try {
- Thread.sleep(200);
- } catch (InterruptedException ie) {
- }
- synchronized(this) {
- if (!"VERSION".startsWith(line) &&
- !line.startsWith("VERSION"))
- line = "";
- reply_queue.clear();
- }
+ boolean got_some;
+ do {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ie) {
+ }
+ got_some = !reply_queue.isEmpty();
+ synchronized(this) {
+ if (!"VERSION".startsWith(line) &&
+ !line.startsWith("VERSION"))
+ line = "";
+ reply_queue.clear();
+ }
+ } while (got_some);
}
public String get_reply() throws InterruptedException {
devices_opened.add(device.getPath());
}
altos = libaltos.altos_open(device);
- if (altos == null)
+ if (altos == null) {
+ close();
throw new FileNotFoundException(device.toShortString());
+ }
input_thread = new Thread(this);
input_thread.start();
print("~\nE 0\n");
+ set_monitor(false);
flush_output();
- set_monitor(monitor_mode);
+ }
+
+ public void set_radio() {
set_channel(AltosPreferences.channel(device.getSerial()));
set_callsign(AltosPreferences.callsign());
}
void set_channel(int channel) {
serial.set_channel(channel);
- }
-
- void set_callsign(String callsign) {
- serial.set_callsign(callsign);
+ AltosPreferences.set_channel(device.getSerial(), channel);
}
public AltosTelemetryReader (AltosDevice in_device)
name = device.toShortString();
telem = new LinkedBlockingQueue<AltosLine>();
+ serial.set_radio();
serial.add_monitor(telem);
}
}
ao_igniter(void)
{
__xdata enum ao_ignter igniter;
- __xdata enum ao_igniter_status status;
ao_config_get();
for (;;) {
void
ao_radio_abort(void)
{
- ao_dma_abort(ao_radio_dma);
- ao_radio_idle();
+ /* Only abort if a task is waiting to receive data */
+ if (RFST == RFST_SRX) {
+ ao_dma_abort(ao_radio_dma);
+ ao_radio_idle();
+ }
}
void
ao_radio_test(void)
{
uint8_t mode = 2;
+ static __xdata radio_on;
ao_cmd_white();
if (ao_cmd_lex_c != '\n') {
ao_cmd_decimal();
mode = (uint8_t) ao_cmd_lex_u32;
}
mode++;
- if (mode & 2) {
+ if ((mode & 2) && !radio_on) {
ao_set_monitor(0);
ao_packet_slave_stop();
ao_radio_get();
RFST = RFST_STX;
+ radio_on = 1;
}
if (mode == 3) {
printf ("Hit a character to stop..."); flush();
getchar();
putchar('\n');
}
- if (mode & 1) {
+ if ((mode & 1) && radio_on) {
ao_radio_idle();
ao_radio_put();
+ radio_on = 0;
}
}