#include "project.h" #define DIGIT_TIMEOUT 4000 static char dialstr[32] = "ATDT"; static unsigned dialstr_ptr = 4; static int dialstr_timeout; void dialstr_clear (void) { dialstr_ptr = 4; dialstr[dialstr_ptr] = ';'; dialstr[dialstr_ptr + 1] = 0; dialstr_timeout = 0; } static void redial(void) { if (in_call) terminate_call(); dialstr_timeout = 1; } static void dialstr_hook(char digit) { switch (digit) { case '1': ringer_enable(); ringer_ring(400); break; case '2': ringer_disable(); break; case '0': for (;;) scb_reset_system(); break; } } static void dialstr_call(char digit) { static char cmd[]={'A','T','+','V','T','S','=','"','{','0',',','3','}','"',0}; switch (digit) { case 'R': redial(); break; case 'M': modem_cmd("AT+CMUT=1"); break; case 'U': modem_cmd("AT+CMUT=0"); break; default: cmd[9]=digit; modem_cmd(cmd); break; } } void dialstr_digit (char digit) { dialtone_off (); printf ("Dialed %c\r\n",digit); if (hook) { dialstr_timeout=0; dialstr_hook(digit); return; } if (in_call) { dialstr_timeout=0; dialstr_call(digit); return; } switch(digit) { case 'R': redial(); break; case 'M': break; case 'U': break; default: if (!dialstr_timeout) dialstr_clear (); if (dialstr_ptr >= (sizeof (dialstr) - 2)) break; dialstr[dialstr_ptr] = digit; dialstr_ptr++; dialstr[dialstr_ptr] = ';'; dialstr[dialstr_ptr + 1] = 0; dialstr_timeout = DIGIT_TIMEOUT; } } void dialstr_dial (void) { printf ("Dialing %s\r\n", dialstr + 4); modem_tone(17); modem_dial (dialstr); } void dialstr_tick (void) { if (!dialstr_timeout) return; dialstr_timeout--; if (dialstr_timeout) return; if (!hook) dialstr_dial (); }