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

📄 stepcali.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//分步校正命令下传参数

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