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

📄 printer.c

📁 Linux下智能终端打印机操作程序
💻 C
字号:
  /*************************************************************************/
/*                                                                       */
/*   Copyright (c) 1993-2002 YULONG COMPUTER                             */
/*                           TELECOMMUNICATION SCIENTIFIC CO.,LTD.       */
/*           宇龙计算机通信科技(深圳)有限公司  版权所有 1993-2002        */
/* PROPRIETARY RIGHTS of eWayCyber Technologies are involved in the      */
/* subject matter of this material.  All manufacturing, reproduction,    */
/* use, and sales rights pertaining to this subject matter are governed  */
/* by the license agreement.  The recipient of this software implicitly  */
/* accepts the terms of the license.                                     */
/* 本软件文档资料是宇龙计算机通信科技(深圳)有限公司的资产,任何人士阅读和 */
/* 使用本资料必须获得相应的书面授权,承担保密责任和接受相应的法律约束.    */
/*                                                                       */
/*************************************************************************/


//===========================================================================
//	                                                                        
//  Product    : YuLong PDA application Example for EOS                      
//  Module     : Application.c                                                 
//  Version    : 1.00                                                      
//                                                                           
//---------------------------------------------------------------------------
//                                                                           
//  Description : 应用程序的基本例子            
//                                     
//---------------------------------------------------------------------------
//                                                                           
//  Author         : yang sheng qian                       
//  developed on   : 2004.07.26                                            
//                                                                           
//===========================================================================
#include "config.h" 

//* some standard include files
#include "eosgui.h" 

#include "Eos_Uart.h"

//* some standard include files
#include "nucleus.h"
#include "guisys.h" 

#include "stdio.h"
#include "fs.h"
#include "hwdev.h"

#include "MPK1200_GA.h"
#include "MPK1200.h"
#include "MPK1210.h"
#include "printer.h"



////////////////////////////////////////////////////////////////////////////////////////////
Int16 PR_OpenComm(Int16 hWndId, Int32 nComCBR)
{
	DCB	  dcb;
	Int16 i16ComId = -1;

	i16ComId = CreateFile(DRIVER_UART1_ID, 0, 0);
	if(0 <= i16ComId) {
		//* 获得DCB状态
		MemSet(&dcb, 0, sizeof(DCB));
		if(0 != GetCommState(i16ComId, &dcb)) {
			//* 设置波特率
			//* 设置波特率
			dcb.BaudRate = nComCBR;
			dcb.ByteSize = 8;
			dcb.Parity   = NOPARITY;
			dcb.StopBits = ONESTOPBIT;
			//Setup the flow control 
			dcb.fDsrSensitivity = FALSE;
			dcb.fOutxCtsFlow = FALSE;
			dcb.fOutxDsrFlow = FALSE;
			dcb.fOutX    = TRUE;
			dcb.fInX     = TRUE;
			dcb.XonChar  = 0x11;
			dcb.XoffChar = 0x13;
			dcb.XoffLim  = 512;
			dcb.XonLim   = 512;
			if(0 != SetCommState(i16ComId, &dcb)) {
				//* 设置Mask
				if(0 != SetCommMask(i16ComId, EV_RXCHAR|EV_ERR)) {
					//* 系统通知
					Sys_IONotify(i16ComId, EV_RXCHAR|EV_ERR, hWndId);
					return i16ComId;
				}
			}
		}
		Close(i16ComId);
	}
	return -1;
}

Int32 PR_GetComCBR(Int32 nPrintId)
{
	if(1 == nPrintId) return MPK1200GA_GetComCBR();
	if(2 == nPrintId) return MPK1200_GetComCBR();
	if(3 == nPrintId) return MPK1210_GetComCBR();
	return 0;
}

Boolean PR_InitEnvironment(void)
{
	EOS_Delete(PR_FILENAME);
	return TRUE;
}

/*****************************************************************************************
入口参数: n-灰度等级(0 <= n <= 10,缺省n=5)
描    述: 调整打印对比度
*****************************************************************************************/
void PR_setdarkness(Char n)
{
	Handle hFile = -1;
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0x01;
		icmd[2] = n;
		icmd[3] = 0x00;
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Close(hFile);
	}
}

/*****************************************************************************************
入口参数: n-字符间隔的尺寸(0 <= n <= 15,缺省n=0,间隔尺寸=n/8毫米)
描    述: 设置字符间隔
*****************************************************************************************/
void PR_setcharspace(Char n)
{
	Handle hFile = -1;
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0x02;
		icmd[2] = n;
		icmd[3] = 0x00;
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Close(hFile);
	}
}

/*****************************************************************************************
入口参数: n-ASCII字体(0 <= n <= 3,缺省n=1 14X24 ASCII字体)
          n=0, 8X13 ASCII字体
          n=1,14X24 ASCII字体
          n=2,22X36 ASCII字体
          n=3,24X24 Shift-JIS编码的KANJI字体
描    述: 设置打印机的ASCII字体
*****************************************************************************************/
void PR_selectASCIIfont(Char n)
{
	Handle hFile = -1;
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0x03;
		icmd[2] = n;
		icmd[3] = 0x00;
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Close(hFile);
	}
}

/*****************************************************************************************
入口参数: dw-指示是否横向放大一倍
          dh-指示是否纵向放大一倍
描    述: 设置字符纵的横向放大
*****************************************************************************************/
void PR_enlargefont(Char dw, Char dh)
{
	Handle hFile = -1;
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0x04;
		icmd[2] = dw;
		icmd[3] = dh;
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Close(hFile);
	}
}

/*****************************************************************************************
入口参数: x-自左边界算起
          y-忽略
描    述: 设定每行打印的绝对起始位置
*****************************************************************************************/
void PR_moveto(Char x, Char y)
{
	Handle hFile = -1;
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0x05;
		icmd[2] = x;
		icmd[3] = y;
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Close(hFile);
	}
}

/*****************************************************************************************
入口参数: pdata-字符串地址
描    述: 打印指定长度的字符串
*****************************************************************************************/
void PR_print(Char *data)
{
	Handle hFile = -1;
	Int16 len = (Int16)StrLen(data);
	Char icmd[4];

	hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_WRONLY, PS_IWRITE);
	if(0 >  hFile) hFile = EOS_Open(PR_FILENAME, PO_CREAT|PO_BINARY|PO_RDWR, PS_IREAD|PS_IWRITE);
	if(0 <= hFile) {
		EOS_Seek(hFile, 0, SEEK_END);
		icmd[0] = 0x1B;
		icmd[1] = 0xff;
		icmd[2] = (Char)((len >> 8) & 0xff);
		icmd[3] = (Char)((len & 0xff));
		EOS_Write(hFile, icmd, sizeof(icmd));
		EOS_Write(hFile, data, StrLen(data));
		EOS_Close(hFile);
	}
}

void PR_printfile(Int16 i16ComId, Int32 nPrintId)
{
	Handle hFile = -1;
	Char *pszInnerBuf = NULL, icmd[4], szBuf[100];
	Int16 len = 512, m, n;

	if(0 <= i16ComId) {
		hFile = EOS_Open(PR_FILENAME, PO_BINARY|PO_RDONLY, PS_IREAD|PS_IWRITE);
		if(0 <= hFile) {
			while(sizeof(icmd) == EOS_Read(hFile, icmd, sizeof(icmd))) {
				if(0x1B == icmd[0]) {
					switch(icmd[1]) {
						case 0x01: //调整打印对比度
							if(1 == nPrintId) MPK1200GA_setdarkness(i16ComId, icmd[2]);
							if(2 == nPrintId) MPK1200_setdarkness(i16ComId, icmd[2]);
							if(3 == nPrintId) MPK1210_setdarkness(i16ComId, icmd[2]);
							break;

						case 0x02: //设置字符间隔
							if(1 == nPrintId) MPK1200GA_setcharspace(i16ComId, icmd[2]);
							if(2 == nPrintId) MPK1200_setcharspace(i16ComId, icmd[2]);
							if(3 == nPrintId) MPK1210_setcharspace(i16ComId, icmd[2]);
							break;

						case 0x03: //设置打印机的ASCII字体
							if(1 == nPrintId) MPK1200GA_selectASCIIfont(i16ComId, icmd[2]);
							if(2 == nPrintId) MPK1200_selectASCIIfont(i16ComId, icmd[2]);
							if(3 == nPrintId) MPK1210_selectASCIIfont(i16ComId, icmd[2]);
							break;

						case 0x04: //设置字符纵的横向放大
							if(1 == nPrintId) MPK1200GA_enlargefont(i16ComId, icmd[2], icmd[3]);
							if(2 == nPrintId) MPK1200_enlargefont(i16ComId, icmd[2], icmd[3]);
							if(3 == nPrintId) MPK1210_enlargefont(i16ComId, icmd[2], icmd[3]);
							break;

						case 0x05: //设定每行打印的绝对起始位置
							if(1 == nPrintId) MPK1200GA_moveto(i16ComId, icmd[2], icmd[3]);
							if(2 == nPrintId) MPK1200_moveto(i16ComId, icmd[2], icmd[3]);
							if(3 == nPrintId) MPK1210_moveto(i16ComId, icmd[2], icmd[3]);
							break;

						case 0xff: //打印指定长度的字符串
							len = icmd[2]*256 + icmd[3];
							pszInnerBuf = (Char *)mcMalloc(len + 1);
							if(NULL != pszInnerBuf) {
								MemSet(pszInnerBuf, 0, len + 1);
								if(len == EOS_Read(hFile, pszInnerBuf, len)) {
									m = 0;
									while(m < len) {
										n = 0;
										MemSet(szBuf, 0, sizeof(szBuf));
										while(m < len && m < 100) {
											if('\n' == pszInnerBuf[m]) break;
											szBuf[n ++] = pszInnerBuf[m ++];
										}
										if(1 == nPrintId) MPK1200GA_print(i16ComId, szBuf);
										if(2 == nPrintId) MPK1200_print(i16ComId, szBuf);
										if(3 == nPrintId) MPK1210_print(i16ComId, szBuf);										
										
										if(m < len && m < 100 && '\n' == pszInnerBuf[m]) {
											if(1 == nPrintId) MPK1200GA_feedCR(i16ComId);
											if(2 == nPrintId) MPK1200_feedCR(i16ComId);
											if(3 == nPrintId) MPK1210_feedCR(i16ComId);
										}
									}
								}	
								mcFree(pszInnerBuf); pszInnerBuf = NULL;
							}
							break;
					}
				}
			}			

			EOS_Close(hFile);
		}
	}
}

void PR_DoPrint(Int16 nId, WindowEventHandlerExType winEventHandler)
{
	WinHandle hDlgWnd = WinCreateWindowByResId(nId);

	if(NULL!= hDlgWnd) {
		WinSetEventHandlerEx(hDlgWnd, winEventHandler);
		WinDoDialog(hDlgWnd); //显示打印设置窗口
		WinDeleteWindow(hDlgWnd, FALSE);
	}
}

⌨️ 快捷键说明

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