// tstmodemDlg.cpp : implementation file // // todo: // - state needs to be visible with checked menu entries. // - output window needs to be better formatted // - input edit should always get the focus. // - comioctl check needs to be reset when changing ports. // todo: // create listbox which supports different classes of text: // 'red' for received // 'blue' for transmitted // 'black' for local messages // also, optionally timing delays should be displayed. // and possibly non-ascii data in hex // also add option to enable/disable display of specific classes. #include "stdafx.h" #include "tstmodem.h" #include "tstmodemDlg.h" #include "bitbutton.h" #include "serialport.h" #include "kernelState.h" #include "RILState.h" #include "serialparams.h" #include "bitcontroller.h" #include "debug.h" #include "stringutils.h" #include "boost_lite.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #if 0 char *initstrings[]= { "Z", "E1Q0V1", "&C1&D2S0=0S3=13S4=10", "S5=8S7=45S8=2S10=14", "TX4+CRC=1;+CMEE=1;+CR=1;+CSCS=\"GSM\"", "+CMGF=0;+CSCB=1,\"\",\"\";+CBST=71,0,1", "+CLIP=1;+FCLASS=0", "+GMI", "+GMM", "+GMR", "+GSN", "+CGMI", "+CGMM", "+CGMR", "+CGSN", "+CPMS=\"SM\",\"SM\",\"SM\"", "+CNMI=1,1,2,2,1;+CRLP=61,61,78,6", "+CREG=1;+COPS=3,2;^SCKS=1;+CSSN=1,1", "+CPBS=\"SM\";^SMGO=1;+CEER", NULL }; #endif const char *g_initstrings[]= { "Z", "E0Q0V1", "&C1S0=0S2=43S3=13S4=10", "S5=8S7=45S8=2S10=14", "&D2+CRC=1;+CMEE=1;+CR=1;+CSCS=\"GSM\"", "+CMGF=0;+CLIP=1", "+FCLASS=0", "+GMI", "+GMM", "+GMR", "", "+CGMI", "+CGMM", "+CGMR", "+CGSN", "TX4S6=3S11=90+CPMS=\"BM\",\"SM\",\"BM\"", "+CNMI=2,1,0,0,0", "+CRLP=120,120,48,6", "+CREG=1;+COPS=3,2;+IPR=19200;+CMOD=0", NULL }; void ConvertHexToBytes(CString& hexstr, CString& newstr); void ConvertBytesToHex(CString& str, CString& hexstr); ///////////////////////////////////////////////////////////////////////////// // CTstmodemDlg dialog CTstmodemDlg::CTstmodemDlg(CWnd* pParent /*=NULL*/) : CDialog(CTstmodemDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTstmodemDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_bUpdateBits= false; m_kernel= NULL; m_ril= NULL; m_gpio_bits= NULL; m_a400_bits= NULL; } void CTstmodemDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTstmodemDlg) DDX_Control(pDX, IDC_CHECK_RTSCTS_FLOWCTL, m_cCheckRtsCtsFlowControl); DDX_Control(pDX, IDC_CHECK_DOBITS, m_cCheckDoBits); DDX_Control(pDX, IDC_CHECK_OPENDEVICE, m_cCheckOpenDevice); DDX_Control(pDX, IDC_CHECK_COM_IOCTL, m_cCheckComIoctl); DDX_Control(pDX, IDC_CHECK_DEBUG_IN_OUTPUT, m_cCheckDebugInOutput); DDX_Control(pDX, IDC_CHECK_KERNEL_03C8, m_cCheckKernel03c8); DDX_Control(pDX, IDC_STATUS_XMIT, m_cStatusTransmit); DDX_Control(pDX, IDC_STATUS_RCV, m_cStatusReceive); DDX_Control(pDX, IDC_COUNTER_XMIT, m_cCounterTransmit); DDX_Control(pDX, IDC_COUNTER_RLSD, m_cCounterRLSD); DDX_Control(pDX, IDC_COUNTER_ERR, m_cCounterERR); DDX_Control(pDX, IDC_COUNTER_RING, m_cCounterRing); DDX_Control(pDX, IDC_COUNTER_RCV, m_cCounterReceive); DDX_Control(pDX, IDC_COUNTER_DSR, m_cCounterDSR); DDX_Control(pDX, IDC_COUNTER_CTS, m_cCounterCTS); DDX_Control(pDX, IDC_COUNTER_BRK, m_cCounterBreak); DDX_Control(pDX, IDC_CHECK_GSMRESET, m_cCheckGsmReset); DDX_Control(pDX, IDC_CHECK_CLEARSCREEN, m_cCheckClearScreen); DDX_Control(pDX, IDC_CHECK_GSM_MODE, m_cCheckGsmMode); DDX_Control(pDX, IDC_RECEIVE_DATA, m_cListReceiveData); DDX_Control(pDX, IDC_CHECK_ENABLE_RIL, m_cCheckEnableRil); DDX_Control(pDX, IDC_CHECK_IR, m_cCheckIR); DDX_Control(pDX, IDC_TRANSMIT_DATA, m_cEditTransmitData); DDX_Control(pDX, IDC_CHECK_HEX, m_cCheckHexData); DDX_Control(pDX, IDC_CHECK_CR, m_cCheckAddCR); DDX_Control(pDX, IDC_CHECK_LF, m_cCheckAddLF); DDX_Control(pDX, IDC_STATUS_RLSD, m_cStatusRLSD); DDX_Control(pDX, IDC_STATUS_ERR, m_cStatusERR); DDX_Control(pDX, IDC_STATUS_RING, m_cStatusRing); DDX_Control(pDX, IDC_STATUS_BRK, m_cStatusBreak); DDX_Control(pDX, IDC_STATUS_DSR, m_cStatusDSR); DDX_Control(pDX, IDC_STATUS_CTS, m_cStatusCTS); DDX_Control(pDX, IDC_CHECK_RTS, m_cCheckRTS); DDX_Control(pDX, IDC_CHECK_DTR, m_cCheckDTR); DDX_Control(pDX, IDC_CHECK_BRK, m_cCheckBreak); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTstmodemDlg, CDialog) //{{AFX_MSG_MAP(CTstmodemDlg) ON_BN_CLICKED(IDC_CHECK_DTR, OnCheckDtr) ON_BN_CLICKED(IDC_CHECK_RTS, OnCheckRts) ON_BN_CLICKED(IDC_CHECK_BRK, OnCheckBrk) ON_BN_CLICKED(IDC_BUTTON_TRANSMIT, OnButtonTransmit) ON_BN_CLICKED(IDC_CHECK_IR, OnCheckIr) ON_BN_CLICKED(IDC_CHECK_HEX, OnCheckHex) ON_WM_CLOSE() ON_BN_CLICKED(IDC_CHECK_ENABLE_RIL, OnCheckEnableRil) ON_BN_CLICKED(IDC_CHECK_GSMRESET, OnCheckGsmreset) ON_BN_CLICKED(IDC_CHECK_CLEARSCREEN, OnCheckClearScreen) ON_BN_CLICKED(IDC_CHECK_GSM_MODE, OnCheckGsmMode) ON_BN_CLICKED(IDC_CHECK_KERNEL_03C8, OnCheckKernel03c8) ON_BN_CLICKED(IDC_CHECK_DEBUG_IN_OUTPUT, OnCheckDebugInOutput) ON_BN_CLICKED(IDC_CHECK_COM_IOCTL, OnCheckComIoctl) ON_BN_CLICKED(IDC_CHECK_OPENDEVICE, OnCheckOpendevice) ON_WM_TIMER() ON_BN_CLICKED(IDC_CHECK_DOBITS, OnCheckDobits) ON_BN_CLICKED(IDC_CHECK_RTSCTS_FLOWCTL, OnCheckRtsctsFlowctl) //}}AFX_MSG_MAP ON_MESSAGE(WM_RECEIVEDATA, OnReceiveData) ON_COMMAND_RANGE(IDM_MENU_SPEED1, IDM_MENU_SPEED49, OnSpeedMenu) ON_COMMAND_RANGE(IDM_MENU_BITS1, IDM_MENU_BITS49, OnBitsMenu) ON_COMMAND_RANGE(IDM_MENU_PORT1, IDM_MENU_PORT49, OnPortMenu) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTstmodemDlg message handlers void SetCheckbox(CButton& checkbox, int value) { checkbox.SetCheck(value ? BST_CHECKED : BST_UNCHECKED); } ///////////////////////////////////////////////////////////// // dynamically creating the menu bar void AddMenuToCommandBar(CCeCommandBar &cmdbar, TCHAR *name, int menuid, CMenu *popup); CMenu *MakeMenu(int menuid, CStringArray *itemlist, CString& dfl); void CTstmodemDlg::InitializeMenu() { //m_wndCommandBar.m_bShowSharedNewButton = TRUE; if(!m_wndCommandBar.Create(this)) // || !m_wndCommandBar.InsertMenuBar(IDR_MENUBAR1) { error("creating menu"); return; } AddMenuToCommandBar(m_wndCommandBar, L"port", IDR_MENU_PORT, MakeMenu(IDR_MENU_PORT+1, SerialParams::GetDeviceList(), SerialParams::GetDefaultPort())); AddMenuToCommandBar(m_wndCommandBar, L"speed", IDR_MENU_SPEED, MakeMenu(IDR_MENU_SPEED+1, SerialParams::GetSpeedList(), SerialParams::GetDefaultSpeed())); AddMenuToCommandBar(m_wndCommandBar, L"bits", IDR_MENU_BITS, MakeMenu(IDR_MENU_BITS+1, SerialParams::GetBitsList(), SerialParams::GetDefaultBits())); ::DrawMenuBar(GetSafeHwnd()); } void AddMenuToCommandBar(CCeCommandBar &cmdbar, TCHAR *name, int menuid, CMenu *popup) { // from http://www.pocketpccode.com/forum/read.php?TID=469 CToolBarCtrl &pToolbar = cmdbar.GetToolBarCtrl(); TBBUTTON tbb0; tbb0.iBitmap = I_IMAGENONE; tbb0.fsState = TBSTATE_ENABLED; #define TBSTYLE_NO_DROPDOWN_ARROW 0x0080 tbb0.fsStyle = TBSTYLE_DROPDOWN|TBSTYLE_AUTOSIZE|TBSTYLE_NO_DROPDOWN_ARROW; tbb0.dwData = (UINT)popup->m_hMenu; tbb0.iString = (UINT)name; // Unicode String tbb0.idCommand = menuid; // unique pToolbar.InsertButton(pToolbar.GetButtonCount(),&tbb0); } CMenu *MakeMenu(int menuid, CStringArray *itemlist, CString& dfl) { if (itemlist==NULL) { debug("ERROR: no items for menu %d\n", menuid); return NULL; } CMenu *pMenu = new CMenu(); pMenu->CreatePopupMenu(); int idxdfl= 0; for(int i=0 ; i < itemlist->GetSize() ; i++) { if (!pMenu->AppendMenu(MF_STRING|MF_ENABLED, menuid+i, itemlist->GetAt(i))) error("failed to add menuentry\n"); if (itemlist->GetAt(i)==dfl) idxdfl= i; } delete itemlist; pMenu->CheckMenuRadioItem(0, itemlist->GetSize()-1, idxdfl, MF_BYPOSITION); return pMenu; } ///////////////////////////////////////////////////////////////// // create bits control void CTstmodemDlg::CreateBitsControl() { RECT prect; this->GetWindowRect(&prect); RECT rect; m_cListReceiveData.GetWindowRect(&rect); // create just below the modem output int ypos= rect.bottom-prect.top+2; int xpos= (prect.right-prect.left-32*(BIT_WIDTH+1))/2; m_gpio_bits= new BitController(0xa9040000, 0xa9040004, 0xffffffff); m_gpio_bits->CreateControl(this, xpos, ypos); m_gpio_bits->UpdateValues(); m_a400_bits= new BitController(0xa4000068, 0xa4000064, 0x0000ffff); m_a400_bits->CreateControl(this, xpos, ypos+BIT_WIDTH+3); m_gpio_bits->UpdateValues(); } ///////////////////////////////////////////////////////////////// // init dialog BOOL CTstmodemDlg::OnInitDialog() { CDialog::OnInitDialog(); DWORD base= GetDialogBaseUnits(); debug("baseunits: %d x %d\n", base&0xffff, base>>16); RECT dlgrect; GetClientRect(&dlgrect); debug("client: (%d x %d)\n", dlgrect.right, dlgrect.bottom); // portrait: pixels: 240 x 268, dialogunits: 160 x 195 for (int dx=-1 ; dx<=1 ; dx++) for (int dy=-1 ; dy<=1 ; dy++) { dlgrect.right = 160+dx; dlgrect.bottom = 195+dy; debug("dlg: (%d x %d) ->", dlgrect.right, dlgrect.bottom); MapDialogRect(&dlgrect); debug("pixels: (%d x %d)\n", dlgrect.right, dlgrect.bottom); } // landscape: pixels: 320 x 188, dialogunits: 213 x 137 for (int dx=-1 ; dx<=1 ; dx++) for (int dy=-1 ; dy<=1 ; dy++) { dlgrect.right = 213+dx; dlgrect.bottom = 137+dy; debug("dlg: (%d x %d) ->", dlgrect.right, dlgrect.bottom); MapDialogRect(&dlgrect); debug("pixels: (%d x %d)\n", dlgrect.right, dlgrect.bottom); } /* LOGFONT lf; ::GetObject((HFONT)GetStockObject(SYSTEM_FONT),sizeof(lf),&lf); debug("default font: w=%d h=%d wg=%d\n", lf.lfWidth, lf.lfHeight, lf.lfWeight); //lf.lfWidth= 6; //lf.lfHeight /= 2; _tcscpy(lf.lfFaceName, L"Tahoma"); CFont font; font.CreateFontIndirect(&lf); m_cListReceiveData.SetFont(&font); m_cEditTransmitData.SetFont(&font); */ #if _WITH_GPIOBITDISPLAY CreateBitsControl(); #else m_cCheckDoBits.ShowWindow(SW_HIDE); #endif InitializeMenu(); /* SetCheckbox(m_cCheckGsmReset, m_kernel->Get_a4000068_bit6()); SetCheckbox(m_cCheckGsmMode, m_kernel->Get_a4000064_bit6()); SetCheckbox(m_cCheckKernel03c8, m_kernel->Get_ac0203c8()); SetCheckbox(m_cCheckEnableRil, true); */ m_cCheckGsmMode.ShowWindow(SW_HIDE); m_cCheckKernel03c8.ShowWindow(SW_HIDE); SetCheckbox(m_cCheckDebugInOutput, true); SetCheckbox(m_cCheckAddCR, true); DebugRegisterWindow(this); m_cEditTransmitData.SetFocus(); return FALSE; // false: no default focus } void CTstmodemDlg::SetModels(SerialPort& port, KernelState& kernel, RILState& ril) { m_port= &port; m_kernel= &kernel; m_ril= &ril; } void CTstmodemDlg::OnCheckDtr() { if (!m_port->SetDTR(m_cCheckDTR.GetCheck()==BST_CHECKED)) SetCheckbox(m_cCheckDTR, false); } void CTstmodemDlg::OnCheckRts() { if (!m_port->SetRTS(m_cCheckRTS.GetCheck()==BST_CHECKED)) SetCheckbox(m_cCheckRTS, false); } void CTstmodemDlg::OnCheckBrk() { if (!m_port->SetBreak(m_cCheckBreak.GetCheck()==BST_CHECKED)) SetCheckbox(m_cCheckBreak, false); } void CTstmodemDlg::OnCheckRtsctsFlowctl() { if (!m_port->SetRtsCtsFlowControl(m_cCheckRtsCtsFlowControl.GetCheck()==BST_CHECKED)) SetCheckbox(m_cCheckRtsCtsFlowControl, false); } void CTstmodemDlg::OnCheckIr() { if (!m_port->SetIRMode(m_cCheckIR.GetCheck()==BST_CHECKED)) SetCheckbox(m_cCheckIR, false); } void CTstmodemDlg::OnCheckHex() { if (m_cCheckHexData.GetCheck()==BST_CHECKED) { CString hex; CString str; m_cEditTransmitData.GetWindowText(str); ConvertBytesToHex(str, hex); m_cEditTransmitData.SetWindowText(hex); } else { CString hex; CString str; m_cEditTransmitData.GetWindowText(hex); ConvertHexToBytes(hex, str); m_cEditTransmitData.SetWindowText(str); } } LRESULT CTstmodemDlg::OnReceiveData(WPARAM wParam, LPARAM lParam) { CString str; m_port->ReceiveData(str); m_cListReceiveData.appendString(str, 0); if (wcsstr(str.GetBuffer(0), L"\nOK\r")) { boost::mutex::scoped_lock lock(m_okmtx); m_ok= true; m_okcond.notify_one(); } // todo: add config flag to enable/disable logging FILE *f= fopen("\\com.log", "a+"); if (f) { fprintf(f, "%ls", str.GetBuffer(0)); fclose(f); } return 0; } void SetState(CButton& button, CStatic& counter, bool state) { bool oldstate= (button.GetState()==BST_PUSHED); //debug("old=%d new=%d state=%d check=%d\n", oldstate, state, button.GetState(), button.GetCheck()); if (state!=oldstate) { button.SetState(state); CString str; counter.GetWindowText(str); DWORD nr= _tcstoul(str.GetBuffer(0), 0, 0); str.Format(L"%d", nr+1); counter.SetWindowText(str); } } void MySetEvent(CButton& button, CStatic& counter) { bool state= button.GetState()==BST_PUSHED; button.SetState(!state); CString str; counter.GetWindowText(str); DWORD nr= _tcstoul(str.GetBuffer(0), 0, 0); str.Format(L"%d", nr+1); counter.SetWindowText(str); } void CTstmodemDlg::CommEventBreak(bool state) { SetState(m_cStatusBreak, m_cCounterBreak, state); } void CTstmodemDlg::CommEventCTS(bool state) { SetState(m_cStatusCTS, m_cCounterCTS, state); } void CTstmodemDlg::CommEventRing(bool state) { SetState(m_cStatusRing, m_cCounterRing, state); } void CTstmodemDlg::CommEventRLSD(bool state) { SetState(m_cStatusRLSD, m_cCounterRLSD, state); } void CTstmodemDlg::CommEventERR(bool state) { SetState(m_cStatusERR, m_cCounterERR, state); } void CTstmodemDlg::CommEventDSR(bool state) { SetState(m_cStatusDSR, m_cCounterDSR, state); } void CTstmodemDlg::CommEventReceive() { MySetEvent(m_cStatusReceive, m_cCounterReceive); } void CTstmodemDlg::CommEventTransmit() { MySetEvent(m_cStatusTransmit, m_cCounterTransmit); } void CTstmodemDlg::CommEventInputOverFlow() { // SetState(m_cStatusRcvOverflow, m_cCounterRcvOverflow, state); } void CTstmodemDlg::CommEventOutputOverFlow() { // SetState(m_cStatusXmitOverflow, m_cCounterXmitOverflow, state); } bool toNyble(char c, int& nyble) { if (c>='0' && c<='9') { nyble= c-'0'; return true; } if (c>='A' && c<='F') { nyble= c-'A'+10; return true; } if (c>='a' && c<='f') { nyble= c-'a'+10; return true; } return false; } char toHex(BYTE c) { return '0' + c + (c>9?'a'-'0'-10:0); } void ConvertHexToBytes(CString& hexstr, CString& newstr) { int buflen= hexstr.GetLength()/2; TCHAR *buf= newstr.GetBuffer(buflen+1); int bi=0; int ni=1; // nyble index ( 1=high, 0=low ) int hexlen= hexstr.GetLength(); TCHAR *hexbuf= hexstr.GetBuffer(0); int si=0; while (si>4); hexbuf[si++]= toHex(strbuf[bi]&0xF); bi++; } hexbuf[si]= 0; hexstr.ReleaseBuffer(si); } void CTstmodemDlg::OnButtonTransmit() { CString str; m_cEditTransmitData.GetWindowText(str); if (m_cCheckHexData.GetCheck()==BST_CHECKED) { CString hex= str; ConvertHexToBytes(hex, str); } else { if (m_cCheckAddCR.GetCheck()==BST_CHECKED) str += "\r"; if (m_cCheckAddLF.GetCheck()==BST_CHECKED) str += "\n"; } m_cListReceiveData.appendString(str, 1); m_port->SendData(str); } void CTstmodemDlg::OnClose() { DebugRegisterWindow(NULL); CDialog::OnClose(); } void CTstmodemDlg::OnCheckEnableRil() { if (m_cCheckEnableRil.GetCheck()==BST_CHECKED) { if (!m_ril->open()) SetCheckbox(m_cCheckEnableRil, false); else if (!m_ril->enable()) SetCheckbox(m_cCheckEnableRil, false); } else { m_ril->disable(); m_ril->close(); } } DWORD CTstmodemDlg::staticthreadproc(CTstmodemDlg* self) { return self->sendcommandlist(); } DWORD CTstmodemDlg::sendcommandlist() { boost::mutex::scoped_lock lock(m_okmtx); for (const char**p= g_initstrings ; *p && !m_okstop ; p++) { m_ok= false; CString str; str.Format(L"AT%hs\r", *p); m_cListReceiveData.appendString(str, 1); if (!m_port->SendData(str)) break; DWORD t0= GetTickCount(); while (!m_ok && !m_okstop && GetTickCount()-t0<5000) m_okcond.wait(lock, 500); if (!m_ok) debug("ERROR: no ok received\n"); } SetCheckbox(m_cCheckGsmReset, false); return 0; } void CTstmodemDlg::OnCheckGsmreset() { boost::mutex::scoped_lock lock(m_okmtx); //m_kernel->Set_a4000068_bit6(m_cCheckGsmReset.GetCheck()==BST_CHECKED); if (m_cCheckGsmReset.GetCheck()==BST_CHECKED) { m_okstop= false; DWORD id; CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CTstmodemDlg::staticthreadproc, this, 0, &id)); } else { m_okstop= true; m_okcond.notify_one(); } } void CTstmodemDlg::OnCheckClearScreen() { m_cListReceiveData.ResetContent(); SetCheckbox(m_cCheckClearScreen, false); } void CTstmodemDlg::OnCheckGsmMode() { //m_kernel->Set_a4000064_bit6(m_cCheckGsmMode.GetCheck()==BST_CHECKED); } void CTstmodemDlg::OnCheckKernel03c8() { //m_kernel->Set_ac0203c8((m_cCheckKernel03c8.GetCheck()==BST_CHECKED) ? 1 : 0 ); } void CTstmodemDlg::OnCheckDebugInOutput() { DebugRegisterWindow( (m_cCheckDebugInOutput.GetCheck()==BST_CHECKED) ? this : NULL ); debug("debugwindow %d\n", m_cCheckDebugInOutput.GetCheck()==BST_CHECKED); } void CTstmodemDlg::OnCheckComIoctl() { // can only be set, since I don't know the 'unset' ioctl. // ( reading serial3.dll, I see 0xaaaa5677 .. 0xaaaa5679 // as special ioctls though ) if (m_cCheckComIoctl.GetCheck()==BST_CHECKED) { if (!m_port->SendIoctl()) SetCheckbox(m_cCheckComIoctl, false); } else SetCheckbox(m_cCheckComIoctl, true); } void CTstmodemDlg::OnCheckOpendevice() { if (m_cCheckOpenDevice.GetCheck()==BST_CHECKED) { if (!m_port->open()) SetCheckbox(m_cCheckOpenDevice, false); } else m_port->close(); } ////////////////////////////////////////////////////////////////////////// // menu handlers void FindMenuString(CCeCommandBar *cmdbar, UINT menuentryid, CString &str); void CTstmodemDlg::OnSpeedMenu(UINT nId) { //debug("app.speed %d\n", nId); CString str; FindMenuString(&m_wndCommandBar, nId, str); m_port->SetSpeed(str); } void CTstmodemDlg::OnBitsMenu(UINT nId) { //debug("bits %d\n", nId); CString str; FindMenuString(&m_wndCommandBar, nId, str); m_port->SetBits(str); } void CTstmodemDlg::OnPortMenu(UINT nId) { //debug("port %d\n", nId); CString str; FindMenuString(&m_wndCommandBar, nId, str); m_port->SetPort(str); // reset userinterface items SetCheckbox(m_cCheckOpenDevice, false); SetCheckbox(m_cCheckComIoctl, false); } void FindMenuString(CCeCommandBar *cmdbar, UINT menuentryid, CString &str) { CToolBarCtrl *ctrl= (CToolBarCtrl *)cmdbar; for (int i=0 ; i<3 ; i++) { UINT id, style; int image; cmdbar->GetButtonInfo(i, id, style, image); TBBUTTONINFO tbbi; tbbi.cbSize= sizeof(TBBUTTONINFO); tbbi.dwMask= TBIF_LPARAM; if (!ctrl->GetButtonInfo(id, &tbbi)) continue; if (!tbbi.lParam) continue; CMenu *menu= CMenu::FromHandle((HMENU)tbbi.lParam); if (menu->GetMenuString(menuentryid, str, MF_BYCOMMAND)) { menu->CheckMenuRadioItem(id+1, id+49, menuentryid, MF_BYCOMMAND); return; } } } void CTstmodemDlg::OnTimer(UINT nIDEvent) { if (m_bUpdateBits && m_gpio_bits && m_a400_bits) { m_gpio_bits->UpdateValues(); m_a400_bits->UpdateValues(); } CDialog::OnTimer(nIDEvent); } void CTstmodemDlg::OnCheckDobits() { m_bUpdateBits= (m_cCheckDoBits.GetCheck()==BST_CHECKED); if (m_bUpdateBits) SetTimer(1, 200, NULL); else KillTimer(1); } void CTstmodemDlg::appendString(const TCHAR *str) { // debug output m_cListReceiveData.appendString(str, 2); }