📄 pr2driver.c
字号:
PR2DRIVER(Close));
return 0;
}
//xxxxxxxx
int PR2DRIVER(ReadComm)(char* result,int length)
{
jbyteArray jbValue ;
jbyte *abyteTmp ;
jboolean iscopy = 1;
char value [1 ];
int i ;
int ret ;
jintArray tmpLen=(*PR2DRIVER(nat_env))->NewIntArray(PR2DRIVER(nat_env),1);
if(length<1)
return 0;
jbValue =(*PR2DRIVER(nat_env))->NewByteArray(PR2DRIVER(nat_env),1);
(*PR2DRIVER(nat_env))->SetByteArrayRegion(PR2DRIVER(nat_env),jbValue,0,1, (jbyte *)value);
i = 0;
while (1) {
#ifdef _DEBUG_PR2DRIVER
PR2DRIVER(print)("read key!",0);
#endif
ret = (*PR2DRIVER(nat_env))->CallIntMethod(PR2DRIVER(nat_env),
PR2DRIVER(nat_obj),
PR2DRIVER(Read),
(jbyte)PR2DRIVER(bPortValue),
jbValue,
tmpLen,
PR2DRIVER(iIoTimeout),
PR2DRIVER(printFlag)); //(B[BII)I
if(ret<0)
{
return ret;
}
abyteTmp = (*PR2DRIVER(nat_env))->GetByteArrayElements(PR2DRIVER(nat_env),jbValue,&iscopy);
value[0]= *abyteTmp;
printf("value[0] is %c\n",value[0]);
(*PR2DRIVER(nat_env))->ReleaseByteArrayElements(PR2DRIVER(nat_env),jbValue,abyteTmp,0);
result[i] = value[0];
#ifdef _DEBUG_PR2DRIVER
PR2DRIVER(print)("read char i=",i);
#endif
i++;
if(i==length)
return length;
}
return 0;
}
//
//zzzzz
int PR2DRIVER(WriteComm)(const char* data, int length)
{
jbyteArray jbHintMesg ;
int ret;
#ifdef _DEBUG_PR2DRIVER
char filename[256];
FILE * flog;
#endif
if(length<=0)
return 0;
#ifdef _DEBUG_PR2DRIVER
{
FILE *tt = fopen("aa.dat", "a+");
static si = 0;
int ii;
if (tt != NULL) {
//fprintf(tt, "\n");
for (ii = 0; ii<length; ii++,si++) {
fprintf(tt, "%02X ", data[ii]&0xff);
if (((si+1) % 16) == 0) fprintf(tt, "%s", "\n");
}
fclose(tt);
}
}
#endif
jbHintMesg =(*PR2DRIVER(nat_env))->NewByteArray(PR2DRIVER(nat_env),length);
(*PR2DRIVER(nat_env))->SetByteArrayRegion(PR2DRIVER(nat_env), jbHintMesg , 0,length, (jbyte *)data);
#ifdef _DEBUG_PR2DRIVER
PR2DRIVER(print)("input hint message",0);
#endif
ret= (*PR2DRIVER(nat_env))->CallIntMethod(PR2DRIVER(nat_env),
PR2DRIVER(nat_obj),
PR2DRIVER(Write),
(jbyte)PR2DRIVER(bPortValue),
jbHintMesg,
length,
PR2DRIVER(printFlag));//input password message
return ret;
}
/*******************************************************************
检测打印机状态发送 _PR2DRIVER_ESC j ,从打印机返回状态
函数返回值:0 状态正常,
-1 状态不正常,但是打印机有返回值,
-2 打印机无返回值
vt-pr2打印机永远状态正确,且纸张已经放好。
*******************************************************************/
int PR2DRIVER(checkPrtAnswerState)()
{
/* 普通打印机 */
char retbuf[4];
int i ;
int ret ;
PR2DRIVER(WriteComm)(PR2DRIVER(StateAsk),strlen(PR2DRIVER(StateAsk)));
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;
}
printf("retbuf is %s\n",retbuf);
retbuf[i]=0;
if (!strcmp(retbuf,PR2DRIVER(StateOk)))
return 0;//ok
else if( retbuf[0]!=PR2DRIVER(StateOk)[0]||retbuf[1]!=PR2DRIVER(StateOk)[1])
{
return -2;
}
else if ((retbuf[0]==PR2DRIVER(StateOk)[0] && retbuf[1]==PR2DRIVER(StateOk)[1]) && (retbuf[2]&0x08 || retbuf[2]&0x01))
{//纸的尾行首列
return -3;
}
return -1;
}
//add by zhanghui 2005.5.11
/***************************
检测读写磁条时打印机状态
发送 ESC j ,从打印机返回状态
函数返回值:0 进纸成功, -1状态不正常,但是打印机有返回值,-2 打印机无返回值
***************/
int PR2DRIVER(checkMagAnswerState)()
{
char retbuf[4];
int i;
int ret;
PR2DRIVER(WriteComm)(PR2DRIVER(StateAsk),strlen(PR2DRIVER(StateAsk)));
memset(retbuf,0x00,4);
for(i=0;i<3;)
{
ret = PR2DRIVER(ReadComm)(retbuf+i,1);
if(ret<0)
return -1;
if(retbuf[0]==0x1b)
i++;
if(retbuf[i] <0)
break;
}
retbuf[i]=0;
if(!strcmp(retbuf,PR2DRIVER(StateOk)) || !strcmp(retbuf,PR2DRIVER(MagOk)))
return 0;
else if( retbuf[0]!=PR2DRIVER(StateOk[0])||retbuf[1]!=PR2DRIVER(StateOk[1]))
{
return -2;
}
else
{
return -1;
}
}
/******************************************************************
* 检查是否连接了一个pr2打印机
* 返回值:打印机类型,pr2返回0,
* 其它非pr2打印机返回-1
* 串口错误返回<-110的错误
*
******************************************************************/
int PR2DRIVER(vTPrtStateCheck)() {
char retbuf[10];
int i;
int charlen;
int ret ;
jboolean iscopy = 1;
char hintMesg [256];
#ifdef _DEBUG_PR2DRIVER
PR2DRIVER(print)("input hint message",0);
#endif
memset(hintMesg,0,256);
sprintf(hintMesg,"%s","\x1bZ\x00");
PR2DRIVER(WriteComm)(hintMesg,strlen(hintMesg));
#ifdef _DEBUG_PR2DRIVER
PR2DRIVER(print)("input hint message finished!",0);
#endif
memset(retbuf, 0x00, sizeof(retbuf));
i = 0;
while (TRUE)
{
ret=PR2DRIVER(ReadComm)(retbuf+i,1);
if(ret<0)
{
PR2DRIVER(CloseComm)();
return ret;
}
if (retbuf[0]=='<')
{
charlen = 5;
} else if(retbuf[0]==0x1b)
{
charlen = 3;
} else
{
continue;
}
i++;
if (i>=charlen) break;
}
if(!strncmp(retbuf,"\x1b/7",3)) {
return 0;
}else if(!strncmp(retbuf,"\x1b//",3)){
return 0; //this type is pr40+ or pr50+;
}else
{
PR2DRIVER(CloseComm)();
return -1;
}
}
/******************************************************************************
这里处理大字符集的中文与GB2312中文的数据,对于不支持GBK打印的打印机,把GBK
中非GB2312字符集的中文转换为0xA3 0xBF,即*输出对于支持GBK的打印机则直接输出
*******************************************************************************/
void PR2DRIVER(processGBdata)(char *databuf)
{
if (!strcmp(_PR2DRIVER_CHARSET, "GBK")) {
int i;
char *p;
unsigned short ss1, ss2;
int len = strlen(databuf);
if (len == 0) return;
for (i=0, p=databuf; i<len; ) {
ss1 = (unsigned short)(*p) & 0x00FF;
/* a part of GBK 1.0 chinese */
if (ss1 >= (unsigned short)0x00a1 && ss1 < (unsigned short)0x00FF) {
if (i < len - 1) {
ss2 = (unsigned short)(*(p+1)) & 0x00FF;
if ( ss2 >= (unsigned short)0x0040 && ss2 < (unsigned short)0x00a1 && ss2 != (unsigned short)0x007f ) {
*p = (char)0xa3;
*(p+1) = (char)0xaa;
i += 2; p += 2;
} else if ( ss2 >= (unsigned short)0x00a1 && ss2 < (unsigned short)0x00FF) {
i += 2; p += 2;
} else {
*p = 0x20;
i += 1; p += 1;
}
} else {
*p = 0x20;
i += 1; p += 1;
}
/* another part of GBK 1.0 chinese */
} else if (ss1 > (unsigned short)0x0080 && ss1 < (unsigned short)0x00a1) {
if (i < len - 1) {
ss2 = (unsigned short)(*(p+1)) & 0x00FF;
if ( ss2 >= (unsigned short)0x40 && ss2 < (unsigned short)0x00ff && ss2 != (unsigned short)0x007f ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -