?? 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 + -