📄 bsptsprnt.c
字号:
}
#pragma arm section code = "bspTSSendOneLine"
/*
******************************************************
*
* 函数名:bspTSSendOneLine
*
* 功 能:热敏打印发送点行数据SPI设置
*
* 输 入:g_ucprntPrintLineBuffer
*
* 输 出:s_ucTSSendOneLine
*
* 返 回:无
*
*
******************************************************
*/
void bspTSSendOneLine (void)
{
UINT1 i;
UINT1 ucValidCharacter = 0;
if ((g_ucSpi0SendMark != 0) || (g_ucSpi0RecMark != 0)) /* 验证Spi是否被占用 */
{
return;
}
s_ucTSSwitchSpiMark = 1;
g_ucTsOccupySpiMark = 1;
g_ucSpi0SendMark = SPI0_GEN_TX;
s_ucTSSendOneLine = 0;
/* 锂电池供电 */
if (!s_ucAdapterPowder)
{
for (i = 0; i < 48; i ++)
{
if (g_ucprntPrintLineBuffer[s_usTSprntLinePrinted][i] != 0)
{
ucValidCharacter ++;
}
}
/* 通过判断点行数据量(50%有效打印字符) */
if ((ucValidCharacter > 24)&&(!s_ucDoubleHeat))
{
/* 下一点行拟采用两次加热打印 */
s_ucNextDoubleHeat = 1;
}
else if ((ucValidCharacter < 24)&&(s_ucDoubleHeat))
{
/* 下一点行采用单次加热打印 */
s_ucNextDoubleHeat = 0;
}
/* 仅调整加热时间 */
if (ucValidCharacter < 24) /* 单行只有1/3数据可以打印 */
{
s_ucPrntAdjEffect = 1; /* 需要调整该点行打印效果 */
}
else
{
s_ucPrntAdjEffect = 0; /* 该点行打印效果不需要调整 */
}
}
else
{
s_ucNextDoubleHeat = 0;
}
g_Spi0Tx.pTxBuf = &g_ucprntPrintLineBuffer[s_usTSprntLinePrinted][0];
g_Spi0Tx.ucWantTxLen = 48;
g_Spi0Tx.ucAlreadyTxLen = 0;
SPI0_SPDR = g_Spi0Tx.pTxBuf[g_Spi0Tx.ucAlreadyTxLen++];
return;
}
#pragma arm section code
/*
******************************************************
*
* 函数名:bspTSConfirmHeatTime
*
* 功 能:热敏打印机根据终端设定和电池供电不同确定加热时间
*
* 输 入:g_usBatteryValue
*
* 输 出:g_ucprntHeatTime
*
* 返 回:无
*
*
******************************************************
*/
void bspTSConfirmHeatTime(void)
{
UINT1 ucprntHeatTime;
UINT4 ustmp;
/* 读取热敏加热时间参数 */
ET_mntnReadParaValue(ID_MNTN_THERMAL_HEAT_TIME, &ucprntHeatTime);
if (g_ucVccOffCnt >= VCC_OFF_CNT)/*外电池掉电、锂电池供电 >=*/
{
s_ucAdapterPowder = 0;
ustmp = g_usBatteryValue/100;
ustmp = (3257 + 41*(ustmp*ustmp)/5 - 319*ustmp)/ADJUST_TIMER_SCALE * ucprntHeatTime/40;
if (ustmp > 240)
{
g_ucprntHeatTime = 250;
}
else
{
if (g_usBatteryValue < 1750) /*电压过低,额外补偿*/
{
g_ucprntHeatTime = ustmp + 10;
}
else
{
g_ucprntHeatTime = ustmp;
}
}
s_ucFirstArrayHeatEnd = 2;
s_ucprntStepTime = (g_ucprntHeatTime + 4/ADJUST_TIMER_SCALE)/4 ; /* 打印走步时间 */
/* 打印点行加热时间不大于走步时间 */
if (g_ucprntHeatTime >= 4*s_ucprntStepTime)
{
s_ucprntStepTime = s_ucprntStepTime + 2;
}
else
{
s_ucprntStepTime = s_ucprntStepTime + 1;
}
}
else
{
s_ucAdapterPowder = 1;
if ((ucprntHeatTime >= 30) && (ucprntHeatTime <= 180))
{
g_ucprntHeatTime = ucprntHeatTime/ADJUST_TIMER_SCALE; /* 设置打印加热时间 */
}
else
{
g_ucprntHeatTime = HEAT_TIME_DEFAULT/ADJUST_TIMER_SCALE; /* 默认打印加热时间3.8ms */
}
s_ucprntStepTime = (g_ucprntHeatTime + 4/ADJUST_TIMER_SCALE)/4 ; /* 打印走步时间 */
/* 打印点行加热时间不大于走步时间 */
if (g_ucprntHeatTime >= 4*s_ucprntStepTime)
{
s_ucprntStepTime = s_ucprntStepTime + 1;
}
}
return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntSetInitState
*
* 功 能:置热敏打印初始状态函数
*
* 输 入:无
*
* 输 出:无
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntSetInitState (void)
{
bspTSPrntEraseBuffer();
bspTSConfirmHeatTime();
g_usTSPrintedLine = 0;
return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntSetEndState
*
* 功 能:置热敏打印结束状态函数
*
* 输 入:无
*
* 输 出:无
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntSetEndState (void)
{
HEAT_DISABLE1;
HEAT_DISABLE2;
s_ucprntPrintEnable = 0;
bspTSPrntEraseBuffer();
bspTSPrntPFStop();
bspTimer1Stop();
s_ucTSSwitchSpiMark = 0;
s_ucRsponseKey = 0;
return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntISTRInit
*
* 功 能:热敏打印中断服务函数变量初始化,触发打印功能
*
* 输 入:无
*
* 输 出:无
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntISTRInit(void)
{
UINT1 ucprntLineBuffer[48];
s_ucDoubleHeat = 0;
s_ucTSSwitchSpiMark = 1;
g_ucTsOccupySpiMark = 1;
g_ucSpi0SendMark = SPI0_GEN_TX;
s_ucTSSendOneLine = 0;
s_ucPrntBlankLine = 1;
mem_set(&ucprntLineBuffer[0], 0 ,48);
g_Spi0Tx.pTxBuf = &ucprntLineBuffer[0];
g_Spi0Tx.ucWantTxLen = 48;
g_Spi0Tx.ucAlreadyTxLen = 0;
SPI0_SPDR = g_Spi0Tx.pTxBuf[g_Spi0Tx.ucAlreadyTxLen++];
OPERATE_LAT;
/* 运动步数计数器清0 */
s_usprntPFStepCnt = 0;
s_ucprntTimerStepCnt = 0;
s_ucprntTimerHeatCnt = 0;
s_ucprntPrintEnable = 1;
s_ucprntHeatEnable = 1;
s_ucprntPFRunSign = 0;
bspTSprntSetISRTimer(s_ucprntStepTime);
//HEAT_ENABLE;/* 确保打印第一点行 */
s_ucTSSendOneLine = 1;
return;
}
/*
**************************************************
*
* 函数名:bspTSPrntEraseBuffer
*
* 功 能:热敏打印机清空打印缓冲区
*
* 输 入:无
*
* 输 出:打印缓冲区输出、打印定位标志位
*
* 返 回:N/A
*
**************************************************
*/
void bspTSPrntEraseBuffer(void)
{
UINT1 i,j;
for (i = 0 ; i < DOTLINE_LIMIT ; i ++)
{
for (j = 0 ; j < TS_ONE_LINE_BYTE; j ++)
{
g_ucprntPrintLineBuffer[i][j] = 0;
}
}
s_usprntDotLine = 0;
s_ucprntBitInByte = 0x80;
s_ucprntHoriByte = 0;
s_usprntDotLineDealed = 0;
s_usTSprntLinePrinted = 0;
s_usprntHoriPosition = 0;
return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntPFStop
*
* 功 能:热敏打印机停机函数
*
* 输 入:无
*
* 输 出:无
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntPFStop(void)
{
HEAT_DISABLE1;
HEAT_DISABLE2;
TS_POWER_OFF(); /* 关闭5v电源 */
s_ucprntPFRunSign = 0; /* 清0进纸运行标志位 */
s_ucprntHeatEnable = 0; /* 清0加热使能标志位 */
s_ucprntPrintEnable = 0; /* 清0打印使能标志位 */
return;
}
/*
***************************************************
*
* 函数名:bspTSPrntPFLineSpace
*
* 功 能:热敏打印机温度检测
*
* 输 入:N/A
*
* 输 出:g_ucprntState
*
* 返 回:N/A
*
****************************************************
*/
INT1 bspTSPrntDetectTemp(void)
{
UINT1 ucRet;
UINT2 uiTempvoltage; /* 单位是mv */
ucRet = bspAdcStart(0, &uiTempvoltage);
if (0 == ucRet)
{
if (uiTempvoltage <= TEMP_lIMIT_VALUE) /* 65度对应电压值mv */
{
g_ucprntState = g_ucprntState|HIGHTEMP;
}
else
{
g_ucprntState = g_ucprntState&0xfb;
}
return SUCCESS;
}
else
{
return FAULT;
}
}
/*
*****************************************************
*
* 函数名:bspTSPrntArabAndASCDeal
*
* 功 能:热敏打印机阿拉伯语中ASCII处理
*
* 输 入:s_ucTSprntDataBuffDataIn
* s_ucRevBuffer
*
* 输 出:s_ucRevBuffer
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntArabAndASCDeal(void)
{
UINT1 j;
for (j = 0;j < s_ucTSprntDataBuffDataIn ;j++)
{
if (((s_ucRevBuffer[j] >= 'A') && (s_ucRevBuffer[j] <= 'Z') == 0x01)
|| ((s_ucRevBuffer[j] >= 'a') && (s_ucRevBuffer[j] <= 'z') == 0x01)
|| ((s_ucRevBuffer[j] >= '0') && (s_ucRevBuffer[j] <= '9') == 0x01))
{
guiReverseNum(s_ucRevBuffer+j);
break;
}
}
return;
}
/*
*****************************************************
*
* 函数名:bspTSPrntData
*
* 功 能:热敏打印机命令解析打印函数
*
* 输 入:s_usprntDotLineDealed
* s_ucTSDealedLineCounter
* s_ucOverFlowPrinted
* g_ucBatVolLower
* g_syscPowOff
*
* 输 出:s_usprntDotLine
* g_ucprntPrintLineBuffer、
* s_ucTSSendOneLine
* s_ucprntPrintEnable
*
* 返 回:N/A
*
*****************************************************
*/
void bspTSPrntData
(
UINT1 *_pData, /* [in]待解析的排版打印数据 */
UINT2 _usLength, /* 数据的长度 */
UINT1 _ucLineSpace, /* 热敏打印行间距 */
UINT1 _ucStartPos /* 热敏打印确定横向起始位置(精确mm) */
)
{
UINT2 i,j,k;
UINT2 uiStepCount,uiStepTempCount;
UINT1 ucEnableDealData = 1;
UINT1 ucSetHeatTime = 0;
UINT1 ucBeginPlace = 0;
UINT1 ucRet = 0;
UINT1 ucfPrnt = 1;
INT1 Ret = 0;
UINT1 ucParseData[2] = {0};
mem_set(s_ucTSprntDataBuffer, 0 , sizeof(s_ucTSprntDataBuffer));
/* 热敏打印行间距不超过默认行间距2倍 */
if (_ucLineSpace >= 2*TS_DEFAULT_lINESPACE)
{
return ;
}
TS_POWER_ON();
//bspUart0Set(9600);
//bspUart0Write((UINT1 *)"1", 1);
//OSTimeDly(100);
bspTSPrntDetectTemp(); /* 温度过高程序自恢复功能 */
bspTSPrntSetInitState();
bspTSPrntSetIntPos(_ucStartPos);
i = 0;
s_ucRsponseKey = 1; /* 热敏打印时候禁止响应进、退纸键 */
if (g_ucPaperType)
{
/* 定长票据支持票据分多次打印初始定位,其中黑标距离打印起始位置9mm(9mm*8*4=288点) */
uiStepCount = (g_usprntPaperLen1 - 288)/4;
}
else
{
/* 不定长票据支持票据分多次打印初始定位,起始位置就是当前相对位置 */
uiStepCount = g_usprntPaperLen3/4;
}
do
{
/* 打印机状态异常或外电掉电并且锂电池电压低,则停止打印 */
if ((g_ucprntState&0x0f)||((g_ucVccOffCnt >= VCC_OFF_CNT)&&(g_ucBatVolLower == 1)))
{
bspTSPrntSetEndState();
if (g_syscPowOff == SUCCESS)
{
g_ucprntState = g_ucprntState |LOSEPOWER;
}
if ((g_usTSPrintedLine <= 345)&&(g_ucprntState&0x01))
{
g_usTSPrintedLine = 0;
}
return;
}
if ((i < _usLength)&&(ucEnableDealData)) /* 命令解析处理 */
{
switch (_pData[i])
{
case 0x0b: /* 设置倍宽打印命令 */
s_ucTSDoubleWidth = 1;
s_ucMaxASClen = 16;
i ++;
break;
case 0x14: /* 取消倍宽打印命令 */
s_ucTSDoubleWidth = 0;
s_ucMaxASClen = LINEASCIINUM;
i ++;
break;
case 0x0f: /* 设置倍高打印命令 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -