Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

933 lines
29 KiB

/*-------------------------------------------------------------------
| portprop.c - Port Properties Sheet.
|--------------------------------------------------------------------*/
#include "precomp.h"
#define D_Level 0x10
static void set_field(HWND hDlg, WORD id);
static void get_field(HWND hDlg, WORD id);
//static int PaintIcon(HWND hWnd);
#define MAX_PORTPROP_SHEETS 3
#define QUERYSIB_CLONE_PORT_PROPS 1
#define CLONEOPT_ALL 1 // clone to all ports
#define CLONEOPT_DEVICE 2 // clone to all ports on selected device
#define CLONEOPT_SELECT 3 // clone to selected ports (lParam = *list)
int FillPortPropSheets(PROPSHEETPAGE *psp, LPARAM our_params);
BOOL WINAPI PortPropSheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam);
BOOL WINAPI PortProp485Sheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam);
BOOL WINAPI PortPropModemSheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam);
static int our_port_index = 0;
static int our_device_index = 0;
static int num_active_portprop_sheets = 1; // always at least one
/*------------------------------------------------------------------------
| FillPortPropSheets - Setup pages for driver level property sheets.
|------------------------------------------------------------------------*/
int FillPortPropSheets(PROPSHEETPAGE *psp, LPARAM our_params)
{
INT pi;
static TCHAR portsetstr[40], rs485str[40], modemstr[40];
memset(psp, 0, sizeof(*psp) * MAX_PORTPROP_SHEETS);
pi = 0;
//----- main prop device sheet.
psp[pi].dwSize = sizeof(PROPSHEETPAGE);
//psp[pi].dwFlags = PSP_USEICONID | PSP_USETITLE;
psp[pi].dwFlags = PSP_USETITLE | PSP_HASHELP;
psp[pi].hInstance = glob_hinst;
psp[pi].pszTemplate = MAKEINTRESOURCE(IDD_PORT_OPTIONS);
psp[pi].pfnDlgProc = PortPropSheet;
load_str( glob_hinst, (TITLESTR+4), portsetstr, CharSizeOf(portsetstr) );
psp[pi].pszTitle = portsetstr;
psp[pi].lParam = (LPARAM)our_params;
psp[pi].pfnCallback = NULL;
++pi;
num_active_portprop_sheets = 1;
//----- rs-485 prop device sheet.
if (((strstr(wi->dev[glob_info->device_selected].ModelName, "485")) &&
(our_port_index < 2)) ||
(wi->GlobalRS485 == 1))
{
psp[pi].dwSize = sizeof(PROPSHEETPAGE);
//psp[pi].dwFlags = PSP_USEICONID | PSP_USETITLE;
psp[pi].dwFlags = PSP_USETITLE | PSP_HASHELP;
psp[pi].hInstance = glob_hinst;
psp[pi].pszTemplate = MAKEINTRESOURCE(IDD_PORT_485_OPTIONS);
psp[pi].pfnDlgProc = PortProp485Sheet;
load_str( glob_hinst, (TITLESTR+5), rs485str, CharSizeOf(rs485str) );
psp[pi].pszTitle = rs485str;
psp[pi].lParam = (LPARAM)our_params;
psp[pi].pfnCallback = NULL;
++pi;
++num_active_portprop_sheets;
}
//----- modem prop device sheet.
if (wi->dev[glob_info->device_selected].ModemDevice)
{
psp[pi].dwSize = sizeof(PROPSHEETPAGE);
//psp[pi].dwFlags = PSP_USEICONID | PSP_USETITLE;
psp[pi].dwFlags = PSP_USETITLE | PSP_HASHELP;
psp[pi].hInstance = glob_hinst;
psp[pi].pszTemplate = MAKEINTRESOURCE(IDD_PORT_MODEM_OPTIONS);
psp[pi].pfnDlgProc = PortPropModemSheet;
load_str( glob_hinst, (TITLESTR+6), modemstr, CharSizeOf(modemstr) );
psp[pi].pszTitle = modemstr;
psp[pi].lParam = (LPARAM)our_params;
psp[pi].pfnCallback = NULL;
++pi;
++num_active_portprop_sheets;
}
return 0;
}
/*------------------------------------------------------------------------
| DoPortPropPages - Main driver level property sheet for NT4.0
|------------------------------------------------------------------------*/
int DoPortPropPages(HWND hwndOwner, int device, int port)
{
PROPSHEETPAGE psp[MAX_PORTPROP_SHEETS];
PROPSHEETHEADER psh;
OUR_INFO *our_params;
INT stat;
Port_Config *pc;
char title[40];
wi->ChangesMade = 1; // indicate changes made, as send_to_driver
// does not calculate this yet
our_port_index = port;
our_device_index = device;
pc = &wi->dev[our_device_index].ports[our_port_index];
strcpy(title, pc->Name);
strcat(title, RcStr(MSGSTR+29));
our_params = glob_info; // temporary kludge, unless we don't need re-entrantancy
//Fill out the PROPSHEETPAGE data structure for the Client Area Shape
//sheet
FillPortPropSheets(&psp[0], (LPARAM)our_params);
//Fill out the PROPSHEETHEADER
memset(&psh, 0, sizeof(PROPSHEETHEADER));
psh.dwSize = sizeof(PROPSHEETHEADER);
//psh.dwFlags = PSH_USEICONID | PSH_PROPSHEETPAGE;
psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW;
psh.hwndParent = hwndOwner;
psh.hInstance = glob_hinst;
psh.pszIcon = "";
psh.pszCaption = (LPSTR) title; //"Port Properties";
//psh.nPages = NUM_PORTPROP_SHEETS;
psh.nPages = num_active_portprop_sheets;
psh.ppsp = (LPCPROPSHEETPAGE) &psp;
//And finally display the dialog with the property sheets.
stat = PropertySheet(&psh);
return 0;
}
/*----------------------------------------------------------
context_menu -
|------------------------------------------------------------*/
static void context_menu(void)
{
HMENU hpop_menu;
POINT scr_pt;
int stat;
scr_pt.x = 200;
scr_pt.y = 200;
hpop_menu = CreatePopupMenu();
if (hpop_menu == NULL)
{
mess(&wi->ip, "Error from CreatePopMenu");
return;
}
//AppendMenu(hpop_menu, 0, 0x10, "Run Peer tracer");
AppendMenu(hpop_menu, 0, 0x11, "Run Wcom Test Terminal");
GetCursorPos(&scr_pt);
stat = TrackPopupMenuEx(hpop_menu,
TPM_NONOTIFY | TPM_RETURNCMD, /* flags */
scr_pt.x, scr_pt.y, /* x,y */
//0, /* 0 reserved */
glob_hwnd,
NULL);
GetSystemDirectory(gtmpstr,144);
strcat(gtmpstr, "\\");
strcat(gtmpstr, OurAppDir);
SetCurrentDirectory(gtmpstr);
if (stat == 0x11)
{
strcat(gtmpstr, "\\wcom32.exe \\\\.\\");
strcat(gtmpstr, wi->dev[our_device_index].ports[our_port_index].Name);
}
WinExec(gtmpstr, SW_RESTORE);
DestroyMenu(hpop_menu);
}
/*----------------------------------------------------------
PortPropSheet - Dlg window procedure for add on Advanced sheet.
|-------------------------------------------------------------*/
BOOL WINAPI PortPropSheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam)
{
OUR_INFO * OurProps = (OUR_INFO *)GetWindowLong(hDlg, DWL_USER);
WORD uCmd;
switch(uMessage)
{
case WM_INITDIALOG :
OurProps = (OUR_INFO *)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLong(hDlg, DWL_USER, (LONG)OurProps);
// save in case of cancel
//memcpy(&org_pc, &wi->dev[our_device_index].ports[our_port_index],
// sizeof(org_pc));
set_field(hDlg, IDC_PORT_LOCKBAUD );
set_field(hDlg, IDC_PORT_WAIT_ON_CLOSE);
set_field(hDlg, IDC_PORT_WONTX );
set_field(hDlg, IDC_MAP_CDTODSR );
set_field(hDlg, IDC_MAP_2TO1 );
set_field(hDlg, IDC_RING_EMULATE );
// Return TRUE to set focus to first control
return TRUE; // No need for us to set the focus.
case PSM_QUERYSIBLINGS :
{
switch (HIWORD(wParam))
{
case QUERYSIB_CLONE_PORT_PROPS :
{
// low word of wParam is which ports to clone to...
// currently we only support "all", but this is the place to add
// other specific handling.
int devnum;
int portnum;
Port_Config *srcport, *destport;
#ifdef DEBUG
char debugstr[80];
#endif
// make sure we have current values before cloning
get_field(hDlg, IDC_PORT_LOCKBAUD );
get_field(hDlg, IDC_PORT_WAIT_ON_CLOSE);
get_field(hDlg, IDC_PORT_WONTX );
get_field(hDlg, IDC_MAP_CDTODSR );
get_field(hDlg, IDC_MAP_2TO1 );
get_field(hDlg, IDC_RING_EMULATE );
srcport = &wi->dev[our_device_index].ports[our_port_index];
switch (LOWORD(wParam))
{
case CLONEOPT_ALL:
{
// apply the options on this page to all other ports
for (devnum = 0; devnum < wi->NumDevices; devnum++)
{
for (portnum = 0; portnum < wi->dev[devnum].NumPorts; portnum++)
{
destport = &wi->dev[devnum].ports[portnum];
// is it target different than the source?
if (destport != srcport)
{
// yep, so apply the source's options to the target
DbgPrintf(D_Level,
(TEXT("cloning general options from port %s to port %s\n"),
srcport->Name, destport->Name));
destport->LockBaud = srcport->LockBaud;
destport->TxCloseTime = srcport->TxCloseTime;
destport->WaitOnTx = srcport->WaitOnTx;
destport->MapCdToDsr = srcport->MapCdToDsr;
destport->Map2StopsTo1 = srcport->Map2StopsTo1;
destport->RingEmulate = srcport->RingEmulate;
}
}
}
break;
}
case CLONEOPT_DEVICE:
{
// apply the options on this page to all other ports on same device
/* not yet implemented */
break;
}
case CLONEOPT_SELECT:
{
// apply the options on this page to the list of selected ports
// lParam is a pointer to a list of ports.
/* not yet implemented */
break;
}
default:
// unknown clone option -- skip it
break;
}
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
break;
}
default :
return FALSE;
}
}
case WM_COMMAND :
#ifdef WIN32
uCmd = HIWORD(wParam);
#else
uCmd = HIWORD(lParam);
#endif
switch (LOWORD(wParam))
{
case IDB_DEF: // actually the defaults button
{
Port_Config *pc;
pc= &wi->dev[our_device_index].ports[our_port_index];
//pc->options = 0;
pc->RingEmulate = 0;
pc->MapCdToDsr = 0;
pc->WaitOnTx = 0;
pc->Map2StopsTo1 = 0;
pc->LockBaud = 0;
pc->TxCloseTime = 0;
// should we be doing this? they are on another page(kpb)
pc->RS485Override = 0;
pc->RS485Low = 0;
set_field(hDlg, IDC_PORT_LOCKBAUD );
set_field(hDlg, IDC_PORT_WAIT_ON_CLOSE);
set_field(hDlg, IDC_PORT_WONTX );
set_field(hDlg, IDC_MAP_CDTODSR );
set_field(hDlg, IDC_MAP_2TO1 );
set_field(hDlg, IDC_RING_EMULATE );
}
break;
}
return FALSE;
case WM_PAINT:
#if 0
PaintIcon(hDlg);
#endif
return FALSE;
case WM_HELP: // question mark thing
our_context_help(lParam);
return FALSE;
case WM_CONTEXTMENU: // right-click
context_menu();
break;
case WM_NOTIFY :
switch (((NMHDR *)lParam)->code)
{
case PSN_HELP :
our_help(&wi->ip, IDD_PORT_OPTIONS);
break;
case PSN_APPLY :
get_field(hDlg, IDC_PORT_LOCKBAUD );
get_field(hDlg, IDC_PORT_WAIT_ON_CLOSE);
get_field(hDlg, IDC_PORT_WONTX );
get_field(hDlg, IDC_MAP_CDTODSR );
get_field(hDlg, IDC_MAP_2TO1 );
get_field(hDlg, IDC_RING_EMULATE );
if (IsDlgButtonChecked(hDlg, IDC_CLONE))
{
PropSheet_QuerySiblings(GetParent(hDlg),
(WPARAM)((QUERYSIB_CLONE_PORT_PROPS << 16) + CLONEOPT_ALL),
0);
}
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
default :
return FALSE;
}
break;
default :
// return FALSE;
break;
}
return FALSE;
}
/*----------------------------------------------------------
PortProp485Sheet -
|-------------------------------------------------------------*/
BOOL WINAPI PortProp485Sheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam)
{
OUR_INFO * OurProps = (OUR_INFO *)GetWindowLong(hDlg, DWL_USER);
WORD uCmd;
switch(uMessage)
{
case WM_INITDIALOG :
OurProps = (OUR_INFO *)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLong(hDlg, DWL_USER, (LONG)OurProps);
// save in case of cancel
//memcpy(&org_pc, &wi->dev[our_device_index].ports[our_port_index],
// sizeof(org_pc));
set_field(hDlg, IDC_PORT_RS485_TLOW );
set_field(hDlg, IDC_PORT_RS485_LOCK );
// Return TRUE to set focus to first control
return TRUE; // No need for us to set the focus.
case PSM_QUERYSIBLINGS :
{
switch (HIWORD(wParam))
{
case QUERYSIB_CLONE_PORT_PROPS :
{
// low word of wParam is which ports to clone to...
// currently we only support "all", but this is the place to add
// other specific handling.
int devnum;
int portnum;
Port_Config *srcport, *destport;
#ifdef DEBUG
char debugstr[80];
#endif
// make sure we have current values before cloning
get_field(hDlg, IDC_PORT_RS485_TLOW );
get_field(hDlg, IDC_PORT_RS485_LOCK );
srcport = &wi->dev[our_device_index].ports[our_port_index];
switch (LOWORD(wParam))
{
case CLONEOPT_ALL:
{
int maxport;
// apply the options on this page to all other ports
for (devnum = 0; devnum < wi->NumDevices; devnum++)
{
if ((strstr(wi->dev[devnum].ModelName, "485")) ||
(wi->GlobalRS485 == 1))
{
// we're only going to apply RS485 settings to other
// 485 boards (unless the global RS485 flag is on)
if (wi->GlobalRS485 == 1)
maxport = wi->dev[devnum].NumPorts;
else
maxport = 2;
for (portnum = 0; portnum < maxport; portnum++)
{
destport = &wi->dev[devnum].ports[portnum];
// is it target different than the source?
if (destport != srcport)
{
// yep, so apply the source's options to the target
DbgPrintf(D_Level,
(TEXT("cloning rs-485 options from port %s to port %s\n"),
srcport->Name, destport->Name));
destport->RS485Low = srcport->RS485Low;
destport->RS485Override = srcport->RS485Override;
}
}
}
}
break;
}
case CLONEOPT_DEVICE:
{
// apply the options on this page to all other ports on same device
/* not yet implemented */
break;
}
case CLONEOPT_SELECT:
{
// apply the options on this page to the list of selected ports
// lParam is a pointer to a list of ports.
/* not yet implemented */
break;
}
default:
// unknown clone option -- skip it
break;
}
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
break;
}
default :
return FALSE;
}
}
case WM_COMMAND :
#ifdef WIN32
uCmd = HIWORD(wParam);
#else
uCmd = HIWORD(lParam);
#endif
switch (LOWORD(wParam))
{
case IDB_DEF: // actually the defaults button
{
Port_Config *pc;
pc= &wi->dev[our_device_index].ports[our_port_index];
// pc->options = 0;
pc->RS485Override = 0;
pc->RS485Low = 0;
set_field(hDlg, IDC_PORT_RS485_TLOW );
set_field(hDlg, IDC_PORT_RS485_LOCK );
}
break;
}
return FALSE;
case WM_PAINT:
#if 0
PaintIcon(hDlg);
#endif
return FALSE;
case WM_HELP: // question mark thing
our_context_help(lParam);
return FALSE;
case WM_NOTIFY :
switch (((NMHDR *)lParam)->code)
{
case PSN_HELP :
our_help(&wi->ip, IDD_PORT_485_OPTIONS);
break;
case PSN_APPLY :
get_field(hDlg, IDC_PORT_RS485_TLOW );
get_field(hDlg, IDC_PORT_RS485_LOCK );
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
default :
return FALSE;
}
default :
return FALSE;
}
}
/*----------------------------------------------------------
request_modem_reset -
|-------------------------------------------------------------*/
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0
#define FILE_DEVICE_SERIAL_PORT 0x0000001b
#define IOCTL_RCKT_SET_MODEM_RESET \
CTL_CODE(FILE_DEVICE_SERIAL_PORT, 0x80d,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_RCKT_CLEAR_MODEM_RESET \
CTL_CODE(FILE_DEVICE_SERIAL_PORT, 0x80e,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_RCKT_SEND_MODEM_ROW \
CTL_CODE(FILE_DEVICE_SERIAL_PORT, 0x80f,METHOD_BUFFERED,FILE_ANY_ACCESS)
void request_modem_reset(int device_index, int port_index)
{
HANDLE hDriver; // file handle to driver device
Port_Config *pc; // config information about the port to reset
ULONG retBytes;
// attempt to open communications with the driver
hDriver = CreateFile(szDriverDevice, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDriver != INVALID_HANDLE_VALUE)
{
// double-check that it is a modem device!
if (wi->dev[device_index].ModemDevice)
{
pc = &wi->dev[device_index].ports[port_index];
// send the ioctl to put the modem into the reset state
DeviceIoControl(hDriver, IOCTL_RCKT_SET_MODEM_RESET,
pc->Name, sizeof(pc->Name),
pc->Name, sizeof(pc->Name),
&retBytes, 0);
// delay briefly before pulling modem out of reset state
Sleep(45);
// send the ioctl to pull the modem out of reset state
DeviceIoControl(hDriver, IOCTL_RCKT_CLEAR_MODEM_RESET,
pc->Name, sizeof(pc->Name),
pc->Name, sizeof(pc->Name),
&retBytes, 0);
Sleep(65);
// if country code is North America or invalid, we're done
// if country code is default or invalid, we're done
if (
(wi->ModemCountry)
&&
( (wi->dev[device_index].ModemDevice == TYPE_RM_VS2000)
&&
(wi->ModemCountry != RowInfo[0].RowCountryCode))
||
( (wi->dev[device_index].ModemDevice == TYPE_RM_i)
&&
(wi->ModemCountry != CTRRowInfo[0].RowCountryCode))
) {
// wait for the modem to stablize before sending country code command
// (about 4 seconds!)
Sleep(4000);
// send the ioctl to configure the country code
DeviceIoControl(hDriver, IOCTL_RCKT_SEND_MODEM_ROW,
pc->Name, sizeof(pc->Name),
pc->Name, sizeof(pc->Name),
&retBytes, 0);
}
}
// close communications with the driver
CloseHandle(hDriver);
}
}
/*----------------------------------------------------------
PortPropModemSheet -
|-------------------------------------------------------------*/
BOOL WINAPI PortPropModemSheet(
IN HWND hDlg,
IN UINT uMessage,
IN WPARAM wParam,
IN LPARAM lParam)
{
OUR_INFO * OurProps = (OUR_INFO *)GetWindowLong(hDlg, DWL_USER);
WORD uCmd;
switch(uMessage)
{
case WM_INITDIALOG :
OurProps = (OUR_INFO *)((LPPROPSHEETPAGE)lParam)->lParam;
SetWindowLong(hDlg, DWL_USER, (LONG)OurProps);
// save in case of cancel
//memcpy(&org_pc, &wi->dev[our_device_index].ports[our_port_index],
// sizeof(org_pc));
if (wi->dev[our_device_index].ModemDevice)
{
// parent device for this port provides modems, enable reset button
EnableWindow(GetDlgItem(hDlg, IDB_RESET), 1);
}
else
{
// parent device for this port has no modems, disable the reset button
EnableWindow(GetDlgItem(hDlg, IDB_RESET), 0);
}
// Return TRUE to set focus to first control
return TRUE; // No need for us to set the focus.
case WM_COMMAND :
#ifdef WIN32
uCmd = HIWORD(wParam);
#else
uCmd = HIWORD(lParam);
#endif
switch (LOWORD(wParam))
{
case IDB_RESET:
request_modem_reset(our_device_index, our_port_index);
break;
}
return FALSE;
case WM_PAINT:
#if 0
PaintIcon(hDlg);
#endif
return FALSE;
case WM_HELP: // question mark thing
our_context_help(lParam);
return FALSE;
case WM_NOTIFY :
switch (((NMHDR *)lParam)->code)
{
case PSN_HELP :
our_help(&wi->ip, IDD_PORT_MODEM_OPTIONS);
break;
case PSN_APPLY :
SetWindowLong(hDlg, DWL_MSGRESULT, PSNRET_NOERROR);
return TRUE;
default :
return FALSE;
}
default :
return FALSE;
}
}
/*-------------------------------------------------------------------
| get_field - Run when a selection is changed.
|--------------------------------------------------------------------*/
static void get_field(HWND hDlg, WORD id)
{
char tmpstr[60];
int i;
Port_Config *pc;
// HWND hwnd;
pc= &wi->dev[our_device_index].ports[our_port_index];
switch (id)
{
case IDC_PORT_LOCKBAUD:
GetDlgItemText(hDlg, id, tmpstr, 58);
pc->LockBaud = getint(tmpstr, &i);
break;
case IDC_PORT_WAIT_ON_CLOSE:
GetDlgItemText(hDlg, id, tmpstr, 58);
pc->TxCloseTime = getint(tmpstr, &i);
break;
case IDC_PORT_WONTX:
if (IsDlgButtonChecked(hDlg, IDC_PORT_WONTX))
pc->WaitOnTx = 1;
else pc->WaitOnTx = 0;
break;
case IDC_PORT_RS485_TLOW:
if (IsDlgButtonChecked(hDlg, IDC_PORT_RS485_TLOW))
pc->RS485Low = 1;
else pc->RS485Low = 0;
break;
case IDC_PORT_RS485_LOCK:
if (IsDlgButtonChecked(hDlg, IDC_PORT_RS485_LOCK))
pc->RS485Override = 1;
else pc->RS485Override = 0;
break;
case IDC_MAP_CDTODSR:
if (IsDlgButtonChecked(hDlg, IDC_MAP_CDTODSR))
pc->MapCdToDsr = 1;
else pc->MapCdToDsr = 0;
break;
case IDC_MAP_2TO1:
if (IsDlgButtonChecked(hDlg, IDC_MAP_2TO1))
pc->Map2StopsTo1 = 1;
else pc->Map2StopsTo1 = 0;
break;
case IDC_RING_EMULATE :
if (IsDlgButtonChecked(hDlg, IDC_RING_EMULATE))
pc->RingEmulate = 1;
else pc->RingEmulate = 0;
break;
}
}
/*----------------------------------------------------------
set_field -
|------------------------------------------------------------*/
static void set_field(HWND hDlg, WORD id)
{
HWND hwnd;
char tmpstr[60];
Port_Config *pc;
if (our_device_index >= wi->NumDevices)
our_device_index = 0;
pc = &wi->dev[our_device_index].ports[our_port_index];
//------------------ fill in name selection
//SetDlgItemText(hDlg, IDC_, pc->Name);
switch(id)
{
case IDC_PORT_LOCKBAUD:
//------------------ fill in baud override selection
hwnd = GetDlgItem(hDlg, IDC_PORT_LOCKBAUD);
SendMessage(hwnd, CB_RESETCONTENT, 0, 0);
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+22));
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) "57600");
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) "115200");
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) "230400");
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) "460800");
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) "921600");
wsprintf(tmpstr, "%d", pc->LockBaud);
if (pc->LockBaud == 0)
strcpy(tmpstr,RcStr(MSGSTR+22));
SetDlgItemText(hDlg, IDC_PORT_LOCKBAUD, tmpstr);
break;
case IDC_PORT_RS485_LOCK:
//------------------ fill in "rs485 override?" option
SendDlgItemMessage(hDlg, IDC_PORT_RS485_LOCK, BM_SETCHECK,
pc->RS485Override, 0);
break;
case IDC_MAP_CDTODSR:
//------------------ fill in "map CD to DSR?" option
SendDlgItemMessage(hDlg, IDC_MAP_CDTODSR, BM_SETCHECK,
pc->MapCdToDsr, 0);
break;
case IDC_MAP_2TO1:
//------------------ fill in "map 2 to 1 stops?" option
SendDlgItemMessage(hDlg, IDC_MAP_2TO1, BM_SETCHECK,
pc->Map2StopsTo1, 0);
break;
case IDC_PORT_RS485_TLOW:
//------------------ fill in "rs485 toggle low?" option
SendDlgItemMessage(hDlg, IDC_PORT_RS485_TLOW, BM_SETCHECK,
pc->RS485Low, 0);
break;
case IDC_PORT_WONTX:
//------------------ fill in "wait on tx?" option
SendDlgItemMessage(hDlg, IDC_PORT_WONTX, BM_SETCHECK,
pc->WaitOnTx, 0);
break;
case IDC_PORT_WAIT_ON_CLOSE:
//------------------ fill in wait on tx close option
hwnd = GetDlgItem(hDlg, IDC_PORT_WAIT_ON_CLOSE);
SendMessage(hwnd, CB_RESETCONTENT, 0, 0);
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+23));
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+24));
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+25));
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+26));
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM)(char far *) RcStr(MSGSTR+27));
// no, need some better way to default this to 1 or 2 seconds
//if (pc->TxCloseTime == 0)
// strcpy(tmpstr, "1 sec"); // 0 means to the driver same as 6-seconds
wsprintf(tmpstr, "%d %s", pc->TxCloseTime, RcStr(MSGSTR+28));
SetDlgItemText(hDlg, IDC_PORT_WAIT_ON_CLOSE, tmpstr);
break;
case IDC_RING_EMULATE:
SendDlgItemMessage(hDlg, IDC_RING_EMULATE, BM_SETCHECK,
pc->RingEmulate, 0);
break;
}
}
#if 0
/*---------------------------------------------------------------------------
PaintIcon - Paints the Icon in the property sheet.
|---------------------------------------------------------------------------*/
static int PaintIcon(HWND hWnd)
{
// int status;
HBITMAP hBitMap;
HGDIOBJ hGdiObj;
HDC hDC, hMemDC ;
PAINTSTRUCT ps ;
RECT spot, main; // left, top, right, bottom
static int cnt = 0;
GetWindowRect(GetDlgItem(hWnd, IDB_DEF), &spot);
GetWindowRect(hWnd, &main);
#ifdef COMMENT_OUT
rect = &right;
mess("hlp r:%d l:%d b:%d t:%d",
rect->right, rect->left, rect->bottom, rect->top);
#endif
spot.left -= main.left;
spot.top -= main.top;
spot.left += 5;
spot.top += 20; // spacing
// load bitmap and display it
hDC = BeginPaint( hWnd, &ps ) ;
if (NULL != (hMemDC = CreateCompatibleDC( hDC )))
{
hBitMap = LoadBitmap(glob_hinst,
MAKEINTRESOURCE(BMP_SMALL_LOGO));
hGdiObj = SelectObject(hMemDC, hBitMap);
BitBlt( hDC, spot.left, spot.top, 100, 100, hMemDC, 0, 0, SRCCOPY ) ;
//StretchBlt( hDC, 5, 5, 600,100, hMemDC, 0, 0, 446, 85, SRCCOPY ) ;
DeleteObject( SelectObject( hMemDC, hGdiObj ) ) ;
DeleteDC( hMemDC ) ;
}
EndPaint( hWnd, &ps ) ;
return 0;
}
#endif