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

📄 prn_buf.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 3 页
字号:
	if ((pos - 1 + len) > MAX_PRN_LEN)
	{
		len = MAX_PRN_LEN - (pos - 1);				// 自动舍去超出部分.
	}

	// check and correct *src.
	for (i=0; i<=len; i++)
	{
		switch (*src++)
		{
		case DB_HEIGT_PRN:
			maxDotLine = PRN_HEIGHT_48;
			temp[i*2] = DB_HEIGT_PRN;
			break;
		case DB_HTWDT_PRN:
			maxDotLine = PRN_HEIGHT_48;	
			temp[i*2] = DB_HTWDT_PRN;
			break;
		case DB_WIDTH_PRN:
			temp[i*2] = DB_WIDTH_PRN;
			break;
		case NM_FONT_PRN:
		default:
			temp[i*2] = NM_FONT_PRN;
			break;
		}
//		if ((*src < 0x20) || (*src > 0x80))
		if ((*src < 0x20))
		{
			temp[i*2+1] = 0x20;							// 不可打印字符清成空格.
		}
		else
		{
			temp[i*2+1] = *src;
		}
		src++;
		if ((temp[i*2] == DB_WIDTH_PRN) || (temp[i*2] == DB_HTWDT_PRN))
		{
			if (i >= len)
			{
				temp[i*2] = NM_FONT_PRN;			// 最后一个字符为双宽,超出指定长度,自动修改之.
			}
			else
			{
				src += 2;									// 跳过双宽字符后的空字符.
				i++;
				temp[i*2] = PRN_DBWD_FREE_BYTE;
				temp[i*2+1] = PRN_DBWD_FREE_BYTE;
			}
		}
	}

	// insert to defined position.
	if (maxDotLine == PRN_HEIGHT_48)
	{
		prnBufFmt[0] = PRN_HEIGHT_48;
	}
	memcpy(&prnBufFmt[2+(pos-1)*2], temp, len*2);
}

///////////////////////////////////////////////////////////////////////////////
// Descript: convert Formatted Buffer to dot-matrix buffer
// In Param:	str --- formatted buffer pointer
// Out Param:	void
// Return:		void
///////////////////////////////////////////////////////////////////////////////
void Prn_BufCvt(const byte *str)
{
	byte tmpBuf[PRN_FMTED_BUF_LEN];
	byte height;
	byte i, j;
	byte pos = 0;											// 每4点为一个pos,即每12点为3个pos.
	byte 	*src, *dst, *ptr;
	byte idx;
	byte tmp, tmp2;
	
	if (str[2] == NM_BMP_PRN)						// LOGO打印.
	{
		CvtBmp();
		return;
	}
	memcpy(tmpBuf, str, PRN_FMTED_BUF_LEN);
	height = tmpBuf[0];									// 正常字体, 或双高.
	
	for (i=0; i<MAX_PRN_LEN; i++)
	{
		switch (tmpBuf[i*2+2])
		{
		case NM_FONT_PRN:
			src = DOT_BASE + tmpBuf[i*2+2+1] * 48;
			idx = phead;
			if (height == 48)								// 清空上半部.
			{
				if ((pos % 2) == 0)						// 需清空随后16点.
				{
					for (j=24; j>0; j--)
					{
						dst = &Prn_Dot_Ring[idx++][pos/2+7];
						*(word *)dst = 0;
					}
				}
				else											// 前4点已空,只需清空后8点.
				{
					for (j=24; j>0; j--)
					{
						dst = &Prn_Dot_Ring[idx++][pos/2+1+7];
						*dst = 0;
					}
				}
			}
			if ((pos % 2) == 0)							// 前8点的位置为一个完整字节.
			{
				for (j=24; j>0; j--)
				{
					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*(word *)dst = *(word *)src;		// 注: 字库中,后4点即为空.
					src += 2;
				}
			}
			else
			{
				for (j=24; j>0; j--)
				{
					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					tmp = *src++;
					*dst |= (tmp >> 4);
					dst++;
					*dst = (tmp << 4) + (*src++ >> 4);
				}
			}
			pos += 3;
			break;
		case DB_WIDTH_PRN:
			src = DOT_DOUBLE_BASE + tmpBuf[i*2+2+1] * 72;
			idx = phead;
			if (height == 48)								// 清空上半部.
			{
				if ((pos % 2) == 0)						// 需清空随后24点.
				{
					for (j=24; j>0; j--)
					{
						dst = &Prn_Dot_Ring[idx++][pos/2+7];
						*dst++ = 0;
						*(word *)dst = 0;
					}
				}
				else											// 前4点已空,只需清空后(20+4)点.
				{
					for (j=24; j>0; j--)
					{
						dst = &Prn_Dot_Ring[idx++][pos/2+1+7];
						*dst++ = 0;
						*(word *)dst = 0;
					}
				}
			}
			if ((pos % 2) == 0)							// 24点的位置为3个完整字节.
			{
				for (j=24; j>0; j--)
				{
					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*dst++ = *src++;
					*(word *)dst = *(word *)src;
					src += 2;
				}
			}
			else
			{
				for (j=24; j>0; j--)
				{
					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					tmp = *src++;
					*dst++ |= (tmp >> 4);
					tmp2 = *src++;
					*dst++ = (tmp << 4) + (tmp2 >> 4);
					tmp = *src++;
					*dst++ = (tmp2 << 4) + (tmp >> 4);
					*dst = (tmp << 4);
				}
			}
			i++;												// 双宽字节占两个字符位置,即忽略随后一个字符.
			pos += 6;
			break;
		case DB_HEIGT_PRN:
			src = DOT_BASE + tmpBuf[i*2+2+1] * 48;
			idx = phead;
			if ((pos % 2) == 0)							// 前8点的位置为一个完整字节.
			{
				for (j=24; j>0; j--)
				{
					ptr = dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*(word *)dst = *(word *)src;		// 注: 字库中,后4点即为空.
					src += 2;

					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*(word *)dst = *(word *)ptr;
				}
			}
			else
			{
				for (j=24; j>0; j--)
				{
					ptr = dst = &Prn_Dot_Ring[idx++][pos/2+7];
					tmp = *src++;
					*dst++ |= (tmp >> 4);
					*dst = (tmp << 4) + (*src++ >> 4);

					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*dst++ |= (*ptr++ & 0x0f);
					*dst = *ptr;
				}
			}
			pos += 3;
			break;
		case DB_HTWDT_PRN:
			src = DOT_DOUBLE_BASE + tmpBuf[i*2+2+1] * 72;
			idx = phead;
			if ((pos % 2) == 0)							// 24点的位置为3个完整字节.
			{
				for (j=24; j>0; j--)
				{
					ptr = dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*dst++ = *src++;
					*(word *)dst = *(word *)src;
					src += 2;

					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					*dst++ = *ptr++;
					*(word *)dst = *(word *)ptr;
				}
			}
			else
			{
				for (j=24; j>0; j--)
				{
					ptr = dst = &Prn_Dot_Ring[idx++][pos/2+7];
					tmp = *src++;
					*dst++ |= (tmp >> 4);
					tmp2 = *src++;
					*dst++ = (tmp << 4) + (tmp2 >> 4);
					tmp = *src++;
					*dst++ = (tmp2 << 4) + (tmp >> 4);
					*dst = (tmp << 4);
					
					dst = &Prn_Dot_Ring[idx++][pos/2+7];
					//*dst++ |= (*ptr++ & 0xf0);
					*dst++ |= (*ptr++ & 0x0f);
					*dst++ = *ptr++;
					*(word *)dst = *(word *)ptr;
				}
			}
			i++;												// 双宽字节占两个字符位置,即忽略随后一个字符.
			pos += 6;
			break;
		default:			break;
		}
	}

	for (i=0,idx=phead; i<height; i++,idx++)
	{
		Prn_Dot_Ring[idx][0] = NM_DOT_FD_CNTR;
	}
	phead += prnBufFmt[0];
}

///////////////////////////////////////////////////////////////////////////////
// Descript: 	convert prn string to defined format
// In Param:	*src -- 上层传递下来的打印缓冲数据, 
// Out Param:	*obj -- 经转换后得到的打印缓冲数据.
// Return:		void
// 有两种情况: 	1) 原模式,即第一字节表示整行格式,后续字节表示打印字符.
//					2) 格式字和字符混合,格式字影响后续字符,直至有新的格式字,无格式字则为普通字体.
///////////////////////////////////////////////////////////////////////////////
void Prn_BufFmt(byte *obj, const byte *src)
{
	byte lineFormat = NM_FONT_PRN;							// 整行字体格式,不影响独立控制字体的字节.

	Prn_BufFmtClr();										// 初始化缓冲区,使之为全空,且为普通字体.

	// 检查是否为原模式,即第一字节表示整行格式,后续字节表示打印字符.若是则作适当转换.
	if (*src <= NM_BMP_PRN)								// 若修改了NM_BMP_PRN等的宏定义,需注意修改此处.
	{
		switch (*src)
		{
		case DB_HEIGT_PRN: 	lineFormat = DB_HEIGT_PRN;
									obj[0] = PRN_HEIGHT_48;		break;
		case DB_HTWDT_PRN: 	lineFormat = DB_HTWDT_PRN;
									obj[0] = PRN_HEIGHT_48;		break;
		case DB_WIDTH_PRN: 	lineFormat = DB_WIDTH_PRN;	break;
		case NM_BMP_PRN:		lineFormat = NM_BMP_PRN;
									obj[0] = PRN_HEIGHT_BMP;	break;
		case NM_FONT_PRN: 	lineFormat = NM_FONT_PRN;	break;
		default:					lineFormat = NM_FONT_PRN;	break;
		}
		src++;
	}

	if (lineFormat == NM_BMP_PRN)						// LOGO打印,
	{
		obj[0] = PRN_HEIGHT_BMP;						// 设置点缓冲行数.
		obj[2] = NM_BMP_PRN;								// 设置第一个格式字节.
		return;
	}
	
	Prn_FmtImpStr(obj+2, src, lineFormat);
}

///////////////////////////////////////////////////////////////////////////////
// Descript: 	将指定字符串转换为指定格式的打印缓冲字符数据.
//					含 "整行统一格式" 和 "整行格式+单个字符控制格式" 两种.
// In Param:	*src -- 上层传递下来的打印缓冲数据, 
// Out Param:	*obj -- 经转换后得到的打印缓冲数据.
// Return:		void
// 有两种情况: 	1) 原模式,即整行为统一格式,后续字节表示打印字符.
//					2) 格式字和字符混合,格式字影响后续一个字符,其余为指定的整行字体.
///////////////////////////////////////////////////////////////////////////////
void Prn_FmtImpStr(byte *obj, const byte *src, byte lineFormat)
{
	byte i = 0;
	byte format;
	byte oneTimeFormat = 0;								// 一次有效的字体格式,只影响后续一个字节.

	while (1)
	{
		if (*src == 0)
		{
			break;
		}
		else if (*src < 0x20)							// 不可打印字符.
		{
			switch (*src)									// 目前只支持四种字体格式.
			{
			case DB_HEIGT_PRN	: 	oneTimeFormat = DB_HEIGT_PRN;
											obj[0] = PRN_HEIGHT_48;	break;
			case DB_HTWDT_PRN: 	oneTimeFormat = DB_HTWDT_PRN;
											obj[0] = PRN_HEIGHT_48;	break;
			case NM_BMP_PRN: 		oneTimeFormat = NM_BMP_PRN;
											obj[0] = PRN_HEIGHT_BMP;	break;
			case DB_WIDTH_PRN	: 	oneTimeFormat = DB_WIDTH_PRN;	break;
			case NM_FONT_PRN: 
			default:					oneTimeFormat = NM_FONT_PRN;	break;
			}
			src++;
		}
		else
		{
			if (oneTimeFormat != 0)
			{
				format = oneTimeFormat;
				oneTimeFormat = 0;
			}
			else
			{
				format = lineFormat;
			}
			obj[2*i] = format;
			obj[2*i+1] = *src++;
			i++;
			if (i >= MAX_PRN_LEN)
			{
				if ((format == DB_HTWDT_PRN) || (format == DB_WIDTH_PRN))
				{
					obj[2*(i-1)] = NM_FONT_PRN;	// 传入的字符超过了打印宽度,改之.
				}
				break;
			}
			if ((format == DB_HTWDT_PRN) || (format == DB_WIDTH_PRN))
			{
				obj[2*i] = PRN_DBWD_FREE_BYTE;
				obj[2*i+1] = PRN_DBWD_FREE_BYTE;
				i++;
				if (i >= MAX_PRN_LEN)
				{
					break;
				}
			}
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// Descript: Get defined Free dot buffer.
// In Param:	bufInc -- free buffer increment
// Out Param:	void
// Return:		void
///////////////////////////////////////////////////////////////////////////////
void Prn_FreeDotBufGet(byte bufInc)
{
	byte idx, i;
	
	idx = phead + 1;
	for (i=0; i<bufInc; )
	{
		if (idx != prear)
		{
			idx++;
			i++;
		}
		else												// dot buffer full
		{
			prn_Chk();									// check No Paper or other Trouble
		}
	}
}

///////////////////////////////////////////////////////////////////////////////
// Descript: feed driver
// In Param:	step -- paper feed step
// Out Param:	void
// Return:		void
///////////////////////////////////////////////////////////////////////////////
void Prn_Feed(byte step)
{
	Prn_FreeDotBufGet(1);
	Prn_Dot_Ring[phead][0] = step;
	Prn_Dot_Ring[phead][1] = 0;
	phead++;
}

///////////////////////////////////////////////////////////////////////////////
// Descript: print string,include LOGO print
// In Param:	*src -- 上层传递下来的打印缓冲数据, 
//					type -- 缓冲数据的格式, 0 -- 格式字符混合, 1 -- 含属性的字符串,即第三种.
// Out Param:	void
// Return:		void
///////////////////////////////////////////////////////////////////////////////
void Prn_Str(byte type)
{
	prn_Chk();												// 检查打印机异常: 缺纸...

	if (type == 0)
	{
		Prn_BufFmtClr();
		Prn_BufFmt(prnBufFmt, prn_Buf);				// 将打印字符缓冲格式化为标准模式.
	}

	#ifdef	PC_COMM
	#ifdef	ELEC_JRNL
	if(Chk_EJ_Up())
	{
		Prn_Send_EJ();
		Prn_BufClr();
		return;
	}
	#endif
	#endif
	
	if ((sysflag->Rcpt_prn == 0)&& (CurrMode == REGISTER))
	{
		Prn_BufClr();
		return;
	}
	
//	if ((key_fd == 0) && ((CurrMode == REGISTER) || (CurrMode == TRAINING)) 
//		&& (Rcpt_Reprn_Flag == 0))
	{
		prn_RP();
	}

	DEBUG_PRN(Prn_BufClr();return;);

	// Not print the receipt, return
	if ((sysflag->Rcpt_prn == 0) && (!Rcpt_Reprn_Flag) && (key_fd == 0) && ((CurrMode == REGISTER)||(CurrMode == TRAINING)))
	{
		Prn_BufClr();
		return;
	}

	if (Flag_Key_Feed_Papr)								// Only Paper Feed
	{
		Flag_Key_Feed_Papr = 0;
		Prn_Feed(NM_FEED_PAPER);
		Prn_BufClr();
		return;
	}

	DEBUG_PRN(;/*Prn_FreeDotBufGet(prnBufFmt[0]);*/)
	Prn_BufCvt(prnBufFmt);
	
	Prn_Feed(NM_CHA_SP_CNTR);
	Prn_BufClr();
}

///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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