⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtx166t.cpp

📁 为keil c51编写自己display接口
💻 CPP
字号:
// Rtx166t.cpp : implementation file
//

#include "stdafx.h"
#include "..\Alloc.h"
#include "RtxTiny.h"
#include "Rtx166t.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif




/////////////////////////////////////////////////////////////////////////////
// CRtx166t dialog

#if 0
struct RtxSym  {
  DWORD    nAdr;
  char      szN [16];
};


struct RtxSym RtxSym[] = {
  {  0,  "?RTX_TASKIDX",  },    // word
  {  0,  "?RTX_TASKIP",   },    // word
  {  0,  "?RTX_TASKCSP",  },    // word, present in md/la/hla models
  {  0,  "?RTX_STATE",    },    // byte
  {  0,  "?RTX_CURRENT",  },    // byte
  {  0,  "?RTX_TIMER",    },    // word
  {  0,  "?RTX_USRSP",    },    // word
  {  0,  "?RTX_SYSSP",    },    // word
};
#endif


static const TYP tp_u8  = { bt_uchar,  1, 0, 0, 0, 0, 0, 0, };
static const TYP tp_u16 = { bt_uint,   2, 0, 0, 0, 0, 0, 0, };


#if 0
CRtx166t::CRtx166t(CWnd* pParent /*=NULL*/)
	: CDialog(CRtx166t::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRtx166t)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}
#endif

CRtx166t::CRtx166t (DYM *pMen, CWnd *pWnd)  {
  pM = pMen;                     // save DYM-Descriptor locally.
  Create (IDD_RTXTINY, pWnd);
}

//CRtx166t::CRtx166t (CWnd *pParent)  {
//  Create (IDD_RTXTINY, pParent);
//}


//--- no Need for this Junk.
//void CRtx166t::DoDataExchange(CDataExchange* pDX)  {
//	CDialog::DoDataExchange(pDX);
//	//{{AFX_DATA_MAP(CRtx166t)
//		// NOTE: the ClassWizard will add DDX and DDV calls here
//	//}}AFX_DATA_MAP
//}


BEGIN_MESSAGE_MAP(CRtx166t, CDialog)
	//{{AFX_MSG_MAP(CRtx166t)
	ON_WM_CLOSE()
	ON_WM_ACTIVATE()
	ON_WM_KILLFOCUS()
	ON_BN_CLICKED(IDC_RTXREFRESH, OnRtxrefresh)
	ON_NOTIFY(NM_DBLCLK, IDC_RTXLIST, OnDblclkRtxlist)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRtx166t message handlers

void CRtx166t::PostNcDestroy()  {
  delete this;              // delete the new'ed object
  pRtx = NULL;              // clear external Object pointer here.
}

void CRtx166t::OnClose()  {
  pRtx->GetWindowRect (&pM->pDlg->rc);      // save Window position
  pM->pDlg->hw = NULL;      // clear m_hWnd
  DestroyWindow();          //--- modeless
}


static const char szEv[4][18] =  {
  { ""                 },
  { "Signal"           },
  { "Timeout"          },
  { "Signal & TimeOut" },
};



void CRtx166t::Setup166()  {
  CListCtrl *pL;
  DWORD     n, i;
  TYR66      *pT;
  char       szB [512];

  pL = (CListCtrl *) GetDlgItem (IDC_RTXLIST);   // get List-Control
  pL->SetBkColor (RGB(255,255,255));
  pL->SetTextColor (RGB(0,0,0));
  pL->DeleteAllItems();                  // remove Header items
  while (pL->DeleteColumn (0));          // remove columns

  LV_COLUMN   lvC;
  memset (&lvC, 0, sizeof (lvC));
  lvC.mask     = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  lvC.fmt      = LVCFMT_LEFT;                // left align columns

  lvC.iSubItem = 0;
  lvC.pszText  = "TID";  // "TaskID";        // TaskID Column
  lvC.cx       = pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (0, &lvC);
  pL->SetColumnWidth (0, lvC.cx + 16);

  lvC.iSubItem = 1;
  lvC.pszText  = "Task Name";                // TaskName Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (1, &lvC);
  pL->SetColumnWidth (1, lvC.cx + 12);

  lvC.iSubItem = 2;
  lvC.pszText  = "State";                    // State Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (2, &lvC);
  pL->SetColumnWidth (2, lvC.cx + 12);

  lvC.iSubItem = 3;
  lvC.pszText  = "Wait for Event";           // Event Column
  lvC.cx       = pL->GetStringWidth (szEv[3]);
  pL->InsertColumn (3, &lvC);
  pL->SetColumnWidth (3, lvC.cx + 20);

  lvC.iSubItem = 4;
  lvC.pszText  = "Sig";                      // Sig Column
  lvC.cx       = pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (4, &lvC);
  pL->SetColumnWidth (4, lvC.cx + 16);

  lvC.iSubItem = 5;
  lvC.pszText  = "Timer";                    // Timer Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (5, &lvC);
  pL->SetColumnWidth (5, lvC.cx);

  lvC.iSubItem = 6;
  lvC.pszText  = "UsrSP";                    // UsrSP Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (6, &lvC);
  pL->SetColumnWidth (6, lvC.cx);

  lvC.iSubItem = 7;
  lvC.pszText  = "SysSP";                    // SysSP Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (7, &lvC);
  pL->SetColumnWidth (7, lvC.cx);

  LV_ITEM     lvI;
  memset (&lvI, 0, sizeof (lvI));
  lvI.mask = LVIF_TEXT | LVIF_PARAM;

  pT = pTasks;
  for ( i = 0 ; i < nTasks ; ++i, ++pT )  {
    lvI.iItem      = i;
    lvI.iSubItem   = 0;
    lvI.pszText    = &szB[0];
    lvI.cchTextMax = 3;
    lvI.lParam     = (LPARAM) pT;
    sprintf (szB, "%3d", i);             // TaskNo
    n = pL->InsertItem (&lvI);
    if ((int) n == -1) break;           // Insertion failed.

    if (pT->sp && pT->sp->name[0]) strcpy (szB, pT->sp->name);
    else                          sprintf (szB, "0x%06X", pT->nAdr);
    n = pL->SetItemText (n, 1, szB);    // Name field
    if (n == 0) break;                  // SetItemText failed
  }
  Update();
}


void CRtx166t::Setup51()  {
  CListCtrl *pL;
  DWORD     n, i;
  TYR66      *pT;
  char       szB [512];

  pL = (CListCtrl *) GetDlgItem (IDC_RTXLIST);   // get List-Control
  pL->SetBkColor (RGB(255,255,255));
  pL->SetTextColor (RGB(0,0,0));
  pL->DeleteAllItems();                  // remove Header items
  while (pL->DeleteColumn (0));          // remove columns

  LV_COLUMN   lvC;
  memset (&lvC, 0, sizeof (lvC));
  lvC.mask     = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  lvC.fmt      = LVCFMT_LEFT;                // left align columns

  lvC.iSubItem = 0;
  lvC.pszText  = "TID";  // "TaskID";        // TaskID Column
  lvC.cx       = pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (0, &lvC);
  pL->SetColumnWidth (0, lvC.cx + 16);

  lvC.iSubItem = 1;
  lvC.pszText  = "Task Name";                // TaskName Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (1, &lvC);
  pL->SetColumnWidth (1, lvC.cx + 12);

  lvC.iSubItem = 2;
  lvC.pszText  = "State";                    // State Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (2, &lvC);
  pL->SetColumnWidth (2, lvC.cx + 12);

  lvC.iSubItem = 3;
  lvC.pszText  = "Wait for Event";           // Event Column
  lvC.cx       = pL->GetStringWidth (szEv[3]);
  pL->InsertColumn (3, &lvC);
  pL->SetColumnWidth (3, lvC.cx + 20);

  lvC.iSubItem = 4;
  lvC.pszText  = "Sig";                      // Sig Column
  lvC.cx       = pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (4, &lvC);
  pL->SetColumnWidth (4, lvC.cx + 16);

  lvC.iSubItem = 5;
  lvC.pszText  = "Timer";                    // Timer Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (5, &lvC);
  pL->SetColumnWidth (5, lvC.cx);

  lvC.iSubItem = 6;
  lvC.pszText  = "Stack";                    // Stack Column
  lvC.cx       = 2 * pL->GetStringWidth (lvC.pszText);
  pL->InsertColumn (6, &lvC);
  pL->SetColumnWidth (6, lvC.cx);

  LV_ITEM     lvI;
  memset (&lvI, 0, sizeof (lvI));
  lvI.mask = LVIF_TEXT | LVIF_PARAM;

  pT = pTasks;
  for ( i = 0 ; i < nTasks ; ++i, ++pT )  {
    lvI.iItem      = i;
    lvI.iSubItem   = 0;
    lvI.pszText    = &szB[0];
    lvI.cchTextMax = 3;
    lvI.lParam     = (LPARAM) pT;
    sprintf (szB, "%3d", i);             // TaskNo
    n = pL->InsertItem (&lvI);
    if ((int) n == -1) break;           // Insertion failed.

    if (pT->sp && pT->sp->name[0]) strcpy (szB, pT->sp->name);
    else  {
      pio->DecodeAdr (0, pT->nAdr, &szB[0]);
    }  
    n = pL->SetItemText (n, 1, szB);    // Name field
    if (n == 0) break;                  // SetItemText failed
  }
  Update();
}




BOOL CRtx166t::OnInitDialog()  {
  CDialog::OnInitDialog();

  switch (pio->iMCS)  {
    case iMCS166:
      Setup166();
      Update();
      break;
    case iMCS51:
      Setup51();
      Update();
      break;
  }

  RECT rc = pM->pDlg->rc;
  if (rc.left != -1)  {                 // restore Window position
    MoveWindow (rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);;
  }
  else CenterWindow();	

  return (TRUE);        // return TRUE unless you set the focus to a control
}


/*
 * Set pio's 'curDlg' modeless handle.
 * 'curDlg' reflects the dialog handle of the currenly active modeless dialog. 
 * This handle is used by Uv2 for 'IsDialogMessage'
 */

void CRtx166t::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)   {
  CDialog::OnActivate(nState, pWndOther, bMinimized);
  switch (nState)  {
    case WA_INACTIVE:
      pio->curDlg = NULL;        // Clear Modeless Handle
//    pio->CmdWinOut ("RTX-Dialog Inactive\r\n");
      break;
    case WA_ACTIVE:
    case WA_CLICKACTIVE:
      pio->curDlg = m_hWnd;      // Set Modeless Handle      
//    pio->CmdWinOut ("RTX-Dialog Activated\r\n");
      break;
  }
}


void CRtx166t::Update166 (void)  {
  union v      v;
  DWORD       nE, nA;
  CListCtrl  *pL;
  DWORD        i;
  TYR66      *pT;
  char       *pS, szB [128];;

  nE = pio->FetchItem (RtxSym[4].nAdr, (TYP *) &tp_u8, &v);  // fetch ?rtx_current
  if (nE == 0) return;            // Memory-access failed, cancel update.
  RtxCur = v.ul & 0xFF;           // TaskNo of current Task

  BeginWaitCursor();
  pL = (CListCtrl *) GetDlgItem (IDC_RTXLIST);   // get List-Control
  pL->SetRedraw (FALSE);

  for ( i = 0 ; i < nTasks ; ++i )  {
    pT = (TYR66 *) pL->GetItemData (i);
    if (pT == NULL) break;

    nA = RtxSym[3].nAdr + pT->n;
    nE = pio->FetchItem (nA, (TYP *) &tp_u8, &v);   // fetch ?rtx_state[TaskNo]
    if (nE == 0) break;                      // access failed.

    if (RtxCur == (BYTE) pT->n && (v.uc & 0x20)) pS = "Running";
    else if                       (v.uc & 0x40)  pS = "Timeout";
    else if                       (v.uc & 0x10)  pS = "Ready";
    else if                       (v.uc & 0x03)  pS = "Waiting";
    else if                     (!(v.uc & 0x10)) pS = "Deleted";
    else                                         pS = "Illegal";

    pL->SetItemText (i, 2, pS);                  // [2]: State field
    pL->SetItemText (i, 3, szEv [v.uc & 0x03]);  // [3]: Wait for Event
 
    szB [0] = (v.uc & 0x04) ? '1' : '0';
    szB [1] = 0;
    pL->SetItemText (i, 4, szB);                 // [4]: Sig

    nA = RtxSym[5].nAdr + (pT->n * 2);           // ?rtx_timer [TaskNo]
    pio->FetchItem (nA, (TYP *) &tp_u16, &v);    // fetch ?rtx_timer [TaskNo]
    sprintf (szB, "0x%04X", v.u16);
    pL->SetItemText (i, 5, szB);                 // [5]: Timer

    nA = RtxSym[6].nAdr + (pT->n * 2);           // ?rtx_usrsp [TaskNo]
    pio->FetchItem (nA, (TYP *) &tp_u16, &v);    // fetch ?rtx_usrsp [TaskNo]
    sprintf (szB, "0x%04X", v.u16);
    pL->SetItemText (i, 6, szB);                 // [6]: UsrSP

    nA = RtxSym[7].nAdr + (pT->n * 2);           // ?rtx_syssp [TaskNo]
    pio->FetchItem (nA, (TYP *) &tp_u16, &v);    // fetch ?rtx_syssp [TaskNo]
    sprintf (szB, "0x%04X", v.u16);
    pL->SetItemText (i, 7, szB);                 // [7]: SysSP
  }

  pL->SetRedraw (TRUE);
  EndWaitCursor();
}


#if 0
struct RtxSym RtxS51[] = {      // i51
  {  0,  "RTX_TASKIDX",      },
  {  0,  "RTX_TASKENTRY",    },
  {  0,  "?RTX_TASKSP",      },
  {  0,  "?RTX_TASKSTATUS",  },
  {  0,  "?RTX_CURRENTTASK", },
};
#endif

void CRtx166t::Update51 (void)  {
  union v      v;
  DWORD       nE, nA;
  CListCtrl  *pL;
  DWORD        i;
  TYR66      *pT;
  char       *pS, szB [128];;

                                  // ?RTX_CURRENTTASK
  nE = pio->FetchItem (RtxS51[4].nAdr, (TYP *) &tp_u8, &v);
  if (nE == 0) return;            // Memory-access failed, cancel update.
  RtxCur = v.ul & 0xFF;           // TaskNo of current Task

  BeginWaitCursor();
  pL = (CListCtrl *) GetDlgItem (IDC_RTXLIST);   // get List-Control
  pL->SetRedraw (FALSE);

  for ( i = 0 ; i < nTasks ; ++i )  {
    pT = (TYR66 *) pL->GetItemData (i);
    if (pT == NULL) break;

    nA = RtxS51[3].nAdr + (pT->n * 2) + 1;       // &?RTX_TASKSTATUS+i*2+1
    nE = pio->FetchItem (nA, (TYP *) &tp_u8, &v);
    if (nE == 0) break;                          // access failed.

    if (RtxCur == (BYTE) pT->n && (v.uc & 0x10)) pS = "Running";
    else if                       (v.uc & 0x40)  pS = "Timeout";
    else if                       (v.uc & 0x10)  pS = "Ready";
    else if                       (v.uc & 0x03)  pS = "Waiting";
    else if                       (v.uc == 0x0)  pS = "Deleted";
    else                                         pS = "Illegal";

    pL->SetItemText (i, 2, pS);                  // [2]: State field
    pL->SetItemText (i, 3, szEv [v.uc & 0x03]);  // [3]: Wait for Event
 
    szB [0] = (v.uc & 0x04) ? '1' : '0';
    szB [1] = 0;
    pL->SetItemText (i, 4, szB);                 // [4]: Sig

    nA = RtxS51[3].nAdr + (pT->n * 2);           // &?RTX_TASKSTATUS + i*2
    nE = pio->FetchItem (nA, (TYP *) &tp_u8, &v);
    if (nE == 0) break;                          // access failed.
    sprintf (szB, "0x%02X", v.uc);               // Timer
    pL->SetItemText (i, 5, szB);

    nA = RtxS51[2].nAdr + i;                     // &?RTX_TASKSP [i]
    nE = pio->FetchItem (nA, (TYP *) &tp_u8, &v);// fetch ?rtx_state[TaskNo]
    if (nE == 0) break;                          // access failed.
    sprintf (szB, "0x%02X", v.uc);
    pL->SetItemText (i, 6, szB);
  }

  pL->SetRedraw (TRUE);
  EndWaitCursor();
}


void CRtx166t::Update (void)  {
  switch (pio->iMCS)  {
    case iMCS166:
      Update166();
      break;
    case iMCS51:
      Update51();
      break;
    case iMCS251:
      break;
  }
}


void CRtx166t::OnRtxrefresh()  {
  Update();
}

void CRtx166t::OnDblclkRtxlist(NMHDR* pNMHDR, LRESULT* pResult)  {
  Update();
  *pResult = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -