/**********************************************************
FILE : GxPIOExample.cpp
PURPOSE : WIN32 sample program for GX5731, GX5732 and GX5733
boards using the GXPIO driver.
CREATED : March 2003
COPYRIGHT : Copyright 2007 Marvin Test Solutions, Inc.
COMMENTS :
To compile the WIN32 example:
1. Microsoft VC++
Load GxPIOExampleC.dsp, .vcproj or .mak, depends on
the VC++ version from the Project\File/Open... menu
Select Project/Rebuild all from the menu
2. Borland C++ Builder
Load GxPIOExampleC.bpr from the Project/Open Project... menu
Select Project/Build all from the menu
**********************************************************/
#include "windows.h"
#include "GxPIO.h"
#include "stdio.h"
// Borland C++ Builder compat. block
#if defined(__BORLANDC__)
#pragma hdrstop
#include <condefs.h>
USELIB("GxPIOBC.lib");
USERC("GxPioExampleC.rc");
//---------------------------------------------------------------------------
#endif // defined(__BORLANDC__)
//*********************************************************
// DisplayMsg
//*********************************************************
void DisplayMsg(PSTR lpszMsg)
{
MessageBeep(0);
MessageBox(0, lpszMsg,"GXPIO", MB_OK);
return;
}
//*********************************************************
// DisplayUsage
//*********************************************************
void DisplayUsage(void)
{
DisplayMsg(
"This example shows how to use the GX5731 or GX5732\r\n"
"Usage:\r\n"
"GxPIOExample <board_type> <slot_number> <port|counter numbers> <operation> <direction|value|count>\r\n\n"
"Where: \r\n"
"<board_type> - Board type: 5731=GX5731, 5732=GX5732, 5733=GX5733\r\n\n"
"<slot_number> - PCI/PXI slot number as shown by the PXI explorer\r\n\n"
"<port|counter numbers> - depends on the operation:\r\n"
"\tport number: \t0-6 for WD/RD/WP/RP operations\r\n"
"\tcounter number: \t0-7 for WC/RC operations\r\n\n"
"<operation> - one of the followings :\r\n"
"\tWD=Write port direction\t\tRD=Read port direction\r\n"
"\tWP=Write port value \t\tRP=Read port value\r\n"
"\tWC=Write counter \t\tRC=Read counter\r\n"
"\tRB=read buffer \tWB=write buffer\r\n"
"\tRBF=read buffer empty/full flag\r\n"
"\tSCLK_SRC=set internal clock source GCLK_SRC=get internal clock source\r\n"
"\tSCLK_DIV=set internal clock divider GCLK_DIV=Get internal clock divider\r\n\n"
"<direction|value|counter> - depends on the operation:\r\n"
"\tWD : 0-15 \t\t4 bits direction. each bit controls a byte direction\r\n"
"\t \t\t in the port, 0 for input and 1 for output\r\n"
"\tWP : 0-0xFFFFFFFF\t\tPort value\r\n"
"\tWC : 0-255 \t\tCounter value to load\r\n\n"
"To change command line under Windows:\r\n"
"\tRight click on the example shortcut from the start menu\r\n"
"\tand type the new command line"
);
exit(1);
}
//*********************************************************
// CheckStatus
//*********************************************************
void CheckStatus(SHORT nStatus)
{
CHAR sz[128];
if (!nStatus) return;
GxPioGetErrorString(nStatus, sz, sizeof sz, &nStatus);
DisplayMsg(sz);
DisplayMsg("Aborting the program...");
exit(nStatus);
}
//*********************************************************
// MAIN
//
// This main functin receives three to four parameters
//
// Board type: 5731 - GX5731
// 5732 - GX5732
// 5733 - GX5733
// PIO board slot number (e.g. 1)
// Port/counter number (depends on operation):
// 0 - 6 for port
// 0 - 7 for counter
// Operation:
// RD=read port direction
// WD=write port direction
// RP=read port value
// WP=write port value
// RC=read counter
// WC=write counter
// RB=read buffer
// WB=write buffer
// RBF=read buffer empty/full flag
// SCLK_SRC=set internal clock source and divider
// GCLK_SRC=get internal clock source
// SCLK_DIV=set internal clock divider
// GCLK_DIV=Get internal clock divider
// Direction/value/counter/clock number (depends on operation):
// 0 - 15 for direction. This is 4-bits direction.
// Each bit controls the direction of a byte of
// the port. 1 for output, 0 for input.
// 0 - 0xFFFFFFFF for value
// 0 - 255 for counter
// 0 - 1 for Internal clock 0 or 1
//*********************************************************
int main(int argc, char **argv)
{
SHORT nSlotNum; // Board slot number
SHORT nBoardType; // Board type
char* sOperation; // Board Operation
SHORT nPortOrCount; // Port or counter number
DWORD dwValue; // Direction, port value or count
DWORD dwSize; // Write/Read buffer data Size
BOOL bTerminalCountState; // returned terminal count state
SHORT nHandle; // Board handle
SHORT nStatus; // Returned status
DWORD dwDivider; // Read Clock Divider
SHORT nSource; // Read Clock Source
// Check number of arguments rcvd
if (argc<4) DisplayUsage();
// Parse command line parameters
nSlotNum=(SHORT)strtol(*(++argv), NULL, 0);
nBoardType=(SHORT)strtol(*(++argv), NULL, 0);
nPortOrCount=(SHORT)strtol(*(++argv), NULL, 0);
#if _MSC_VER < 1400
sOperation = strupr(*(++argv));
#else
sOperation=*(++argv);
_strupr_s(sOperation, sizeof sOperation);
#endif
// Check parameters
if (nPortOrCount<0 || nPortOrCount>7) DisplayUsage();
// Board type is GX5731
if (nBoardType==5731)
{ Gx5731Initialize(nSlotNum, &nHandle, &nStatus);
CheckStatus(nStatus);
if(!strcmp(sOperation, "WD")) // Write port direction
{ if (nPortOrCount>6) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5731SetPortDirection(nHandle, nPortOrCount, SHORT(dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Writes port direction OK\n");
}
else if (!strcmp(sOperation, "RD")) // read port direction
{ if (nPortOrCount>6) DisplayUsage();
Gx5731GetPortDirection(nHandle, nPortOrCount, ((PSHORT)&dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Reads port direction: %d\n", SHORT(dwValue));
}
else if (!strcmp(sOperation, "WP")) // write port data
{ if (nPortOrCount>6) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5731SetPort(nHandle, nPortOrCount, dwValue, &nStatus);
CheckStatus(nStatus);
printf("Writes port value OK\n");
}
else if (!strcmp(sOperation, "RP")) // read port data
{ if (nPortOrCount>6) DisplayUsage();
Gx5731GetPort(nHandle, nPortOrCount, &dwValue, &nStatus);
CheckStatus(nStatus);
printf("Reads port value: 0x%X\n", dwValue);
}
else if (!strcmp(sOperation, "WB")) // write buffer
{ if (argc<5 || (nPortOrCount<0 || nPortOrCount>2)) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
dwSize=1;
Gx5731ModuleBufferWriteData(nHandle, nPortOrCount, &dwValue,
&dwSize, &nStatus);
CheckStatus(nStatus);
printf("Writes data to buffer OK\n");
}
else if (!strcmp(sOperation, "RB")) // read buffer
{ if (nPortOrCount<0 || nPortOrCount>2) DisplayUsage();
dwSize=1;
Gx5731ModuleBufferReadData(nHandle, nPortOrCount, &dwValue,
&dwSize, &nStatus);
CheckStatus(nStatus);
printf("Reads data to buffer: %d\n", dwValue);
}
else if (!strcmp(sOperation, "RBF"))// read buffer empty/full flag
{ if (argc<5 || (nPortOrCount<0 || nPortOrCount>2))
DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5731ModuleBufferGetState(nHandle, nPortOrCount,
((PSHORT)&dwValue), &nStatus);
CheckStatus(nStatus);
printf("Module Buffer Flag state is: %d\n", dwValue);
}
else if (!strcmp(sOperation, "SCLK_SRC")) // set internal clock source
{ if (argc<5 || (nPortOrCount<0 || nPortOrCount>2)) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5731GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
Gx5731SetInternalClock(nHandle, nPortOrCount, SHORT(dwValue),
dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Set internal clock source OK\n");
}
else if (!strcmp(sOperation, "GCLK_SRC")) // get internal clock source
{ if (nPortOrCount<0 || nPortOrCount>2) DisplayUsage();
Gx5731GetInternalClock(nHandle, nPortOrCount, ((PSHORT)&dwValue),
&dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Internal clock source is: %d\n", dwValue);
}
else if (!strcmp(sOperation, "SCLK_DIV")) // set internal clock divider
{ if (argc<5 || (nPortOrCount<0 || nPortOrCount>2)) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5731GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
Gx5731SetInternalClock(nHandle, nPortOrCount, nSource, dwValue,
&nStatus);
CheckStatus(nStatus);
printf("Set internal clock divider OK\n");
}
else if (!strcmp(sOperation, "GCLK_DIV")) // get internal clock divider
{ if (nPortOrCount<0 || nPortOrCount>2) DisplayUsage();
Gx5731GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Internal clock divider is: %d\n", dwDivider);
}
else
DisplayUsage();
}
// Borad type is GX5732
else
{ Gx5732Initialize(nSlotNum, &nHandle, &nStatus);
CheckStatus(nStatus);
if(!strcmp(sOperation, "WD")) // Write port direction
{ if (nPortOrCount>6) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5732SetPortDirection(nHandle, nPortOrCount, SHORT(dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Writes port direction OK\n");
}
else if (!strcmp(sOperation, "RD")) // read port direction
{ if (nPortOrCount>6) DisplayUsage();
Gx5732GetPortDirection(nHandle, nPortOrCount, ((PSHORT)&dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Reads port direction: %d\n", SHORT(dwValue));
}
else if (!strcmp(sOperation, "WP")) // write port data
{ if (nPortOrCount>6) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5732SetPort(nHandle, nPortOrCount, dwValue, &nStatus);
CheckStatus(nStatus);
printf("Writes port value OK\n");
}
else if (!strcmp(sOperation, "RP")) // read port data
{ if (nPortOrCount>6) DisplayUsage();
Gx5732GetPort(nHandle, nPortOrCount, &dwValue, &nStatus);
CheckStatus(nStatus);
printf("Reads port value: 0x%X\n", dwValue);
}
else if (!strcmp(sOperation, "WC")) // write counter
{ if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5732SetCounterValue(nHandle, nPortOrCount, (BYTE)dwValue,
&nStatus);
CheckStatus(nStatus);
printf("Writes counter OK\n");
}
else if (!strcmp(sOperation, "RC")) // read counter
{ Gx5732GetCounterValue(nHandle, nPortOrCount, (BYTE*)&dwValue,
&bTerminalCountState, &nStatus);
CheckStatus(nStatus);
printf("Reads counter: %d, terminal count state: %d\n",
(BYTE)dwValue, bTerminalCountState);
}
else
DisplayUsage();
}
// Borad type is GX5733
if (nBoardType==5733)
{ Gx5733Initialize(nSlotNum, &nHandle, &nStatus);
CheckStatus(nStatus);
if(!strcmp(sOperation, "WD")) // Write port direction
{ if (nPortOrCount>3) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5733SetPortDirection(nHandle, nPortOrCount, SHORT(dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Writes port direction OK\n");
}
else if (!strcmp(sOperation, "RD")) // read port direction
{ if (nPortOrCount>3) DisplayUsage();
Gx5733GetPortDirection(nHandle, nPortOrCount, ((PSHORT)&dwValue),
&nStatus);
CheckStatus(nStatus);
printf("Reads port direction: %d\n", SHORT(dwValue));
}
else if (!strcmp(sOperation, "WP")) // write port data
{ if (nPortOrCount>3) DisplayUsage();
if (argc<5) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5733SetPort(nHandle, nPortOrCount, dwValue, &nStatus);
CheckStatus(nStatus);
printf("Writes port value OK\n");
}
else if (!strcmp(sOperation, "RP")) // read port data
{ if (nPortOrCount>3) DisplayUsage();
Gx5733GetPort(nHandle, nPortOrCount, &dwValue, &nStatus);
CheckStatus(nStatus);
printf("Reads port value: 0x%X\n", dwValue);
}
else if (!strcmp(sOperation, "WB")) // write buffer
{ if (argc<5 || nPortOrCount!=0) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
dwSize=1;
Gx5733ModuleBufferWriteData(nHandle, nPortOrCount, &dwValue,
&dwSize, &nStatus);
CheckStatus(nStatus);
printf("Writes data to buffer OK\n");
}
else if (!strcmp(sOperation, "RB")) // read buffer
{ if (nPortOrCount!=0) DisplayUsage();
dwSize=1;
Gx5733ModuleBufferReadData(nHandle, nPortOrCount, &dwValue,
&dwSize, &nStatus);
CheckStatus(nStatus);
printf("Reads data to buffer: %d\n", dwValue);
}
else if (!strcmp(sOperation, "RBF")) // read buffer empty/full flag
{ if (argc<5 || nPortOrCount!=0) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5733ModuleBufferGetState(nHandle, nPortOrCount,
(PSHORT)&dwValue), &nStatus);
CheckStatus(nStatus);
printf("Module Buffer Flag state is: %d\n", dwValue);
}
else if (!strcmp(sOperation, "SCLK_SRC")) // set internal clock source
{ if (argc<5 || nPortOrCount!=0) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5733GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
Gx5733SetInternalClock(nHandle, nPortOrCount, SHORT(dwValue),
dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Set internal clock source OK\n");
}
else if (!strcmp(sOperation, "GCLK_SRC")) // get internal clock source
{ if (nPortOrCount!=0) DisplayUsage();
Gx5733GetInternalClock(nHandle, nPortOrCount, ((PSHORT)&dwValue),
&dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Internal clock source is: %d\n", dwValue);
}
else if (!strcmp(sOperation, "SCLK_DIV")) // set internal clock divider
{ if (argc<5 || nPortOrCount!=0) DisplayUsage();
dwValue=(DWORD)strtol(*(++argv), NULL, 0);
Gx5733GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
Gx5733SetInternalClock(nHandle, nPortOrCount, nSource, dwValue,
&nStatus);
CheckStatus(nStatus);
printf("Set internal clock divider OK\n");
}
else if (!strcmp(sOperation, "GCLK_DIV")) // get internal clock divider
{ if (nPortOrCount!=0) DisplayUsage();
Gx5733GetInternalClock(nHandle, nPortOrCount, &nSource,
&dwDivider, &nStatus);
CheckStatus(nStatus);
printf("Internal clock divider is: %d\n", dwDivider);
}
else
DisplayUsage();
}
else
DisplayUsage();
return 0;
}
//*********************************************************
// End Of File
//*********************************************************