📄 setscanner.cpp
字号:
/--------------------------------------------------------------*/
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 + -