目标:
利用0x21c寄存器的第0、1位,增加新的前后限位功能。
方法:
一、BottomStatus.h函数
1、增加前后限位状态:
#define STATUS_HEAD_Y2 8
#define STATUS_BACK_Y2 9
2、成员变量的声明
BOOL m_bHeadY2; //0820
BOOL m_bBackY2; //0820
3、生成矩形状态框的数目
//#define BOTTOMSTATUS_RECT_SUM 14
#define BOTTOMSTATUS_RECT_SUM 20
二、BottomStatus.cpp
1、CBottomStatus::CBottomStatus()中初始化成员变量:
m_bHeadY2 = FALSE;
m_bBackY2 = FALSE;
2、增加两个索引的刷新函数
》void CBottomStatus::RedrawSwitch(int index, BOOL bFlag)//刷新开关量
》index为事件的索引入口,bflag为对应事件寄存器返回某位的状态量
》状态量发生改变的时候,刷新显示的效果
if (index == STATUS_HEAD_Y2) //0820
{
if (m_bHeadY2!= bFlag)
{
m_bHeadY2 = bFlag;
m_pParent->RedrawWindow(&m_rcDrawItem[14]);
}
}
if (index == STATUS_BACK_Y2) //0820
{
if (m_bBackY2 != bFlag)
{
m_bBackY2 = bFlag;
m_pParent->RedrawWindow(&m_rcDrawItem[15]);
}
}
3、在debug/language文件夹的schinese.txt中
》language文件夹中记录了状态栏文字的索引,增加Y1前、后限位:
0525=前限位0
0526=后限位0
4、状态栏的显示程序
》void CBottomStatus::DrawBar(CDC *pDC)
》注释了原来上下限位的刷新功能,改为现在的前后限位刷新判断
rcItem.left += BOTTOMSTATUS_X_EDGE + BOTTOMSTATUS_SIZE;
rcItem.right = rcItem.left + BOTTOMSTATUS_SIZE;
//strText = g_GetLanguageResource(&g_GlobePara, g_GlobePara.m_LanguagePosition[104]);//104上限位
strText = g_GetLanguageResource(&g_GlobePara, g_GlobePara.m_LanguagePosition[525]);//525前限位0
//if(m_bUpZ)
if (m_bHeadY2) //0820
pDC->SelectObject(&brush2);
else
pDC->SelectObject(&brush1);
rcDraw = rcItem;
//m_rcDrawItem[3] = rcDraw;
m_rcDrawItem[14] = rcDraw; //0820
//if(g_psuGlobeJetPara->m_lInitEnableZ == 1)
//{
// pDC->Rectangle(&rcDraw);
// pDC->DrawText(strText, &rcDraw, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
//}
pDC->Rectangle(&rcDraw);
pDC->DrawText(strText, &rcDraw, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
//******************************************************************************************
rcItem.left += BOTTOMSTATUS_X_EDGE + BOTTOMSTATUS_SIZE;
rcItem.right = rcItem.left + BOTTOMSTATUS_SIZE;
//strText = g_GetLanguageResource(&g_GlobePara, g_GlobePara.m_LanguagePosition[105]);//105下限位
strText = g_GetLanguageResource(&g_GlobePara, g_GlobePara.m_LanguagePosition[526]);//526后限位0
//if(m_bDownZ)
if(m_bBackY2) //0820
pDC->SelectObject(&brush2);
else
pDC->SelectObject(&brush1);
rcDraw = rcItem;
//m_rcDrawItem[4] = rcDraw;
m_rcDrawItem[15] = rcDraw;
/*if(g_psuGlobeJetPara->m_lInitEnableZ == 1)
{
pDC->Rectangle(&rcDraw);
pDC->DrawText(strText, &rcDraw, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
}*/
pDC->Rectangle(&rcDraw);
pDC->DrawText(strText, &rcDraw, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
三、MacFunDriver.cpp
1、函数声明
》在MacFunDriver.h中:
BOOL IsMoveEdgeAheadY2(BOOL &bEdge);//检测Y是否到前限位
BOOL IsMoveEdgeBackwardY2(BOOL &bEdge);//检测Y是否到后限位
2、增加前限位Y1是否到位信号
(1)前限位的检测函数
BOOL CMacFunDriver::IsMoveEdgeAheadY2(BOOL &bEdge)//检测Y1是否到前限位
{
BOOL bRet = FALSE;
DWORD dwValue;
bRet = ReadPortEx(REG_IO_INPUT, dwValue);
if (bRet)
{
if (CheckDwordBit(dwValue, 0) == 0x00)
bEdge = FALSE;
else
bEdge = TRUE;
}
if (bEdge)
{
bRet = ReadPortEx(REG_IO_INPUT, dwValue);
if (bRet)
{
if (CheckDwordBit(dwValue, 0) == 0x00)
bEdge = FALSE;
else
bEdge = TRUE;
}
}
return bRet;
}
(2)后限位的检测函数
BOOL CMacFunDriver::IsMoveEdgeBackwardY2(BOOL &bEdge)//检测Y1是否到后限位
{
BOOL bRet = FALSE;
DWORD dwValue;
bRet = ReadPortEx(REG_IO_INPUT, dwValue);
if (bRet)
{
if (CheckDwordBit(dwValue, 1) == 0x00)
bEdge = FALSE;
else
bEdge = TRUE;
}
if (bEdge)
{
bRet = ReadPortEx(REG_IO_INPUT, dwValue);
if (bRet)
{
if (CheckDwordBit(dwValue, 1) == 0x00)
bEdge = FALSE;
else
bEdge = TRUE;
}
}
return bRet;
}
四、PrintsoftDlg.cpp
1、检测函数
》在void CPrinterSoftDlg::OnTimer(UINT_PTR nIDEvent){}的if(TIMER_INFO == nIDEvent)中添加:
》IsMoveEdgeAheadY2()函数如果PCIE寄存器数据读取成功,则该函数返回1,否则返回0。
》同时,会将读取寄存器的某一位的值返回到bflag当中,然后传到RedrawSwitch函数
》RedrawSwitch:如果bflag发生变化,会改变显示状态
if (g_MacFunDriver.IsMoveEdgeAheadY2(bFlag))
m_BottomStatus.RedrawSwitch(STATUS_HEAD_Y2, bFlag);
if (g_MacFunDriver.IsMoveEdgeBackwardY2(bFlag))
m_BottomStatus.RedrawSwitch(STATUS_BACK_Y2, bFlag);
五、在debug/language文件夹的schinese.txt中
》在第一大点的第3小点提过
》language文件夹中记录了状态栏文字的索引,增加Y1前、后限位:
0525=前限位0
0526=后限位0
通过全局变量的传递(法2)
》如果有必要用到整个解决方案的全局变量
》全局变量的定义位于:JetTypedef.h的typedef struct tagGlobeJetPara
》快速查找的方式:对suGlobeJetPara按F12进入该结构体的定义
》添加变量:
如:
BOOL m_bHeadY2; //0820
BOOL m_bBackY2; //0820
》则在解决方案即可对该变量进行传递
g_psuGlobeJetPara->m_bHeadY2;//即可调用