From 0b54d9380f3a71b772747b1ed529d8fb89289b22 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 24 May 2011 15:10:01 -0600 Subject: [PATCH] altos: Make telescience reliably log only when told to Use a pull-up on telescience and tri-state input on telemetrum at boot time. Enable logging by pulling the TM output low and enabling as an output, disable by pulling the TM output high and switching back to input mode. Also, ignore pin state changes for 5 seconds at boot to give things a chance to settle down. Should work when both boards are powered up together. Signed-off-by: Keith Packard --- src-avr/ao_log_telescience.c | 24 +++++++++++++++++++----- src/ao_flight.c | 15 +++++++++------ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src-avr/ao_log_telescience.c b/src-avr/ao_log_telescience.c index 04e494fd..ef5a1c97 100644 --- a/src-avr/ao_log_telescience.c +++ b/src-avr/ao_log_telescience.c @@ -111,8 +111,6 @@ ao_log_check_pin(void) void ao_log_telescience(void) { - ao_log_check_pin(); - ao_storage_setup(); /* Find end of data */ @@ -122,12 +120,21 @@ ao_log_telescience(void) if (!ao_log_valid(&log)) break; } + + /* + * Wait for the other side to settle down + */ + ao_delay(AO_SEC_TO_TICKS(5)); + + ao_log_check_pin(); + ao_log_current_pos = ao_log_start_pos; ao_log_end_pos = ao_storage_config; for (;;) { while (!ao_log_running) ao_sleep(&ao_log_running); + flush(); memset(&log, '\0', sizeof (struct ao_log_telescience)); log.type = AO_LOG_TELESCIENCE_START; log.tick = ao_time(); @@ -149,12 +156,14 @@ ao_log_telescience(void) /* Wait for more ADC data to arrive */ ao_sleep((void *) &ao_adc_head); } + flush(); } } void ao_log_set(void) { + printf("Logging currently %s\n", ao_log_running ? "on" : "off"); ao_cmd_hex(); if (ao_cmd_status == ao_cmd_success) { if (ao_cmd_lex_i) { @@ -165,6 +174,7 @@ ao_log_set(void) ao_log_stop(); } } + ao_cmd_status = ao_cmd_success; } void @@ -174,7 +184,7 @@ ao_log_list(void) uint32_t start = 0; uint8_t flight = 0; - for (pos = 0; pos < ao_storage_config; pos += sizeof (struct ao_log_telescience)) { + for (pos = 0; ; pos += sizeof (struct ao_log_telescience)) { if (!ao_storage_read(pos, &log, sizeof (struct ao_log_telescience))) break; if (!ao_log_valid(&log) || log.type == AO_LOG_TELESCIENCE_START) { @@ -206,6 +216,7 @@ ao_log_delete(void) printf("No such flight: %d\n", ao_cmd_lex_i); return; } + ao_log_stop(); for (pos = 0; pos < ao_storage_config; pos += ao_storage_block) { if (!ao_storage_read(pos, &log, sizeof (struct ao_log_telescience))) break; @@ -213,6 +224,7 @@ ao_log_delete(void) break; ao_storage_erase(pos); } + ao_log_current_pos = ao_log_start_pos = 0; if (pos == 0) printf("No such flight: %d\n", ao_cmd_lex_i); else @@ -236,12 +248,14 @@ ao_log_init(void) { ao_log_running = 0; + DDRB &= ~(1 << DDB0); + + PORTB |= (1 << PORTB0); /* Pull input up; require input to log */ + PCMSK0 |= (1 << PCINT0); /* Enable PCINT0 pin change */ PCICR |= (1 << PCIE0); /* Enable pin change interrupt */ - PORTB &= ~(1 << PORTB0); /* Pull input down; always log if NC */ - ao_cmd_register(&ao_log_cmds[0]); ao_add_task(&ao_log_task, ao_log_telescience, "log"); diff --git a/src/ao_flight.c b/src/ao_flight.c index cfecc5af..822a20b8 100644 --- a/src/ao_flight.c +++ b/src/ao_flight.c @@ -168,8 +168,9 @@ ao_flight(void) ao_wakeup(&ao_gps_data); ao_wakeup(&ao_gps_tracking_data); #endif -#ifdef ASCENT_PIN - ASCENT_PIN = 0; +#ifdef ASCENT_SIGNAL + ASCENT_SIGNAL = 0; + ASCENT_SIGNAL_DIR |= (1 << ASCENT_SIGNAL_PIN); #endif ao_wakeup(DATA_TO_XDATA(&ao_flight_state)); @@ -240,8 +241,9 @@ ao_flight(void) /* Turn the RDF beacon back on */ ao_rdf_set(1); -#ifdef ASCENT_PIN - ASCENT_PIN = 1; +#ifdef ASCENT_SIGNAL + ASCENT_SIGNAL_DIR &= ~(1 << ASCENT_SIGNAL_PIN); + ASCENT_SIGNAL = 0; #endif /* * Start recording min/max height @@ -320,9 +322,10 @@ void ao_flight_init(void) { #ifdef ASCENT_SIGNAL - ASCENT_SIGNAL = 1; - ASCENT_SIGNAL_DIR |= (1 << ASCENT_SIGNAL_PIN); ASCENT_SIGNAL_SEL &= ~(1 << ASCENT_SIGNAL_PIN); + ASCENT_SIGNAL_DIR &= ~(1 << ASCENT_SIGNAL_PIN); + P1INP |= (1 << ASCENT_SIGNAL_PIN); + ASCENT_SIGNAL = 1; #endif ao_flight_state = ao_flight_startup; ao_add_task(&flight_task, ao_flight, "flight"); -- 2.30.2