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