Instead of having everyone wait on the raw ADC ring, have the flight
code wait on that and have everyone else wait for the flight code to
finish looking at the data and move its pointer forwards.
Signed-off-by: Keith Packard <keithp@keithp.com>
-extern __xdata struct ao_adc ao_flight_data;
+extern __data uint8_t ao_flight_adc;
extern __pdata enum ao_flight_state ao_flight_state;
extern __pdata uint16_t ao_flight_tick;
extern __pdata int16_t ao_flight_accel;
extern __pdata enum ao_flight_state ao_flight_state;
extern __pdata uint16_t ao_flight_tick;
extern __pdata int16_t ao_flight_accel;
ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 0;
}
ADCCON3 = ADCCON3_EREF_VDD | ADCCON3_EDIV_512 | 0;
}
-void
-ao_adc_sleep(void)
-{
- ao_sleep(&ao_adc_ring);
-}
-
void
ao_adc_get(__xdata struct ao_adc *packet)
{
void
ao_adc_get(__xdata struct ao_adc *packet)
{
- uint8_t i = ao_adc_ring_prev(ao_adc_head);
+ uint8_t i = ao_adc_ring_prev(ao_flight_adc);
memcpy(packet, &ao_adc_ring[i], sizeof (struct ao_adc));
}
memcpy(packet, &ao_adc_ring[i], sizeof (struct ao_adc));
}
/* record this conversion series */
ao_adc_ring[ao_adc_head].tick = ao_time();
ao_adc_head = ao_adc_ring_next(ao_adc_head);
/* record this conversion series */
ao_adc_ring[ao_adc_head].tick = ao_time();
ao_adc_head = ao_adc_ring_next(ao_adc_head);
- ao_wakeup(ao_adc_ring);
+ ao_wakeup(DATA_TO_XDATA(&ao_adc_head));
puts("Calibrating..."); flush();
i = ACCEL_CALIBRATE_SAMPLES;
accel_total = 0;
puts("Calibrating..."); flush();
i = ACCEL_CALIBRATE_SAMPLES;
accel_total = 0;
- cal_adc_ring = ao_adc_head;
+ cal_adc_ring = ao_flight_adc;
- ao_sleep(&ao_adc_ring);
- while (i && cal_adc_ring != ao_adc_head) {
+ ao_sleep(DATA_TO_XDATA(&ao_flight_adc));
+ while (i && cal_adc_ring != ao_flight_adc) {
accel_total += (int32_t) ao_adc_ring[cal_adc_ring].accel;
cal_adc_ring = ao_adc_ring_next(cal_adc_ring);
i--;
accel_total += (int32_t) ao_adc_ring[cal_adc_ring].accel;
cal_adc_ring = ao_adc_ring_next(cal_adc_ring);
i--;
ao_raw_pres = 0;
ao_flight_tick = 0;
for (;;) {
ao_raw_pres = 0;
ao_flight_tick = 0;
for (;;) {
- ao_sleep(&ao_adc_ring);
+ ao_wakeup(DATA_TO_XDATA(&ao_flight_adc));
+ ao_sleep(DATA_TO_XDATA(&ao_adc_head));
while (ao_flight_adc != ao_adc_head) {
__pdata uint8_t ticks;
__pdata int16_t ao_vel_change;
while (ao_flight_adc != ao_adc_head) {
__pdata uint8_t ticks;
__pdata int16_t ao_vel_change;
ao_sleep(void *wchan)
{
ao_dump_state();
ao_sleep(void *wchan)
{
ao_dump_state();
- if (wchan == &ao_adc_ring) {
+ if (wchan == &ao_adc_head) {
char type;
uint16_t tick;
uint16_t a, b;
char type;
uint16_t tick;
uint16_t a, b;
__xdata uint8_t request, firing, fired;
__critical {
__xdata uint8_t request, firing, fired;
__critical {
ao_adc_get(&adc);
request = ao_ignition[igniter].request;
fired = ao_ignition[igniter].fired;
ao_adc_get(&adc);
request = ao_ignition[igniter].request;
fired = ao_ignition[igniter].fired;
/* Write the whole contents of the ring to the log
* when starting up.
*/
/* Write the whole contents of the ring to the log
* when starting up.
*/
- ao_log_adc_pos = ao_adc_ring_next(ao_adc_head);
+ ao_log_adc_pos = ao_adc_ring_next(ao_flight_adc);
for (;;) {
/* Write samples to EEPROM */
for (;;) {
/* Write samples to EEPROM */
- while (ao_log_adc_pos != ao_adc_head) {
+ while (ao_log_adc_pos != ao_flight_adc) {
log.type = AO_LOG_SENSOR;
log.tick = ao_adc_ring[ao_log_adc_pos].tick;
log.u.sensor.accel = ao_adc_ring[ao_log_adc_pos].accel;
log.type = AO_LOG_SENSOR;
log.tick = ao_adc_ring[ao_log_adc_pos].tick;
log.u.sensor.accel = ao_adc_ring[ao_log_adc_pos].accel;
static __xdata struct ao_adc adc;
for (;;) {
static __xdata struct ao_adc adc;
for (;;) {
- ao_sleep(&ao_adc_ring);
+ ao_sleep(&ao_adc_head);
ao_adc_get(&adc);
if (adc.accel < 15900)
ao_led_on(AO_LED_RED);
ao_adc_get(&adc);
if (adc.accel < 15900)
ao_led_on(AO_LED_RED);