diff options
Diffstat (limited to 'altosui')
| -rw-r--r-- | altosui/AltosConfigTD.java | 150 | ||||
| -rw-r--r-- | altosui/AltosConfigureUI.java | 2 | ||||
| -rw-r--r-- | altosui/AltosFlightUI.java | 4 | ||||
| -rw-r--r-- | altosui/AltosFrame.java | 23 | ||||
| -rw-r--r-- | altosui/AltosIdleMonitorUI.java | 4 | ||||
| -rw-r--r-- | altosui/AltosUI.java | 4 | ||||
| -rw-r--r-- | altosui/AltosUIPreferences.java | 22 | ||||
| -rw-r--r-- | altosui/Makefile-standalone | 15 | ||||
| -rw-r--r-- | altosui/Makefile.am | 31 | ||||
| -rw-r--r-- | altosui/altos-windows.nsi | 5 | ||||
| -rw-r--r-- | altosui/libaltos/libaltos.c | 33 |
11 files changed, 154 insertions, 139 deletions
diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java index 324a5988..71d628b3 100644 --- a/altosui/AltosConfigTD.java +++ b/altosui/AltosConfigTD.java @@ -74,7 +74,6 @@ public class AltosConfigTD implements ActionListener { string_ref version; string_ref product; AltosConfigTDUI config_ui; - boolean serial_started; boolean made_visible; boolean get_int(String line, String label, int_ref x) { @@ -108,17 +107,7 @@ public class AltosConfigTD implements ActionListener { } } - void start_serial() throws InterruptedException, TimeoutException { - serial_started = true; - } - - void stop_serial() throws InterruptedException { - if (!serial_started) - return; - serial_started = false; - } - - void update_ui() { + synchronized void update_ui() { config_ui.set_serial(serial.get()); config_ui.set_product(product.get()); config_ui.set_version(version.get()); @@ -131,7 +120,7 @@ public class AltosConfigTD implements ActionListener { } } - void process_line(String line) { + void finish_input(String line) { if (line == null) { abort(); return; @@ -141,63 +130,82 @@ public class AltosConfigTD implements ActionListener { update_ui(); return; } - get_string(line, "Config version", config_version); - get_int(line, "serial-number", serial); - get_int(line, "Radio channel:", radio_channel); - get_int(line, "Radio cal:", radio_calibration); - get_int(line, "Frequency:", radio_frequency); - get_int(line, "Radio setting:", radio_setting); - get_string(line,"software-version", version); - get_string(line,"product", product); } - final static int serial_mode_read = 0; - final static int serial_mode_save = 1; - final static int serial_mode_reboot = 2; - - class SerialData implements Runnable { - AltosConfigTD config; - int serial_mode; - - void process_line(String line) { - config.process_line(line); - } - void callback(String in_line) { - final String line = in_line; + synchronized void process_line(String line) { + if (line == null || line.equals("all finished")) { + final String last_line = line; Runnable r = new Runnable() { public void run() { - process_line(line); + finish_input(last_line); } }; SwingUtilities.invokeLater(r); + } else { + get_string(line, "Config version", config_version); + get_int(line, "serial-number", serial); + get_int(line, "Radio channel:", radio_channel); + get_int(line, "Radio cal:", radio_calibration); + get_int(line, "Frequency:", radio_frequency); + get_int(line, "Radio setting:", radio_setting); + get_string(line,"software-version", version); + get_string(line,"product", product); } + } + + synchronized void reset_data() { + serial.set(0); + radio_channel.set(0); + radio_setting.set(0); + radio_frequency.set(0); + radio_calibration.set(1186611); + config_version.set("0.0"); + version.set("unknown"); + product.set("unknown"); + } - void reset_data() { - serial.set(0); + synchronized double frequency() { + return AltosConvert.radio_to_frequency(radio_frequency.get(), + radio_setting.get(), + radio_calibration.get(), + radio_channel.get()); + } + + synchronized void set_frequency(double freq) { + int frequency = radio_frequency.get(); + int setting = radio_setting.get(); + + if (frequency > 0) { + radio_frequency.set((int) Math.floor (freq * 1000 + 0.5)); + } else if (setting > 0) { + radio_setting.set(AltosConvert.radio_frequency_to_setting(freq, + radio_calibration.get())); radio_channel.set(0); - radio_setting.set(0); - radio_frequency.set(0); - radio_calibration.set(1186611); - config_version.set("0.0"); - version.set("unknown"); - product.set("unknown"); + } else { + radio_channel.set(AltosConvert.radio_frequency_to_channel(freq)); } + } + + final static int serial_mode_read = 0; + final static int serial_mode_save = 1; + final static int serial_mode_reboot = 2; + + class SerialData implements Runnable { + AltosConfigTD config; + int serial_mode; void get_data() { try { boolean been_there = false; - config.start_serial(); - reset_data(); + config.reset_data(); for (;;) { - config.serial_line.printf("c s\nf\nl\nv\n"); + config.serial_line.printf("c s\nf\nv\n"); for (;;) { try { String line = config.serial_line.get_reply(5000); - if (line == null) - stop_serial(); - callback(line); - if (line.startsWith("software-version")) + config.process_line(line); + if (line != null && line.startsWith("software-version")) break; } catch (Exception e) { break; @@ -212,17 +220,13 @@ public class AltosConfigTD implements ActionListener { config.serial_line.flush_input(); } } catch (InterruptedException ie) { - } catch (TimeoutException te) { - } finally { - try { - stop_serial(); - } catch (InterruptedException ie) { - } } - double pref_frequency = AltosPreferences.frequency(serial.get()); - if (pref_frequency != 0) - radio_frequency.set((int) Math.floor (pref_frequency * 1000 + 0.5)); - callback("all finished"); + /* + * This makes sure the displayed frequency respects the limits that the + * available firmware version might place on the actual frequency + */ + config.set_frequency(AltosPreferences.frequency(serial.get())); + config.process_line("all finished"); } void save_data() { @@ -280,31 +284,9 @@ public class AltosConfigTD implements ActionListener { update_ui(); } - double frequency() { - return AltosConvert.radio_to_frequency(radio_frequency.get(), - radio_setting.get(), - radio_calibration.get(), - radio_channel.get()); - } - - void set_frequency(double freq) { - int frequency = radio_frequency.get(); - int setting = radio_setting.get(); - - if (frequency > 0) { - radio_frequency.set((int) Math.floor (freq * 1000 + 0.5)); - } else if (setting > 0) { - radio_setting.set(AltosConvert.radio_frequency_to_setting(freq, - radio_calibration.get())); - radio_channel.set(0); - } else { - radio_channel.set(AltosConvert.radio_frequency_to_channel(freq)); - } - } - void save_data() { - - set_frequency(config_ui.radio_frequency()); + double freq = config_ui.radio_frequency(); + set_frequency(freq); run_serial_thread(serial_mode_save); } diff --git a/altosui/AltosConfigureUI.java b/altosui/AltosConfigureUI.java index da82e8e0..249fc35a 100644 --- a/altosui/AltosConfigureUI.java +++ b/altosui/AltosConfigureUI.java @@ -246,7 +246,7 @@ public class AltosConfigureUI c.anchor = GridBagConstraints.WEST; pane.add(new JLabel("Imperial Units"), c); - imperial_units = new JRadioButton("Enable", AltosUIPreferences.serial_debug()); + imperial_units = new JRadioButton("Enable", AltosUIPreferences.imperial_units()); imperial_units.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JRadioButton item = (JRadioButton) e.getSource(); diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index ddc54cbd..600d8acc 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -170,10 +170,6 @@ public class AltosFlightUI extends AltosFrame implements AltosFlightDisplay, Alt GridBagConstraints c = new GridBagConstraints(); - java.net.URL imgURL = AltosUI.class.getResource("/altus-metrum-16x16.jpg"); - if (imgURL != null) - setIconImage(new ImageIcon(imgURL).getImage()); - setTitle(String.format("AltOS %s", reader.name)); /* Stick channel selector at top of table for telemetry monitoring */ diff --git a/altosui/AltosFrame.java b/altosui/AltosFrame.java index 70598634..338b363e 100644 --- a/altosui/AltosFrame.java +++ b/altosui/AltosFrame.java @@ -44,14 +44,37 @@ public class AltosFrame extends JFrame implements AltosUIListener { this.pack(); } + static final String[] icon_names = { + "/altus-metrum-16.png", + "/altus-metrum-32.png", + "/altus-metrum-48.png", + "/altus-metrum-64.png", + "/altus-metrum-128.png", + "/altus-metrum-256.png" + }; + + public void set_icon() { + ArrayList<Image> icons = new ArrayList<Image>(); + + for (int i = 0; i < icon_names.length; i++) { + java.net.URL imgURL = AltosUI.class.getResource(icon_names[i]); + if (imgURL != null) + icons.add(new ImageIcon(imgURL).getImage()); + } + + setIconImages(icons); + } + public AltosFrame() { AltosUIPreferences.register_ui_listener(this); addWindowListener(new AltosFrameListener()); + set_icon(); } public AltosFrame(String name) { super(name); AltosUIPreferences.register_ui_listener(this); addWindowListener(new AltosFrameListener()); + set_icon(); } } diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index 46ca3e5d..510579c5 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -106,10 +106,6 @@ public class AltosIdleMonitorUI extends AltosFrame implements AltosFlightDisplay GridBagConstraints c = new GridBagConstraints(); - java.net.URL imgURL = AltosUI.class.getResource("/altus-metrum-16x16.jpg"); - if (imgURL != null) - setIconImage(new ImageIcon(imgURL).getImage()); - setTitle(String.format("AltOS %s", device.toShortString())); /* Stick frequency selector at top of table for telemetry monitoring */ diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index 926d66f0..9977e82b 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -105,10 +105,6 @@ public class AltosUI extends AltosFrame { load_library(null); - java.net.URL imgURL = AltosUI.class.getResource("/altus-metrum-16x16.jpg"); - if (imgURL != null) - setIconImage(new ImageIcon(imgURL).getImage()); - AltosUIPreferences.set_component(this); pane = getContentPane(); diff --git a/altosui/AltosUIPreferences.java b/altosui/AltosUIPreferences.java index 10ab26c3..8f1e45d9 100644 --- a/altosui/AltosUIPreferences.java +++ b/altosui/AltosUIPreferences.java @@ -102,15 +102,17 @@ public class AltosUIPreferences extends AltosPreferences { } } public static int font_size() { - return font_size; + synchronized (preferences) { + return font_size; + } } static void set_fonts() { } public static void set_font_size(int new_font_size) { - font_size = new_font_size; synchronized (preferences) { + font_size = new_font_size; preferences.putInt(fontSizePreference, font_size); flush_preferences(); Altos.set_fonts(font_size); @@ -132,12 +134,12 @@ public class AltosUIPreferences extends AltosPreferences { } public static void set_look_and_feel(String new_look_and_feel) { - look_and_feel = new_look_and_feel; try { - UIManager.setLookAndFeel(look_and_feel); + UIManager.setLookAndFeel(new_look_and_feel); } catch (Exception e) { } synchronized(preferences) { + look_and_feel = new_look_and_feel; preferences.put(lookAndFeelPreference, look_and_feel); flush_preferences(); for (AltosUIListener l : ui_listeners) @@ -146,7 +148,9 @@ public class AltosUIPreferences extends AltosPreferences { } public static String look_and_feel() { - return look_and_feel; + synchronized (preferences) { + return look_and_feel; + } } public static void register_ui_listener(AltosUIListener l) { @@ -161,16 +165,18 @@ public class AltosUIPreferences extends AltosPreferences { } } public static void set_serial_debug(boolean new_serial_debug) { - serial_debug = new_serial_debug; - AltosLink.set_debug(serial_debug); + AltosLink.set_debug(new_serial_debug); synchronized (preferences) { + serial_debug = new_serial_debug; preferences.putBoolean(serialDebugPreference, serial_debug); flush_preferences(); } } public static boolean serial_debug() { - return serial_debug; + synchronized (preferences) { + return serial_debug; + } } }
\ No newline at end of file diff --git a/altosui/Makefile-standalone b/altosui/Makefile-standalone index 0d9931d5..23163e40 100644 --- a/altosui/Makefile-standalone +++ b/altosui/Makefile-standalone @@ -44,7 +44,14 @@ CLASSFILES=\ AltosRomconfigUI.class \ AltosVoice.class -JAVA_ICON=../icon/altus-metrum-16x16.jpg +JAVA_ICONS=\ + ../icon/altus-metrum-16.png \ + ../icon/altus-metrum-32.png \ + ../icon/altus-metrum-48.png \ + ../icon/altus-metrum-64.png \ + ../icon/altus-metrum-128.png \ + ../icon/altus-metrum-256.png + WINDOWS_ICON=../icon/altus-metrum.ico # where altosui.jar gets installed @@ -109,7 +116,7 @@ classes/libaltosJNI: classes/images: mkdir -p classes/images - ln -sf ../$(JAVA_ICON) classes/images + ln -sf ../$(JAVA_ICONS) classes/images altosui: echo "#!/bin/sh" > $@ @@ -123,11 +130,11 @@ fat/altosui: echo 'exec java -Djava.library.path="$$DIR" -jar "$$DIR"/altosui.jar' >> $@ chmod +x $@ -fat/altosui.jar: $(CLASSFILES) $(JAVA_ICON) fat/classes/Manifest.txt +fat/altosui.jar: $(CLASSFILES) $(JAVA_ICONS) fat/classes/Manifest.txt mkdir -p fat/classes test -L fat/classes/altosui || ln -sf ../.. fat/classes/altosui mkdir -p fat/classes/images - cp $(JAVA_ICON) fat/classes/images + cp $(JAVA_ICONS) fat/classes/images test -L fat/classes/libaltosJNI || ln -sf ../../libaltos/libaltosJNI fat/classes/libaltosJNI cd ./fat/classes && jar cfm ../../$@ Manifest.txt images/* altosui/*.class libaltosJNI/*.class diff --git a/altosui/Makefile.am b/altosui/Makefile.am index 9f75d5e3..6010df58 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -6,7 +6,7 @@ man_MANS=altosui.1 altoslibdir=$(libdir)/altos -CLASSPATH_ENV=mkdir -p $(JAVAROOT); CLASSPATH=".:classes:../altoslib/*:libaltos::$(JFREECHART)/jfreechart.jar:$(FREETTS)/freetts.jar" +CLASSPATH_ENV=mkdir -p $(JAVAROOT); CLASSPATH=".:classes:../altoslib/*:libaltos:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar:$(FREETTS)/freetts.jar" bin_SCRIPTS=altosui @@ -119,14 +119,25 @@ FATJAR=altosui-fat.jar # Icons ICONDIR=$(top_srcdir)/icon -JAVA_ICON=$(ICONDIR)/altus-metrum-16x16.jpg +JAVA_ICONS=\ + $(ICONDIR)/altus-metrum-16.png \ + $(ICONDIR)/altus-metrum-32.png \ + $(ICONDIR)/altus-metrum-48.png \ + $(ICONDIR)/altus-metrum-64.png \ + $(ICONDIR)/altus-metrum-128.png \ + $(ICONDIR)/altus-metrum-256.png ICONS= $(ICONDIR)/redled.png $(ICONDIR)/redoff.png \ $(ICONDIR)/greenled.png $(ICONDIR)/greenoff.png \ $(ICONDIR)/grayled.png $(ICONDIR)/grayoff.png # icon base names for jar -ICONJAR= -C $(ICONDIR) altus-metrum-16x16.jpg \ +ICONJAR= -C $(ICONDIR) altus-metrum-16.png \ + -C $(ICONDIR) altus-metrum-32.png \ + -C $(ICONDIR) altus-metrum-48.png \ + -C $(ICONDIR) altus-metrum-64.png \ + -C $(ICONDIR) altus-metrum-128.png \ + -C $(ICONDIR) altus-metrum-256.png \ -C $(ICONDIR) redled.png -C $(ICONDIR) redoff.png \ -C $(ICONDIR) greenled.png -C $(ICONDIR) greenoff.png \ -C $(ICONDIR) grayon.png -C $(ICONDIR) grayled.png @@ -216,13 +227,13 @@ install-altosuiJAVA: altosui.jar classes/altosui: mkdir -p classes/altosui -$(JAR): classaltosui.stamp Manifest.txt $(JAVA_ICON) $(ALTOSLIB_CLASS) +$(JAR): classaltosui.stamp Manifest.txt $(JAVA_ICONS) $(ALTOSLIB_CLASS) jar cfm $@ Manifest.txt \ $(ICONJAR) \ -C classes altosui \ -C libaltos libaltosJNI -$(FATJAR): classaltosui.stamp Manifest-fat.txt $(ALTOSLIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) $(JAVA_ICON) +$(FATJAR): classaltosui.stamp Manifest-fat.txt $(ALTOSLIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) $(JAVA_ICONS) jar cfm $@ Manifest-fat.txt \ $(ICONJAR) \ -C classes altosui \ @@ -230,25 +241,25 @@ $(FATJAR): classaltosui.stamp Manifest-fat.txt $(ALTOSLIB_CLASS) $(FREETTS_CLASS Manifest.txt: Makefile echo 'Main-Class: altosui.AltosUI' > $@ - echo "Class-Path: AltosLib.jar $(FREETTS)/freetts.jar $(JFREECHART)/jfreechart.jar $(JCOMMON)/jcommon.jar" >> $@ + echo "Class-Path: AltosLib.jar $(FREETTS)/freetts.jar $(JCOMMON)/jcommon.jar $(JFREECHART)/jfreechart.jar" >> $@ Manifest-fat.txt: echo 'Main-Class: altosui.AltosUI' > $@ - echo "Class-Path: AltosLib.jar freetts.jar jfreechart.jar jcommon.jar" >> $@ + echo "Class-Path: AltosLib.jar freetts.jar jcommon.jar jfreechart.jar" >> $@ altosui: Makefile echo "#!/bin/sh" > $@ - echo 'exec java -cp "$(FREETTS)/*:$(JFREECHART)/*:$(JCOMMON)/*" -Djava.library.path="$(altoslibdir)" -jar "$(altosuidir)/altosui.jar" "$$@"' >> $@ + echo 'exec java -cp "$(FREETTS)/freetts.jar:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar" -Djava.library.path="$(altoslibdir)" -jar "$(altosuidir)/altosui.jar" "$$@"' >> $@ chmod +x $@ altosui-test: Makefile echo "#!/bin/sh" > $@ - echo 'exec java -cp "./*:$(FREETTS)/*:$(JFREECHART)/*:$(JCOMMON)/*" -Djava.library.path="libaltos/.libs" -jar altosui.jar "$$@"' >> $@ + echo 'exec java -cp "./*:$(FREETTS)/freetts.jar:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar" -Djava.library.path="libaltos/.libs" -jar altosui.jar "$$@"' >> $@ chmod +x $@ altosui-jdb: Makefile echo "#!/bin/sh" > $@ - echo 'exec jdb -classpath "classes:libaltos:$(FREETTS)/*:$(JFREECHART)/*:$(JCOMMON)/*" -Djava.library.path="libaltos/.libs" altosui/AltosUI "$$@"' >> $@ + echo 'exec jdb -classpath "classes:libaltos:$(FREETTS)/freetts.jar:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar" -Djava.library.path="libaltos/.libs" altosui/AltosUI "$$@"' >> $@ chmod +x $@ libaltos.so: build-libaltos diff --git a/altosui/altos-windows.nsi b/altosui/altos-windows.nsi index 986919d4..20dd65f0 100644 --- a/altosui/altos-windows.nsi +++ b/altosui/altos-windows.nsi @@ -88,6 +88,7 @@ Section "AltosUI Application" SetOutPath $INSTDIR File "altosui-fat.jar" + File "AltosLib.jar" File "cmudict04.jar" File "cmulex.jar" File "cmu_time_awb.jar" @@ -157,6 +158,9 @@ Section "Uninstall" Delete "$INSTDIR\*.*" RMDir "$INSTDIR" + ; Remove .inf file + Delete "$WINDIR\Inf\telemetrum.inf" + ; Remove devices InstDrv::InitDriverSetup /NOUNLOAD {4D36E96D-E325-11CE-BFC1-08002BE10318} AltusMetrumSerial InstDrv::DeleteOemInfFiles /NOUNLOAD @@ -165,4 +169,5 @@ Section "Uninstall" ; Remove shortcuts, if any Delete "$SMPROGRAMS\AltusMetrum.lnk" Delete "$DESKTOP\AltusMetrum.lnk" + SectionEnd diff --git a/altosui/libaltos/libaltos.c b/altosui/libaltos/libaltos.c index 515432f9..ab6ca878 100644 --- a/altosui/libaltos/libaltos.c +++ b/altosui/libaltos/libaltos.c @@ -941,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]; @@ -952,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) { @@ -1161,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); @@ -1168,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; } } @@ -1188,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) @@ -1201,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; } @@ -1214,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; } @@ -1241,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); } } |
