From b814bc2ab370832431d3fa659521949482aa2180 Mon Sep 17 00:00:00 2001 From: Jérémy Dufour Date: Mon, 21 Apr 2008 23:56:02 +0200 Subject: * digital/io/src - move functions definitions of switch module to a source file ; - add a filter when getting the state value of the jack ; - add jack events transmission to the top FSM into the main loop ; - make it build for host implementation. --- digital/io/src/Makefile | 1 + digital/io/src/main.c | 9 ++- digital/io/src/simu.host.c | 5 ++ digital/io/src/simu.host.h | 4 ++ digital/io/src/switch.avr.c | 143 ++++++++++++++++++++++++++++++++++++++++++++ digital/io/src/switch.h | 78 +++++++----------------- 6 files changed, 181 insertions(+), 59 deletions(-) create mode 100644 digital/io/src/switch.avr.c (limited to 'digital/io/src') diff --git a/digital/io/src/Makefile b/digital/io/src/Makefile index 8e4782ed..7b463940 100644 --- a/digital/io/src/Makefile +++ b/digital/io/src/Makefile @@ -1,6 +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 \ simu.host.c \ fsm.c \ getsamples.c getsamples_fsm.c getsamples_cb.c \ diff --git a/digital/io/src/main.c b/digital/io/src/main.c index 8b6f8d78..1be36985 100644 --- a/digital/io/src/main.c +++ b/digital/io/src/main.c @@ -106,6 +106,9 @@ main_loop (void) /* Update TWI module to get new data from the asserv board */ asserv_update_status (); + /* Update switch module */ + switch_update (); + /* Is last command has been acknowledged? */ if (asserv_last_cmd_ack () == 0) /* Called function to manage retransmission */ @@ -141,7 +144,11 @@ main_loop (void) fsm_handle_event (&getsamples_fsm, GETSAMPLES_EVENT_arm_pass_noted_position); } - /* Check other sensors */ + /* Jack */ + fsm_handle_event (&top_fsm, switch_get_jack () ? + TOP_EVENT_jack_removed_from_bot : + TOP_EVENT_jack_inserted_into_bot); + /* TODO: Check other sensors */ } } } diff --git a/digital/io/src/simu.host.c b/digital/io/src/simu.host.c index e17a001d..382c9451 100644 --- a/digital/io/src/simu.host.c +++ b/digital/io/src/simu.host.c @@ -123,6 +123,11 @@ switch_get_jack (void) return r; } +void +switch_update (void) +{ +} + void main_timer_init (void) { diff --git a/digital/io/src/simu.host.h b/digital/io/src/simu.host.h index 00021470..e4b90dcf 100644 --- a/digital/io/src/simu.host.h +++ b/digital/io/src/simu.host.h @@ -39,6 +39,10 @@ main_timer_wait (void); void switch_init (void); +/** Hooked, do nothing. */ +void +switch_update (void); + /** Hooked, request via mex. */ uint8_t switch_get_color (void); diff --git a/digital/io/src/switch.avr.c b/digital/io/src/switch.avr.c new file mode 100644 index 00000000..dcc35765 --- /dev/null +++ b/digital/io/src/switch.avr.c @@ -0,0 +1,143 @@ +/* switch.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 "switch.h" + +#include "common.h" +#include "modules/utils/utils.h" /* set_bit */ +#include "io.h" /* PORT/PIN, bit_is_set */ + +/** + * @defgroup SwitchConfiguration Configuration of the switch module. + * You can change the value of the defines and variables of this group to + * configure the module. + */ + +/** + * Color selector switch port. + */ +#define SWITCH_COLOR_PORT PORTC + +/** + * Color selector read register port. + */ +#define SWITCH_COLOR_PIN PINC + +/** + * Color selector switch pin number of the port. + */ +#define SWITCH_COLOR_PIN_NUMBER 0 + +/** + * Jack switch port. + */ +#define SWITCH_JACK_PORT PORTC + +/** + * Jack switch read register port. + */ +#define SWITCH_JACK_PIN PINC + +/** + * Jack switch pin number of the port. + */ +#define SWITCH_JACK_PIN_NUMBER 1 + +/** + * Number of iteration of 4.4 ms to have for the filter. + */ +#define SWITCH_JACK_FILTER_NUMBER 50 + +/** + * Get the current state of the jack switch. + * @return the state of the jack without any filter. + */ +static inline uint8_t +switch_get_jack_raw (void); + +/** + * The current filtered value of the jack. + */ +uint8_t switch_jack_filtered_value_; + +/** @} */ + +/* Initialize the switch module. */ +void +switch_init (void) +{ + /* By default, all pins are in input direction */ + /* Enable the pull-ups */ + set_bit (SWITCH_COLOR_PORT, SWITCH_COLOR_PIN_NUMBER); + set_bit (SWITCH_JACK_PORT, SWITCH_JACK_PIN_NUMBER); + /* By default, there is no jack inserted */ + switch_jack_filtered_value_ = 1; +} + +/* Update the switch module. */ +void +switch_update (void) +{ + /* Filter counter */ + static uint8_t switch_jack_filter = 0; + + /* If the get return the same as the cached one */ + if (switch_get_jack_raw () == switch_jack_filtered_value_) + /* Ensure filter counter is zero */ + switch_jack_filter = 0; + else + { + /* Increment filter counter and compare it to the max filter */ + if (switch_jack_filter++ == SWITCH_JACK_FILTER_NUMBER) + { + /* We change the value of the jack */ + switch_jack_filtered_value_ = !switch_jack_filtered_value_; + /* Reset filter counter */ + switch_jack_filter = 0; + } + } +} + +/* Get the current state of the select colors switch. */ +enum team_color_e +switch_get_color (void) +{ + return bit_is_set (SWITCH_COLOR_PIN, SWITCH_COLOR_PIN_NUMBER); +} + +/* Get the current state of the jack switch. */ +static inline uint8_t +switch_get_jack_raw (void) +{ + return bit_is_set (SWITCH_JACK_PIN, SWITCH_JACK_PIN_NUMBER); +} + +/* Get the value of the jack with filtering. */ +uint8_t +switch_get_jack (void) +{ + return switch_jack_filtered_value_; +} + diff --git a/digital/io/src/switch.h b/digital/io/src/switch.h index 0f334776..00ca227a 100644 --- a/digital/io/src/switch.h +++ b/digital/io/src/switch.h @@ -29,77 +29,39 @@ * @file Module to manage 'switchs'. For example, colors selector and jack. */ -#include "io.h" /* PORT/PIN, bit_is_set */ -#include "modules/utils/utils.h" /* set_bit */ #include "giboulee.h" /* team_color_e */ +#include "common.h" /** - * @defgroup SwitchConfiguration Configuration of the switch module. - * You can change the value of the defines and variables of this group to - * configure the module. - */ - -/** - * Color selector switch port. - */ -#define SWITCH_COLOR_PORT PORTC - -/** - * Color selector read register port. - */ -#define SWITCH_COLOR_PIN PINC - -/** - * Color selector switch pin number of the port. - */ -#define SWITCH_COLOR_PIN_NUMBER 0 - -/** - * Jack switch port. - */ -#define SWITCH_JACK_PORT PORTC - -/** - * Jack switch read register port. - */ -#define SWITCH_JACK_PIN PINC - -/** - * Jack switch pin number of the port. + * Initialize the switch module. + * This functions just put the pins in input direction and enable pull-ups. */ -#define SWITCH_JACK_PIN_NUMBER 1 - -/** @} */ +void +switch_init (void); /** - * Initialize the switch module. - * This functions just put the pins in input direction and enable pull-ups. + * Update the switch module. + * This function must be called at each "main cycle" to ensure that the filter + * of the jack is updated. */ -static inline void -switch_init (void) -{ - /* By default, all pins are in input direction */ - /* Enable the pull-ups */ - set_bit (SWITCH_COLOR_PORT, SWITCH_COLOR_PIN_NUMBER); - set_bit (SWITCH_JACK_PORT, SWITCH_JACK_PIN_NUMBER); -} +void +switch_update (void); /** * Get the current state of the select colors switch. + * Be careful, the result of this function is not filtered. + * @return the color of our team. */ -static inline enum team_color_e -switch_get_color (void) -{ - return bit_is_set (SWITCH_COLOR_PIN, SWITCH_COLOR_PIN_NUMBER); -} +enum team_color_e +switch_get_color (void); /** - * Get the current state of the jack switch. + * Get the filtered value of the jack. + * In comparison with the \a switch_get_jack_raw, this function ensure you the + * state of the jack is the same during a defined period of time. + * @return the filtered state of the jack. */ -static inline uint8_t -switch_get_jack (void) -{ - return bit_is_set (SWITCH_JACK_PIN, SWITCH_JACK_PIN_NUMBER); -} +uint8_t +switch_get_jack (void); #endif /* switch_h */ -- cgit v1.2.3