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

📄 setscanner.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/--------------------------------------------------------------*/
void CSetScanner::SCSI_Read(LPSTR lp,int bytes,int bytes1,int n,int m)
{
	int i;

    ASPI32Status=0xff;	

	int Row;
	int ASPI_Host_Adapter_ID1;
	Row=n;

	ASPI_Host_Adapter_ID1=GetPrivateProfileInt("ASPI_Adapter","ASPI",0,InitDir2);
     
	for(i=0;i<16;i++)
	mySRBEIO.SenseArea[i]=0;
	
	mySRBEIO.SRB_Cmd		=SC_EXEC_SCSI_CMD;
	mySRBEIO.SRB_Status		=0;
	mySRBEIO.SRB_HaId		=ASPI_Host_Adapter_ID1;
	mySRBEIO.SRB_Flags		=SRB_DIR_SCSI;
	mySRBEIO.SRB_Hdr_Rsvd	=0;
	mySRBEIO.SRB_Target	    =6;
	mySRBEIO.SRB_Lun		=0;
	mySRBEIO.SRB_Rsvd1		=0;
	mySRBEIO.SRB_BufLen		=bytes;
	mySRBEIO.SRB_BufPointer	= (unsigned char*)lp;
	
	mySRBEIO.SRB_SenseLen	=SENSE_LEN;
	mySRBEIO.SRB_CDBLen		=10;
	mySRBEIO.SRB_HaStat		=0;
	mySRBEIO.SRB_TargStat	=0;
	mySRBEIO.SRB_Rsvd2	=0;

	mySRBEIO.CDBByte[0]		=SCSI_READ10;  //即0X28H
	mySRBEIO.CDBByte[1]		=0;
	mySRBEIO.CDBByte[2]		=0;           //读取数据类型,0是图像数据,1是LM9812数据
	mySRBEIO.CDBByte[3]		=0;
	mySRBEIO.CDBByte[4]		=HIBYTEOFWORD(n);           //读取数据行数
	mySRBEIO.CDBByte[5]		=LOBYTEOFWORD(n);
	mySRBEIO.CDBByte[6]		=SECONDBYTEOFDWORD(bytes1);  //表示的是象素点数目
	mySRBEIO.CDBByte[7]		=THIRDBYTEOFDWORD(bytes1);
	mySRBEIO.CDBByte[8]		=LASTBYTEOFDWORD(bytes1);
	mySRBEIO.CDBByte[9]		=0;
	mySRBEIO.SRB_PostProc	=0;
				
    ASPI32Status = SendASPI32Command( (LPSRB) &mySRBEIO); 
	if(m==0)
	{
      while(mySRBEIO.SRB_Status==SS_PENDING);
	  if(mySRBEIO.SRB_Status!=SS_COMP)
	  {
		AfxMessageBox("检查SCSI状态");
	  }

      if(mySRBEIO.SRB_TargStat==0x02)    //约定GOOD为00H,检查出错为02H
	  {
	   SCSI_CHECK();
	  }
	}
}


/////////////////////////////////////////////////////////////
//检查主机适配器号                                         //
/////////////////////////////////////////////////////////////
/*
 void CSetScanner::SCSI_Adapter_Check()
{
    int i;
    char str[36];

    ASPI32Status=0xff;	
    for(i=0;i<8;i++)
	{
	  mySRBEIO.SRB_Cmd		=SC_EXEC_SCSI_CMD;	
 	  mySRBEIO.SRB_Status	=0;					
	  mySRBEIO.SRB_HaId		=i;	
	  mySRBEIO.SRB_Flags	=SRB_DIR_SCSI;		
	  mySRBEIO.SRB_Hdr_Rsvd	=0;				
	  mySRBEIO.SRB_Target	=6;					
	  mySRBEIO.SRB_Lun		=0;				
	  mySRBEIO.SRB_Rsvd1	=0;					
	  mySRBEIO.SRB_BufLen	=0;				
	  mySRBEIO.SRB_BufPointer=0;
	  mySRBEIO.SRB_SenseLen	=SENSE_LEN;		
	  mySRBEIO.SRB_CDBLen	=6;			
	  mySRBEIO.SRB_HaStat	=0;					
	  mySRBEIO.SRB_TargStat	=0;                
	  mySRBEIO.SRB_Rsvd2	=0;			
	
	  //发送INQUIRY命令
      mySRBEIO.CDBByte[0]		=0x12;
	  mySRBEIO.CDBByte[1]		=0;
	  mySRBEIO.CDBByte[2]		=0;
	  mySRBEIO.CDBByte[3]		=0;
	  mySRBEIO.CDBByte[4]		=0x24;
	  mySRBEIO.CDBByte[5]		=0;

      ASPI32Status = SendASPI32Command( (LPSRB) &mySRBEIO);
    
      ASPI_Host_Adapter_ID=i;
      sprintf(str, "%d", 0);

      WritePrivateProfileString("ASPI_Adapter", "ASPI", str, InitDir2);

      while(mySRBEIO.SRB_Status==SS_PENDING);
	  if(mySRBEIO.SRB_Status!=130)
	  {
	    return;
	  }
	}
}
*/
/////////////////////////////////////////////////////////////
//判断底层是否准备好扫描,如果准备好,则返回,否则调用查错函数
/////////////////////////////////////////////////////////////
void CSetScanner:: SCSI_TST()
{
    ASPI32Status=0xff;	
	//SRB_ExecSCSICmd mySRBEIO;

    //检查适配器号
    //SCSI_Adapter_Check();
 
	ASPI_Host_Adapter_ID=GetPrivateProfileInt("ASPI_Adapter","ASPI",0,InitDir2);
   	
	mySRBEIO.SRB_Cmd		=SC_EXEC_SCSI_CMD;	
	mySRBEIO.SRB_Status		=0;					
	mySRBEIO.SRB_HaId		=ASPI_Host_Adapter_ID;	
	mySRBEIO.SRB_Flags		=SRB_DIR_SCSI;		
	mySRBEIO.SRB_Hdr_Rsvd	=0;				
	mySRBEIO.SRB_Target		=6;					
	mySRBEIO.SRB_Lun		=0;				
	mySRBEIO.SRB_Rsvd1		=0;					
	mySRBEIO.SRB_BufLen		=0;				
	mySRBEIO.SRB_BufPointer	=0;
	mySRBEIO.SRB_SenseLen	=SENSE_LEN;		
	mySRBEIO.SRB_CDBLen		=6;			
	mySRBEIO.SRB_HaStat		=0;					
	mySRBEIO.SRB_TargStat	=0;                
	mySRBEIO.SRB_Rsvd2	    =0;	
	
    mySRBEIO.CDBByte[0]		=0x00;  //表示是检查是否准备好
	mySRBEIO.CDBByte[1]		=0;
	mySRBEIO.CDBByte[2]		=0;
	mySRBEIO.CDBByte[3]		=0;
	mySRBEIO.CDBByte[4]		=0;
	mySRBEIO.CDBByte[5]		=0;

    ASPI32Status = SendASPI32Command( (LPSRB) &mySRBEIO);
    int mm;
	mm=mySRBEIO.SRB_Status;
	while(mySRBEIO.SRB_Status==SS_PENDING);
	if(mySRBEIO.SRB_TargStat==0x02)    //约定GOOD为00H,检查出错为02H
	{
	   SCSI_CHECK();
	}
}

/////////////////////////////////////////////////////////////
//调用查错函数
/////////////////////////////////////////////////////////////
void CSetScanner:: SCSI_CHECK()
{ 
    char check[24];
	int i;
	
	ASPI32Status=0xff;	
  
	//用来描述状态
	CString   Stauts1;
    CString   Stauts2;
    CString   Stauts3; 
    CString   Stauts4;
    CString   Stauts5;
    CString   Stauts6;
    CString   Stauts7;
    CString   Stauts8; 
  
    for(i=0;i<24;i++)
    {
     check[i]=0;
    }

    ASPI_Host_Adapter_ID=GetPrivateProfileInt("ASPI_Adapter","ASPI",0,InitDir2);
    for(i=0;i<16;i++)
	mySRBEIO.SenseArea[i]=0;
	
	mySRBEIO.SRB_Cmd		=SC_EXEC_SCSI_CMD;
	mySRBEIO.SRB_Status		=0;
	mySRBEIO.SRB_HaId		=ASPI_Host_Adapter_ID;
	mySRBEIO.SRB_Flags		=SRB_DIR_SCSI;
	mySRBEIO.SRB_Hdr_Rsvd	=0;
	mySRBEIO.SRB_Target	    =6;
	mySRBEIO.SRB_Lun		=0;
	mySRBEIO.SRB_Rsvd1		=0;
	mySRBEIO.SRB_BufLen		=24;
	mySRBEIO.SRB_BufPointer	=(unsigned char *)check;
	mySRBEIO.SRB_SenseLen	=SENSE_LEN;
	mySRBEIO.SRB_CDBLen		=6;
	mySRBEIO.SRB_HaStat		=0;
	mySRBEIO.SRB_TargStat	=0;
	mySRBEIO.SRB_Rsvd2	    =0;

	mySRBEIO.CDBByte[0]		=0x1C;
	mySRBEIO.CDBByte[1]		=0;
	mySRBEIO.CDBByte[2]		=0;
	mySRBEIO.CDBByte[3]		=0;
	mySRBEIO.CDBByte[4]		=24;
	mySRBEIO.CDBByte[5]		=0;
	
				
	ASPI32Status = SendASPI32Command( (LPSRB) &mySRBEIO);
	while(mySRBEIO.SRB_Status==SS_PENDING);
	if(mySRBEIO.SRB_Status!=SS_COMP)
	{
	  AfxMessageBox("检查SCSI状态");
	}
 
//***********************************************************************    
//以下代码是用来检查出错状态
//*********************************************************************** 
   
   if(check[0]==0x00)  //检测系统是否正确
   {
      MessageBox("系统准确","系统检测",MB_OK);
   }
   if(check[0]==0xFF) //系统不正确,继续检查
   {
       MessageBox("系统出错,继续检查","系统检测",MB_OKCANCEL);
       //***********************************
	   //系统板检测结果,并且写道报告文件中
	   //***********************************
	   if((check[1]&0x80)==1)
	   {
          Stauts1="SCSI FIFO 自检出错";
	   }
	   else
	   {
          Stauts1="SCSI FIFO 自检正确";
	   }

       if((check[1]&0x40)==1)
	   {
          Stauts2="DP5380 自检出错";
	   }
	   else
	   {
          Stauts2="DP5380 自检正确";
	   }
       
       if((check[1]&0x20)==1)
	   {
          Stauts3="校正查找表 自检出错";
	   }
	   else
	   {
          Stauts3="校正查找表 自检正确";
	   }

       if((check[1]&0x10)==1)
	   {
          Stauts4="校正查找表图像校正查找操作 出错";
	   }
	   else
	   {
          Stauts4="校正查找表图像校正查找操作 正确";
	   }
     
       if((check[1]&0x08)==1)
	   {
          Stauts5="下限位 出错";
	   }
	   else
	   {
          Stauts5="上限位 正确";
	   } 

       if((check[1]&0x04)==1)
	   {
          Stauts6="上限位 出错";
	   }
	   else
	   {
          Stauts6="上限位 正确";
	   }

      //向信息报告文件中,写入检查结果
  
      WritePrivateProfileString("系统自检", "信息1:", Stauts1, InitDir2);
      WritePrivateProfileString("系统自检", "信息2:", Stauts2, InitDir2); 
      WritePrivateProfileString("系统自检", "信息3:", Stauts3, InitDir2);
      WritePrivateProfileString("系统自检", "信息4:", Stauts4, InitDir2);
	  WritePrivateProfileString("系统自检", "信息5:", Stauts5, InitDir2);
      WritePrivateProfileString("系统自检", "信息6:", Stauts6, InitDir2);

     //*********************************************************
	 //CCD板自检,一共有5个CCD头,通过函数调用,并写到相应的文件中.
	 //*********************************************************
	 for(i=2;i<7;i++)
	 {
	   CCD_CHECK(check[i]);
	 }
	 //*********************************************************
	 //CCD板校正状态检查,通过调用函数,并写到相应的文件中
	 //********************************************************
     for(i=7;i<12;i++)
	 {
	   CCD_JIAOZHENG(check[i]);
	 } 
     //********************************************************
	 //参数设置状态检查
	 //********************************************************
     //系统板检测结果,并且写道报告文件中
	   if((check[12]&0x80)==1)
	   {
          Stauts1="分辨率参数设置 出错";
	   }
	   else
	   {
          Stauts1="分辨率参数设置 正确";
	   }

       if((check[12]&0x40)==1)
	   {
          Stauts2="X方向起点坐标设置 出错";
	   }
	   else
	   {
          Stauts2="X方向起点坐标设置 正确";
	   }
       
       if((check[12]&0x20)==1)
	   {
          Stauts3="Y方向起点坐标设置 出错";
	   }
	   else
	   {
          Stauts3="Y方向起点坐标设置 正确";
	   }

       if((check[12]&0x10)==1)
	   {
          Stauts4="X方向扫描宽度设置 出错";
	   }
	   else
	   {
          Stauts4="X方向扫描宽度设置 正确";
	   }
     
       if((check[12]&0x08)==1)
	   {
          Stauts5="Y方向扫描宽度设置 出错";
	   }
	   else
	   {
          Stauts5="Y方向扫描宽度设置 正确";
	   } 

       if((check[12]&0x04)==1)
	   {
          Stauts6="像素位数设置 出错";
	   }
	   else
	   {
          Stauts6="像素位数设置 正确";
	   }
    
       if((check[12]&0x02)==1)
	   {
          Stauts7="扫描宽度参数设置或者CCD头的像元设置 出错";
	   }
	   else
	   {
          Stauts7="扫描宽度参数设置或者CCD头的像元设置 正确";
	   }

       if((check[12]&0x01)==1)
	   {
          Stauts8="定位位置超出最大极限  出错";
	   }
	   else
	   {
          Stauts8="定位位置未超出最大极限 正确";
	   }

      //向信息报告文件中,写入检查结果
      WritePrivateProfileString("参数设置状态", "信息1:", Stauts1, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息2:", Stauts2, InitDir2); 
      WritePrivateProfileString("参数设置状态", "信息3:", Stauts3, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息4:", Stauts4, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息5:", Stauts5, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息6:", Stauts6, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息7:", Stauts7, InitDir2);
      WritePrivateProfileString("参数设置状态", "信息8:", Stauts8, InitDir2);
    }//结束出错检查
    return;
} 

//CCD板在自检,并将检查结果写到report文件中.
void CSetScanner::CCD_CHECK(int check)
{
  	CString   Stauts1;
    CString   Stauts2;
    CString   Stauts3; 
    CString   Stauts4;
    CString   Stauts5;

	CString   Stauts[5];
	int i;
   //CCD板自检状态,并且写到报告文件中
   if((check&0x80)==1)
   {
     Stauts1="LM9812 自检出错";
   }
   else
   {
     Stauts1="LM9812 自检正确";
   }

   if((check&0x40)==1)
   {
      Stauts2="像素FIFO 自检出错";
   }
   else
   {
      Stauts2="像素FIFO 自检正确";
   }
       
   if((check&0x20)==1)
   {
     Stauts3="偏移校正FIFO 自检出错";
   }
   else
   {
     Stauts3="偏移校正FIFO 自检正确";
   }

   if((check&0x10)==1)
   {
     Stauts4="增益校正FIFO自检 出错";
   }
   else
   {
     Stauts4="增益校正FIFO自检 正确";
   }

   if((check&0x08)==1)
   {
     Stauts5=

⌨️ 快捷键说明

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