From 3b457ff8d43630c04e0cb22bb3a2765be5e188bd Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 17 May 2013 03:21:08 -0700 Subject: altos/cc1111: Hack on USB driver to make Windows happy The Windows modem driver is quite chatty at startup time, getting and setting the comm parameters each time the device is opened. Sometimes, when setting the parameters, the cc1111 would STALL EP0. Most of the time, Windows would happily pass this as an error back to AltosUI which would then re-try the open (and succeed, most of the time). Sometimes, Windows would stall for 30 seconds before passing the error back. This made the whole UI freeze, and I suspect most people assumed our app had died. A bit of analysis with the beagle USB sniffer and I discovered the STALL settings, but there wasn't any correlation between the data on the wire and when the STALL would be generated. So, I found a couple of other cc1111 USB stacks on the net and just looked to see how our driver differed. There wasn't anything clearly related, but there were a list of small differences: 1) Other drivers didn't bother waiting for the hardware to ack the USBADDR setting; doing it this way means we can set the address *before* acking the setup packet. It'll get set eventually, at which point the device will start responding to packets again. Easy to fix, and saves a bit of code space too. 2) The other drivers set the STALL bit for setup packets which aren't understood. This shouldn't have any effect on 'good' systems as those shouldn't ever be generating bogus setup packets anyways. The driver already handled the STALL state in the interrupt handler, the only requirement was to figure out when to explicitly set the STALL bit. That required moving the state updating code from the start of the ep0 setup handling to the end, after the setup packet had been examined and data queued in or out as appropriate. 3) Our driver explicitly queued an IN packet for any setup request that wasn't waiting for an OUT pack. This appears to tie in with the USBADDR change above as before I made that change, this change caused the driver to fail to respond to most setup packets. This was simple once the above change was made, just move the generation of the IN packet inside the code that switched to the IN state. Signed-off-by: Keith Packard --- src/cc1111/ao_usb.c | 68 ++++++++++++++++++++++++++++++----------------------- src/core/ao_usb.h | 1 + 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/cc1111/ao_usb.c b/src/cc1111/ao_usb.c index 8bd2efdf..a655d1be 100644 --- a/src/cc1111/ao_usb.c +++ b/src/cc1111/ao_usb.c @@ -152,19 +152,17 @@ ao_usb_ep0_fill(void) *ao_usb_ep0_out_data++ = USBFIFO[0]; } -void +static void ao_usb_ep0_queue_byte(uint8_t a) { ao_usb_ep0_in_buf[ao_usb_ep0_in_len++] = a; } -void +static void ao_usb_set_address(uint8_t address) { ao_usb_running = 1; - USBADDR = address | 0x80; - while (USBADDR & 0x80) - ; + USBADDR = address; } static void @@ -191,24 +189,6 @@ ao_usb_ep0_setup(void) if (ao_usb_ep0_out_len != 0) return; - /* Figure out how to ACK the setup packet */ - if (ao_usb_setup.dir_type_recip & AO_USB_DIR_IN) { - if (ao_usb_setup.length) - ao_usb_ep0_state = AO_USB_EP0_DATA_IN; - else - ao_usb_ep0_state = AO_USB_EP0_IDLE; - } else { - if (ao_usb_setup.length) - ao_usb_ep0_state = AO_USB_EP0_DATA_OUT; - else - ao_usb_ep0_state = AO_USB_EP0_IDLE; - } - USBINDEX = 0; - if (ao_usb_ep0_state == AO_USB_EP0_IDLE) - USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END; - else - USBCS0 = USBCS0_CLR_OUTPKT_RDY; - ao_usb_ep0_in_data = ao_usb_ep0_in_buf; ao_usb_ep0_in_len = 0; switch(ao_usb_setup.dir_type_recip & AO_USB_SETUP_TYPE_MASK) { @@ -274,10 +254,39 @@ ao_usb_ep0_setup(void) } break; } - if (ao_usb_ep0_state != AO_USB_EP0_DATA_OUT) { + + /* Figure out how to ACK the setup packet and the + * next state + */ + USBINDEX = 0; + if (ao_usb_ep0_in_len) { + + /* Sending data back to the host + */ + ao_usb_ep0_state = AO_USB_EP0_DATA_IN; + USBCS0 = USBCS0_CLR_OUTPKT_RDY; if (ao_usb_setup.length < ao_usb_ep0_in_len) ao_usb_ep0_in_len = ao_usb_setup.length; ao_usb_ep0_flush(); + } else if (ao_usb_ep0_out_len) { + + /* Receiving data from the host + */ + ao_usb_ep0_state = AO_USB_EP0_DATA_OUT; + USBCS0 = USBCS0_CLR_OUTPKT_RDY; + } else if (ao_usb_setup.length) { + + /* Uh-oh, the host expected to send or receive data + * and we don't know what to do. + */ + ao_usb_ep0_state = AO_USB_EP0_STALL; + USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_SEND_STALL; + } else { + + /* Simple setup packet with no data + */ + ao_usb_ep0_state = AO_USB_EP0_IDLE; + USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END; } } @@ -299,12 +308,12 @@ ao_usb_ep0(void) USBINDEX = 0; cs0 = USBCS0; if (cs0 & USBCS0_SETUP_END) { - ao_usb_ep0_state = AO_USB_EP0_IDLE; USBCS0 = USBCS0_CLR_SETUP_END; + ao_usb_ep0_state = AO_USB_EP0_IDLE; } if (cs0 & USBCS0_SENT_STALL) { + USBCS0 = 0; ao_usb_ep0_state = AO_USB_EP0_IDLE; - USBCS0 &= ~USBCS0_SENT_STALL; } if (ao_usb_ep0_state == AO_USB_EP0_DATA_IN && (cs0 & USBCS0_INPKT_RDY) == 0) @@ -318,12 +327,11 @@ ao_usb_ep0(void) break; case AO_USB_EP0_DATA_OUT: ao_usb_ep0_fill(); - if (ao_usb_ep0_out_len == 0) - ao_usb_ep0_state = AO_USB_EP0_IDLE; USBINDEX = 0; - if (ao_usb_ep0_state == AO_USB_EP0_IDLE) + if (ao_usb_ep0_out_len == 0) { + ao_usb_ep0_state = AO_USB_EP0_IDLE; USBCS0 = USBCS0_CLR_OUTPKT_RDY | USBCS0_DATA_END; - else + } else USBCS0 = USBCS0_CLR_OUTPKT_RDY; break; } diff --git a/src/core/ao_usb.h b/src/core/ao_usb.h index 4476ee6b..6bc77608 100644 --- a/src/core/ao_usb.h +++ b/src/core/ao_usb.h @@ -114,6 +114,7 @@ extern __code __at (0x00aa) uint8_t ao_usb_descriptors []; #define AO_USB_EP0_IDLE 0 #define AO_USB_EP0_DATA_IN 1 #define AO_USB_EP0_DATA_OUT 2 +#define AO_USB_EP0_STALL 3 #define LE_WORD(x) ((x)&0xFF),((uint8_t) (((uint16_t) (x))>>8)) -- cgit v1.2.3 From fbe7857e371fa8ffa726fda2b43d4eddd551eaa4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 17 May 2013 03:34:50 -0700 Subject: libaltos: use PurgeComm in Windows altos_close to abort in-progress ops Instead of manually signalling the related events, use PurgeComm which can then abort the operations itself. Also make sure all of the relevant handles are set to INVALID before closing them to avoid race conditions. Signed-off-by: Keith Packard --- libaltos/libaltos.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/libaltos/libaltos.c b/libaltos/libaltos.c index fc949c70..4a6363ed 100644 --- a/libaltos/libaltos.c +++ b/libaltos/libaltos.c @@ -994,6 +994,11 @@ log_message(char *fmt, ...) if (!log) log = fopen("\\temp\\altos.txt", "w"); if (log) { + SYSTEMTIME time; + GetLocalTime(&time); + fprintf (log, "%4d-%02d-%02d %2d:%02d:%02d. ", + time.wYear, time.wMonth, time.wDay, + time.wHour, time.wMinute, time.wSecond); va_start(a, fmt); vfprintf(log, fmt, a); va_end(a); @@ -1339,6 +1344,7 @@ altos_open(struct altos_device *device) file->handle = open_serial(full_name); if (file->handle != INVALID_HANDLE_VALUE) break; + altos_set_last_windows_error(); Sleep(100); } @@ -1373,13 +1379,19 @@ altos_open(struct altos_device *device) PUBLIC void altos_close(struct altos_file *file) { - if (file->handle != INVALID_HANDLE_VALUE) { - CloseHandle(file->handle); + HANDLE handle = file->handle; + if (handle != INVALID_HANDLE_VALUE) { + HANDLE ov_read = file->ov_read.hEvent; + HANDLE ov_write = file->ov_write.hEvent; + file->handle = INVALID_HANDLE_VALUE; + file->ov_read.hEvent = INVALID_HANDLE_VALUE; + file->ov_write.hEvent = INVALID_HANDLE_VALUE; + PurgeComm(handle, PURGE_RXABORT|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_TXCLEAR); + Sleep(100); + CloseHandle(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); + CloseHandle(ov_read); + CloseHandle(ov_write); } } -- cgit v1.2.3 From 8d40c37bae0c58037f267e54de40071cd19c931d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 17 May 2013 03:27:20 -0700 Subject: libaltos: Build the linux library targets when doing a 'fat' build These are necessary for the fat release, so make sure they're built then. Signed-off-by: Keith Packard --- libaltos/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libaltos/Makefile.am b/libaltos/Makefile.am index b5ab1ddb..41549558 100644 --- a/libaltos/Makefile.am +++ b/libaltos/Makefile.am @@ -42,7 +42,7 @@ MINGCC64=x86_64-w64-mingw32-gcc MINGFLAGS=-Wall -DWINDOWS -DBUILD_DLL -I$(JVM_INCLUDE) MINGLIBS=-lsetupapi -fat: altos.dll altos64.dll +fat: all altos.dll altos64.dll altos.dll: $(libaltos_la_SOURCES) $(MINGCC32) -o $@ $(MINGFLAGS) -shared $(libaltos_la_SOURCES) $(MINGLIBS) -- cgit v1.2.3 From 51f2c4ce2692ee3e898b4e94232c45a608932c15 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 19 May 2013 20:35:42 -0700 Subject: altos/telemega: The last two igniters are apogee and main Not the first two. TeleMega v0.3 has these marked on the silk Signed-off-by: Keith Packard --- altoslib/AltosRecordMM.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/altoslib/AltosRecordMM.java b/altoslib/AltosRecordMM.java index bf64192c..d697111c 100644 --- a/altoslib/AltosRecordMM.java +++ b/altoslib/AltosRecordMM.java @@ -71,11 +71,11 @@ public class AltosRecordMM extends AltosRecord { } public double main_voltage() { - return pyro(sense[1]); + return pyro(sense[5]); } public double drogue_voltage() { - return pyro(sense[0]); + return pyro(sense[4]); } public double temperature() { -- cgit v1.2.3 From db9ea188aebe5299f46bbd4fca5317c1bc95f3f5 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 20 May 2013 21:37:20 -0700 Subject: Create release notes for 1.2.1 Move most of the 1.2 content to the 1.2.1 block Signed-off-by: Keith Packard --- doc/Makefile | 3 +- doc/altusmetrum.xsl | 15 ++++++-- doc/release-notes-1.2.1.xsl | 83 +++++++++++++++++++++++++++++++++++++++++++++ doc/release-notes-1.2.xsl | 59 +++----------------------------- 4 files changed, 101 insertions(+), 59 deletions(-) create mode 100644 doc/release-notes-1.2.1.xsl diff --git a/doc/Makefile b/doc/Makefile index 7c4da29e..06346a2d 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -10,7 +10,8 @@ RELNOTES=\ release-notes-1.0.1.html \ release-notes-1.1.html \ release-notes-1.1.1.html \ - release-notes-1.2.html + release-notes-1.2.html \ + release-notes-1.2.1.html RELNOTES_XSL=$(RELNOTES:.html=.xsl) HTML=altusmetrum.html altos.html telemetry.html companion.html micropeak.html $(RELNOTES) diff --git a/doc/altusmetrum.xsl b/doc/altusmetrum.xsl index 294f30ac..558898cf 100644 --- a/doc/altusmetrum.xsl +++ b/doc/altusmetrum.xsl @@ -36,12 +36,20 @@ - 1.2 - 14 April 2013 + 1.2.1 + 21 May 2013 Updated for software version 1.2. Version 1.2 adds support for TeleBT and AltosDroid. It also adds a few minor features - and fixes a few minor bugs in AltosUI and the AltOS firmware. + and fixes bugs in AltosUI and the AltOS firmware. + + + + 1.2 + 18 April 2013 + + Updated for software version 1.2. Version 1.2 adds support + for MicroPeak and the MicroPeak USB interface. @@ -2851,6 +2859,7 @@ NAR #88757, TRA #12200 Release Notes + Version 1.21 Version 1.2 Version 1.1.1 Version 1.1 diff --git a/doc/release-notes-1.2.1.xsl b/doc/release-notes-1.2.1.xsl new file mode 100644 index 00000000..5f9aef01 --- /dev/null +++ b/doc/release-notes-1.2.1.xsl @@ -0,0 +1,83 @@ + + + +
+ + Version 1.2.1 is a minor release. It adds support for TeleBT and + the AltosDroid application, provides several new features in + AltosUI and fixes some bugs in the AltOS firmware. + + + AltOS Firmware Changes + + + Add support for TeleBT + + + In TeleMini recovery mode (when booted with the outer two + debug pins connected together), the radio parameters are also + set back to defaults (434.550MHz, N0CALL, factory radio cal). + + + Add support for reflashing the SkyTraq GPS chips. This + requires special host-side code which currently only exists + for Linux. + + + Correct Kalman filter model error covariance matrix. The + values used previously assumed continuous measurements instead + of discrete measurements. + + + Fix some bugs in the USB driver for TeleMetrum and TeleDongle + that affected Windows users. + + + Adjusted the automatic gain control parameters that affect + receive performance for TeleDongle. Field tests indicate that this + may improve receive performance somewhat. + + + + + AltosUI Changes + + + Handle missing GPS lock in 'Descent' tab. Previously, if the + GPS position of the pad was unknown, an exception would be + raised, breaking the Descent tab contents. + + + Improve the graph, adding tool-tips to show values near the + cursor and making the displayed set of values configurable, + adding all of the flight data as options while leaving the + default settings alone so that the graph starts by showing + height, speed and acceleration. + + + Make the initial position of the AltosUI top level window + configurable. Along with this change, the other windows will + pop up at 'sensible' places now, instead of on top of one + another. + + + Add callsign to Monitor idle window and connecting + dialogs. This makes it clear which callsign is being used so + that the operator will be aware that it must match the flight + computer value or no communication will work. + + + When downloading flight data, display the block number so that + the user has some sense of progress. Unfortunately, we don't + know how many blocks will need to be downloaded, but at least + it isn't just sitting there doing nothing for a long time. + + + Add GPS data and a map to the graph window. This lets you see + a complete summary of the flight without needing to 'replay' + the whole thing. + + + +
diff --git a/doc/release-notes-1.2.xsl b/doc/release-notes-1.2.xsl index b254c7b5..64ba46a9 100644 --- a/doc/release-notes-1.2.xsl +++ b/doc/release-notes-1.2.xsl @@ -4,75 +4,24 @@
- Version 1.2 is a minor release. It provides a few new features in AltosUI - and the AltOS firmware and fixes bugs. + Version 1.2 is a major release. It adds support for MicroPeak and + the MicroPeak USB adapter. AltOS Firmware Changes - - In TeleMini recovery mode (when booted with the outer two - debug pins connected together), the radio parameters are also - set back to defaults (434.550MHz, N0CALL, factory radio cal). - - - Add support for reflashing the SkyTraq GPS chips. This - requires special host-side code which currently only exists - for Linux. - Add MicroPeak support. This includes support for the ATtiny85 processor and adaptations to the core code to allow for devices too small to run the multi-tasking scheduler. - - Correct Kalman filter model error covariance matrix. The - values used previously assumed continuous measurements instead - of discrete measurements. - - AltosUI Changes + MicroPeak UI changes - Handle missing GPS lock in 'Descent' tab. Previously, if the - GPS position of the pad was unknown, an exception would be - raised, breaking the Descent tab contents. - - - Add preliminary TeleMega support, including configuration, - data download and analysis. - - - Improve the graph, adding tool-tips to show values near the - cursor and making the displayed set of values configurable, - adding all of the flight data as options while leaving the - default settings alone so that the graph starts by showing - height, speed and acceleration. - - - Make the initial position of the AltosUI top level window - configurable. Along with this change, the other windows will - pop up at 'sensible' places now, instead of on top of one - another. - - - Add callsign to Monitor idle window and connecting - dialogs. This makes it clear which callsign is being used so - that the operator will be aware that it must match the flight - computer value or no communication will work. - - - When downloading flight data, display the block number so that - the user has some sense of progress. Unfortunately, we don't - know how many blocks will need to be downloaded, but at least - it isn't just sitting there doing nothing for a long time. - - - Add GPS data and a map to the graph window. This lets you see - a complete summary of the flight without needing to 'replay' - the whole thing. + Added this new application -- cgit v1.2.3 From 03fe10efd307da10e35c5f6a46f0c8b1a3888c57 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 20 May 2013 21:41:01 -0700 Subject: doc: Update description of graph window to note new tabs (config and map) Signed-off-by: Keith Packard --- doc/altusmetrum.xsl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/altusmetrum.xsl b/doc/altusmetrum.xsl index 558898cf..dfd72ab4 100644 --- a/doc/altusmetrum.xsl +++ b/doc/altusmetrum.xsl @@ -1113,14 +1113,15 @@ NAR #88757, TRA #12200 flash memory. - Once a flight record is selected, a window with two tabs is + Once a flight record is selected, a window with four tabs is opened. The first tab contains a graph with acceleration (blue), velocity (green) and altitude (red) of the flight, - measured in metric units. The - apogee(yellow) and main(magenta) igniter voltages are also - displayed; high voltages indicate continuity, low voltages - indicate open circuits. The second tab contains some basic - flight statistics. + measured in metric units. The apogee(yellow) and main(magenta) + igniter voltages are also displayed; high voltages indicate + continuity, low voltages indicate open circuits. The second + tab lets you configure which data to show in the graph. The + third contains some basic flight statistics while the fourth + has a map with the ground track of the flight displayed. The graph can be zoomed into a particular area by clicking and -- cgit v1.2.3