📄 rtx166t.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 + -