summaryrefslogtreecommitdiffstats
path: root/app/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/gpio.c')
-rw-r--r--app/gpio.c105
1 files changed, 97 insertions, 8 deletions
diff --git a/app/gpio.c b/app/gpio.c
index 2eb41ce..e597d16 100644
--- a/app/gpio.c
+++ b/app/gpio.c
@@ -1,24 +1,64 @@
#include "project.h"
+#define DEBOUNCE 10
+#define DIAL_BLACKOUT 90 /* (10pps)*/
+
+static int hs_poll;
+int hook;
+static int dial_poll;
+static int dial_pulse_blackout;
+static int pulse_count;
+
-static int hs_poll=50,hook=-1;
static int fake_hook;
+static void exti5_isr(void)
+{
+exti_reset_request(EXTI5);
+dial_poll=DEBOUNCE;
+}
+
+static void exti7_isr(void)
+{
+exti_reset_request(EXTI7);
+if (dial_pulse_blackout) return;
+dial_pulse_blackout=DIAL_BLACKOUT;
+pulse_count++;
+}
+
+
+static void exti14_isr(void)
+{
+exti_reset_request(EXTI14);
+hs_poll=DEBOUNCE;
+}
+
+
+
+void exti9_5_isr(void)
+{
+if (exti_get_flag_status(EXTI5)) exti5_isr();
+if (exti_get_flag_status(EXTI7)) exti7_isr();
+}
void exti15_10_isr(void)
{
- exti_reset_request(EXTI14);
-hs_poll=50;
+if (exti_get_flag_status(EXTI14)) exti14_isr();
}
+
+
static void hs_tick(void)
{
int h;
+
+
if (!hs_poll) return;
hs_poll--;
+
if (hs_poll) return;
-h=!!gpio_get(GPIOC,GPIO14);
+h=!gpio_get(GPIOC,GPIO14);
h^=fake_hook;
@@ -28,10 +68,11 @@ hook=h;
printf("Hook is now %d\r\n",hook);
-if ((!hook) && (ringing)) {
+if (!hook) {
+ if (ringing) {
ring_off();
answer_call();
-
+ }
}
if (hook) {
@@ -39,22 +80,41 @@ if (hook) {
terminate_call();
}
-
+}
+static void dial_tick(void) {
+int m;
+
+if (dial_pulse_blackout) dial_pulse_blackout--;
+if (!dial_poll) return;
+dial_poll--;
+if (dial_poll) return;
+
+m=!!gpio_get(GPIOA,GPIO5);
+
+
+if (m) return;
+if (!pulse_count) return;
+
+dialstr_digit((pulse_count == 10) ? 0:pulse_count);
+pulse_count=0;
}
+
void toggle_fake_hook(void)
{
fake_hook^=1;
-hs_poll=50;
+hs_poll=DEBOUNCE;
}
void gpio_tick(void)
{
hs_tick();
+dial_tick();
+
}
@@ -69,6 +129,35 @@ void gpio_init(void)
gpio_set(GPIOA,GPIO1);
+ /* Dial mute */
+ gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO4);
+ gpio_set(GPIOA,GPIO4);
+
+ gpio_set_mode (GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO5);
+ gpio_clear(GPIOA,GPIO5);
+
+
+ exti_select_source(EXTI5, GPIOA);
+ exti_set_trigger(EXTI5, EXTI_TRIGGER_BOTH);
+ exti_enable_request(EXTI5);
+
+ /*Dial contacts */
+
+ gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO6);
+ gpio_set(GPIOA,GPIO6);
+
+ gpio_set_mode (GPIOA, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO7);
+ gpio_clear(GPIOA,GPIO7);
+
+
+ exti_select_source(EXTI7, GPIOA);
+ exti_set_trigger(EXTI7, EXTI_TRIGGER_RISING);
+ exti_enable_request(EXTI7);
+
+
+ nvic_enable_irq(NVIC_EXTI9_5_IRQ);
+
+
/*hookswitch*/
gpio_set_mode (GPIOC, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO15);
gpio_set(GPIOC,GPIO15);