#include "project.h" #define DEBOUNCE 10 #define DIAL_BLACKOUT 90 /* (10pps) */ #define L2_THRESHOLD 1500 static int hs_poll=DEBOUNCE; int hook=1; static int dial_poll; static int dial_pulse_blackout; static int pulse_count; static int dial_mute_time; 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; if ((!pulse_count) && (dial_mute_time>L2_THRESHOLD)) pulse_count=100; 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) { 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 ^= fake_hook; if (hook == h) return; hook = h; printf ("Hook is now %d\r\n", hook); if (!hook) { if (ringing) { ringer_off (); answer_call (); } else { ringer_off (); dialstr_clear (); dialtone_on (); } } if (hook) { ringer_off (); terminate_call (); dialstr_clear (); dialtone_off(); modem_tone_off(); } } static void dial_tick (void) { int m; dial_mute_time++; if (dial_pulse_blackout) dial_pulse_blackout--; if (!dial_poll) return; dial_poll--; if (dial_poll) return; m = ! !gpio_get (GPIOA, GPIO5); if (m) { dial_mute_time=0; return; } switch (pulse_count) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: dialstr_digit ('0'+pulse_count); break; case 10: dialstr_digit ('0'); break; case 101: dialstr_digit ('*'); break; case 102: dialstr_digit ('#'); break; case 103: dialstr_digit ('R'); break; case 104: dialstr_digit ('M'); break; case 105: dialstr_digit ('U'); break; } pulse_count=0; } void toggle_fake_hook (void) { fake_hook ^= 1; hs_poll = 1; hs_tick(); } void gpio_tick (void) { hs_tick (); dial_tick (); } void gpio_init (void) { /*GSM module reset pin */ gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO1); 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); gpio_set_mode (GPIOC, GPIO_MODE_INPUT, GPIO_CNF_INPUT_PULL_UPDOWN, GPIO14); gpio_clear (GPIOC, GPIO14); exti_select_source (EXTI14, GPIOC); exti_set_trigger (EXTI14, EXTI_TRIGGER_BOTH); exti_enable_request (EXTI14); nvic_enable_irq (NVIC_EXTI15_10_IRQ); }