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
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
|
|
|