diff options
| -rw-r--r-- | altosui/AltosBTDevice.java | 7 | ||||
| -rw-r--r-- | altosui/AltosCSVUI.java | 2 | ||||
| -rw-r--r-- | altosui/AltosConfig.java | 3 | ||||
| -rw-r--r-- | altosui/AltosDataChooser.java | 2 | ||||
| -rw-r--r-- | altosui/AltosDevice.java | 1 | ||||
| -rw-r--r-- | altosui/AltosEepromDownload.java | 12 | ||||
| -rw-r--r-- | altosui/AltosEepromManage.java | 3 | ||||
| -rw-r--r-- | altosui/AltosFlashUI.java | 4 | ||||
| -rw-r--r-- | altosui/AltosIgniteUI.java | 3 | ||||
| -rw-r--r-- | altosui/AltosLanded.java | 4 | ||||
| -rw-r--r-- | altosui/AltosLaunchUI.java | 3 | ||||
| -rw-r--r-- | altosui/AltosScanUI.java | 6 | ||||
| -rw-r--r-- | altosui/AltosSerial.java | 4 | ||||
| -rw-r--r-- | altosui/AltosUI.java | 9 | ||||
| -rw-r--r-- | altosui/AltosUSBDevice.java | 7 | ||||
| -rw-r--r-- | altosui/libaltos/libaltos.c | 97 | ||||
| -rw-r--r-- | altosui/libaltos/libaltos.h | 8 | 
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); | 
