summaryrefslogtreecommitdiff
path: root/digital/io/src/switch.avr.c
blob: 659b597aada5086278532200c859e9b583d0d7c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* 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 PORTD

/**
 * Color selector read register port.
 */
#define SWITCH_COLOR_PIN PIND

/**
 * Color selector switch pin number of the port.
 */
#define SWITCH_COLOR_PIN_NUMBER 6

/**
 * Jack switch port.
 */
#define SWITCH_JACK_PORT PORTD

/**
 * Jack switch read register port.
 */
#define SWITCH_JACK_PIN PIND

/**
 * Jack switch pin number of the port.
 */
#define SWITCH_JACK_PIN_NUMBER 7

/**
 * 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)
{
    if (bit_is_set (SWITCH_COLOR_PIN, SWITCH_COLOR_PIN_NUMBER))
	return 1;
    else
	return 0;
}

/* Get the current state of the jack switch. */
static inline uint8_t
switch_get_jack_raw (void)
{
    if (bit_is_set (SWITCH_JACK_PIN, SWITCH_JACK_PIN_NUMBER))
	return 1;
    else
	return 0;
}

/* Get the value of the jack with filtering. */
uint8_t
switch_get_jack (void)
{
    return switch_jack_filtered_value_;
}