From 331037945d5e0146868a82707e7cc9e14942e58f Mon Sep 17 00:00:00 2001 From: Jérémy Dufour Date: Wed, 23 Apr 2008 10:23:03 +0200 Subject: * digital/io/src - seperate chrono into two files (source and header) ; - add necessary functions to end the match ; - integrate it into the main loop ; - partial integration into the simulator (need to simulate a counter). --- digital/io/src/Makefile | 2 +- digital/io/src/chrono.c | 144 +++++++++++++++++++++++++++++++++++++++++++++ digital/io/src/chrono.h | 62 ++++++------------- digital/io/src/main.c | 10 ++++ digital/io/src/simu.host.c | 6 -- digital/io/src/simu.host.h | 4 -- digital/io/src/top_cb.c | 2 +- 7 files changed, 175 insertions(+), 55 deletions(-) create mode 100644 digital/io/src/chrono.c (limited to 'digital') diff --git a/digital/io/src/Makefile b/digital/io/src/Makefile index e170c70c..1899bc6f 100644 --- a/digital/io/src/Makefile +++ b/digital/io/src/Makefile @@ -1,7 +1,7 @@ BASE = ../../avr PROGS = io io_SOURCES = main.c asserv.c servo.avr.c eeprom.avr.c trap.c sharp.c \ - switch.avr.c \ + switch.avr.c chrono.c \ simu.host.c \ fsm.c \ getsamples.c getsamples_fsm.c getsamples_cb.c \ diff --git a/digital/io/src/chrono.c b/digital/io/src/chrono.c new file mode 100644 index 00000000..9f162f3c --- /dev/null +++ b/digital/io/src/chrono.c @@ -0,0 +1,144 @@ +/* chrono.avr.c */ +/* io - Input & Output with Artificial Intelligence (ai) support on AVR. {{{ + * + * Copyright (C) 2008 Dufour Jérémy + * + * APBTeam: + * Web: http://apbteam.org/ + * Email: team AT apbteam DOT org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include "chrono.h" + +#include "modules/utils/utils.h" /* regv */ +#include "asserv.h" /* asserv_* */ + +#include "io.h" /* Registers for timer/counter 1 */ + +/** + * Number of overflow of the timer/counter 1 before doing the last one. + */ +#define CHRONO_OVERFLOW_MAX 70 + +/** + * Number of TIC to restart from for the last overflow. + */ +#define CHRONO_RESTART_TIC 58982 +/** + * Duration of a loop to emulate from the original behaviour, in ms. + */ +#define CHRONO_LOOP_DURATION 4 +/** + * Time to wait before resetting asserv board, in ms. + */ +#define CHRONO_WAIT_BEFORE_RESET 1000 + +/** + * Match is finished. + * This variable will be set to 0 when the match is over. + */ +static volatile uint8_t chrono_match_over_ = 0; + +/** + * Overflow counter. + */ +static volatile uint8_t chrono_ov_count_; + +/* Initialize the chrono timer/counter 1. */ +void +chrono_init (void) +{ +#ifndef HOST + /* Presaler = 256 */ + TCCR1B = regv (ICNC1, ICES1, 5, WGM13, WGM12, CS12, CS11, CS10, + 0, 1, 0, 0, 0, 1, 0, 0); + /* Enable overflow interrupt */ + set_bit (TIMSK, TOIE1); +#endif +} + +#ifndef HOST +/* Overflow of timer/counter 1 handler. */ +SIGNAL (SIG_OVERFLOW1) +{ + switch (++chrono_ov_count_) + { + case CHRONO_OVERFLOW_MAX: + /* Last but not complete overflow */ + TCNT1 = CHRONO_RESTART_TIC; + break; + case CHRONO_OVERFLOW_MAX + 1: + /* End of match! */ + chrono_match_over_ = 1; + break; + } +} +#endif + +/* Match over? */ +uint8_t +chrono_is_match_over (void) +{ + return chrono_match_over_; +} + +/* End the match. */ +void +chrono_end_match (uint8_t block) +{ + /* Make sure previous command has been acknowledged. If not, retransmit + * until acknowledged */ + while (asserv_last_cmd_ack () == 0) + { + /* Update status */ + asserv_update_status (); + /* Manage retransmission */ + asserv_retransmit (); + /* Wait a little */ + utils_delay_ms (CHRONO_LOOP_DURATION); + } + + /* Make the bot stop moving */ + asserv_stop_motor (); + + /* Wait until complete */ + while (42) + { + /* Update the asserv board */ + asserv_update_status (); + /* Stop acknowledged ? */ + if (asserv_last_cmd_ack () == 0) + { + /* Retransmit if needed */ + asserv_retransmit (); + /* Wait a little */ + utils_delay_ms (CHRONO_LOOP_DURATION); + } + else + /* Exit loop */ + break; + } + + /* Wait CHRONO_WAIT_BEFORE_RESET ms before reseting */ + utils_delay_ms (CHRONO_WAIT_BEFORE_RESET); + /* Reset the asserv board */ + asserv_reset (); + /* Block indefinitely */ + if (block) + while (42); +} diff --git a/digital/io/src/chrono.h b/digital/io/src/chrono.h index 2003f290..fc715d6d 100644 --- a/digital/io/src/chrono.h +++ b/digital/io/src/chrono.h @@ -33,59 +33,35 @@ * match_duration / (1 / (AC_FREQ / (Prescaler * (TOP + 1)))) * It will overflow 79 times and them reset the timer/counter to 58982 * (TOP - ((TOP + 1) / 10)). + * @todo add the ability to unblock the chrono_end_match with a flag that can + * be unset with an uart command. Maybe dangerous... */ -#include "modules/utils/utils.h" /* regv */ -#include "io.h" /* Registers for timer/counter 1 */ +#include "common.h" /** - * Number of overflow of the timer/counter 1 before doing the last one. - */ -#define CHRONO_OVERFLOW_MAX 70 - -/** - * Number of TIC to restart from for the last overflow. - */ -#define CHRONO_RESTART_TIC 58982 - -/** - * Match is finished. - * This variable will be set to 0 when the match is over. + * Initialize the chrono timer/counter 1. + * It starts it for a duration of 90s. */ -static uint8_t chrono_match_over; +void +chrono_init (void); /** - * Overflow counter. + * Match over? + * @return + * - 0 if the match is not finished yet + * - 1 if the match is over */ -static volatile uint8_t chrono_ov_count_; +uint8_t +chrono_is_match_over (void); /** - * Initialize the chrono timer/counter 1. + * End the match. + * This function is responsible of resetting the asserv board to stop the bot + * from moving and put the io board in a state where it will not do something. + * @param block blocking function until hardware reset? */ -static inline void -chrono_init (void) -{ - /* Presaler = 256 */ - TCCR1B = regv (ICNC1, ICES1, 5, WGM13, WGM12, CS12, CS11, CS10, - 0, 1, 0, 0, 0, 1, 0, 0); - /* Enable overflow interrupt */ - set_bit (TIMSK, TOIE1); -} - -/* Overflow of timer/counter 1 handler. */ -SIGNAL (SIG_OVERFLOW1) -{ - switch (++chrono_ov_count_) - { - case CHRONO_OVERFLOW_MAX: - /* Last but not complete overflow */ - TCNT1 = CHRONO_RESTART_TIC; - break; - case CHRONO_OVERFLOW_MAX + 1: - /* End of match! */ - chrono_match_over = 1; - break; - } -} +void +chrono_end_match (uint8_t block); #endif /* chrono_h */ diff --git a/digital/io/src/main.c b/digital/io/src/main.c index 883bb25d..efcd9d4e 100644 --- a/digital/io/src/main.c +++ b/digital/io/src/main.c @@ -43,6 +43,7 @@ #include "giboulee.h" /* team_color */ #include "getsamples.h" /* getsamples_start */ #include "top.h" /* top_* */ +#include "chrono.h" /* chrono_end_match */ #include "io.h" @@ -106,6 +107,15 @@ main_loop (void) /* Manage UART protocol */ proto_accept (uart0_getc ()); + /* Is match over? */ + if (chrono_is_match_over ()) + { + /* End it and block here indefinitely */ + chrono_end_match (42); + /* Safety */ + return; + } + /* Update TWI module to get new data from the asserv board */ asserv_update_status (); diff --git a/digital/io/src/simu.host.c b/digital/io/src/simu.host.c index e7521796..86029139 100644 --- a/digital/io/src/simu.host.c +++ b/digital/io/src/simu.host.c @@ -179,9 +179,3 @@ void eeprom_clear_param (void) { } - -void -chrono_init (void) -{ -} - diff --git a/digital/io/src/simu.host.h b/digital/io/src/simu.host.h index e4b90dcf..efd3bb2a 100644 --- a/digital/io/src/simu.host.h +++ b/digital/io/src/simu.host.h @@ -51,10 +51,6 @@ switch_get_color (void); uint8_t switch_get_jack (void); -/** Hooked, do nothing. */ -void -chrono_init (void); - #endif /* defined (HOST) */ #endif /* simu_host_h */ diff --git a/digital/io/src/top_cb.c b/digital/io/src/top_cb.c index 82ed00c4..352fbc86 100644 --- a/digital/io/src/top_cb.c +++ b/digital/io/src/top_cb.c @@ -29,9 +29,9 @@ #include "move.h" /* move FSM */ #include "playground.h" /* PG_* */ #include "asserv.h" /* asserv_* */ +#include "chrono.h" /* chrono_init */ /* AVR include, non HOST */ #ifndef HOST -# include "chrono.h" /* chrono_init */ # include "switch.h" /* switch_get_color */ #endif /* HOST */ #include "simu.host.h" -- cgit v1.2.3