📄 serial.c
字号:
dState = state ; DialogStart(ModemPats, NModemPats, time, SerialDialog) ;}voidSerialConnect(){ char *phone = getPhoneNo() ; hangingUp = 0 ; if( SerialOpen(serialPort()) < 0 ) return ; connectionActive = True ; connectTime0 = time(NULL) ; WindowModem() ; if( phone[0] != '\0' ) { /* begin modem dialog */ WindowStatus("Connecting to Modem...") ; bufWrite(ofd, "AT\r", 3) ; dialogInit(dSModemConnect, MODEM_TIMEOUT) ; } else WindowStatus("Serial port opened") ;}voidSerialDisConnect(){ char *phone = getPhoneNo() ; if( ifd == -1 ) return ; if( phone[0] != '\0' ) { /* begin modem dialog */ WindowStatus("Connecting to Modem...") ; bufWrite(ofd, "AT\r", 3) ; dialogInit(dSModemDisConnect, MODEM_TIMEOUT) ; } else { SerialClose() ; ConnectionDone() ; }}static voidunexpected(int which){ if( which == -1 ) WindowStatus("Modem does not respond") ; else WindowStatus("Unexpected modem response %d", which) ; sleep(1) ;}static voiddialNext(){ if( modemDialNext() ) { WindowStatus("Dialing next number...") ; dialogInit(dSModemDialing, DIAL_TIMEOUT) ; }} /* handle input during serial connect/disconnect dialog. */static voidSerialDialog(int which){ char buf[32] ; if( connectAbort ) { /* cancel dialog, connection remains */ bufWrite(ofd, "AT\r", 3) ; WindowStatus("Cancelled") ; return ; } switch( dState ) { case dSModemConnect: switch( which ) { case -1: /* timeout */ default: unexpected(which) ; break ; case 0: /* OK */ WindowStatus("Resetting Modem...") ; if( modemInit[0] != '\0' ) { bufWrite(ofd, modemInit, strlen(modemInit)) ; bufWrite(ofd, "\r", 1) ; } else { /* reset it ourselves. TODO: support other than hayes */ bufWrite(ofd, "ATZ\r", 4) ; } dialogInit(dSModemInit, MODEM_TIMEOUT) ; } break ; case dSModemInit: switch( which ) { case -1: /* timeout */ default: unexpected(which) ; break ; case 0: /* OK */ WindowStatus("Setting Modem...") ; /* init it ourselves. TODO: support other than hayes */ /* set: verbose result codes */ bufWrite(ofd, stdResetStr, sizeof(stdResetStr)-1) ; switch( modemAttn ) { case ModemAttnEsc: sprintf(buf, "\\K5&D0S2=%d", modemEsc[0]) ; bufWrite(ofd, buf, strlen(buf)) ; break ; case ModemAttnBrk: bufWrite(ofd, "\\K4&D0S2=128", 12) ; break ; case ModemAttnDtr: bufWrite(ofd, "\\K5&D1S2=128", 12) ; break ; } bufWrite(ofd, "\r", 1) ; dialogInit(dSModemSetup, MODEM_TIMEOUT) ; } break ; case dSModemSetup: switch( which ) { case -1: /* timeout */ default: unexpected(which) ; break ; case 0: /* OK */ if( modemDialFirst() ) { WindowStatus("Dialing...") ; dialogInit(dSModemDialing, DIAL_TIMEOUT) ; } else WindowStatus("Phone number not found") ; break ; } break ; case dSModemDialing: switch( which ) { case -1: /* timeout */ bufWrite(ofd, "AT\r", 3) ; case 2: /* NO CARRIER */ WindowStatus("No answer") ; dialNext() ; break ; case 1: /* CONNECT */ WindowStatus("Connected") ; modemDialDone() ; break ; case 3: /* BUSY */ WindowStatus("Busy") ; dialNext() ; break ; case 5: /* NO DIAL TONE */ WindowStatus("No dial tone") ; modemDialDone() ; break ; default: unexpected(which) ; dialNext() ; break ; } break ; case dSModemDisConnect: switch( which ) { case -1: /* timeout */ case 1: /* CONNECT */ /* modem still connected, seize control */ WindowStatus("Grabbing modem...") ; modemBreak() ; dialogInit(dSModemBreak, MODEM_TIMEOUT) ; break ; default: /* anything else is good enough */ WindowStatus("Hanging up...") ; hangingUp = 1 ; SetHardwareFlow() ; bufWrite(ofd, "ATH0\r", 5) ; dialogInit(dSModemHangup, MODEM_TIMEOUT) ; break ; } break ; case dSModemBreak: switch( which ) { default: unexpected(which) ; case 0: /* OK */ case 2: /* NO CARRIER */ WindowStatus("Hanging up...") ; hangingUp = 1 ; SetHardwareFlow() ; bufWrite(ofd, "ATH0\r", 5) ; dialogInit(dSModemHangup, MODEM_TIMEOUT) ; break ; } break ; case dSModemHangup: switch( which ) { default: unexpected(which) ; case 0: /* OK */ case 2: /* NO CARRIER */ hangingUp = 0 ; SetHardwareFlow() ; WindowStatus("Resetting modem...") ; if( modemReset[0] != '\0' ) { bufWrite(ofd, modemReset, strlen(modemReset)) ; bufWrite(ofd, "\r", 1) ; } else { bufWrite(ofd, "ATZ\r", 4) ; } dialogInit(dSModemReset, MODEM_TIMEOUT) ; break ; } break ; case dSModemReset: switch( which ) { default: unexpected(which) ; case 0: /* OK */ case 2: /* NO CARRIER */ SerialClose() ; ConnectionDone() ; break ; } break ; }} /* dial a number */static voidcall(char *string){ bufWrite(ofd, "ATD", 3) ; bufWrite(ofd, string, strlen(string)) ; bufWrite(ofd, "\r", 1) ;} /* get first phone number, dial it and return true. Return * false if no more phone number(s) */static int modemFileCount ; /* # files tried */static FILE *modemFile ;static intmodemDialFirst(){ char *phone = getPhoneNo() ; if( phone[0] != '@' ) { call(phone) ; return 1 ; } modemFileCount = 0 ; modemFile = NULL ; return modemDialNext() ;} /* Get next phone number, dial it and return true. Return * false if no more phone numbers */static intmodemDialNext(){ char line[128] ; int len ; char *ptr ; char *env ; char *phone = getPhoneNo() ; if( phone[0] != '@' ) return 0 ; /* phone numbers come from $PHONES or /etc/phones */ if( modemFile == NULL ) switch( modemFileCount ) { case 0: if( (env = getenv("PHONES")) != NULL && (modemFile = fopen(env, "r")) != NULL ) break ; else ++modemFileCount ; case 1: if( (modemFile = fopenU(EtcPhones, "r")) != NULL ) break ; case 2: default: return 0 ; } /* search phone numbers file for a match. Format is: * #comment * <name><blanks><number> * see phones(5) */ len = strlen(phone+1) ; while( fgets(line, sizeof(line), modemFile) != NULL ) { if( line[0] != '#' ) { if( strncmp(line, phone+1, len) == 0 && isspace(line[len]) ) { if( (ptr = strchr(line+len, '\n')) != NULL ) *ptr = '\0' ; for( ptr = line+len; isspace(*ptr); ++ptr) ; if( *ptr != '\0' ) { call(ptr) ; return 1 ; } } } } fclose(modemFile) ; modemFile = NULL ; ++modemFileCount ; return modemDialNext() ;}static voidmodemDialDone(){ if( modemFile != NULL ) { fclose(modemFile) ; modemFile = NULL ; }} /* execute modem reset sequence as defined by modemAttn and * modemEsc */static voidmodemBreak(){ char attn[3] ;static int dtr = TIOCM_DTR ; switch( modemAttn ) { case ModemAttnEsc: sleep(2) ; attn[0] = modemEsc[0] ; attn[1] = modemEsc[0] ; attn[2] = modemEsc[0] ; bufWrite(ofd, attn, 3) ; sleep(2) ; break ; case ModemAttnBrk: tcsendbreak(ofd, 0) ; break ; case ModemAttnDtr: /* TODO: is there a posix-compatible way to do this? */ (void) ioctl(ofd, TIOCMBIC, &dtr) ; sleep(1) ; (void) ioctl(ofd, TIOCMBIS, &dtr) ; break ; }}#ifdef COMMENTvoiddump_buffer(char *data, int len, Buffer *buf){ int i,j ; struct timezone z ; if( len <= 0 ) return ; if( !ascout ) { if( lastread != buf ) { gettimeofday(×tamp, &z) ; lastread = buf ; } i = fwrite((char *)&buf->which, sizeof(buf->which), 1, stdout) ; i = fwrite((char *)×tamp, sizeof(timestamp), 1, stdout) ; i = fwrite((char *)&len, sizeof(len), 1, stdout) ; i = fwrite(data, 1, len, stdout) ; } else { for(j = len; j > 0; ) { i = j > 32 ? 32 : j ; if( buf->which == 1 ) printf("\t\t\t\t\t") ; while( --i >= 0 ) { putchar( *data >= ' ' && *data <= 0176 ? *data : '.') ; ++data ; --j ; } putchar('\n') ; } }}#endif /* COMMENT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -