summaryrefslogtreecommitdiffhomepage
path: root/digital/io
diff options
context:
space:
mode:
authorJérémy Dufour2008-04-21 23:56:02 +0200
committerJérémy Dufour2008-04-21 23:56:02 +0200
commitb814bc2ab370832431d3fa659521949482aa2180 (patch)
tree7c3ef4e96e0de2eb8e060eceacf6ff2b4770b844 /digital/io
parent4e9abfc25206587a3e96cfb2251dae5e81d34b5f (diff)
* 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.
Diffstat (limited to 'digital/io')
-rw-r--r--digital/io/src/Makefile1
-rw-r--r--digital/io/src/main.c9
-rw-r--r--digital/io/src/simu.host.c5
-rw-r--r--digital/io/src/simu.host.h4
-rw-r--r--digital/io/src/switch.avr.c143
-rw-r--r--digital/io/src/switch.h78
6 files changed, 181 insertions, 59 deletions
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
@@ -124,6 +124,11 @@ switch_get_jack (void)
}
void
+switch_update (void)
+{
+}
+
+void
main_timer_init (void)
{
simu_init ();
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 */