diff --git a/firmware/inc/sequencer.h b/firmware/inc/sequencer.h index 1c2937f..da69cbd 100644 --- a/firmware/inc/sequencer.h +++ b/firmware/inc/sequencer.h @@ -26,6 +26,6 @@ #include "samd20.h" -void run_sequencer(uint32_t n); +void run_sequencer(uint32_t n, uint32_t cycle_time_s); #endif /* SEQUENCER_H */ diff --git a/firmware/src/main.c b/firmware/src/main.c index ba1882c..61e8be7 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -275,31 +275,30 @@ volatile uint8_t run_flag = 1; /* run immediately after init */ uint8_t in_cold_out = 1; /* test temperature immediately after init */ uint32_t cold_out_count = 0; +uint32_t cycle_time_s = 0; /** - * Sets the hibernate time in seconds + * Sets the cycle time in seconds */ -void set_hibernate_time(uint8_t cold_out) +void set_cycle_time(uint8_t cold_out) { - uint32_t hibernate_time_s; - if (cold_out == 0) { /* Normal operations */ if (gps_is_locked() == GPS_NO_LOCK) { /* no lock */ - hibernate_time_s = 0; /* shortest hibernate */ + cycle_time_s = 0; /* shortest hibernate */ } else if ((get_battery_charge_state() != BATTERY_DISCHARGING) || /* plenty of power */ (gps_get_flight_state() == GPS_FLIGHT_STATE_LAUNCH)) { /* or during launch */ - hibernate_time_s = CYCLE_TIME_FAST; + cycle_time_s = CYCLE_TIME_FAST; } else { - hibernate_time_s = CYCLE_TIME_SLOW; + cycle_time_s = CYCLE_TIME_SLOW; } } else { /* cold out */ - hibernate_time_s = COLD_OUT_SECONDS; + cycle_time_s = COLD_OUT_SECONDS; } - /* set this */ - rtc_hibernate_time(hibernate_time_s); + /* hibernate until this time is up */ + rtc_hibernate_time(cycle_time_s); } /** * Called when it's time to run again @@ -349,12 +348,12 @@ int main(void) in_cold_out = 1; /* cold */ } else { - in_cold_out = 0; /* ready to go! */ - gps_init(); /* init the gps! */ - run_sequencer(n++); /* run for the first time! */ + in_cold_out = 0; /* ready to go! */ + gps_init(); /* init the gps! */ + run_sequencer(n++, cycle_time_s); /* run for the first time! */ } } else { - run_sequencer(n++); /* Run */ + run_sequencer(n++, cycle_time_s); /* run */ } /* Clocks off */ @@ -370,7 +369,7 @@ int main(void) hf_clock_disable(); /* Hibernate timing */ - set_hibernate_time(in_cold_out); + set_cycle_time(in_cold_out); } /* Idle */ diff --git a/firmware/src/sequencer.c b/firmware/src/sequencer.c index 76d4509..80a2d77 100644 --- a/firmware/src/sequencer.c +++ b/firmware/src/sequencer.c @@ -117,7 +117,7 @@ void telemetry_sequence(struct tracker_datapoint* dp, uint32_t n) /** * Run sequence n */ -void run_sequencer(uint32_t n) +void run_sequencer(uint32_t n, uint32_t cycle_time_s) { struct tracker_datapoint* dp; @@ -131,12 +131,15 @@ void run_sequencer(uint32_t n) telemetry_sequence(dp, n); /* Backlog */ - if (gps_is_locked() == GPS_LOCKED) { /* gps is locked. we can use this data */ + if ((gps_is_locked() == GPS_LOCKED) && /* gps is locked. we can use this data */ + (cycle_time_s > 0)) { /* and an actual cycle */ + /* Accumulator for backlog */ accumulator_add(dp); /* Record */ - if ((n % 15) == 10) { /* Once per hour with 4 minute wakeup */ + uint32_t rate = 3600 / cycle_time_s; /* once per hour */ + if ((n % rate) == 0) { /* replace some values from this sample with averages */ accumulator_read(dp);