Clean up Windows event handles on com port close
[fw/altos] / altosui / libaltos / libaltos.c
index 48e00a4415d4bd034f33bd45710035a561d69fe9..ab6ca87887c87b69675890e8f87f6e55afb4d4bf 100644 (file)
 #define USB_VENDOR_FSF                 0xfffe
 #define USB_VENDOR_ALTUSMETRUM         USB_VENDOR_FSF
 #define USB_PRODUCT_ALTUSMETRUM                0x000a
-#define USB_PRODUCT_TELEMETRUM         0x000b
-#define USB_PRODUCT_TELEDONGLE         0x000c
-#define USB_PRODUCT_TELETERRA          0x000d
-#define USB_PRODUCT_TELEBT             0x000e
 #define USB_PRODUCT_ALTUSMETRUM_MIN    0x000a
-#define USB_PRODUCT_ALTUSMETRUM_MAX    0x0013
+#define USB_PRODUCT_ALTUSMETRUM_MAX    0x00ff
 
 #define USB_IS_ALTUSMETRUM(v,p)        ((v) == USB_VENDOR_ALTUSMETRUM && \
                (USB_PRODUCT_ALTUSMETRUM_MIN <= (p) && \
@@ -225,7 +221,7 @@ altos_flush(struct altos_file *file)
 #endif
                if (ret < 0) {
                        altos_set_last_posix_error();
-                       return -errno;
+                       return -last_error.code;
                }
                if (ret) {
                        memmove(file->out_data, file->out_data + ret,
@@ -251,7 +247,7 @@ altos_putchar(struct altos_file *file, char c)
        ret = 0;
        if (file->out_used == USB_BUF_SIZE)
                ret = altos_flush(file);
-       return 0;
+       return ret;
 }
 
 #ifdef USE_POLL
@@ -945,7 +941,7 @@ struct altos_file {
 };
 
 static void
-altos_set_last_windows_error(void)
+_altos_set_last_windows_error(char *file, int line)
 {
        DWORD   error = GetLastError();
        TCHAR   message[1024];
@@ -956,9 +952,13 @@ altos_set_last_windows_error(void)
                      message,
                      sizeof (message) / sizeof (TCHAR),
                      NULL);
+       if (error != ERROR_SUCCESS)
+               printf ("%s:%d %s\n", file, line, message);
        altos_set_last_error(error, message);
 }
 
+#define altos_set_last_windows_error() _altos_set_last_windows_error(__FILE__, __LINE__)
+
 PUBLIC struct altos_list *
 altos_list_start(void)
 {
@@ -1165,6 +1165,7 @@ altos_flush(struct altos_file *file)
                if (!WriteFile(file->handle, data, used, &put, &file->ov_write)) {
                        if (GetLastError() != ERROR_IO_PENDING) {
                                altos_set_last_windows_error();
+                               printf ("\tflush write error\n");
                                return LIBALTOS_ERROR;
                        }
                        ret = WaitForSingleObject(file->ov_write.hEvent, INFINITE);
@@ -1172,11 +1173,13 @@ altos_flush(struct altos_file *file)
                        case WAIT_OBJECT_0:
                                if (!GetOverlappedResult(file->handle, &file->ov_write, &put, FALSE)) {
                                        altos_set_last_windows_error();
+                                       printf ("\tflush result error\n");
                                        return LIBALTOS_ERROR;
                                }
                                break;
                        default:
                                altos_set_last_windows_error();
+                               printf ("\tflush wait error\n");
                                return LIBALTOS_ERROR;
                        }
                }
@@ -1192,7 +1195,6 @@ altos_open(struct altos_device *device)
 {
        struct altos_file       *file = calloc (1, sizeof (struct altos_file));
        char    full_name[64];
-       DCB dcbSerialParams = {0};
        COMMTIMEOUTS timeouts;
 
        if (!file)
@@ -1205,6 +1207,7 @@ altos_open(struct altos_device *device)
                                  FILE_FLAG_OVERLAPPED, NULL);
        if (file->handle == INVALID_HANDLE_VALUE) {
                altos_set_last_windows_error();
+               printf ("cannot open %s\n", full_name);
                free(file);
                return NULL;
        }
@@ -1218,24 +1221,6 @@ altos_open(struct altos_device *device)
        timeouts.WriteTotalTimeoutConstant = 0;
        SetCommTimeouts(file->handle, &timeouts);
 
-       dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
-       if (!GetCommState(file->handle, &dcbSerialParams)) {
-               altos_set_last_windows_error();
-               CloseHandle(file->handle);
-               free(file);
-               return NULL;
-       }
-       dcbSerialParams.BaudRate = CBR_9600;
-       dcbSerialParams.ByteSize = 8;
-       dcbSerialParams.StopBits = ONESTOPBIT;
-       dcbSerialParams.Parity = NOPARITY;
-       if (!SetCommState(file->handle, &dcbSerialParams)) {
-               altos_set_last_windows_error();
-               CloseHandle(file->handle);
-               free(file);
-               return NULL;
-       }
-
        return file;
 }
 
@@ -1245,6 +1230,10 @@ altos_close(struct altos_file *file)
        if (file->handle != INVALID_HANDLE_VALUE) {
                CloseHandle(file->handle);
                file->handle = INVALID_HANDLE_VALUE;
+               SetEvent(file->ov_read.hEvent);
+               SetEvent(file->ov_write.hEvent);
+               CloseHandle(file->ov_read.hEvent);
+               CloseHandle(file->ov_write.hEvent);
        }
 }