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

📄 proppage.c

📁 一个linux下rs485驱动程序的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************/
/* uLan property page - Roman Bartosinski (C)2003               */
/********************************************************************/

#include "proppage.h"
#include <devioctl.h>


  DWORD baud_tbl[] = { 75,110,134,150,300,600,1200,1800,2400,4800,7200,
                      9600,14400,19200,38400,57600,115200,128000,0};  
  LPCTSTR debug_tbl[] = { L"none", L"Lowest", L"Lower", L"Normal", L"Higher", L"Highest", NULL};


  HANDLE g_hInst = NULL;
  TCHAR applet_name[]     = TEXT("General Property Page");

/********************************************************************/
/*
TCHAR sz_evbousb_help[] = _T("evbousb.hlp");
const DWORD HelpIDs[]=
{
    PP_PORT_NAME,       IDH_PORTSET_NAME,       // "" (ComboBox)
    PP_ULAN_BAUD,       IDH_PORTSET_BAUDRATE,   // "" (ComboBox)
    PP_ULAN_ADDR,       IDH_PORTSET_ADDRESS,    // "" (ComboBox)
    PP_ULAN_DEBUG,      IDH_PORTSET_DEBUGLEVEL, // "" (ComboBox)
    PP_ULAN_PMODE,      IDH_PORTSET_PROMODE,    // "" (ComboBox)
    IDC_RESTORE,        IDH_PORTSET_DEFAULTS,   // "&Restore Defaults" (Button)
    IDC_REFRESH,        IDH_PORTSET_DEFAULTS,   // "&Refresh Defaults" (Button)
    IDC_STATIC,         IDH_NONE,               // no help
    0, 0
};
*/



/********************************************************************/
/********************************************************************/
BOOL APIENTRY LibMain( HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
{
  switch( dwReason ) {
    case DLL_PROCESS_ATTACH:
      g_hInst = hDll;
      DisableThreadLibraryCalls(hDll);
      break;
    case DLL_PROCESS_DETACH:
      break;
    default:
      break;
  }
  return TRUE;
}

/********************************************************************/
void InitPortParams( IN OUT PPORT_PARAMS Params, IN HDEVINFO DeviceInfoSet, IN PSP_DEVINFO_DATA DeviceInfoData)
{
  SP_DEVINFO_LIST_DETAIL_DATA detailData;

  ZeroMemory( Params, sizeof(PORT_PARAMS));
  Params->DeviceInfoSet = DeviceInfoSet;
  Params->DeviceInfoData = DeviceInfoData;
  Params->ChangesEnabled = TRUE;
  detailData.cbSize = sizeof(SP_DEVINFO_LIST_DETAIL_DATA);
  if ( SetupDiGetDeviceInfoListDetail( DeviceInfoSet, &detailData) &&
       detailData.RemoteMachineHandle != NULL) {

    Params->ChangesEnabled = FALSE;
  }
}

/********************************************************************/
HPROPSHEETPAGE InitSettingsPage(PROPSHEETPAGE *psp, OUT PPORT_PARAMS Params)
{
//  debugPrint("InitSetting");
  psp->dwSize      = sizeof( PROPSHEETPAGE);
  psp->dwFlags     = PSP_USECALLBACK; // | PSP_HASHELP;
  psp->hInstance   = g_hInst;
  psp->pszTemplate = MAKEINTRESOURCE(DLG_PPAGE);
  psp->pfnDlgProc = PortSettingsDlgProc;
  psp->lParam     = (LPARAM) Params;
  psp->pfnCallback = PortSettingsDlgCallback;
  return CreatePropertySheetPage( psp);
}

/********************************************************************/
UINT CALLBACK PortSettingsDlgCallback( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp)
{
  PPORT_PARAMS params;
  
  switch (uMsg) {
    case PSPCB_CREATE:
      return TRUE;    // return TRUE to continue with creation of page
    case PSPCB_RELEASE:
      params = (PPORT_PARAMS) ppsp->lParam;
      if ( params)
        LocalFree(params);
      return 0;       // return value ignored
    default:
      break;
  }
  return TRUE;
}

/********************************************************************/
void Port_OnCommand( HWND hDlg, int ControlId, HWND ControlHwnd, UINT NotifyCode)
{
  PPORT_PARAMS params = (PPORT_PARAMS)GetWindowLongPtr( hDlg, DWLP_USER);
  DWORD i; 
  BYTE j;
  TCHAR str[20];
  BYTE changed = 0;

  switch( ControlId) {
    case PP_ULAN_BAUD:
      if ( NotifyCode == CBN_SELCHANGE) {
        //debugPrint("Select Baudrate");
        GetWindowText( GetDlgItem( hDlg, PP_ULAN_BAUD), str, 20);
        params->PortSettings.BaudRate = (DWORD) myatoi( str);
        changed = 1;
      }
      break;
    case PP_ULAN_DEBUG:    
      if ( NotifyCode == CBN_SELCHANGE) {
        //debugPrint("Select Debug");
        params->PortSettings.Debug = SendMessage( ControlHwnd, CB_GETCURSEL, 0, 0);
        changed = 1;
      }
      break;
    case PP_ULAN_ADDR:
      if ( NotifyCode == EN_KILLFOCUS) {
        //debugPrint("KillFocus");
        GetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str, 20);
        params->PortSettings.Address = (DWORD) myatoi( str);
        if ( params->PortSettings.Address < ULANADDR_MIN || params->PortSettings.Address > ULANADDR_MAX) {
          params->PortSettings.Address = params->PortSettings.DefAddress;
          wsprintf( str, TEXT("%d"), params->PortSettings.Address);
          SetWindowText( GetDlgItem( hDlg, PP_ULAN_ADDR), str);
        }
        changed = 1; // there is some bug, maybe.
      }
      break;
    case PP_ULAN_PMODE:
      if ( NotifyCode == BN_CLICKED) {
        //debugPrint("Clicked");
        if ( IsDlgButtonChecked( hDlg, PP_ULAN_PMODE) == BST_CHECKED)
          params->PortSettings.ProMode = 1;
        else
          params->PortSettings.ProMode = 0;
        changed = 1;
      }
      break;
    case IDC_REFRESH:
      MessageBox( hDlg, TEXT("Here will be IOCTL driver call."), TEXT("uLan Property Page"), MB_OK | MB_ICONINFORMATION);
      break;
    case IDC_RESTORE:
      //debugPrint("ChangeData");
      RestorePortSettings( hDlg, params);
      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);
      PropSheet_Changed( GetParent(hDlg), hDlg);
      break; 
    case IDCANCEL: // ??? redundant control
      EndDialog( hDlg, 0); 
      return;
    case IDC_APPLY:
      PropSheet_Apply( GetParent( hDlg));
      params->PortSettings.DefBaudRate = params->PortSettings.BaudRate;
      params->PortSettings.DefAddress = params->PortSettings.Address;
      params->PortSettings.DefDebug = params->PortSettings.Debug;
      params->PortSettings.DefProMode = params->PortSettings.ProMode;
      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);
      break;
  }
  if ( changed) {
    if(( params->PortSettings.DefBaudRate != params->PortSettings.BaudRate) ||
       ( params->PortSettings.DefAddress != params->PortSettings.Address) ||
       ( params->PortSettings.DefDebug != params->PortSettings.Debug) ||
       ( params->PortSettings.DefProMode != params->PortSettings.ProMode)) {
      PropSheet_Changed( GetParent( hDlg), hDlg);
      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), TRUE);
    } else {
      EnableWindow( GetDlgItem( hDlg, IDC_RESTORE), FALSE);
    }
  }
}

/********************************************************************/
BOOL Port_OnInitDialog( HWND hDlg, HWND FocusHwnd, LPARAM Lparam)
{
  PPORT_PARAMS params;

  if ( Lparam) {
    params = (PPORT_PARAMS) ((LPPROPSHEETPAGE)Lparam)->lParam;
    SetWindowLongPtr(hDlg, DWLP_USER, (ULONG_PTR) params);
    FillSettingCommDlg( hDlg, params);
  }
  return TRUE;  // No need for us to set the focus.
}

/********************************************************************/
BOOL Port_OnNotify( HWND hDlg, LPNMHDR NmHdr)
{
  PPORT_PARAMS params = (PPORT_PARAMS)GetWindowLongPtr( hDlg, DWLP_USER);

  switch ( NmHdr->code) { // user click on Apply or OK
    case PSN_APPLY:
      //debugPrint("Apply");
      if ( SetPortSettings( hDlg, params)) {
        //debugPrint( "changed");
//        SetupDiCallClassInstaller( DIF_PROPERTYCHANGE, params->DeviceInfoSet, params->DeviceInfoData);
        PropSheet_Changed( GetParent( hDlg), hDlg);
      }
      SetWindowLongPtr( hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
      return TRUE;        
    default:
      return FALSE;
  }
}


/********************************************************************/
INT_PTR APIENTRY PortSettingsDlgProc( IN HWND hDlg, IN UINT uMessage, IN WPARAM wParam, IN LPARAM lParam)
{
  switch(uMessage) {
    case WM_COMMAND:
      Port_OnCommand(hDlg, (int) LOWORD(wParam), (HWND)lParam, (UINT)HIWORD(wParam));
      break;
//    case WM_CONTEXTMENU:
//      WinHelp( (HWND)wParam, sz_evbousb_help, HELP_CONTEXTMENU, (ULONG_PTR) HelpIDs);
//      return FALSE;
//    case WM_HELP: 
//      if ( ((LPHELPINFO)lParam)->iContextType == HELPINFO_WINDOW) {
//        WinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, sz_evbousb_help, HELP_WM_HELP, (ULONG_PTR) HelpIDs);
//      }
//      break;
    case WM_INITDIALOG:
      return Port_OnInitDialog(hDlg, (HWND)wParam, lParam); 
    case WM_NOTIFY:
      return Port_OnNotify(hDlg,  (NMHDR *)lParam);
  }
  return FALSE;
} /* PortSettingsDialogProc */

/********************************************************************/

⌨️ 快捷键说明

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