X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fao_companion.c;h=4c8f4269588769054a541535b5e939934f82aac7;hb=e268798dc260311f5f0167909481b41c9d27fc1c;hp=556ce0447f15cf0c488850043f1d5a3c0378d223;hpb=ebe2ffb29944abc4d6a35889c7b5f3d9f2871077;p=fw%2Faltos diff --git a/src/ao_companion.c b/src/ao_companion.c index 556ce044..4c8f4269 100644 --- a/src/ao_companion.c +++ b/src/ao_companion.c @@ -43,6 +43,8 @@ ao_companion_send_command(uint8_t command) ao_companion_command.command = command; ao_companion_command.flight_state = ao_flight_state; ao_companion_command.tick = ao_time(); + ao_companion_command.serial = ao_serial_number; + ao_companion_command.flight = ao_flight_number; ao_spi_send(&ao_companion_command, sizeof (ao_companion_command)); } @@ -53,9 +55,8 @@ ao_companion_get_setup(void) ao_companion_send_command(AO_COMPANION_SETUP); ao_spi_recv(&ao_companion_setup, sizeof (ao_companion_setup)); COMPANION_DESELECT(); - if (ao_companion_setup.board_id != ~ao_companion_setup.board_id) - return 0; - return 1; + return (ao_companion_setup.board_id == + ~ao_companion_setup.board_id_inverse); } static void @@ -69,21 +70,47 @@ ao_companion_get_data(void) COMPANION_DESELECT(); } +static void +ao_companion_notify(void) +{ + COMPANION_SELECT(); + ao_companion_send_command(AO_COMPANION_NOTIFY); + COMPANION_DESELECT(); +} + void ao_companion(void) { - if (!ao_companion_get_setup()) - ao_exit(); - ao_companion_running = 1; - for (;;) { - ao_delay(ao_companion_setup.update_period); - ao_companion_get_data(); + uint8_t i; + while (!ao_flight_number) + ao_sleep(&ao_flight_number); + for (i = 0; i < 10; i++) { + ao_delay(AO_SEC_TO_TICKS(1)); + if ((ao_companion_running = ao_companion_get_setup())) + break; } + while (ao_companion_running) { + ao_alarm(ao_companion_setup.update_period); + if (ao_sleep(DATA_TO_XDATA(&ao_flight_state))) + ao_companion_get_data(); + else + ao_companion_notify(); + } + ao_exit(); } void ao_companion_status(void) __reentrant { + uint8_t i; + printf("Companion running: %d\n", ao_companion_running); + printf("device: %d\n", ao_companion_setup.board_id); + printf("update period: %d\n", ao_companion_setup.update_period); + printf("channels: %d\n", ao_companion_setup.channels); + printf("data:"); + for(i = 0; i < ao_companion_setup.channels; i++) + printf(" %5u", ao_companion_data[i]); + printf("\n"); } __code struct ao_cmds ao_companion_cmds[] = { @@ -101,6 +128,5 @@ ao_companion_init(void) COMPANION_CS_SEL &= ~COMPANION_CS_MASK; /* set CS pins as GPIO */ ao_cmd_register(&ao_companion_cmds[0]); - ao_add_task(&ao_companion_task, ao_companion, "companion"); }