Files
sicspsi/utils/pmacterm.c
2009-04-17 12:55:00 +00:00

154 lines
3.6 KiB
C

/**
* This is a small program which implements a little terminal
* application for talking directly to the Delta-Tau PMAC
* motion controller via TCP/IP
*
* copyright: GPL
*
* Mark Koennecke, March 2009
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <errno.h>
#include "asynnet.h"
#define ETHERNET_DATA_SIZE 1492
#define INPUT_SIZE (ETHERNET_DATA_SIZE+1) /* +1 to allow space to add terminating ACK */
#define STX '\2'
#define CTRLB '\2'
#define CTRLC '\3'
#define ACK '\6'
#define CTRLF '\6'
#define BELL '\7'
#define CTRLG '\7'
#define CTRLP '\16'
#define CTRLV '\22'
#define CTRLX '\24'
/* PMAC ethernet command structure */
#pragma pack(1)
typedef struct tagEthernetCmd {
unsigned char RequestType;
unsigned char Request;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength; /* length of bData */
unsigned char bData[ETHERNET_DATA_SIZE];
} ethernetCmd;
#pragma pack()
#define ETHERNET_CMD_HEADER ( sizeof(ethernetCmd) - ETHERNET_DATA_SIZE )
/* PMAC ethernet commands - RequestType field */
#define VR_UPLOAD 0xC0
#define VR_DOWNLOAD 0x40
/* PMAC ethernet commands - Request field */
#define VR_PMAC_SENDLINE 0xB0
#define VR_PMAC_GETLINE 0xB1
#define VR_PMAC_FLUSH 0xB3
#define VR_PMAC_GETMEM 0xB4
#define VR_PMAC_SETMEN 0xB5
#define VR_PMAC_SETBIT 0xBA
#define VR_PMAC_SETBITS 0xBB
#define VR_PMAC_PORT 0xBE
#define VR_PMAC_GETRESPONSE 0xBF
#define VR_PMAC_READREADY 0xC2
#define VR_CTRL_RESPONSE 0xC4
#define VR_PMAC_GETBUFFER 0xC5
#define VR_PMAC_WRITEBUFFER 0xC6
#define VR_PMAC_WRITEERROR 0xC7
#define VR_FWDOWNLOAD 0xCB
#define VR_IPADDRESS 0xE0
/*--------------------------------------------------------*/
int main(int argc, char *argv[])
{
ethernetCmd cmd;
int pmacHandle, port, bytesToWrite;
char *colon, line[132], output, expectCR, repChar;
time_t start;
if(argc < 2) {
printf("Usage:\n\tpmacterm host:port\n");
exit(1);
}
colon = strchr(argv[1],':');
if(colon == NULL){
printf("ERROR: no colon in host:port\n");
exit(1);
}
port = atoi(colon+1);
*colon = '\0';
pmacHandle = ANETconnect(argv[1],port);
if(pmacHandle < 0){
printf("ERROR: failed to connect to the PMAC controller with errno %d\n",errno);
printf("Try to use the numeric IP, sometimes this helps\n");
exit(1);
}
memset(&cmd, 0, sizeof(ethernetCmd));
cmd.RequestType = VR_DOWNLOAD;
cmd.Request = VR_PMAC_GETRESPONSE;
cmd.wValue = 0;
cmd.wIndex = 0;
while(1){
fprintf(stdout,"pmac> ");
memset(line,0,132);
fgets(line,132,stdin);
if(strstr(line,"exit") != NULL){
break;
}
cmd.wLength = htons(strlen(line));
bytesToWrite = strlen(line) + 1+ ETHERNET_CMD_HEADER;
strcpy((char *)cmd.bData, line);
ANETwrite(pmacHandle, &cmd,bytesToWrite);
start = time(NULL);
output = 0;
expectCR = 0;
while(1){
ANETprocess();
if(time(NULL) > start + 10){
printf("TIMEOUT!!!\n");
fflush(stdout);
break;
}
if(ANETread(pmacHandle, &repChar,1) == 1){
ANETreadConsume(pmacHandle,1);
if(repChar == STX || repChar == BELL){
expectCR = 1;
continue;
}
if(expectCR && repChar == '\r'){
printf("\n");
fflush(stdout);
break;
}
if(repChar == '\n'){
printf("\n");
fflush(stdout);
break;
}
if(repChar == ACK){
if(output){
printf("\n");
} else {
printf("ACK\n");
}
fflush(stdout);
break;
}
printf("%c",repChar);
output = 1;
}
}
}
ANETclose(pmacHandle);
exit(0);
}