(yes, this should be two patches, but the diffs in AltosSerial were merged together).
First, this replaces the existing flush/flush_reply mess with two simple functions,
one to flush output to the serial device, making sure that all data written will be seen
while we wait for input. The other sucks any pending input off of the serial line and
discards it.
Second, AltosSerial now tracks whether the serial line is being used for telemetry
monitoring. If so, it enables monitoring, otherwise it disables it. Eliminates a
bunch of manual state tracking elsewhere.
Signed-off-by: Keith Packard <keithp@keithp.com>
void start_serial() throws InterruptedException {
if (remote) {
void start_serial() throws InterruptedException {
if (remote) {
- serial_line.printf("m 0\n");
serial_line.set_channel(AltosPreferences.channel());
serial_line.set_callsign(AltosPreferences.callsign());
serial_line.printf("p\n");
serial_line.set_channel(AltosPreferences.channel());
serial_line.set_callsign(AltosPreferences.callsign());
serial_line.printf("p\n");
+ serial_line.flush_input();
}
}
void stop_serial() throws InterruptedException {
if (remote) {
}
}
void stop_serial() throws InterruptedException {
if (remote) {
- serial_line.printf("~\n");
- serial_line.flush();
+ serial_line.printf("~");
+ serial_line.flush_output();
void ensure_debug_mode() {
if (!debug_mode) {
void ensure_debug_mode() {
if (!debug_mode) {
- printf("m 0\nD\n");
- flush_reply();
+ printf("D\n");
+ flush_input();
throws IOException, InterruptedException {
byte[] data = new byte[length];
throws IOException, InterruptedException {
byte[] data = new byte[length];
ensure_debug_mode();
printf("I %x %x\n", length, address);
int i = 0;
ensure_debug_mode();
printf("I %x %x\n", length, address);
int i = 0;
public byte[] read_bytes(int length)
throws IOException, InterruptedException {
public byte[] read_bytes(int length)
throws IOException, InterruptedException {
ensure_debug_mode();
printf("G %x\n", length);
int i = 0;
ensure_debug_mode();
printf("G %x\n", length);
int i = 0;
public void run () {
if (remote) {
public void run () {
if (remote) {
- serial_line.printf("m 0\n");
serial_line.set_channel(AltosPreferences.channel());
serial_line.set_callsign(AltosPreferences.callsign());
serial_line.set_channel(AltosPreferences.channel());
serial_line.set_callsign(AltosPreferences.callsign());
- serial_line.printf("p\n");
+ serial_line.printf("p\nE 0\n");
+ serial_line.flush_input();
}
monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
}
monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
if (remote)
serial_line.printf("~");
monitor.done();
if (remote)
serial_line.printf("~");
monitor.done();
+ serial_line.flush_output();
String line;
byte[] line_bytes;
int line_count;
String line;
byte[] line_bytes;
int line_count;
public void run () {
int c;
public void run () {
int c;
- public void flush_reply() {
+ public void flush_output() {
libaltos.altos_flush(altos);
libaltos.altos_flush(altos);
+ }
+
+ public void flush_input() {
+ flush_output();
} catch (InterruptedException ie) {
}
} catch (InterruptedException ie) {
}
+ synchronized(this) {
+ if (!"VERSION".startsWith(line) &&
+ !line.startsWith("VERSION"))
+ line = "";
+ reply_queue.clear();
+ }
}
public String get_reply() throws InterruptedException {
}
public String get_reply() throws InterruptedException {
- libaltos.altos_flush(altos);
String line = reply_queue.take();
return line;
}
public void add_monitor(LinkedBlockingQueue<String> q) {
String line = reply_queue.take();
return line;
}
public void add_monitor(LinkedBlockingQueue<String> q) {
monitors.add(q);
}
public void remove_monitor(LinkedBlockingQueue<String> q) {
monitors.remove(q);
monitors.add(q);
}
public void remove_monitor(LinkedBlockingQueue<String> q) {
monitors.remove(q);
- }
-
- public void flush () {
- synchronized(this) {
- if (!"VERSION".startsWith(line) && !line.startsWith("VERSION"))
- line = "";
- reply_queue.clear();
- }
+ if (monitors.isEmpty())
+ set_monitor(false);
}
public boolean opened() {
}
public boolean opened() {
libaltos.altos_close(altos);
libaltos.altos_close(altos);
if (input_thread != null) {
try {
input_thread.interrupt();
if (input_thread != null) {
try {
input_thread.interrupt();
}
public void print(String data) {
}
public void print(String data) {
-//h System.out.printf("\"%s\" ", data);
+// System.out.printf("\"%s\" ", data);
for (int i = 0; i < data.length(); i++)
putc(data.charAt(i));
}
for (int i = 0; i < data.length(); i++)
putc(data.charAt(i));
}
throw new FileNotFoundException(device.getPath());
input_thread = new Thread(this);
input_thread.start();
throw new FileNotFoundException(device.getPath());
input_thread = new Thread(this);
input_thread.start();
- print("\nE 0\n");
- try {
- Thread.sleep(200);
- } catch (InterruptedException e) {
- }
- flush();
+ print("~\nE 0\n");
+ set_monitor(monitor_mode);
+ flush_input();
}
public void set_channel(int channel) {
}
public void set_channel(int channel) {
- if (altos != null)
- printf("m 0\nc r %d\nm 1\n", channel);
+ if (altos != null) {
+ if (monitor_mode)
+ printf("m 0\nc r %d\nm 1\n", channel);
+ else
+ printf("c r %d\n", channel);
+ }
+ }
+
+ void set_monitor(boolean monitor) {
+ monitor_mode = monitor;
+ if (altos != null) {
+ if (monitor)
+ printf("m 1\n");
+ else
+ printf("m 0\n");
+ }
}
public void set_callsign(String callsign) {
}
public void set_callsign(String callsign) {
altos = null;
input_thread = null;
line = "";
altos = null;
input_thread = null;
line = "";
monitors = new LinkedList<LinkedBlockingQueue<String>> ();
reply_queue = new LinkedBlockingQueue<String> ();
}
monitors = new LinkedList<LinkedBlockingQueue<String>> ();
reply_queue = new LinkedBlockingQueue<String> ();
}