📄 bsptsprnt.c
字号:
*
* 功 能:热敏打印机统计走纸步数
*
* 输 入:无
*
* 输 出:g_uiprntPaperLen1
* g_usprntPaperLen2
* g_usprntPaperLen3
*
* 返 回:SUCCESS 时序处理成功
* FAULT 函数参数输入不合法
*
*******************************************************
*/
INT1 bspTSPrntStepTotal
(
UINT1 _ucDirection, /* 正反向进纸选择 1 正向 0 反向 */
UINT1 _ucPaperType /* 纸类型 0 非黑标纸 1 黑标纸 */
)
{
if ((_ucDirection > 1)||(_ucPaperType > 1))
{
return FAULT;
}
else if (0 == _ucPaperType) /* 非黑标纸 */
{
if (_ucDirection)
{
g_usprntPaperLen3 ++;
}
else if ((!_ucDirection) && ( g_usprntPaperLen3 >= 2 ))
{
g_usprntPaperLen3 --;
}
}
else /* 黑标纸 */
{
if (_ucDirection)
{
g_usprntPaperLen1 ++;
g_usprntPaperLen2 ++;
}
else if ((!_ucDirection) && ( g_usprntPaperLen2 >= 2 ))
{
g_usprntPaperLen1 --;
g_usprntPaperLen2 --;
}
}
return SUCCESS;
}
/*
*******************************************************
*
* 函数名:bspTSPrntPFLineSpace
*
* 功 能:热敏打印机进、退纸N步距函数
*
* 输 入:s_ucprntPFRunSign
*
* 输 出:s_usprntPFStepCnt
*
* 返 回:SUCCESS 函数处理成功
* FAULT 函数参数输入不合法
*
*******************************************************
*/
INT1 bspTSPrntPFLineSpace
(
UINT1 _ucDirection, /*1 进纸, 0 退纸 */
UINT2 _usLength /*走纸或退纸的步数*/
)
{
UINT1 ucRunSign;
UINT1 ucPFRunMode;
UINT2 usStepTotal;
if ((_ucDirection > 1) || (_usLength < 1) || (_usLength > TS_LEED_LEN))
{
return FAULT;
}
s_ucprntPrintEnable = 0;
s_ucprntHeatEnable = 0;
s_usprntPFStepCnt = 0;
g_ucprntTimerInt = 0;
s_ucprntPrintEnable = 0;
s_ucprntPFRunSign = 1;
ucRunSign = 1;
TS_POWER_ON();
/*禁止任务切换 */
OSSchedLock();
if (1 == g_ucprntCheckBM)
{
g_ucprntCheckBM = 0;
bspTSprntSetTimer(TS_PU_TIME);
ucPFRunMode = 3;
}
else
{
/*根据走纸的步数来确定是否要加速*/
if ((_usLength == 1) && (_usLength <= 30))
{
bspTSprntSetTimer(TS_PFSHORTLEN_TIMER);
ucPFRunMode = 0;
}
else /* 要加速*/
{
bspTSprntSetTimer(TS_PU_TIME);
ucPFRunMode = 1;
}
}
while (ucRunSign)
{
if (g_ucprntTimerInt)
{
g_ucprntTimerInt = 0;
switch (ucPFRunMode)
{
case 0: /* 低步数没有加减速过程 */
bspTSPrntPFPhase(_ucDirection, g_ucPaperType);
s_usprntPFStepCnt ++;
bspTSprntSetTimer(TS_PFSHORTLEN_TIMER);
if (s_usprntPFStepCnt == _usLength)
{
ucPFRunMode = 2;
}
break;
case 1: /* 多步数包含加、减速驱动 */
bspTSPrntPFPhase(_ucDirection, g_ucPaperType);
s_usprntPFStepCnt ++;
if (s_usprntPFStepCnt <= TS_UPDOWN_STEP)/* 14步减速驱动 */
{
bspTSprntSetTimer(s_usPFSpeedUp[s_usprntPFStepCnt - 1]);
}
else if (s_usprntPFStepCnt <= (_usLength - TS_UPDOWN_STEP)) /* 匀速驱动 */
{
bspTSprntSetTimer(TS_PFSPEED_TIMER);
}
else if ((s_usprntPFStepCnt > (_usLength - TS_UPDOWN_STEP)) && (s_usprntPFStepCnt < _usLength))
{
bspTSprntSetTimer(s_usPFSpeedDown[s_usprntPFStepCnt + TS_UPDOWN_STEP - _usLength]);
}
else if (s_usprntPFStepCnt >= _usLength)
{
bspTSprntSetTimer(TS_PD_TIME);
ucPFRunMode = 2;
}
break;
case 2: /* PF停机函数 */
bspTSPrntPFStop();
ucRunSign = 0;
break;
case 3: /* 检测黑标处理流程 */
bspTSPrntPFPhase(_ucDirection, 1);
s_usprntPFStepCnt ++;
if (s_usprntPFStepCnt <= TS_UPDOWN_STEP) /* 14步减速驱动 */
{
bspTSprntSetTimer(s_usPFSpeedUp[s_usprntPFStepCnt - 1]);
}
else if ((0 == g_ucprntCheckedBMark) && (s_usprntPFStepCnt <= TS_LEED_LEN))/* 匀速驱动 */
{
bspTSprntSetTimer(TS_PFSPEED_TIMER);
}
else if ((0 == g_ucprntCheckedBMark) && (s_usprntPFStepCnt <= (TS_LEED_LEN + TS_UPDOWN_STEP)))
{
bspTSprntSetTimer(s_usPFSpeedDown[s_usprntPFStepCnt - TS_LEED_LEN]);
}
else
{
if (g_ucprntCheckedBMark)
{
if (1 == g_ucPrntCheckBMInt)
{
g_ucPrntCheckBMInt = 0;
bspTSprntSetTimer(TS_PD_TIME); /* 上电初始化找到黑标后,即停机 */
ucPFRunMode = 2;
}
else
{
s_usprntPFStepCnt = 0;
g_usprntPaperLen1 = g_usprntPaperLen2;
usStepTotal = g_usprntPaperLen2;
if (g_usPrintLocatOffset <= usStepTotal)
{
DelayXus(PD);
/* 打印起始位置设定值为0,不进入流程4,否则步数统计误差1步 */
ucPFRunMode = 2;
}
else
{
ucPFRunMode = 4; /* 找到黑标后进入流程4走纸到起始位置 */
}
}
}
else
{
bspTSprntSetTimer(TS_PD_TIME);/* 未找到黑标走满整页纸后停机*/
ucPFRunMode = 2;
}
}
break;
case 4: /* 进纸找黑标后走纸到打印起始位置 */
bspTSPrntPFPhase(_ucDirection, 1);
s_usprntPFStepCnt ++;
bspTSprntSetTimer(TS_PFSHORTLEN_TIMER - 3);
if (s_usprntPFStepCnt == (g_usPrintLocatOffset - usStepTotal))
{
bspTSprntSetTimer(TS_PD_TIME);
ucPFRunMode = 2;
}
else if(s_usprntPFStepCnt > 1200)
{
bspTSprntSetTimer(TS_PD_TIME);/* 异常停机处理流程*/
ucPFRunMode = 2;
}
break;
default:
break;
}
bspPrntCheckBM(1);
}
}
bspTimer1Stop();
/* 启动任务切换 */
OSSchedUnlock();
return SUCCESS;
}
/*
******************************************************
*
* 函数名:bspTSPrntGoToBeginPlace
*
* 功 能:进纸到打印起始位置
*
* 输 入:g_uiPrintLocatOffset
* g_uiprntPaperLeni
*
* 输 出:g_ucprntCheckBM
*
* 返 回:FAULT 打印机状态异常
* SUCCESS 函数执行成功
*
*******************************************************
*/
INT1 bspTSPrntGoToBeginPlace
(
UINT1 _ucPaperType /* 票据类型 1 定长、0不定长 */
)
{
if ((_ucPaperType > 1)||(g_ucprntState&0x0f))
{
return FAULT;
}
else if ( _ucPaperType == 0)
{
g_usprntPaperLen3 = 0; /* 非定长票据进纸步数计数器清0 */
bspTSPrntPFLineSpace (1 , g_usPrintLocatOffset);
}
else
{
/* 如果之前已经检测到黑标 */
if (g_ucprntCheckedBMark)
{
g_ucprntCheckedBMark = 0;
g_usprntPaperLen1 = g_usprntPaperLen2;
if (g_usPrintLocatOffset > g_usprntPaperLen1 )
{
bspTSPrntPFLineSpace (1 , (g_usPrintLocatOffset - g_usprntPaperLen1));
}
else
{
/* 置起找黑标标志,并进纸到起始位置 */
g_ucprntCheckBM = 1;
bspTSPrntPFLineSpace (1 , 100);
}
}
else
{
/* 以前未检测到黑标,直接进纸找黑标操作 */
g_ucprntCheckBM = 1;
bspTSPrntPFLineSpace (1 , 100);
}
}
return SUCCESS;
}
/*
********************************************************
*
* 函数名:prntTSGoToCutPlace
*
* 功 能:进纸到打印切纸位置
*
* 输 入:g_uiprntPaperLeni
*
* 输 出:无
*
* 返 回:FAULT 打印机故障
* SUCESS 处理成功
*
********************************************************
*/
INT1 bspTSPrntGoToCutPlace
(
UINT1 _ucPaperType, /* 票据类型(1 定长、0 不定长)*/
UINT2 _usPageLength, /* 打印纸页长 */
UINT2 _usCutOffset /* 打印切纸位置 */
)
{
if (g_ucprntState&0x0f)
{
return FAULT; /* 打印机状态异常直接返回 */
}
if (_ucPaperType == WHITE_PAPER)
{
if (g_usprntPaperLen3 > 1)
{
if(_usPageLength > g_usprntPaperLen3)
{
bspTSPrntPFLineSpace(1, _usPageLength - g_usprntPaperLen3);
}
}
else
{
bspTSPrntPFLineSpace(1, _usPageLength);
}
}
else
{
if (_usCutOffset > g_usprntPaperLen1)
{
bspTSPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen1);
}
else if (_usCutOffset > g_usprntPaperLen2)
{
bspTSPrntPFLineSpace(1, _usCutOffset - g_usprntPaperLen2);
}
else
{
bspTSPrntPFLineSpace (1, 200);
}
g_usprntPaperLen1 = g_usprntPaperLen2;
}
return SUCCESS;
}
/*
*******************************************************
*
* 函数名:bspTSPrntGetPattern
*
* 功 能:热敏打印机取字模函数
*
* 输 入:无
*
* 输 出:无
*
* 返 回:ASCII_PATTERN----处理字符字模
* CHINESE_PATTERN----处理汉字字模
* ERROR_CODE----非法区位码
*
*******************************************************
*/
INT1 bspTSPrntGetPattern
(
const UINT1* _pStr, /* [in]待取字模国标码首地址 */
UINT1* _pBuffer, /* [out]存放显示字模数据缓存首地址 */
UINT1 _ucLangFlag /* 语言种类选择标志(0中文 1阿拉伯语 2英语)*/
)
{
UINT1 uctempData1, uctempData2;
UINT4 offset;
uctempData1 = *(_pStr); /* 取ASCII码或国标码区码 */
if ((uctempData1 >= 0x20) && (uctempData1 <= 0x7f))
{
offset = (uctempData1 - 0x20) * ASCII_PATTERN_LEN + ASCII_24_ADDR;
mem_cpy(_pBuffer, (UINT4 *)offset, ASCII_PATTERN_LEN);
return ASCII_PATTERN;
}
else
{
if (_ucLangFlag == 0x01) /* 取阿拉伯语字模 */
{
mem_cpy(_pBuffer, (UINT1 *)g_ArabFont24X12[uctempData1-0x80], 48);
return ASCII_PATTERN;
}
else
{
uctempData2 = *(_pStr + 1); /* 取字模位码 */
if ((uctempData1 >= 0xa1) && (uctempData2 >= 0xa1) && (uctempData1 <= 0xf7) && (uctempData2 <= 0xfe))
{
offset = ((uctempData1 - 0xA1) * 94 + (uctempData2 - 0xA1)) * CN_PATTERN_LEN + GB2312_24_ADDR;
mem_cpy(_pBuffer, (UINT4 *)offset, CN_PATTERN_LEN);
return CHINESE_PATTERN;
}
}
}
return ERROR_CODE;
}
#pragma arm section code = "bspTSPrntDealWord"
/*
*****************************************************
*
* 函数名:bspTSPrntDealWord
*
* 功 能:热敏打印机字模移位处理函数
*
* 输 入:g_ucprntCharPattern
* s_ucprntBitInByte
* s_usprntDotLine
*
* 输 出:g_ucprntPrintLineBuffer
*
* 返 回:SUCCESS---处理成功
*
******************************************************
*/
INT1 bspTSPrntDealWord
(
UINT1 _ucCNSign, /* 0 ASCII字符 1 中文字符 */
UINT1 _ucCharSpace, /* 字符间距 */
UINT1* _pBuffer /* [in]存放显示字模数据缓存首地址 */
)
{
UINT1 i,j,k;
UINT1 ucDealBytes;
UINT1 ucAdjustBit;
UINT1 ucReadOneByte;
UINT1 ucDealOneBit;
UINT1 ucDotLinePos;
UINT1 ucDotRowPos;
UINT1 ucDotBitPos;
if (_ucCNSign)
{
ucDealBytes = CN_PATTERN_LEN; /* 24点阵72字节( 长度24点 ) */
}
else
{
ucDealBytes = ASCII_PATTERN_LEN; /* 24点阵48字节( 长度12点 ) */
}
ucDotLinePos = s_usprntDotLine; /* 保存起始打印行位置(增加1个字符字模后,回到初始位置) */
ucDotRowPos = s_ucprntHoriByte; /* 存起始打印列位置(以字节为单位) */
ucDotBitPos = s_ucprntBitInByte; /* 当前处理的位在打印列位置相对位置 */
for (i = 0; i < ucDealBytes; i ++)
{
ucReadOneByte = *(_pBuffer + i); /* 从字模缓存取1字节 */
if (_ucCNSign)
{
ucAdjustBit = 8; /* 汉字字模的取值调整位 */
}
else
{
if( i % 2) /* ASCII字模 */
{
ucAdjustBit = 4; /* ASCII奇数字节只有4位数据有效 */
}
else
{
ucAdjustBit = 8; /* ASCII长度12,横向前一字节8位 */
}
}
for (j = 0; j < ucAdjustBit; j ++) /* 将字模单字节移位处理存取打印缓冲区 */
{
ucDealOneBit = ucReadOneByte >> 7;
ucReadOneByte = ucReadOneByte << 1;
bspTSPrntPatternShift(ucDealOneBit, 0);
}
if (((_ucCNSign == 1) && (i % 3 == 2))||((_ucCNSign == 0) && (i % 2 == 1)))
{
if (s_ucTSDoubleHigh)
{
INC(s_usprntDotLine, DOTLINE_LIMIT);
}
INC(s_usprntDotLine, DOTLINE_LIMIT);
s_ucprntHoriByte = ucDotRowPos; /* 换点行后,恢复起始打印列字节位置 */
s_ucprntBitInByte = ucDotBitPos; /* 换点行后,恢复当前字模处理位在打印列字节中的位置 */
}
}
s_usprntDotLine = ucDotLinePos;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -