上位机:0820增加新的前后限位功能

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Teddygogogo/article/details/81868900

目标:

利用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_bHead
Y2!= bFlag)
        {
            m_bHead
Y2 = 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;//即可调用

猜你喜欢

转载自blog.csdn.net/Teddygogogo/article/details/81868900