⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 get_a_re.c

📁 BC3.1编译,小交换机计费系统.使用Dos做出如此好的界面,少有.
💻 C
📖 第 1 页 / 共 2 页
字号:
 * called by : take_all_record()
 * output    : 1 -- successful in connection
 *             0 -- unsuccessful
 * date      : 1993.9.25
 */
UC ConnTermAndCPU(UC port)
{
    int  i;
    char hand_shake[9] = "\xb0YWHQCSN\xfc";
    UC   msg[20];
    UC   suc, flag = 0;
    UL   GoalTick;

    sprintf(msg, "正在联机(%d)...", port+1);
    hz16_disp(H_BX+H_XAD, H_BY+H_YAD/2, msg, BLACK); /* connecting */

    if(port == 0 || port == 1)
        outportb(SIO_IER[port],0x1);        /* Enable Receive Int */

    CheckPort(port);
    SIORecHead[port] = SIORecTail[port] = CmdCount[port] = 0;
    for(i=0; i<9; i++)
        ToCPU(port, 0xb0);

    GoalTick = *Tick_cnt_ptr + TimeOut;
    for(;;)
    {
        if(kbhit() && (get_key0()==ESC))
        {
           flag = 0;
           break;
        }

        CheckPort(port);
	if(!CmdCount[port])             /* receiving buffer is still empty     */
        {
	    if(*Tick_cnt_ptr > GoalTick)      /* time out and no valid data received */
            {
                message(CONN_ERR);          /* error in connection       */
                flag = 0;
		break;
            }
            else
                continue;
        }

        suc = GetCmdFromBuf(port);    /* data have been received */
        if(suc != 1)              /* not the valid data      */
        {
            message(CONN_ERR);
            flag = 0;
            break;
        }

	for(i = 0; i < 9; i++)          /* compare with the hand_shake infor*/
            if(CmdBuf[port][i] != hand_shake[i])       /* not the same         */
                break;
        if(i<9)
        {
            message(CONN_ERR);
	    flag = 0;
            break;
        }

        ToCPU(port,0xb6);              /* successful in connection */
        clr_scr(H_BX+H_XAD,H_BY+H_YAD/2,H_BX+2*H_XAD,H_BY+H_YAD,BLACK,LIGHTGRAY);
        flag = 1;
        break;
    }    /* end of "for(;;)" */

    return(flag);
}

/* function  : receive data and command from SIORecBuf
 * called by : ConnTermAndCPU(),take_record(),take_immediate_record()
 * output    : 0 -- not the valid data received
 *             1 -- successful
 * date      : 1993.9.25
 */
UC GetCmdFromBuf(UC port)
{
    int i, j, k;

    CheckPort(port);

    if(SIORecHead[port] == SIORecTail[port])
    {
        for(i = 0; i < CMD_BUF_SIZE; i++)
            CmdBuf[port][i] = 0;
        CmdCount[port]--;
        return(0);
    }

    i = 0;
    while(SIORecHead[port] != SIORecTail[port])
    {
        CmdBuf[port][i] = SIORecBuf[port][SIORecHead[port]++];     /* move data to CmdBuf */
        if( SIORecHead[port] >= SIO_BUF_SIZE)
            SIORecHead[port] -= SIO_BUF_SIZE;
        i++;
    }

    k = 0;
    for( ; ; )
    {
        if((CmdBuf[port][0] != 0xf0) && (CmdBuf[port][0] != 0xb0) &&
           (CmdBuf[port][0] != 0xb4) && (CmdBuf[port][0] != 0xb7) &&
//	   (CmdBuf[port][0] != 0xb5) && (CmdBuf[port][0] != 0xb2) &&
	   (CmdBuf[port][0] != 0xb8))          /* not the valid command head */
        {
            for(j=0;j<i;j++)           /* move forward */
                CmdBuf[port][j]=CmdBuf[port][j+1];
            k++;
            if(k==i)
		return(0);             /* error in received data */
        }
        else
            break;
    }

    for(; i < CMD_BUF_SIZE; i++)
        CmdBuf[port][i]=0;
    CmdCount[port]--;

    return(1);
}

/* function  : take records from Exchanger
 * called by : take_all_record()
 * output    : 0 -- unsuccessful in taking data
 *             1 -- successful
 * date      : 1993.9.25
 */
UC take_record(void)
{
    int   i, k;
    UC    SendB2=0;
    UL    LastTick;
    long  len;
    FILE  *fp, *fperror;
    UI	  rec_len=23;
    UC    port, B4Rtn, UsedPorts;

    B4Rtn = 0;
    UsedPorts = 0;
    for(port=0; port<PORT_NUM; port++)
    	if(Sys_mode.com_m[port])
        	UsedPorts++;

    TRCount = 0;

    hz16_disp(H_BX+H_XAD,H_BY+H_YAD/2,"正在接收...",BLACK);  /* receiving */

    fp = fopen("pabx.chg","wb");       /* original record file */

    LastTick = *Tick_cnt_ptr;

    for(; ;)
    {
        if(kbhit() && (get_key0()==ESC))
        {
            fclose(fp);
            outportb(SIO_IER[0],0);
            outportb(SIO_IER[1],0);
            return(0);
        }

        for(port=0; port<PORT_NUM; port++) {
            if(Sys_mode.com_m[port]) {
                CheckPort(port);
                if(CmdCount[port])
		{
		    LastTick = *Tick_cnt_ptr;
		    break;
		}
            }
        }
        if(port == PORT_NUM)
        {
	    if(*Tick_cnt_ptr > LastTick + TimeOut)
            {
                fclose(fp);
                outportb(SIO_IER[0],0);
                outportb(SIO_IER[1],0);
                message(REC_TIMEOUT);  /* TimeOut */
                return(0);
            }
            else
                continue;
        }
        else {
          GetCmdFromBuf(port);
          if((CmdBuf[port][0]==0xf0) && (CmdBuf[port][rec_len-1]==0xfd))   /* a telephone record*/
          {
	    CmdBuf[port][0] = 0;
            for(i = 1; i < rec_len-2; i++)                /* CmdBuf[25]=check sum */
                CmdBuf[port][0] += CmdBuf[port][i];
            CmdBuf[port][0] = CmdBuf[port][0] & 0x7f;

            if(CmdBuf[port][0] == CmdBuf[port][rec_len-2])     /* a valid phone record */
            {
                TRCount++;
                outf(H_BX+3*H_XAD/2,H_BY+H_YAD,7,BLACK,"<< %-5u>>",TRCount);
                CmdBuf[port][rec_len-2] = 0xfd;
                CmdBuf[port][0] = port;
                fwrite(CmdBuf[port],rec_len-1,1,fp);
                SendB2 = 0;
                ToCPU(port, 0xb5);                /* a verify information */
            }           /* end of "if(CmdBuf[0] == CmfBuf[25])"     */
            else
            {
                if(SendB2 < 5)
                {
                    SendB2++;
		    ToCPU(port, 0xb2);
                }
                else
                {
                    fperror = fopen("error.dat","ab");
                    fwrite(CmdBuf[port],sizeof(UC),rec_len,fperror);
                    fclose(fperror);

                    SendB2 = 0;
                    ERRCount++;
                    ToCPU(port, 0xb5);
                }
            }           /* end of "else if(CmdBuf[0] != CmfBuf[25])" */
          }     /* end of "if((CmdBuf[0]==0xf0) && (CmdBuf[26]==0xfd))"*/

          else if(CmdBuf[port][0] == 0xb4)          /* no more records       */
          {
            if(Menu_path == 300)             /* all record method */
            {
                ToCPU(port, 0xb1); ToCPU(port, 0xb1); ToCPU(port, 0xb1);
		ToCPU(port, 0xb1); ToCPU(port, 0xb1); ToCPU(port, 0xb1);
                ToCPU(port, 0xb1); ToCPU(port, 0xb1); ToCPU(port, 0xb1);
            }
            else                             /* go to immediate method */
            {
                ToCPU(port, 0xb7); ToCPU(port, 0xb7); ToCPU(port, 0xb7);
                ToCPU(port, 0xb7); ToCPU(port, 0xb7); ToCPU(port, 0xb7);
                ToCPU(port, 0xb7); ToCPU(port, 0xb7); ToCPU(port, 0xb7);

                /* read returned B7 */
		while(SIORecHead[port] == SIORecTail[port] )
		{
			CheckPort(port);
			if(_bios_keybrd(_KEYBRD_READY) )
			if(_bios_keybrd(_KEYBRD_READ) == ESC) break;
		}

		if(SIORecHead[port] == SIORecTail[port])
		    warn_mesg("错误","通讯超时");
		else if(SIORecBuf[port][SIORecHead[port]] == 0xB7) { /* success */
		}
		else
		    warn_mesg("错误","设置错误");
	    }
	    if(port <2)
		    outportb(SIO_IER[port],0);             /* disable interruption  */

	    B4Rtn++;
	    if(B4Rtn < UsedPorts ) continue;

	    fclose(fp);

	    k = open("pabx.chg",O_RDONLY|O_BINARY);
	    len = filelength(k);             /* take file length */
	    close(k);
	    fp = fopen("pabx.lth","wb");
	    fwrite(&len,sizeof(long),1,fp);
	    fclose(fp);

	    clr_scr(H_BX+H_XAD,  H_BY+H_YAD/2,\
		       H_BX+3*H_XAD-20,H_BY+2*H_YAD-20,BLACK,LIGHTGRAY);
	    if(TRCount == 0)                 /* No record */
	    {
		hz16_disp(H_BX+H_XAD,H_BY+H_YAD/2,"无  信  息!",BLACK);
		delay_10ms(100);
	    }
	    else
	    {
		hz16_disp(H_BX+H_XAD,H_BY+H_YAD/2,"接 收 完 毕!",BLACK);
		message_disp(8,"正在分拣, 请稍候...");
		all_record_transfer();
		message_end();
	    }
	    return(1);
	}
	else if(CmdBuf[port][0] == 0xb7)          /* returned B7       */
	{
	}
	else
	{
	    fperror = fopen("error.dat","ab");
	    fwrite(CmdBuf[port],sizeof(UC),rec_len,fperror);
	    fclose(fperror);

	    ERRCount++;
	    ToCPU(port, 0xb5);
	}
      }  /* end of "port"*/
    }    /* end of "for(;;)" */
}

/* function  : copy *.tmp to *.dat
 * called by : take_all_record(), take_immediate_record()
 * output    : 0 -- successful, others -- unsuccessful
 * date      : 1993.9.25
 */
UC tmp_to_dat(void)
{
    int    flag;
    struct ffblk  fblk;

    message_disp(8,"正在存盘, 请稍候...");       /* saving, please wait...*/

    flag = findfirst("idd.tmp",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("idd.tmp","idd.dbf");

    flag = findfirst("ddd.tmp",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("ddd.tmp","ddd.dbf");

    flag = findfirst("ldd.tmp",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("ldd.tmp","ldd.dbf");

    message_end();

    return(flag);
}

/* function  : copy *.dat to *.tmp
 * called by : take_all_record(), take_immediate_record()
 * output    : 0 -- successful, others -- unsuccessful
 * date      : 1993.9.25
 */
UC dat_to_tmp(void)
{
    int    flag;
    struct ffblk fblk;

    message_disp(8,"正在存盘, 请稍候...");       /* saving, please wait...*/

    flag = findfirst("idd.dbf",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("idd.dbf","idd.tmp");
    else
        remove("idd.tmp");

    flag = findfirst("ddd.dbf",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("ddd.dbf","ddd.tmp");
    else
        remove("ddd.tmp");

    flag = findfirst("ldd.dbf",&fblk,FA_ARCH);
    if(flag == 0)
        fcopy("ldd.dbf","ldd.tmp");
    else
        remove("ldd.tmp");

    message_end();

    return(flag);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -