- Added pmacterm, a new application which implements a terminal to a
Delta Tau motor controller
This commit is contained in:
13
utils/Make.pmacterm
Normal file
13
utils/Make.pmacterm
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
|
OBJ=asynnet.o rwpuffer.o pmacterm.o
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) -c -g $*.c
|
||||||
|
|
||||||
|
all:pmacterm
|
||||||
|
|
||||||
|
pmacterm: $(OBJ)
|
||||||
|
$(CC) -g -o pmacterm $(OBJ)
|
||||||
|
|
153
utils/pmacterm.c
Normal file
153
utils/pmacterm.c
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
}
|
Reference in New Issue
Block a user