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

📄 pr2driver.c

📁 hid类主机对打印机操作的应用例程
💻 C
📖 第 1 页 / 共 5 页
字号:
#include "Pr2Driver.h"
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
#include "ReadCfg.h"

#include <windows.h>
HANDLE hcom=NULL;
 

#undef _DEBUG_PR2DRIVER

#define PR2DRIVER(foo) Java_Pr2Driver_ ## foo


#define TRUE            1
#define FALSE           0
#define _PR2DRIVER_CHARSET         "GBK"
//#define GBK //如果打印机支持GBK,可以去掉此行,add by zhanghui

#define _PR2DRIVER_CMDNUM          64
#define	_OKI_CMDNUM					64
#define _PR2DRIVER_PRTCMDLEN       256
#define _PR2DRIVER_CMDDATALEN      256
#define _PR2DRIVER_ESC	            0x1b

#define _PR2DRIVER_CR         		0 	/* 回车                                          */
#define _PR2DRIVER_LF         		1 	/* 换行                                          */
#define _PR2DRIVER_FF         		2 	/* 退纸                                          */
#define _PR2DRIVER_DUHEIGHT			3 	/* 倍高                                          */
#define _PR2DRIVER_BOLDFONT			4 	/* 黑体                                          */
#define _PR2DRIVER_NORMFONT			5 	/* 普通字体                                      */
#define _PR2DRIVER_CPI				6 	/* 设置列距 输入参数          字符/英寸          */
										/*			  0,1              10  cpi           */
										/*			  2                12  cpi           */
										/*			  3                15  cpi           */
										/*			  4                16.6cpi           */
										/*			  8                17.1cpi           */
#define _PR2DRIVER_LPI       		7 	/* 设置行距 0nn表示行步距为 nn/240英寸           */
#define _PR2DRIVER_TOPMARGIN  		8   /* 设页顶距 nnn表示页顶长为nnn/240英寸,小于70无效*/
#define _PR2DRIVER_PAGELEN    		9 	/* 设定页长 nnn 表示行数                         */
#define _PR2DRIVER_ABSROW     		10	/* 绝对行定位 nnn 表示移动到第nnn行              */
#define _PR2DRIVER_RLTROW     		11	/* 相对行定位 nnn 表示向前移动nnn行              */
#define _PR2DRIVER_ABSCOL     		12	/* 绝对列定位 nnn 表示移动到当前行第nnn个字符处  */
#define _PR2DRIVER_RLTCOL     		13	/* 相对列定位 向右 移动nnn个字符                 */
#define _PR2DRIVER_PAUSE      		14	/* 暂时关闭辅口,用于多次上主机                   */
#define _PR2DRIVER_NOPAUSE    		15	/* 取消暂时关闭辅口,用于多次上主机               */
#define _PR2DRIVER_PAGDETECT 		16  /* 置检测纸边标志                                */
#define _PR2DRIVER_NOPAGDETECT 	17  /* 取消置检测纸边标志                            */
#define _PR2DRIVER_DUWIDTH         18  /* 倍宽                                          */
#define _PR2DRIVER_NODUWIDTH       19  /* 取消倍宽                                      */
#define _PR2DRIVER_NODUHEIGHT		20 	/* 取消倍高                                      */
#define _PR2DRIVER_DUHEIGHTWIDTH	21 	/* 倍高倍宽                                      */
#define _PR2DRIVER_NODUHEIGHTWIDTH	22 	/* 取消倍高倍宽                                  */
#define _PR2DRIVER_NOBOLDFONT		23  /* 取消黑体                                      */
#define _PR2DRIVER_RESET           24  /* 总清                                          */
#define _PR2DRIVER_AUTOOPRT        25  /* 赋予自动操作                                  */
#define _PR2DRIVER_OLIVETTI        26  /* 设置_PR2DRIVER_OLIVETTI方式                              */
#define _PR2DRIVER_OPRREQ          27  /* 设置操作员请求                                */
#define _PR2DRIVER_TRIWIDTH		28  /* 三倍宽                                        */
#define _PR2DRIVER_NOTRIWIDTH      29  /* 取消三倍宽                                    */
#define _PR2DRIVER_UNDERLINE       30  /* 下划线                                        */
#define _PR2DRIVER_NOUNDERLINE     31  /* 取消下划线                                    */
#define _PR2DRIVER_INIT            32  /* 初始化操作                                    */
#define _PR2DRIVER_INP             33  /* 等待进纸                                      */
#define _PR2DRIVER_COMPRESS        34  /* 水平压缩                                      */
#define _PR2DRIVER_DISAPOUT		35	/*置退纸标志*/
#define _PR2DRIVER_OLIVETTI_TO_OKI		36	/*转换成Oki仿真,一旦转换,则本次打印全为Oki仿真,不再提供中途变回Olivetti方式*/


#define	_MSF_IN_STRING_DIV	 0x0a                /*输入2、3磁道字符串间分隔符*/
#define MSFREAD2             1				
#define MSFREAD3             2				
#define MSFREAD23            3				
#define MSFWRITE2            4				
#define MSFWRITE3            5				
#define MSFWRITE23           6	


/***********************与宏指令对应的每一条PR2的指令*************************/
struct _PR2DRIVER_CMD
{
		char Cmd[_PR2DRIVER_PRTCMDLEN];
		int  OutCmdFlag;
	}PR2DRIVER(PrtCmd)[_PR2DRIVER_CMDNUM]={
		{"\x0d\x00"        ,	0    },		/*0  _PR2DRIVER_CR            回车              */
		{"\x0a\x0d\x00"    ,	0    },		/*1  _PR2DRIVER_LF            换行              */
		{"\x1b\x4f\x00"    ,	0    },		/*2  _PR2DRIVER_FF            退纸              */
		{"\x1bw1\x00"      ,	0    },		/*3  _PR2DRIVER_DUHEIGHT      倍高              */
		{"\x1b(\x00"       ,	0    },		/*4  _PR2DRIVER_BOLDFONT      黑体              */
		{"\x1b)\x1bw0\x1b\x34\x1c\x6a\x00",0 },/*5  _PR2DRIVER_NORMFONT   普通字体          */
		{"\x1b\x61\x00"    ,	0    },		/*6  _PR2DRIVER_CPI%03d       设置列距  输入参数*/
											/*			         10  cpi  0,1    */
											/*			         12  cpi  2      */
											/*			         15  cpi  3      */
											/*			         16.6cpi  4      */
											/*			         17.1cpi  8      */
		{"\x1b&\x00"       ,	0    },		/*7  _PR2DRIVER_LPI%03d       设置行距          */
		{"\x1bT\x00"       ,	0    },		/*8  _PR2DRIVER_TOPMARGIN%03d 设页顶距          */
		{"\x1bQ\x00"       ,	0    },		/*9  _PR2DRIVER_PAGELEN%03d   设定页长          */
		{"\x1bL\x00"       ,	0    },		/*10 _PR2DRIVER_ABSROW%03d    绝对行定位        */
		{"\x1bI\x00"       ,	0    },		/*11 _PR2DRIVER_RLTROW%03d    相对行定位        */
		{"\x1bH\x00"       ,	0    },		/*12 _PR2DRIVER_ABSCOL%03d    绝对列定位        */
		{"\x20\x00"	       ,	0    },		/*13 _PR2DRIVER_RLTCOL%03d    相对列定位        */
		{"\x00"            ,	0    },		/*14               暂时关闭辅口      */
		{"\x00"            ,	0    },		/*15               取消暂时关闭辅口  */
		{"\x00"            ,	0    },		/*16               置检测纸边标志    */
		{"\x00"            ,	0    },		/*17               取消置检测纸边标志*/
		{"\x1b\x33\x00"    ,    0    },		/*18  _PR2DRIVER_DUWIDTH      倍宽              */
		{"\x1b\x34\x00"    ,    0    },		/*19  _PR2DRIVER_NODUWIDTH    取消倍宽          */
		{"\x1bw0\x00"      ,    0    },		/*20  _PR2DRIVER_NODUHEIGHT   取消倍高          */
		{"\x1b\x64\x00"    ,    0    },		/*21  _PR2DRIVER_DUHEIGHTWIDTH倍高倍宽          */
		{"\x1b\x65\x00"    ,    0    },		/*22  _PR2DRIVER_NODUHEIGHTWIDTH取消倍高倍宽    */
		{"\x1b)\x00"       ,	0    },		/*23  _PR2DRIVER_NOBOLDFONT   取消黑体          */
        {"\x1b\x30\x00"    ,    0    },		/*24  _PR2DRIVER_RESET        总清              */
		{"\x1b\x2e\x00"    ,    0    },     /*25  _PR2DRIVER_AUTOOPRT     赋予自动操作      */
		{"\x1b\x6e\x1b\x53\x35\x00",0},     /*26  _PR2DRIVER_OLIVETTI     设置_PR2DRIVER_OLIVETTI方式  */
		{"\x1b\x55\x6e\x00",    0    },     /*27  _PR2DRIVER_OPRREQ       设置操作员请求    */ 
		{"\x1c\x68\x00"    ,    0    },		/*28  _PR2DRIVER_TRIWIDTH     三倍宽            */   
		{"\x1c\x6a\x00"    ,    0    },		/*29  _PR2DRIVER_NOTRIWIDTH   取消三倍宽        */
		{"\x1b\x2a\x30\00" ,    0    },     /*30  _PR2DRIVER_UNDERLINE    下划线            */
		{"\x1b\x2b\00"     ,    0    },     /*31  _PR2DRIVER_UNDERLINE    取消下划线        */
		{"\x1b&\00"        ,	0    },		/*32               初始化操作        */
		{"\x1b&\00"        ,	0    },		/*33               等待进纸          */
		{"\x00"            ,	0    },		/*34               水平压缩          */
		{"\x00"            ,	0    },		/*35               add by zhanghui,2005.5.11          */
		{"\x1b\x5e\x31"  ,	0    },		/*36   _PR2DRIVER_OLIVETTI_TO_OKI   update by tangxn  2007.8.27        */
	};
/*******************************打印机状态 结构体******************************/
struct _PR2DRIVER_PrtStatus {
	int  	paper               ;    /*是否进纸标志 0无纸,1有纸	                  */
	
	//add by zhanghui
	int	papernotout	;	/* 退纸标志0-退纸,1-屏蔽退纸 */
	int	msf_direction;	/*内置磁条标志,0-不用内置磁条,1-用内置磁条*/

	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[_PR2DRIVER_CMDDATALEN];
}PR2DRIVER(prter);

char PR2DRIVER(StateAsk)       [] = {      _PR2DRIVER_ESC , 'j',     0x00           };
char PR2DRIVER(StateOk)        [] = {      _PR2DRIVER_ESC , 'r','P' ,0x00           };

//add by zhanghui,2005.5.11
char PR2DRIVER(MagOk)          [] = { _PR2DRIVER_ESC, 'r','p',0x00		};

//modify by tangxn ,20060808  读写南天内置磁条
char PR2DRIVER(ReadMag2)       [] = {0x1b,'l',0x1b,'Y','E','R','@',0x1b,']',0x00			};//读二磁道
char PR2DRIVER(ReadMag3)       [] = {0x1b,'l',0x1b,'Y','E','T','@',0x1b,']',0x00			};//读三磁道
char PR2DRIVER(ReadMag23)       [] = {0x1b,'l',0x1b,'Y','E','R','@',0x1b,']',0x1b,'l',0x1b,'Y','E','T','@',0x1b,']',0x00		};//读二三磁道
char PR2DRIVER(WriteMag2)      [] = {0x1b,'l',0x1b,'Y','E','R','@',0x1b,'t',0x00			};//写二磁道
char PR2DRIVER(WriteMag3)       [] = {0x1b,'l',0x1b,'Y','E','T','@',0x1b,'t',0x00			};//写三磁道
char PR2DRIVER(WriteMag23)       [] = {0x1b,'l',0x1b,'Y','E','R','@',0x1b,'t',0x1b,'l',0x1b,'Y','E','T','@',0x1b,'t',0x00		};//写二三磁道
char PR2DRIVER(WrMagTail)      [] = { 0x1d,0x1b,0x5c,0x00	};//内置磁条写数据结束符


char PR2DRIVER(IdentifyPrint)  [] = {      _PR2DRIVER_ESC , 'Z',     0x00			  };/* 打印机类型ID识别            */
char PR2DRIVER(ClearAll)       [] = {      _PR2DRIVER_ESC , '0',     0x00           };
char PR2DRIVER(AutoOprtOk)     [] = {      _PR2DRIVER_ESC , 'r',0x25,0x00           };
char PR2DRIVER(AutoOprt)       [] = {      _PR2DRIVER_ESC , '.',_PR2DRIVER_ESC ,'U' ,'n' ,0x00 };//赋予自动操作  操作员请求
char PR2DRIVER(PageTopMargin)  [] = {      _PR2DRIVER_ESC , 'T','0' ,'7' , '0',0x00 };//设定页顶高度
char PR2DRIVER(LineLocation)   [] = {      _PR2DRIVER_ESC , 'L','0' ,'0' ,'0' ,0x00 };//设置绝对垂直定位
char PR2DRIVER(LinePIn)   [5];
char PR2DRIVER(PaperLength)    [] = {      _PR2DRIVER_ESC , 'Q','2' ,'5' ,'0' ,_PR2DRIVER_ESC ,0x5a ,0x00};
char PR2DRIVER(ClearErr)       [] = {		0x7f,_PR2DRIVER_ESC , 'l',     0x00      };
char PR2DRIVER(OliveBook)      [] = {      _PR2DRIVER_ESC , 'n',_PR2DRIVER_ESC ,'S' ,'5' ,0x00 };
char PR2DRIVER(NewLine)        [] = {                     0x0d,     0x00 };
char PR2DRIVER(OpenPrt)        [] = {                     0x00           };
char PR2DRIVER(ClosePrt)       [] = {                     0x00           };
char PR2DRIVER(ToGBK)          [] = {      0x1c,0x47,0x31, _PR2DRIVER_ESC, 'l',0x00 };
char PR2DRIVER(Cpi)            [] = {      _PR2DRIVER_ESC ,0x61,0x33,0x00           };
char PR2DRIVER(AbsCol)         [] = {      _PR2DRIVER_ESC , 'H' ,'0','0' ,'0' ,0x00 };
char PR2DRIVER(Reset)          [] = {      _PR2DRIVER_ESC , '0' ,0x00               };
/******************FS G 1(取消全角ASCII码) 清除错误状态***************/

int PR2DRIVER(Init)();
int PR2DRIVER(ParseMacro)(const char* macro);
int PR2DRIVER(checkPrtAnswerState)();
int PR2DRIVER(ReadComm)      (         char* result, int length);
int PR2DRIVER(WriteComm)     (const    char* data  , int length);
int PR2DRIVER(OpenComm)      (byte deviceType[],int length	   );
int PR2DRIVER(CloseComm)     (                                 );
int PR2DRIVER(SetPropAndVal) (byte device[],int length);
int PR2DRIVER(inPutPaper)    (char* pPageTopMargin, char* LinePI);
int PR2DRIVER(prtInit)    (char* pPageTopMargin, char* LinePI);
int PR2DRIVER(inP)(char *LinePI);
int PR2DRIVER(checkInputPaper)();
void PR2DRIVER(processGBdata)(char *databuf);
int PR2DRIVER(vTPrtStateCheck)();
int PR2DRIVER(disablePaperOut)();
int PR2DRIVER(enablePaperOut)();
int PR2DRIVER(MsfRetBook)();
int PR2DRIVER(GetVerb)(const char* macro);
void PR2DRIVER(print1)(char* str,int ret);




static JNIEnv    *PR2DRIVER(nat_env)       ;
static jobject   PR2DRIVER(nat_obj)        ;
static jclass    PR2DRIVER(Terms)          ;
static jmethodID PR2DRIVER(Open)           ;
static jmethodID PR2DRIVER(Close)          ;
static jmethodID PR2DRIVER(Read)           ;
static jmethodID PR2DRIVER(Write)          ;
static jbyte     PR2DRIVER(bPortValue)     ;
static jint      PR2DRIVER(iIoTimeout)     ;
static jbyteArray PR2DRIVER(deviceType)	   ;
static jboolean  PR2DRIVER(printFlag)	   ;


static int       PR2DRIVER(edgeCheck)=0    ;


/***********************OKI仿真声明begin*************************/
#define _OKI_CMDNUM          64
#define _OKI_PRTCMDLEN       256
#define _OKI_CMDDATALEN      256
#define _OKI_ESC	0x1b

#define _OKI_CR         		0 	/* 回车                                          */
#define _OKI_LF         		1 	/* 换行                                          */
#define _OKI_FF         		2 	/* 退纸                                          */
#define _OKI_DUHEIGHT			3 	/* 倍高                                          */
#define _OKI_BOLDFONT			4 	/* 黑体                                          */
#define _OKI_NORMFONT			5 	/* 普通字体                                      */
#define _OKI_CPI				6 	/* 设置列距 输入参数          字符/英寸          */
										/*			  0,1              10  cpi           */
										/*			  2                12  cpi           */
										/*			  3                15  cpi           */
										/*			  4                16.6cpi           */
										/*			  8                17.1cpi           */
#define _OKI_LPI       		7 	/* 设置行距 0nn表示行步距为 nn/240英寸           */
#define _OKI_TOPMARGIN  		8   /* 设页顶距 nnn表示页顶长为nnn/240英寸,小于70无效*/
#define _OKI_PAGELEN    		9 	/* 设定页长 nnn 表示行数                         */
#define _OKI_ABSROW     		10	/* 绝对行定位 nnn 表示移动到第nnn行              */
#define _OKI_RLTROW     		11	/* 相对行定位 nnn 表示向前移动nnn行              */
#define _OKI_ABSCOL     		12	/* 绝对列定位 nnn 表示移动到当前行第nnn个字符处  */
#define _OKI_RLTCOL     		13	/* 相对列定位 向右 移动nnn个字符                 */
#define _OKI_PAUSE      		14	/* 暂时关闭辅口,用于多次上主机                   */
#define _OKI_NOPAUSE    		15	/* 取消暂时关闭辅口,用于多次上主机               */
#define _OKI_PAGDETECT 		16  /* 置检测纸边标志                                */
#define _OKI_NOPAGDETECT 	17  /* 取消置检测纸边标志                            */
#define _OKI_DUWIDTH         18  /* 倍宽                                          */
#define _OKI_NODUWIDTH       19  /* 取消倍宽                                      */
#define _OKI_NODUHEIGHT		20 	/* 取消倍高                                      */
#define _OKI_DUHEIGHTWIDTH	21 	/* 倍高倍宽                                      */
#define _OKI_NODUHEIGHTWIDTH	22 	/* 取消倍高倍宽                                  */
#define _OKI_NOBOLDFONT		23  /* 取消黑体                                      */
#define _OKI_RESET           24  /* 总清                                          */
#define _OKI_AUTOOPRT        25  /* 赋予自动操作                                  */
#define _OKI_OLIVETTI        26  /* 设置_OKI_OLIVETTI方式                              */
#define _OKI_OPRREQ          27  /* 设置操作员请求                                */
#define _OKI_TRIWIDTH		28  /* 三倍宽                                        */
#define _OKI_NOTRIWIDTH      29  /* 取消三倍宽                                    */
#define _OKI_UNDERLINE       30  /* 下划线                                        */
#define _OKI_NOUNDERLINE     31  /* 取消下划线                                    */
#define _OKI_INIT            32  /* 初始化操作                                    */
#define _OKI_INP             33  /* 等待进纸                                      */
#define _OKI_COMPRESS        34  /* 水平压缩                                      */
#define _OKI_NOCOMPRESS		35	/*取消水平压缩*/
#define _OKI_ENAPOUT		36	/*置不退纸标志*/

struct _OKI_CMD
{
	char Cmd[_OKI_PRTCMDLEN];
	int  OutCmdFlag;
}PR2DRIVER(OkiCmd)[_OKI_CMDNUM]={
	{"\x0d\x00"        ,	0    },		/*0  _OKI_CR            回车              */
	{"\x0a\x0d\x00"    ,	0    },		/*1  _OKI_LF            换行              */
	{"\x0c\x00"    ,	0    },		/*2  _OKI_FF            退纸              */
	{"\x1b[\x00"      ,	0    },		/*3  _OKI_DUHEIGHT      倍高              */
	{"\x1bi\x00"       ,	0    },		/*4  _OKI_BOLDFONT      黑体              */
	{"\x1b]\x1bj\x00",0 },/*5  _OKI_NORMFONT   普通字体          */
	{"\x1c\x24\x00"    ,	0    },		/*6  _OKI_CPI%03d       设置列距  输入参数*/
											/*			         10  cpi  0,1    */
											/*			         12  cpi  2      */										
	{"\x1b%9\x00"       ,	0    },		/*7  _OKI_LPI%03d       设置行距          */
	{"\x1b%5\x00"       ,	0    },		/*8  _OKI_TOPMARGIN%03d 设页顶距          */
	{"\x00"     	    ,	0    },		/*9  _OKI_PAGELEN%03d   设定页长          */
	{"\x1b\x0b\x00"     ,	0    },		/*10 _OKI_ABSROW%03d    绝对行定位        */
	{"\x1b\x0b\x00"     ,	0    },		/*11 _OKI_RLTROW%03d    相对行定位        */

⌨️ 快捷键说明

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