📄 pr2driver.c
字号:
#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 + -