summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2011-08-28 15:50:30 -0700
committerKeith Packard <keithp@keithp.com>2011-08-28 15:50:30 -0700
commit31e3255b6cbfaf95c0e97e2d1ec8de72f845994c (patch)
tree7213069af129b6b29bc59d48ce5c1e3f336537c9
parentcf72c2f5a69a736c28a9b63e124d510ef41a9f5d (diff)
altosui: Report error message back from libaltos
This includes changing all of the error dialogs to show the error message rather than just the file name. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--altosui/AltosBTDevice.java7
-rw-r--r--altosui/AltosCSVUI.java2
-rw-r--r--altosui/AltosConfig.java3
-rw-r--r--altosui/AltosDataChooser.java2
-rw-r--r--altosui/AltosDevice.java1
-rw-r--r--altosui/AltosEepromDownload.java12
-rw-r--r--altosui/AltosEepromManage.java3
-rw-r--r--altosui/AltosFlashUI.java4
-rw-r--r--altosui/AltosIgniteUI.java3
-rw-r--r--altosui/AltosLanded.java4
-rw-r--r--altosui/AltosLaunchUI.java3
-rw-r--r--altosui/AltosScanUI.java6
-rw-r--r--altosui/AltosSerial.java4
-rw-r--r--altosui/AltosUI.java9
-rw-r--r--altosui/AltosUSBDevice.java7
-rw-r--r--altosui/libaltos/libaltos.c97
-rw-r--r--altosui/libaltos/libaltos.h8
17 files changed, 131 insertions, 44 deletions
diff --git a/altosui/AltosBTDevice.java b/altosui/AltosBTDevice.java
index 7a876c25..55b8f8fc 100644
--- a/altosui/AltosBTDevice.java
+++ b/altosui/AltosBTDevice.java
@@ -42,6 +42,13 @@ public class AltosBTDevice extends altos_bt_device implements AltosDevice {
return getAddr();
}
+ public String getErrorString() {
+ altos_error error = new altos_error();
+
+ libaltos.altos_get_last_error(error);
+ return String.format("%s (%d)", error.getString(), error.getCode());
+ }
+
public int getSerial() {
String name = getName();
if (name == null)
diff --git a/altosui/AltosCSVUI.java b/altosui/AltosCSVUI.java
index e1b6002d..a212409e 100644
--- a/altosui/AltosCSVUI.java
+++ b/altosui/AltosCSVUI.java
@@ -99,7 +99,7 @@ public class AltosCSVUI
writer.close();
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(frame,
- file.getName(),
+ ee.getMessage(),
"Cannot open file",
JOptionPane.ERROR_MESSAGE);
}
diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java
index 122ebecc..93def70d 100644
--- a/altosui/AltosConfig.java
+++ b/altosui/AltosConfig.java
@@ -480,8 +480,7 @@ public class AltosConfig implements ActionListener {
}
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(owner,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ee.getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} catch (AltosSerialInUseException si) {
diff --git a/altosui/AltosDataChooser.java b/altosui/AltosDataChooser.java
index 15de05c2..d81ca6d1 100644
--- a/altosui/AltosDataChooser.java
+++ b/altosui/AltosDataChooser.java
@@ -61,7 +61,7 @@ public class AltosDataChooser extends JFileChooser {
}
} catch (FileNotFoundException fe) {
JOptionPane.showMessageDialog(frame,
- filename,
+ fe.getMessage(),
"Cannot open file",
JOptionPane.ERROR_MESSAGE);
}
diff --git a/altosui/AltosDevice.java b/altosui/AltosDevice.java
index 3357c550..1b5c1a91 100644
--- a/altosui/AltosDevice.java
+++ b/altosui/AltosDevice.java
@@ -26,5 +26,6 @@ public interface AltosDevice {
public abstract int getSerial();
public abstract String getPath();
public abstract boolean matchProduct(int product);
+ public abstract String getErrorString();
public SWIGTYPE_p_altos_file open();
}
diff --git a/altosui/AltosEepromDownload.java b/altosui/AltosEepromDownload.java
index 358ad337..e7e52466 100644
--- a/altosui/AltosEepromDownload.java
+++ b/altosui/AltosEepromDownload.java
@@ -248,6 +248,10 @@ public class AltosEepromDownload implements Runnable {
done = true;
}
+ void CaptureTelemetry(AltosEepromChunk eechunk) throws IOException {
+
+ }
+
void CaptureLog(AltosEepromLog log) throws IOException, InterruptedException, TimeoutException {
int block, state_block = 0;
int log_format = flights.config_data.log_format;
@@ -300,10 +304,10 @@ public class AltosEepromDownload implements Runnable {
extension = "eeprom";
CaptureTiny(eechunk);
break;
-// case Altos.AO_LOG_FORMAT_TELEMETRY:
-// extension = "telem";
-// CaptureTelemetry(eechunk);
-// break;
+ case Altos.AO_LOG_FORMAT_TELEMETRY:
+ extension = "telem";
+ CaptureTelemetry(eechunk);
+ break;
case Altos.AO_LOG_FORMAT_TELESCIENCE:
extension = "science";
CaptureTeleScience(eechunk);
diff --git a/altosui/AltosEepromManage.java b/altosui/AltosEepromManage.java
index 2e520628..083c7372 100644
--- a/altosui/AltosEepromManage.java
+++ b/altosui/AltosEepromManage.java
@@ -219,8 +219,7 @@ public class AltosEepromManage implements ActionListener {
t.start();
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(frame,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ee.getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} catch (AltosSerialInUseException si) {
diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java
index 3874b500..3956ff20 100644
--- a/altosui/AltosFlashUI.java
+++ b/altosui/AltosFlashUI.java
@@ -200,8 +200,8 @@ public class AltosFlashUI
void exception (Exception e) {
if (e instanceof FileNotFoundException) {
JOptionPane.showMessageDialog(frame,
- "Cannot open image",
- file.toString(),
+ ((FileNotFoundException) e).getMessage(),
+ "Cannot open file",
JOptionPane.ERROR_MESSAGE);
} else if (e instanceof AltosSerialInUseException) {
JOptionPane.showMessageDialog(frame,
diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java
index c11a8614..b215c228 100644
--- a/altosui/AltosIgniteUI.java
+++ b/altosui/AltosIgniteUI.java
@@ -122,8 +122,7 @@ public class AltosIgniteUI
void ignite_exception(Exception e) {
if (e instanceof FileNotFoundException) {
JOptionPane.showMessageDialog(owner,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ((FileNotFoundException) e).getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} else if (e instanceof AltosSerialInUseException) {
diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java
index 50e6b542..4dd9a2dd 100644
--- a/altosui/AltosLanded.java
+++ b/altosui/AltosLanded.java
@@ -250,7 +250,7 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
FileInputStream in = new FileInputStream(file);
records = new AltosTelemetryIterable(in);
} else {
- throw new FileNotFoundException();
+ throw new FileNotFoundException(filename);
}
try {
new AltosGraphUI(records, filename);
@@ -259,7 +259,7 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
}
} catch (FileNotFoundException fe) {
JOptionPane.showMessageDialog(null,
- filename,
+ fe.getMessage(),
"Cannot open file",
JOptionPane.ERROR_MESSAGE);
}
diff --git a/altosui/AltosLaunchUI.java b/altosui/AltosLaunchUI.java
index 4e630afb..47365e03 100644
--- a/altosui/AltosLaunchUI.java
+++ b/altosui/AltosLaunchUI.java
@@ -164,8 +164,7 @@ public class AltosLaunchUI
void launch_exception(Exception e) {
if (e instanceof FileNotFoundException) {
JOptionPane.showMessageDialog(owner,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ((FileNotFoundException) e).getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} else if (e instanceof AltosSerialInUseException) {
diff --git a/altosui/AltosScanUI.java b/altosui/AltosScanUI.java
index bce4b32c..df5c51d4 100644
--- a/altosui/AltosScanUI.java
+++ b/altosui/AltosScanUI.java
@@ -130,8 +130,7 @@ public class AltosScanUI
void scan_exception(Exception e) {
if (e instanceof FileNotFoundException) {
JOptionPane.showMessageDialog(owner,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ((FileNotFoundException) e).getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} else if (e instanceof AltosSerialInUseException) {
@@ -326,8 +325,7 @@ public class AltosScanUI
return true;
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(owner,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ee.getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} catch (AltosSerialInUseException si) {
diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java
index 0a531aa9..4cf306d0 100644
--- a/altosui/AltosSerial.java
+++ b/altosui/AltosSerial.java
@@ -323,8 +323,10 @@ public class AltosSerial implements Runnable {
}
altos = device.open();
if (altos == null) {
+ final String message = device.getErrorString();
close();
- throw new FileNotFoundException(device.toShortString());
+ throw new FileNotFoundException(String.format("%s (%s)",
+ device.toShortString(), message));
}
if (debug)
System.out.printf("Open %s\n", device.getPath());
diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java
index 60adfc7c..3e5bcf43 100644
--- a/altosui/AltosUI.java
+++ b/altosui/AltosUI.java
@@ -52,8 +52,7 @@ public class AltosUI extends JFrame {
new AltosFlightUI(voice, reader, device.getSerial());
} catch (FileNotFoundException ee) {
JOptionPane.showMessageDialog(AltosUI.this,
- String.format("Cannot open device \"%s\"",
- device.toShortString()),
+ ee.getMessage(),
"Cannot open target device",
JOptionPane.ERROR_MESSAGE);
} catch (AltosSerialInUseException si) {
@@ -356,7 +355,7 @@ public class AltosUI extends JFrame {
else
return new AltosTelemetryIterable(in);
} catch (FileNotFoundException fe) {
- System.out.printf("Cannot open '%s'\n", filename);
+ System.out.printf("%s\n", fe.getMessage());
return null;
}
}
@@ -366,7 +365,7 @@ public class AltosUI extends JFrame {
try {
return new AltosCSV(file);
} catch (FileNotFoundException fe) {
- System.out.printf("Cannot open '%s'\n", filename);
+ System.out.printf("%s\n", fe.getMessage());
return null;
}
}
@@ -376,7 +375,7 @@ public class AltosUI extends JFrame {
try {
return new AltosKML(file);
} catch (FileNotFoundException fe) {
- System.out.printf("Cannot open '%s'\n", filename);
+ System.out.printf("%s\n", fe.getMessage());
return null;
}
}
diff --git a/altosui/AltosUSBDevice.java b/altosui/AltosUSBDevice.java
index dc746a64..b11a3934 100644
--- a/altosui/AltosUSBDevice.java
+++ b/altosui/AltosUSBDevice.java
@@ -39,6 +39,13 @@ public class AltosUSBDevice extends altos_device implements AltosDevice {
}
+ public String getErrorString() {
+ altos_error error = new altos_error();
+
+ libaltos.altos_get_last_error(error);
+ return String.format("%s (%d)", error.getString(), error.getCode());
+ }
+
public SWIGTYPE_p_altos_file open() {
return libaltos.altos_open(this);
}
diff --git a/altosui/libaltos/libaltos.c b/altosui/libaltos/libaltos.c
index a3796ee3..48e00a44 100644
--- a/altosui/libaltos/libaltos.c
+++ b/altosui/libaltos/libaltos.c
@@ -49,6 +49,22 @@ altos_fini(void)
{
}
+static struct altos_error last_error;
+
+static void
+altos_set_last_error(int code, char *string)
+{
+ last_error.code = code;
+ strncpy(last_error.string, string, sizeof (last_error.string) -1);
+ last_error.string[sizeof(last_error.string)-1] = '\0';
+}
+
+PUBLIC void
+altos_get_last_error(struct altos_error *error)
+{
+ *error = last_error;
+}
+
#ifdef DARWIN
#undef USE_POLL
@@ -96,6 +112,12 @@ struct altos_file {
int in_read;
};
+static void
+altos_set_last_posix_error(void)
+{
+ altos_set_last_error(errno, strerror(errno));
+}
+
PUBLIC struct altos_file *
altos_open(struct altos_device *device)
{
@@ -103,12 +125,18 @@ altos_open(struct altos_device *device)
int ret;
struct termios term;
- if (!file)
+ if (!file) {
+ altos_set_last_posix_error();
return NULL;
+ }
+
+// altos_set_last_error(12, "yeah yeah, failed again");
+// free(file);
+// return NULL;
file->fd = open(device->path, O_RDWR | O_NOCTTY);
if (file->fd < 0) {
- perror(device->path);
+ altos_set_last_posix_error();
free(file);
return NULL;
}
@@ -117,7 +145,7 @@ altos_open(struct altos_device *device)
#else
file->out_fd = open(device->path, O_RDWR | O_NOCTTY);
if (file->out_fd < 0) {
- perror(device->path);
+ altos_set_last_posix_error();
close(file->fd);
free(file);
return NULL;
@@ -125,7 +153,7 @@ altos_open(struct altos_device *device)
#endif
ret = tcgetattr(file->fd, &term);
if (ret < 0) {
- perror("tcgetattr");
+ altos_set_last_posix_error();
close(file->fd);
#ifndef USE_POLL
close(file->out_fd);
@@ -143,7 +171,7 @@ altos_open(struct altos_device *device)
#endif
ret = tcsetattr(file->fd, TCSAFLUSH, &term);
if (ret < 0) {
- perror("tcsetattr");
+ altos_set_last_posix_error();
close(file->fd);
#ifndef USE_POLL
close(file->out_fd);
@@ -195,8 +223,10 @@ altos_flush(struct altos_file *file)
#else
ret = write (file->out_fd, file->out_data, file->out_used);
#endif
- if (ret < 0)
+ if (ret < 0) {
+ altos_set_last_posix_error();
return -errno;
+ }
if (ret) {
memmove(file->out_data, file->out_data + ret,
file->out_used - ret);
@@ -248,7 +278,7 @@ altos_fill(struct altos_file *file, int timeout)
fd[1].events = POLLIN;
ret = poll(fd, 2, timeout);
if (ret < 0) {
- perror("altos_getchar");
+ altos_set_last_posix_error();
return LIBALTOS_ERROR;
}
if (ret == 0)
@@ -261,7 +291,7 @@ altos_fill(struct altos_file *file, int timeout)
{
ret = read(file->fd, file->in_data, USB_BUF_SIZE);
if (ret < 0) {
- perror("altos_getchar");
+ altos_set_last_posix_error();
return LIBALTOS_ERROR;
}
file->in_read = 0;
@@ -700,8 +730,10 @@ altos_bt_open(struct altos_bt_device *device)
if (!file)
goto no_file;
file->fd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
- if (file->fd < 0)
+ if (file->fd < 0) {
+ altos_set_last_posix_error();
goto no_sock;
+ }
addr.rc_family = AF_BLUETOOTH;
addr.rc_channel = 1;
@@ -711,7 +743,7 @@ altos_bt_open(struct altos_bt_device *device)
(struct sockaddr *)&addr,
sizeof(addr));
if (status < 0) {
- perror("connect");
+ altos_set_last_posix_error();
goto no_link;
}
sleep(1);
@@ -912,6 +944,21 @@ struct altos_file {
OVERLAPPED ov_write;
};
+static void
+altos_set_last_windows_error(void)
+{
+ DWORD error = GetLastError();
+ TCHAR message[1024];
+ FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
+ 0,
+ error,
+ 0,
+ message,
+ sizeof (message) / sizeof (TCHAR),
+ NULL);
+ altos_set_last_error(error, message);
+}
+
PUBLIC struct altos_list *
altos_list_start(void)
{
@@ -922,7 +969,7 @@ altos_list_start(void)
list->dev_info = SetupDiGetClassDevs(NULL, "USB", NULL,
DIGCF_ALLCLASSES|DIGCF_PRESENT);
if (list->dev_info == INVALID_HANDLE_VALUE) {
- printf("SetupDiGetClassDevs failed %ld\n", GetLastError());
+ altos_set_last_windows_error();
free(list);
return NULL;
}
@@ -956,6 +1003,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
DICS_FLAG_GLOBAL, 0, DIREG_DEV,
KEY_READ);
if (dev_key == INVALID_HANDLE_VALUE) {
+ altos_set_last_windows_error();
printf("cannot open device registry key\n");
continue;
}
@@ -966,6 +1014,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
result = RegQueryValueEx(dev_key, "SymbolicName", NULL, NULL,
symbolic, &symbolic_len);
if (result != 0) {
+ altos_set_last_windows_error();
printf("cannot find SymbolicName value\n");
RegCloseKey(dev_key);
continue;
@@ -988,6 +1037,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
port, &port_len);
RegCloseKey(dev_key);
if (result != 0) {
+ altos_set_last_windows_error();
printf("failed to get PortName\n");
continue;
}
@@ -1003,6 +1053,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
sizeof(friendlyname),
&friendlyname_len))
{
+ altos_set_last_windows_error();
printf("Failed to get friendlyname\n");
continue;
}
@@ -1015,8 +1066,10 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
return 1;
}
result = GetLastError();
- if (result != ERROR_NO_MORE_ITEMS)
+ if (result != ERROR_NO_MORE_ITEMS) {
+ altos_set_last_windows_error();
printf ("SetupDiEnumDeviceInfo failed error %d\n", (int) result);
+ }
return 0;
}
@@ -1035,8 +1088,10 @@ altos_queue_read(struct altos_file *file)
return LIBALTOS_SUCCESS;
if (!ReadFile(file->handle, file->in_data, USB_BUF_SIZE, &got, &file->ov_read)) {
- if (GetLastError() != ERROR_IO_PENDING)
+ if (GetLastError() != ERROR_IO_PENDING) {
+ altos_set_last_windows_error();
return LIBALTOS_ERROR;
+ }
file->pend_read = TRUE;
} else {
file->pend_read = FALSE;
@@ -1061,8 +1116,10 @@ altos_wait_read(struct altos_file *file, int timeout)
ret = WaitForSingleObject(file->ov_read.hEvent, timeout);
switch (ret) {
case WAIT_OBJECT_0:
- if (!GetOverlappedResult(file->handle, &file->ov_read, &got, FALSE))
+ if (!GetOverlappedResult(file->handle, &file->ov_read, &got, FALSE)) {
+ altos_set_last_windows_error();
return LIBALTOS_ERROR;
+ }
file->pend_read = FALSE;
file->in_read = 0;
file->in_used = got;
@@ -1106,15 +1163,20 @@ altos_flush(struct altos_file *file)
while (used) {
if (!WriteFile(file->handle, data, used, &put, &file->ov_write)) {
- if (GetLastError() != ERROR_IO_PENDING)
+ if (GetLastError() != ERROR_IO_PENDING) {
+ altos_set_last_windows_error();
return LIBALTOS_ERROR;
+ }
ret = WaitForSingleObject(file->ov_write.hEvent, INFINITE);
switch (ret) {
case WAIT_OBJECT_0:
- if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE))
+ if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE)) {
+ altos_set_last_windows_error();
return LIBALTOS_ERROR;
+ }
break;
default:
+ altos_set_last_windows_error();
return LIBALTOS_ERROR;
}
}
@@ -1142,6 +1204,7 @@ altos_open(struct altos_device *device)
0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL);
if (file->handle == INVALID_HANDLE_VALUE) {
+ altos_set_last_windows_error();
free(file);
return NULL;
}
@@ -1157,6 +1220,7 @@ altos_open(struct altos_device *device)
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(file->handle, &dcbSerialParams)) {
+ altos_set_last_windows_error();
CloseHandle(file->handle);
free(file);
return NULL;
@@ -1166,6 +1230,7 @@ altos_open(struct altos_device *device)
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(file->handle, &dcbSerialParams)) {
+ altos_set_last_windows_error();
CloseHandle(file->handle);
free(file);
return NULL;
diff --git a/altosui/libaltos/libaltos.h b/altosui/libaltos/libaltos.h
index a05bed4c..f90fbb87 100644
--- a/altosui/libaltos/libaltos.h
+++ b/altosui/libaltos/libaltos.h
@@ -51,6 +51,11 @@ struct altos_bt_device {
//%mutable;
};
+struct altos_error {
+ int code;
+ char string[1024];
+};
+
#define LIBALTOS_SUCCESS 0
#define LIBALTOS_ERROR -1
#define LIBALTOS_TIMEOUT -2
@@ -62,6 +67,9 @@ altos_init(void);
PUBLIC void
altos_fini(void);
+PUBLIC void
+altos_get_last_error(struct altos_error *error);
+
PUBLIC struct altos_list *
altos_list_start(void);