📄 stepcali.cpp
字号:
//分步校正命令下传参数
#include <windows.h>
#include "stdafx.h"
#include "source10.h"
#include "wnaspi32.h"
#include "scsidefs.h"
#include "Scanner.h"
#include "Setscanner.h"
#include "stepcali.h"
extern char InitDir2[100];
extern CSetScanner *pSetScanner;
extern unsigned char Def_Stp_Para[300]; //下传缺省参数150B+分步校正参数150B存储缓冲区
unsigned char Stp_Cai_XGP[1710]; //上传实际分步校正参数150B+效果参数1552B+8B存储缓冲区
/*==========================================================/
/ *****下传分步校正参数包并显示校正效果参数***** /
/ input: inStep ---> 分步校正的步号 /
/ return value : =0 -> 正常退出 /
/ =1 -> /
/ =2 -> /
/==========================================================*/
int Step_Cali(int inStep)
{
//加入在参数输入对话框中显示“进入下传分步校正参数包SCSI命令程序”功能
//AfxMessageBox("进入下传分步校正参数包SCSI命令程序");
//初始化SCSI调用缓冲区
DWORD ASPI32Status=0xff;
SRB_ExecSCSICmd mySRBEIO;
for(int i=0;i<16;i++)
mySRBEIO.SenseArea[i]=0;
int ASPI_Host_Adapter_ID1;
ASPI_Host_Adapter_ID1=GetPrivateProfileInt("ASPI_Adapter","ASPI",0,InitDir2);
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;
//分步校正下传参数包Def_Stp_Para缓冲区300个字节:150字节的缺省参数及150字节的分步参数
mySRBEIO.SRB_BufLen =300;
mySRBEIO.SRB_BufPointer =(unsigned char *)Def_Stp_Para;
mySRBEIO.SRB_SenseLen =SENSE_LEN;
mySRBEIO.SRB_CDBLen =6;
mySRBEIO.SRB_HaStat =0;
mySRBEIO.SRB_TargStat =0;
mySRBEIO.SRB_Rsvd2 =0;
mySRBEIO.CDBByte[0] =0x15; //分步校正SCSI命令包 CDBLen=6。命令码=15H
mySRBEIO.CDBByte[1] =0x00;
mySRBEIO.CDBByte[2] =LOBYTE(inStep);//分步校正模式字节(步号)
mySRBEIO.CDBByte[3] =HIBYTE(300);
mySRBEIO.CDBByte[4] =LOBYTE(300);
mySRBEIO.CDBByte[5] =0;
mySRBEIO.SRB_PostProc =0;
ASPI32Status =SendASPI32Command((LPSRB) &mySRBEIO);
while(mySRBEIO.SRB_Status==SS_PENDING);
if(mySRBEIO.SRB_Status==SS_ERR)
{
AfxMessageBox("SCSI状态==ss_error");
//return 1;
}
if(mySRBEIO.SRB_TargStat!=0x00) //约定GOOD为00H,检查出错为02H
{
pSetScanner->SCSI_CHECK();
//return 2;
}
// *****底层校正结果信息获取与显示*****
//加入在参数输入对话框中显示“进入底层校正结果信息获取与显示SCSI命令程序”功能
// AfxMessageBox("进入底层校正结果信息获取与显示SCSI命令程序");
for(i=0;i<1710;i++)
Stp_Cai_XGP[i]=1;
//初始化SCSI调用缓冲区
ASPI32Status=0xff;
for(i=0;i<16;i++)
mySRBEIO.SenseArea[i]=0;
ASPI_Host_Adapter_ID1=GetPrivateProfileInt("ASPI_Adapter","ASPI",0,InitDir2);
mySRBEIO.SRB_Cmd =SC_EXEC_SCSI_CMD;
mySRBEIO.SRB_Status =0;
mySRBEIO.SRB_HaId =ASPI_Host_Adapter_ID1;
mySRBEIO.SRB_Flags =SRB_DIR_IN; //2004-01-8
mySRBEIO.SRB_Hdr_Rsvd =0;
mySRBEIO.SRB_Target =6;
mySRBEIO.SRB_Lun =0;
mySRBEIO.SRB_Rsvd1 =0;
//上传实际分步校正参数150B+效果参数1532B+8B存储缓冲区:Stp_Cai_XGP[1710]
mySRBEIO.SRB_BufLen =1710;
mySRBEIO.SRB_BufPointer = (unsigned char*)Stp_Cai_XGP;
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] =0x01; //读取数据类型,0是图像数据,1是分步校正效果参数
mySRBEIO.CDBByte[3] =0;
mySRBEIO.CDBByte[4] =LOBYTEOFWORD(inStep); //分步校正模式字节
mySRBEIO.CDBByte[5] =0;
mySRBEIO.CDBByte[6] =SECONDBYTEOFDWORD(1710); //上传效果参数包的长度
mySRBEIO.CDBByte[7] =THIRDBYTEOFDWORD(1710);
mySRBEIO.CDBByte[8] =LASTBYTEOFDWORD(1710);
mySRBEIO.CDBByte[9] =0;
mySRBEIO.SRB_PostProc =0;
ASPI32Status = SendASPI32Command( (LPSRB) &mySRBEIO);
while(mySRBEIO.SRB_Status==SS_PENDING);
if(mySRBEIO.SRB_Status!=SS_COMP)
{
AfxMessageBox("读取校正结果参数出错");
// return 3; //1 --->读取校正结果参数出错
}
if(mySRBEIO.SRB_TargStat==0x02) //约定GOOD为00H,检查出错为02H
{
AfxMessageBox("底层扫描仪校正操作异常");
pSetScanner->SCSI_CHECK();
// return 4; //2 --->底层扫描仪校正操作异常
}
// *****将获取的分步校正效果参数写入正文文件并显示*****
FILE *fp; // 校正效果文件头,每头R、G、B 3字节的校正参数
char Cali_RName[30];
char Cali_Title[20];
char Title_Tmp[20];
switch (inStep)
{
case 0:
case 1: //粗/精感光时间设置
if(inStep==0)
{
strcpy(Cali_RName,"感光初始获取.txt");
strcpy(Cali_Title,"感光初始获取");
}
else
{
strcpy(Cali_RName,"感光精调.txt");
strcpy(Cali_Title,"感光精调");
}
fp = fopen(GetFullFilePath(Cali_RName),"wt");
fprintf(fp," ================ %s ================\n",Cali_Title);
if(inStep==0)
GangG_Disp(0,Cali_Title,fp); //感光初始获取校正参数及效果参数写入fp文件
else
GangG_Disp(1,Cali_Title,fp); //感光精校正参数及效果参数写入fp文件
break;
case 2:
case 3: //粗/精静态偏移设置
if(inStep==2)
{
strcpy(Cali_RName,"偏移初始获取.txt");
strcpy(Cali_Title,"偏移初始获取");
}
else
{
strcpy(Cali_RName,"偏移精调.txt");
strcpy(Cali_Title,"偏移精调");
}
fp = fopen(GetFullFilePath(Cali_RName),"wt");
fprintf(fp," ================ %s ================\n",Cali_Title);
/*
strcpy(Title_Tmp,"感光校正及效果");
GangG_Disp(1,Title_Tmp,fp); //感光校正参数及效果参数写入fp文件
*/
OFFset_Disp(Cali_Title,fp); //静态偏移校正参数及效果参数写入fp文件
break;
case 4:
case 5: //粗/精静态增益设置
if(inStep==4)
{
strcpy(Cali_RName,"增益初始获取.txt");
strcpy(Cali_Title,"增益初始获取");
}
else
{
strcpy(Cali_RName,"增益精调.txt");
strcpy(Cali_Title,"增益精调");
}
fp = fopen(GetFullFilePath(Cali_RName),"wt");
fprintf(fp," ================ %s ================\n",Cali_Title);
/*
strcpy(Title_Tmp,"感光校正及效果");
GangG_Disp(1,Title_Tmp,fp); //感光校正参数及效果参数写入fp文件
strcpy(Title_Tmp,"偏移校正及效果");
OFFset_Disp(Title_Tmp,fp); //静态偏移校正参数及效果参数写入fp文件
*/
Gain_Disp(Cali_Title,fp); //增益及偏色校正参数及效果参数写入fp文件
break;
case 6:
case 7:
if(inStep==6)
{
strcpy(Cali_RName,"缺省完整校正效果.txt");
strcpy(Cali_Title,"缺省完整校正效果");
}
else
{
strcpy(Cali_RName,"参数文件校正效果.txt");
strcpy(Cali_Title,"参数文件校正效果");
}
fp = fopen(GetFullFilePath(Cali_RName),"wt");
fprintf(fp," ================ %s ================\n",Cali_Title);
strcpy(Title_Tmp,"感光校正及效果");
GangG_Disp(1,Title_Tmp,fp); //感光校正参数及效果参数写入fp文件
strcpy(Title_Tmp,"偏移校正及效果");
OFFset_Disp(Title_Tmp,fp); //静态偏移校正参数及效果参数写入fp文件
strcpy(Title_Tmp,"增益及偏色校正及效果");
Gain_Disp(Title_Tmp,fp); //增益及偏色校正参数及效果参数写入fp文件
break;
default:
strcpy(Cali_RName,"无效.txt");
break;
}
fclose(fp);
char IniFile[120];
GetWindowsDirectory(IniFile,sizeof(IniFile));
char pFilePath[120];
strcpy(pFilePath,strcat(IniFile,"\\twain_32\\MTIScanner"));
ShellExecute(NULL,NULL,_T(Cali_RName),NULL,pFilePath,SW_MAXIMIZE);
return 0; //0 --->正常退出
}
/*====================2004.2.24=================/
/ *****分步校正效果参数显示格式行写入***** /
/ 感光校正参数及效果参数写入fp文件 /
/==============================================*/
void GangG_Disp(int c_j_flg,CString Cali_Title,FILE *fp)
{
//从上传效果参数中提取底层实际使用的附加及延时时间参数
for (int i=0;i<32;i++)
Def_Stp_Para[i+150+8]=Stp_Cai_XGP[i+8]; //以上传值更新保存参数值
int JZP,XGP; //对应校正步号返回的校正参数及效果参数的位置
int GGt,GGc;
GGt=250;
GGc=(Def_Stp_Para[150]<<8) | (Def_Stp_Para[151]);
fprintf(fp," \n");
fprintf(fp," \n");
fprintf(fp,"========================================================== %s ======================================================\n",Cali_Title);
fprintf(fp," \n");
fprintf(fp," 感光时间基值(单位22us): %d 感光目标码: %d \n",GGt,GGc);
fprintf(fp," \n");
fprintf(fp," ==各CCD头的附加感光时间(单位:22us)==\n");
fprintf(fp," CCD1 CCD2 CCD3 CCD4 CCD5 \n");
fprintf(fp," %5d%7d%7d%7d%7d\n",Def_Stp_Para[158],Def_Stp_Para[159],Def_Stp_Para[160],Def_Stp_Para[161],Def_Stp_Para[162]);
if (c_j_flg==1) //感光时间初始获取时(c_j_flg=0),不系数附加感光效果
{
JZP=1; //设置JZP=1,决定在写入时单另处理。
XGP=150+0; //CCD头附加感光时间校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+0
fprintf(fp," \n");
fprintf(fp," ==附加感光时间校正效果参数==\n");
Cali_Disp(JZP,XGP,fp); //附加感光时间校正效果参数格式化写入
}
JZP=166; //CCD头感光校正参数在Def_Stp_Para缓冲区中的起始位置=166
XGP=150+240; //CCD头感光校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+240
fprintf(fp," \n");
fprintf(fp," ==延迟感光时间校正参数及校正效果系数==\n");
Cali_Disp(JZP,XGP,fp); //感光时间校正参数及校正效果系数格式化写入
}
/*====================2004.2.24=================/
/ *****分步校正效果参数显示格式行写入***** /
/ 静态偏移校正参数及效果参数写入fp文件 /
/==============================================*/
void OFFset_Disp(CString Cali_Title,FILE *fp)
{
//从上传效果参数中提取底层实际使用的静态偏移参数
for (int i=0;i<24;i++)
Def_Stp_Para[i+150+40]=Stp_Cai_XGP[i+40]; //以上传值更新保存参数值
int JZP,XGP; //对应校正步号返回的校正参数及效果参数的位置
fprintf(fp," \n");
fprintf(fp," \n");
fprintf(fp,"========================================================== %s ======================================================\n",Cali_Title);
JZP=190; //CCD头静态偏移校正参数在Def_Stp_Para缓冲区中的起始位置=190
XGP=150+480; //CCD头静态偏移校正效果参数在Stp_Cai_XGP缓冲区中的起始位置=150+480
fprintf(fp," \n");
fprintf(fp," ==静态偏移校正参数及校正效果系数==\n");
Cali_OFF_Dsp(JZP,XGP,fp); //静态偏移校正参数及校正效果系数格式化写入
}
/*====================2004.2.24=================/
/ *****分步校正效果参数显示格式行写入***** /
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -