📄 ioview.c
字号:
/* <St> ***********************************************************************
FILENAME : IOVIEW.C
-----------------------------------------------------------------------------
DEVELOPER : Armin Beck
PROJEKT : Test program for I/O buffer handling
=============================================================================
DISCRIPTION
This program shows the process data image transfer
=============================================================================
CHANGES
Version Name Date Discription
-----------------------------------------------------------------------------
V 2.000 Mayer 11.11.97 - Adjusted to new DUALPORT.H header file
V 1.000 Beck 28.03.96 - created
************************************************************************ <En> */
/* ------------------------------------------------------------------------ */
/* Common includes */
/* ------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
/* ------------------------------------------------------------------------ */
/* Hardware specific includes */
/* ------------------------------------------------------------------------ */
#include "dualport.h" /* DPM layout */
/* ------------------------------------------------------------------------ */
/* Macro definitions */
/* ------------------------------------------------------------------------ */
#ifdef _MSC_VER
#include <graph.h>
#define position(a,b) _settextposition(a,b)
#define color(a) _settextcolor(a)
#define output(a) _outtext(a)
#define clear(a) _clearscreen(a)
#else
#ifdef __BORLANDC__
#include <graphics.h>
#define position(a,b) gotoxy((b+1),(a+1))
#define color(a) textcolor(a)
#define output(a) cprintf(a)
#define clear(a) clrscr(a)
#endif
#endif
/* ------------------------------------------------------------------------ */
/* Local definitions */
/* ------------------------------------------------------------------------ */
/* Colormasks for screen */
#define COLOR_BLACK 0
#define COLOR_GREEN 2
#define COLOR_RED 4
#define COLOR_LIGHT_RED 12
#define COLOR_YELLOW 14
#define COLOR_BLINKING 16
/* ------------------------------------------------------------------------ */
/* Function prototypes */
/* ------------------------------------------------------------------------ */
void TriggerWatchdog ( void );
void PrintDevState ( void );
void DoIO ( void );
void GetKey ( void );
/* ------------------------------------------------------------------------ */
/* Global variables */
/* ------------------------------------------------------------------------ */
DPM_MEMORY far *ptDpm = NULL;
unsigned char far *pabSendPData = NULL;
unsigned char far *pabRecvPData = NULL;
unsigned short usPDataSize = 0;
unsigned short SendWordAddress = 0;
unsigned short ReceiveWordAddress = 0;
unsigned char FirmwareName[17];
unsigned char FirmwareVersion[17];
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/* MAIN PROGRAM */
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/* <ST> =================================================================================
Function: main
---------------------------------------------------------------------------------------
Input : -
Output : -
Return : -
================================================================================= <En> */
void main(int argc, char *argv[] )
{
unsigned short usStartSegment;
unsigned short usDpmSize, usIdx;
long lStartAddress;
unsigned long TimeCounter = 0;
unsigned char PointPosition = 25;
/* Load delivered parameter */
if( --argc != 2) {
printf("\nError : wrong parameter count");
exit(0);
}
usStartSegment = 0xCA00;
usDpmSize = 2;
for ( usIdx = 1; usIdx <= (unsigned short)argc; usIdx++)
{
strupr( argv[usIdx]);
/* Load pointer to DPM */
if ( strncmp( argv[usIdx], "/A:", 3) == 0 )
{
/* Load pointer to DPM */
if ( sscanf( argv[usIdx], "/A:%04X", &usStartSegment) == 0 )
{
printf("\nError : wrong DPM address parameter");
exit(0);
}
} else if ( strncmp( argv[usIdx], "/DPM:", 5) == 0 )
{
/* Load DPM size */
if ( sscanf( argv[usIdx], "/DPM:%X", &usDpmSize) == 0 )
{
printf("\nError : wrong DPM size parameter");
exit(0);
}
}
}
/* Create DPM SEGMENT:OFFSET address */
lStartAddress = ((long)(usStartSegment) << 16);
/* Calculate DPM size in bytes */
usPDataSize = (usDpmSize * 1024) - 1024;
/* Load DPM pointer */
ptDpm = (DPM_MEMORY far*)(lStartAddress + usPDataSize);
pabSendPData = (unsigned char far*)(lStartAddress);
pabRecvPData = (unsigned char far*)(lStartAddress + (usPDataSize / 2));
/* Initialize screen */
clear(0);
position(0,0);
/* Test hardware */
if( ptDpm->tDeviceInfo.abDevIdentifier[0] != 'C' )
{
printf("no valid hardware found\n");
printf("please check adress");
exit(0);
}
if( ptDpm->tDeviceInfo.abDevIdentifier[1] != 'O' &&
ptDpm->tDeviceInfo.abDevIdentifier[1] != 'I'
)
{
printf("no valid hardware found\n");
printf("please check adress");
exit(0);
}
if( ptDpm->tDeviceInfo.abDevIdentifier[2] != 'M' &&
ptDpm->tDeviceInfo.abDevIdentifier[2] != 'F'
)
{
printf("no valid hardware found\n");
printf("please check adress");
exit(0);
}
/* First, set host flags to zero */
ptDpm->bHostFlags = 0;
/* Run COLDSTART */
printf("initialising the device\n");
ptDpm->bDevFlags = RESET_FLAG;
/* Wait until hardware is ready */
printf("\nwaiting for ready-signal");
for(;;)
{
if( !(TimeCounter & 0x01ffff) )
{
if(PointPosition == 40 )
{
position(3,25);
printf(" ");
PointPosition = 25;
}
position(3,PointPosition++);
printf(".");
}
if( ++TimeCounter == 0x2fffff )
{
clear(0);
position(0,0);
printf("no success in coldstarting the device");
exit(0);
}
/* test ready-bit */
if( ptDpm->bHostFlags & READY_FLAG )
{
/* leave loop */
break;
}
}
printf("\n\nConnection to device established.\n");
_fmemcpy(&FirmwareName[0],&ptDpm->tFirmwareInfo.abFirmwareName[0],16);
FirmwareName[16] = 0;
_fmemcpy(&FirmwareVersion[0],&ptDpm->tFirmwareInfo.abFirmwareVersion[0],16);
FirmwareVersion[16] = 0;
printf("Following firmware detected: %s\n\n",&FirmwareName[0]);
printf("Following version detected: %s\n\n",&FirmwareVersion[0]);
printf("Be sure that the device uses operation mode standard/uncontrolled \n\n");
printf("Now press any key to continue.\n");
while( !kbhit() );
clear(0);
position(0,0);
color(COLOR_LIGHT_RED);
output("I/O monitor V02.000 ('esc'-key to quit )");
position(3,0);
printf("RDY RUN COM");
position(12,0);
printf("receive address[dec]: ('left' or 'right'-arrow changes address)"
"\n"
"\nreceive word [hex]:"
"\n"
"\n"
"\nsend address [dec]: ('up' or 'down'-arrow changes address)"
"\n"
"\nsend word [hex]: ('i' or 'd'-key increments/decrements outputword)"
);
position(24,0);
/* Endless loop */
for(;;)
{
/* Trigger watchdog of DPM */
TriggerWatchdog();
/* Print state of device */
PrintDevState();
/* Print input and output data */
DoIO();
/* Test if key pressed */
GetKey();
}
}
/* <ST> =================================================================================
Function: TriggerWatchdog
---------------------------------------------------------------------------------------
Input : -
Output : -
Return : -
================================================================================= <En> */
void TriggerWatchdog( void )
{
static unsigned short WDogCnt;
/* Trigger watchdog */
if( ptDpm->tRcsInfo.bDevWatchDog == ptDpm->tRcsInfo.bHostWatchDog)
{
if( (++WDogCnt) == 200 )
{
position(23,0);
color(COLOR_RED+COLOR_BLINKING);
output("the watchdog of the harware turned out");
exit(0);
}
}
else
{
WDogCnt = 0;
ptDpm->tRcsInfo.bDevWatchDog = ptDpm->tRcsInfo.bHostWatchDog;
}
}
/* <ST> =================================================================================
Function: DoIO
---------------------------------------------------------------------------------------
Input : -
Output : -
Return : -
================================================================================= <En> */
void DoIO( void )
{
position(12,23);
printf("%03d",ReceiveWordAddress>>1);
position(14,22);
printf("%02X%02X",
pabRecvPData[ReceiveWordAddress],
pabRecvPData[ReceiveWordAddress+1]
);
position(17,23);
printf("%03d",SendWordAddress>>1);
position(19,22);
printf("%02X%02X",
pabSendPData[SendWordAddress],
pabSendPData[SendWordAddress+1]
);
}
/* <ST> =================================================================================
Function: GetKey
---------------------------------------------------------------------------------------
Input : -
Output : -
Return : -
================================================================================= <En> */
void GetKey( void )
{
if( kbhit() )
{
switch( getch() )
{
case 72:
{
/* key 'up' was pressed */
SendWordAddress+=2;
if( SendWordAddress == 512 )
{
SendWordAddress = 0;
}
break;
}
case 80:
{
/* key 'down' was pressed */
SendWordAddress-=2;
if( SendWordAddress == 0xfffe )
{
SendWordAddress = 510;
}
break;
}
case 75:
{
/* key 'left' was pressed */
ReceiveWordAddress-=2;
if( ReceiveWordAddress == 0xfffe )
{
ReceiveWordAddress = 510;
}
break;
}
case 77:
{
/* key 'right' was pressed */
ReceiveWordAddress+=2;
if( ReceiveWordAddress == 512 )
{
ReceiveWordAddress = 0;
}
break;
}
case 27:
{
/* key 'esc' was pressed */
/* stop Watchdog of device */
ptDpm->tRcsInfo.bDevWatchDog = 0;
exit(0);
}
case 'i':
{
/* key 'i' was pressed */
(* (unsigned short*) &pabSendPData[SendWordAddress])++;
break;
}
case 'd':
{
/* key 'd' was pressed */
(* (unsigned short*) &pabSendPData[SendWordAddress])--;
break;
}
}
}
}
/* <ST> =================================================================================
Function: GetKey
---------------------------------------------------------------------------------------
Input : -
Output : -
Return : -
================================================================================= <En> */
void PrintDevState(void)
{
register rMulti = ptDpm->bHostFlags;
position(4,0);
/* test 'ready' of device */
if( rMulti & READY_FLAG )
{
color(COLOR_YELLOW);
output("
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -