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

📄 pr2driver.c

📁 hid类主机对打印机操作的应用例程
💻 C
📖 第 1 页 / 共 5 页
字号:
	{"\x1bH\x00"		,	0    },		/*12 _OKI_ABSCOL%03d    绝对列定位        */
	{"\x00"	        ,	0    },		/*13 _OKI_RLTCOL%03d    相对列定位        */
		
	{"\x00"				,	0    },		/*14               暂时关闭辅口      */
	{"\x00"				,	0    },		/*15               取消暂时关闭辅口  */
	{"\x00"				,	0    },		/*16               置检测纸边标志    */
	{"\x00"				,	0    },		/*17               取消置检测纸边标志*/
		
	{"\x1bU\x00"		,   0    },		/*18  _OKI_DUWIDTH      倍宽              */
	{"\x1bR\x00"		,   0    },		/*19  _OKI_NODUWIDTH    取消倍宽          */
	{"\x1b]\x00"		,   0    },		/*20  _OKI_NODUHEIGHT   取消倍高          */
	{"\x1b[\x1bU\x00"   ,   0    },		/*21  _OKI_DUHEIGHTWIDTH倍高倍宽          */
	{"\x1b]\x1bR\x00"   ,   0    },		/*22  _OKI_NODUHEIGHTWIDTH取消倍高倍宽    */
	{"\x1bj\x00"		,  	0    },		/*23  _OKI_NOBOLDFONT   取消黑体          */
    {"\x18\x00"			,   0    },		/*24  _OKI_RESET        总清              */
		
	{"\x00"				,   0    },     /*25  _OKI_AUTOOPRT     赋予自动操作      */
	{"\x00"				,	0	 },     /*26  _OKI_OLIVETTI     设置_OKI_OLIVETTI方式  */
	{"\x00"				,   0    },     /*27  _OKI_OPRREQ       设置操作员请求    */ 
		
	{"\x1c\x67\x00"		,   0    },		/*28  _OKI_TRIWIDTH     三倍宽            */   
	{"\x1c\x68\x00"		,   0    },		/*29  _OKI_NOTRIWIDTH   取消三倍宽        */
	{"\x1b\x58\x00"		,   0    },     /*30  _OKI_UNDERLINE    下划线            */
	{"\x1b\x59\x00"		,   0    },     /*31  _OKI_UNDERLINE    取消下划线        */
		
	{"\x00"				,	0    },		/*32               初始化操作        */
	{"\x00"				,	0    },		/*33               等待进纸          */
	{"\x1b\x3c\x00"		,	0    },		/*34               水平压缩          */
	{"\x1b\x3e\x00"		,	0    },		/*35               取消水平压缩          */
	{"\x00"				,	0    },		/*36               add by zhanghui  2005.5.11        */
};

struct _OKI_PrtStatus {
	int  	paper               ;    /*是否进纸标志 0无纸,1有纸	                  */
	
	//add for OKI
	int cmdlen					;	
	int row						;
	//end of add
	
	int 	comflag             ;    /*关闭辅口时,记录辅口状态1开,0关             */
	int		detected            ;    /* 检测纸边标志,默认检测		              */
	int     cpi			        ;    /* 设置列距 输入参数 字符/英寸               */
								     /*		  0,1       10  cpi                   */
							         /*		  2         12  cpi                   */
							         /*		  3         15  cpi                   */
							         /*		  4         16.6cpi                   */
					    		     /*		  8         17.1cpi                   */
	int     lpi       	        ;	 /* 设置行距 0nn表示行步距为 nn/240英寸       */
    int     topmargin 	        ;	 /* 设页顶距 nnn表示页顶长为nnn/240英寸       */
    int     pagelen    	        ;	 /* 设定页长 nnn 表示行数                     */
    int     absrow     	        ; 	 /* 绝对行定位nnn表示移动到第nnn行            */
    int     rltrow     	        ;	 /* 相对行定位nnn表示向前移动nnn行            */
	int     abscol     	        ;	 /* 绝对列定位nnn表示移动到当前行第nnn个字符处*/
	int     rtlcol     	        ;	 /* 相对列定位 向右 移动nnn个字符             */
	int     macroptr            ;
	char	macrocmd[_OKI_CMDDATALEN];
}PR2DRIVER(oki_prter);

char PR2DRIVER(OKI_LineLocation)   [] = {      _OKI_ESC , 0x0b,'0' ,'0' ,0x00 };//设置绝对垂直定位

char PR2DRIVER(OKI_LinePIn)   [5];
char PR2DRIVER(OKI_ClearErr)       [] = {		 0x00      };
char PR2DRIVER(OKI_Cpi)            [] = {      0x1c, 0x24, 0x09, 0x00           };
char PR2DRIVER(OKI_OKITOOLIVETTI)            [] = {_OKI_ESC,'^','1',0x00         };

void	PR2DRIVER(OKI_Init)();
int PR2DRIVER(OKI_SetPropAndVal) (byte device[],int len);
int PR2DRIVER(OKI_inPutPaper)(char* pPageTopMargin, char *LinePI);

int OLIVETTI_TO_OKI =0;
int absLine = 2;

/***********************OKI仿真声明end***********************************/




/*************************************************************************************
********************************初始化打印参数,同时进纸*******************************
*************************************************************************************/	
void usleep(int tm){
	Sleep(tm);
}

void PR2DRIVER(print)(char* str,int ret){
		printf("%s %d",str,ret);
}


int PR2DRIVER(Init)()                           
{	
//修改初始化值
	PR2DRIVER(prter).paper    = 0   ;            /* 是否进纸标志 0无纸,1有纸		             */
	
	//add by zhanghui,2005.5.11
	//PR2DRIVER(prter).msf_direction = 0;
	//PR2DRIVER(prter).papernotout = 0;
	
	PR2DRIVER(prter).comflag  = 0   ;            /* 关闭辅口时,记录辅口状态1开,0关            */
	PR2DRIVER(prter).detected = 0   ;            /* 检测纸边标志,默认检测		             */
	PR2DRIVER(prter).cpi      = 0   ;		      /* 设置列距 输入参数 字符/英寸               */
								      /*		     0,1       10  cpi               */
							          /*		     2         12  cpi               */
							          /*		     3         15  cpi               */
							          /*		     4         16.6cpi               */
					    			  /*		     8         17.1cpi               */
	PR2DRIVER(prter).lpi      = 0   ;      	  /* 设置行距 0nn表示行步距为 nn/240英寸       */
    PR2DRIVER(prter).topmargin= 070 ;     	      /* 设页顶距 nnn表示页顶长为nnn/240英寸       */
    PR2DRIVER(prter).pagelen  = 070 ;  		  /* 设定页长 nnn 表示行数                     */
    PR2DRIVER(prter).absrow   = 0   ;      	  /* 绝对行定位nnn表示移动到第nnn行            */
    PR2DRIVER(prter).rltrow   = 0   ;    		  /* 相对行定位nnn表示向前移动nnn行            */
	PR2DRIVER(prter).abscol   = 0   ;    		  /* 绝对列定位nnn表示移动到当前行第nnn个字符处*/
	PR2DRIVER(prter).rtlcol   = 0   ;    		  /* 相对列定位 向右 移动nnn个字符             */
	PR2DRIVER(prter).macroptr = 0   ;
	memset(PR2DRIVER(prter).macrocmd,0x00,_PR2DRIVER_CMDDATALEN);
	
	PR2DRIVER(OKI_Init)();
	return 0;
}

/*******************************************************************
检测发送进纸命令后,打印机进纸成功与否状态
函数返回值:0   状态正常,
			-1 状态不正常,但是打印机有返回值,
			-2 打印机无返回值
*******************************************************************/
int PR2DRIVER(checkInputPaper)()
{
	char retbuf[4];
	int i;
	int ret;

	PR2DRIVER(WriteComm)(PR2DRIVER(AutoOprt),strlen(PR2DRIVER(AutoOprt)));
	memset(retbuf,0x00,4);
	for(i=0;i<3;) {
		ret=PR2DRIVER(ReadComm)(retbuf+i,1);
		if(ret<0)
		  return ret;
		if(retbuf[0]==0x1b) 
			i++;
		if(retbuf[i] <0) 
			break;
	}
	retbuf[i]=0;
	if(!strcmp(retbuf,PR2DRIVER(AutoOprtOk)))	
		return 0;
	return 1;
}

/***************************************************************
	打印机进纸函数:
	使用oliv 命令集
	返回值: 0 成功
***************************************************************/
int PR2DRIVER(inPutPaper)(char* pPageTopMargin, char *LinePI)
{ 
	/* 每次进纸都作打印机类型检测           */
	/* 以应付屏幕打印与打印机打印之间的切换 */
	/**********************************************************/
	unsigned int  i ;
	char          ch;
	int           status=0;
	int           ret;

    time_t ltime;
	//time_t now;
    time(&ltime );

	PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
	while(1)
	{
		PR2DRIVER(WriteComm)(PR2DRIVER(OpenPrt)  ,strlen(PR2DRIVER(OpenPrt)  ));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
		PR2DRIVER(WriteComm)(PR2DRIVER(OliveBook),strlen(PR2DRIVER(OliveBook)));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
		PR2DRIVER(WriteComm)(PR2DRIVER(PaperLength),strlen(PR2DRIVER(PaperLength)));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr)   ,strlen(PR2DRIVER(ClearErr)   ));

		if((ret=PR2DRIVER(checkPrtAnswerState)())!=0)
		{	
			printf("ret is %d!\n",ret);
			#ifdef _DEBUG_PR2DRIVER
				PR2DRIVER(print)( "ret=PR2DRIVER(checkPrtAnswerState)() =%d\n",ret);
			#endif							
			PR2DRIVER(WriteComm)(PR2DRIVER(Reset)    ,strlen(PR2DRIVER(Reset)));
			PR2DRIVER(WriteComm)(PR2DRIVER(ClosePrt),strlen(PR2DRIVER(ClosePrt)));
			usleep(100);

			continue;
		}

		while(1)
		{
			PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr),strlen(PR2DRIVER(ClearErr)));
	 		if((status=PR2DRIVER(checkInputPaper)())) 
			{
				PR2DRIVER(WriteComm)(PR2DRIVER(ClosePrt),strlen(PR2DRIVER(ClosePrt)));
				PR2DRIVER(WriteComm)(PR2DRIVER(OpenPrt) ,strlen(PR2DRIVER(OpenPrt) ));
				PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr)   ,strlen(PR2DRIVER(ClearErr)   ));
				usleep(100);
				continue;
			}
			else if(status==0)	
					break;	
			
			MessageBox(NULL,"hehe","hhe",MB_OK);
				
		}
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr),strlen(PR2DRIVER(ClearErr)));
		if(strlen(pPageTopMargin)==0)
			PR2DRIVER(WriteComm)(PR2DRIVER(PageTopMargin),strlen(PR2DRIVER(PageTopMargin)));
		else
		{
			if(pPageTopMargin == NULL)
				return -2;
			for(i=0; i<strlen(pPageTopMargin); i++)
			{
				ch = *(pPageTopMargin+i);
				if(ch<'0'||ch>'9')
					return -3;
			}

			i= atoi(pPageTopMargin);
			if((i<0)||i>999)
				return -3;
			pPageTopMargin = (char*)malloc(6);
			memset (pPageTopMargin,0,6);
			sprintf(pPageTopMargin,"\x1bT%03d",i);
			PR2DRIVER(WriteComm)(pPageTopMargin,strlen(pPageTopMargin));
			if(PR2DRIVER(checkPrtAnswerState)()!=0)
				return -1;
			free(pPageTopMargin);
		}

		/********GBK	2001.12.07**************/
		PR2DRIVER(WriteComm)(PR2DRIVER(ToGBK),strlen(PR2DRIVER(ToGBK)));
		/***************************************/
		PR2DRIVER(WriteComm)(LinePI, strlen(LinePI));
		PR2DRIVER(WriteComm)(PR2DRIVER(LineLocation),strlen(PR2DRIVER(LineLocation)));//实际上进纸指令
		if(PR2DRIVER(checkPrtAnswerState)())
		{
			PR2DRIVER(WriteComm)(PR2DRIVER(Reset)    ,strlen(PR2DRIVER(Reset)));				
			PR2DRIVER(WriteComm)(PR2DRIVER(ClosePrt),strlen(PR2DRIVER(ClosePrt)));
			continue;
		}
		else
			break;
	}
	PR2DRIVER(WriteComm)(PR2DRIVER(PrtCmd)[5].Cmd,strlen(PR2DRIVER(PrtCmd)[5].Cmd));//正常字体
	PR2DRIVER(WriteComm)("\x1b#0",3);
	if(PR2DRIVER(vTPrtStateCheck)()!=0)
		return -2;
	PR2DRIVER(WriteComm)(PR2DRIVER(Cpi)    ,strlen(PR2DRIVER(Cpi)    ));		//_PR2DRIVER_CPI%03d _PR2DRIVER_ESC a 3

	PR2DRIVER(WriteComm)(PR2DRIVER(NewLine),strlen(PR2DRIVER(NewLine)));
	PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr),strlen(PR2DRIVER(ClearErr)));
	PR2DRIVER(WriteComm)(PR2DRIVER(NewLine),strlen(PR2DRIVER(NewLine)));

	return 0;//PR2DRIVER(checkPrtAnswerState)();
}
int PR2DRIVER(prtInit)(char* pPageTopMargin, char *LinePI)
{ 
	/* 每次读内置磁条都作打印机类型检测和初始化,但超时需要退出           */
	/**********************************************************/
	unsigned int  i ;
	char          ch;
	int           status=0;
	int           ret;

    	time_t ltime;

	#ifdef _DEBUG_PR2DRIVER
		PR2DRIVER(print)( "Time in seconds since UTC 1/1/70:",(int)ltime);
	#endif

	//PR2DRIVER(WriteComm)(PR2DRIVER(Reset)    ,strlen(PR2DRIVER(Reset)));
	PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
	for(ltime = time(NULL);time(NULL)-ltime<PR2DRIVER(iIoTimeout);)
	{
		PR2DRIVER(WriteComm)(PR2DRIVER(OpenPrt)  ,strlen(PR2DRIVER(OpenPrt)  ));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
		PR2DRIVER(WriteComm)(PR2DRIVER(OliveBook),strlen(PR2DRIVER(OliveBook)));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr) ,strlen(PR2DRIVER(ClearErr) ));
		PR2DRIVER(WriteComm)(PR2DRIVER(PaperLength),strlen(PR2DRIVER(PaperLength)));
		PR2DRIVER(WriteComm)(PR2DRIVER(ClearErr)   ,strlen(PR2DRIVER(ClearErr)   ));

		if((ret=PR2DRIVER(checkPrtAnswerState)())!=0)
		{	
			#ifdef _DEBUG_PR2DRIVER
				PR2DRIVER(print)( "ret=PR2DRIVER(checkPrtAnswerState)() =%d\n",ret);
			#endif							
			PR2DRIVER(WriteComm)(PR2DRIVER(Reset)    ,strlen(PR2DRIVER(Reset)));
			PR2DRIVER(WriteComm)(PR2DRIVER(ClosePrt),strlen(PR2DRIVER(ClosePrt)));
			usleep(100);
			continue;
		}

⌨️ 快捷键说明

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