Add Linux adaptations

This commit is contained in:
cvs
2000-10-20 06:43:34 +00:00
parent ce6eb2944d
commit 2cee4ec5e0

View File

@ -1,4 +1,4 @@
#define ident "1D05"
#define ident "1D08"
#ifdef VAXC
#module EL734_Utility ident
#endif
@ -59,6 +59,7 @@
** EL734_EncodeMSR - Encode the MSR status into text.
** EL734_EncodeSS - Encode the SS flags into text.
** EL734_ErrInfo - Return detailed status from last operation.
** EL734_GetAirCush - Get W and AC register values.
** EL734_GetEncGearing - Get FD register values.
** EL734_GetId - Get ID register value.
** EL734_GetLimits - Get H register values.
@ -68,6 +69,7 @@
** EL734_GetPrecision - Get A register value.
** EL734_GetRefMode - Get K register value.
** EL734_GetRefParam - Get Q register value.
** EL734_GetSpeeds - Get G, J and E register values.
** EL734_GetStatus - Get MSR/SS/U register values.
** EL734_GetZeroPoint - Get zero-point of motor.
** EL734_MoveNoWait - Move motor and don't wait for completion.
@ -76,7 +78,11 @@
** EL734_PutOffline - Put the EL734 off-line.
** EL734_PutOnline - Put the EL734 on-line.
** EL734_SendCmnd - Send a command to RS232C server.
** EL734_SetAirCush - Set the air-cushion (AC register).
** EL734_SetErrcode - Set up EL734_errcode.
** EL734_SetHighSpeed - Set the max speed (J register).
** EL734_SetLowSpeed - Set the start/stop speed (G register).
** EL734_SetRamp - Set the start/stop ramp (E register).
** EL734_Stop - Send a stop command to motor.
** EL734_WaitIdle - Wait till MSR goes to zero.
** EL734_ZeroStatus - Zero the "ored-MSR" and fault counters.
@ -239,6 +245,19 @@
** Returns detailed status of the last operation. Once an error has been
** detected, the error status is frozen until this routine has been called.
**-------------------------------------------------------------------------
** int EL734_GetAirCush (&handle, &present, &state)
** ----------------
** Get W and AC register values.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Output Args:
** int *present - The W register. If non-zero, motor has an air-cushion.
** int *state - The AC register. If non-zero, air-cushion is up.
** Description:
** The routine is the same as EL734_GetEncGearing except that it issues
** a "W" command and then an "AC" command instead of an "FD" command to
** the controller.
**-------------------------------------------------------------------------
** int EL734_GetEncGearing (&handle, &numerator, &denominator)
** -------------------
** Get FD register values.
@ -360,6 +379,20 @@
** The routine is the same as EL734_GetEncGearing except that it issues
** a "Q" command instead of an "FD" command to the controller.
**-------------------------------------------------------------------------
** int EL734_GetSpeeds (&handle, &lo, &hi, &ramp)
** ---------------
** Get G, J and E register values.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Output Args:
** int *lo - The start/stop speed (G register). Units = Steps/sec.
** int *hi - The maximum speed (J register). Units = Steps/sec.
** int *ramp - The start/stop ramp (E register). Units = kHz/sec.
** Description:
** The routine is the same as EL734_GetEncGearing except that it issues
** a "G", "J" and "E" commands instead of an "FD" command to the
** controller.
**-------------------------------------------------------------------------
** int EL734_GetStatus (&handle, &msr, &ored_msr, &fp_cntr, &fr_cntr,
** --------------- &ss, &ist_posit)
** Get MSR/SS/U register values.
@ -597,6 +630,38 @@
** Description:
** The command is passed to AsynSrv_SendCmnds and the reply extracted.
**-------------------------------------------------------------------------
** int EL734_SetAirCush (&handle, state)
** ----------------
** Set AC register value.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Input Args:
** int state - The new state of the AC register. 0 --> down
** non-zero --> up
** Output Args:
** none
** Modified Args:
** none
** Return status:
** True if no problems detected, otherwise False and EL734_ErrInfo
** can be called to identify the problem. Values of Errcode set by
** EL734_SetAirCush are (other values may be set by the called
** routines):
** EL734__BAD_TMO, BAD_LOC, BAD_CMD, BAD_OFL,
** BAD_ADR, EMERG_STOP --> see EL734_Open.
** EL734__VFY_ERR --> the value for the AC register returned by the
** call to EL734_GetAirCush was not the value which
** was sent via the AC command. This could happen
** if there is noise on the RS232C connection to
** the EL734.
** Routines called:
** EL734_AddCallStack, AsynSrv_SendCmnds, AsynSrv_GetReply,
** EL734_GetAirCush
** Description:
** The routine issues an "AC" command to the controller to set the air-
** cushions of the motor up or down. It then calls EL734_GetAirCush
** to check that the air-cushions were set correctly.
**-------------------------------------------------------------------------
** int EL734_SetErrcode (&info_ptr, &response, &cmnd)
** ----------------
** Set up EL734_errcode (for internal use only)
@ -618,6 +683,60 @@
** extra action is undertaken to try to see if the emergency stop state
** is active or not.
**-------------------------------------------------------------------------
** int EL734_SetHighSpeed (&handle, hi)
** ------------------
** Set J register value.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Input Args:
** int hi - The maximum speed (J register). Units = Steps/sec.
** Output Args:
** none
** Modified Args:
** none
** Return status:
** True if no problems detected, otherwise False and EL734_ErrInfo
** can be called to identify the problem. Values of Errcode set by
** EL734_SetHighSpeed are (other values may be set by the called
** routines):
** EL734__BAD_TMO, BAD_LOC, BAD_CMD, BAD_OFL,
** BAD_ADR, EMERG_STOP --> see EL734_Open.
** EL734__VFY_ERR --> the value for the J register returned by the call
** to EL734_GetSpeeds was not the value which was
** sent via the J command. This could happen if
** there is noise on the RS232C connection to
** the EL734.
** Routines called:
** EL734_AddCallStack, AsynSrv_SendCmnds, AsynSrv_GetReply, EL734_GetSpeeds
** Description:
** The routine issues a "J" command to the controller to set the max speed
** of the motor. It then calls EL734_GetSpeeds to check that the speed
** was set correctly.
**-------------------------------------------------------------------------
** int EL734_SetLowSpeed (&handle, hi)
** -----------------
** Set G register value.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Input Args:
** int lo - The start/stop speed (G register). Units = Steps/sec.
** Description:
** The routine is identical to the EL734_SetHighSpeed routine except that
** a "G" command rather than a "J" command is issued to the controller to
** set the start/stop speed.
**-------------------------------------------------------------------------
** int EL734_SetRamp (&handle, ramp)
** -------------
** Set E register value.
** Input Args:
** void **handle - The pointer to the structure returned by EL734_Open.
** Input Args:
** int ramp - The start/stop ramp (E register). Units = kHz/sec.
** Description:
** The routine is identical to the EL734_SetHighSpeed routine except that
** an "E" command rather than a "J" command is issued to the controller to
** set the start/stop ramp.
**-------------------------------------------------------------------------
** int EL734_Stop (&handle)
** ----------
** Send a stop command to motor
@ -676,9 +795,6 @@
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#ifndef LINUX
#include <timers.h>
#endif
#include <errno.h>
#include <signal.h>
#include <netdb.h>
@ -688,9 +804,12 @@
#include <string.h>
#ifdef __VMS
#include <unixio.h>
#include <unixio.h>
#else
#include <unistd.h>
#include <unistd.h>
#ifdef FORTIFY
#include <fortify/fortify.h>
#endif
#endif
/*-----------------------------------------------------------------*/
#include <rs232c_def.h>
@ -707,6 +826,7 @@
static char EL734_routine[5][64];
static int EL734_errcode = 0;
static int EL734_errno, EL734_vaxc_errno;
char EL734_IllgText[256];
/*
**---------------------------------------------------------------------------
** EL734_AddCallStack: Add a routine name to the call stack.
@ -1087,6 +1207,65 @@
}
/*
**---------------------------------------------------------------------------
** EL734_GetAirCush: Get W and AC register values.
*/
int EL734_GetAirCush (
/* ================
*/ void **handle,
int *present,
int *state) {
int status;
struct EL734info *info_ptr;
char cmnd0[10], cmnd1[10];
char *rply_ptr, *rply_ptr0, *rply_ptr1;
/*----------------------------------------------
*/
*present = *state = 0;
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_GetAirCush")) return False;
/*----------------------------------------------
** Send W and AC cmnds to EL734
*/
sprintf (cmnd0, "w %d\r", info_ptr->motor);
sprintf (cmnd1, "ac %d\r", info_ptr->motor);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, cmnd1, NULL);
if (!status) {
*present = *state = 0;
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr1 = NULL;
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 != NULL) rply_ptr1 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, rply_ptr0);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (rply_ptr1 == NULL) rply_ptr1 = "?no_response";
if ((sscanf (rply_ptr0, "%d", present) != 1) ||
(sscanf (rply_ptr1, "%d", state) != 1)) {
if (*rply_ptr0 == '?') {
rply_ptr = rply_ptr0;
}else if (*rply_ptr1 == '?') {
rply_ptr = rply_ptr1;
}else {
rply_ptr = "?funny_response";
}
*present = *state = 0;
EL734_SetErrcode (info_ptr, rply_ptr, "W\" or \"AC");
return False;
}
}
if (EL734_errcode != 0) return False;
EL734_call_depth--;
return True;
}
/*
**---------------------------------------------------------------------------
** EL734_GetEncGearing: Get FD register values.
*/
int EL734_GetEncGearing (
@ -1486,6 +1665,80 @@
}
/*
**---------------------------------------------------------------------------
** EL734_GetSpeeds: Get G/J/E register values.
*/
int EL734_GetSpeeds (
/* ===============
*/ void **handle,
int *lo,
int *hi,
int *ramp) {
int status;
struct EL734info *info_ptr;
char cmnd0[10];
char cmnd1[10];
char cmnd2[10];
char *rply_ptr;
char *rply_ptr0;
char *rply_ptr1;
char *rply_ptr2;
/*----------------------------------------------
*/
*lo = *hi = *ramp = 0;
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_GetSpeeds")) return False;
/*----------------------------------------------
** Send G, J and E cmnds to EL734
*/
sprintf (cmnd0, "g %d\r", info_ptr->motor);
sprintf (cmnd1, "j %d\r", info_ptr->motor);
sprintf (cmnd2, "e %d\r", info_ptr->motor);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, cmnd1, cmnd2, NULL);
if (!status) {
*lo = *hi = *ramp = 0;
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr1 = rply_ptr2 = NULL;
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 != NULL) rply_ptr1 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, rply_ptr0);
if (rply_ptr1 != NULL) rply_ptr2 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, rply_ptr1);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (rply_ptr1 == NULL) rply_ptr1 = "?no_response";
if (rply_ptr2 == NULL) rply_ptr2 = "?no_response";
if ((sscanf (rply_ptr0, "%d", lo) != 1) ||
(sscanf (rply_ptr1, "%d", hi) != 1) ||
(sscanf (rply_ptr2, "%d", ramp) != 1)) {
if (*rply_ptr0 == '?') {
rply_ptr = rply_ptr0;
}else if (*rply_ptr1 == '?') {
rply_ptr = rply_ptr1;
}else if (*rply_ptr2 == '?') {
rply_ptr = rply_ptr2;
}else {
rply_ptr = "?funny_response";
}
*lo = *hi = *ramp = 0;
EL734_SetErrcode (info_ptr, rply_ptr, "G\", \"J\" or \"E");
return False;
}
}
if (EL734_errcode != 0) return False;
EL734_call_depth--;
return True;
}
/*
**---------------------------------------------------------------------------
** EL734_GetStatus: Get MSR/SS/U register values.
*/
int EL734_GetStatus (
@ -1507,7 +1760,6 @@
char *rply_ptr0;
char *rply_ptr1;
char *rply_ptr2;
char buffer[50];
/*----------------------------------------------
*/
*msr = *ored_msr = *fp_cntr = *fr_cntr = *ss = -1; *ist_posit = 0.0;
@ -1564,13 +1816,7 @@
rply_ptr = "?funny_response";
}
*msr = *ored_msr = *fp_cntr = *fr_cntr = *ss = -1; *ist_posit = 0.0;
strcpy(buffer,cmnd0);
strcat(buffer,cmnd1);
strcat(buffer,cmnd2);
EL734_SetErrcode (info_ptr, rply_ptr, buffer);
if (EL734_errcode == EL734__BAD_ILLG)
fprintf (stderr, " Unrecognised response to \"MSR\", \"SS\""
" or \"U\" command: \"%s\"\n", rply_ptr);
EL734_SetErrcode (info_ptr, rply_ptr, "MSR\", \"SS\" or \"U");
return False;
}
}
@ -2020,10 +2266,58 @@
}
/*
**---------------------------------------------------------------------------
** EL734_SetAirCush: Set the air-cushion register (AC register)
*/
int EL734_SetAirCush (
/* ================
*/ void **handle,
int state) {
int status, dum1, my_state;
struct EL734info *info_ptr;
char cmnd0[32];
char *rply_ptr0;
/*----------------------------------------------
*/
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_SetAirCush")) return False;
/*----------------------------------------------
** Send AC cmnd to EL734
*/
if (state != 0) state = 1;
sprintf (cmnd0, "ac %d %d\r", info_ptr->motor, state);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, NULL);
if (!status) {
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (*rply_ptr0 == '\0') {
/*
** The command was accepted - check value is set OK.
*/
status = EL734_GetAirCush (handle, &dum1, &my_state);
if (!status) return False;
if (state != my_state) {
EL734_errcode = EL734__VFY_ERR;
return False;
}
EL734_call_depth--;
return True;
}
EL734_SetErrcode (info_ptr, rply_ptr0, "AC");
return False;
}
}
/*
**---------------------------------------------------------------------------
** EL734_SetErrcode - Set up EL734_errcode
*/
char cILLGText[256];
int EL734_SetErrcode (
/* ================
*/ struct EL734info *info_ptr,
@ -2040,20 +2334,11 @@ char cILLGText[256];
if (strcmp (response, "?CMD") == 0) EL734_errcode = EL734__BAD_CMD;
if (strcmp (response, "?LOC") == 0) EL734_errcode = EL734__BAD_LOC;
if (strcmp (response, "?ADR") == 0) EL734_errcode = EL734__BAD_ADR;
if (strcmp (response, "?BSY") == 0) EL734_errcode = EL734__BAD_BSY;
if (strcmp (response, "?RNG") == 0) EL734_errcode = EL734__BAD_RNG;
if (strcmp (response, "*ES") == 0) EL734_errcode = EL734__EMERG_STOP;
if (strcmp (response, "*MS" ) == 0) EL734_errcode = EL734__BAD_STP;
if (strncmp (response, "?TMO", 4) == 0) EL734_errcode = EL734__BAD_TMO;
if (EL734_errcode != EL734__BAD_ILLG) return EL734_errcode;
/*
* copy bad response to ILLGText for debugging purposes
*/
strcpy(cILLGText,cmnd);
strcat(cILLGText," : ");
strcat(cILLGText,response);
/*
** The response is not recognised. Perhaps the emergency stop
** signal is set. To check this, it is necessary to turn off
@ -2081,13 +2366,164 @@ char cILLGText[256];
}
if (strstr (rply, "*ES") != NULL) EL734_errcode = EL734__EMERG_STOP;
if ((EL734_errcode == EL734__BAD_ILLG) && (cmnd != NULL))
if ((EL734_errcode == EL734__BAD_ILLG) && (cmnd != NULL)) {
fprintf (stderr, " Unrecognised response to \"%s\" command: \"%s\"\n",
cmnd, response);
strcpy (EL734_IllgText, cmnd);
strcat (EL734_IllgText, " : ");
strcat (EL734_IllgText, response);
}
return EL734_errcode;
}
/*
**---------------------------------------------------------------------------
** EL734_SetHighSpeed: Set the max speed (J register)
*/
int EL734_SetHighSpeed (
/* ==================
*/ void **handle,
int hi) {
int status, my_lo, my_hi, my_ramp;
struct EL734info *info_ptr;
char cmnd0[32];
char *rply_ptr0;
/*----------------------------------------------
*/
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_SetHighSpeed")) return False;
/*----------------------------------------------
** Send J cmnd to EL734
*/
sprintf (cmnd0, "j %d %d\r", info_ptr->motor, hi);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, NULL);
if (!status) {
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (*rply_ptr0 == '\0') {
/*
** The command was accepted - check value is set OK.
*/
status = EL734_GetSpeeds (handle, &my_lo, &my_hi, &my_ramp);
if (!status) return False;
if (hi != my_hi) {
EL734_errcode = EL734__VFY_ERR;
return False;
}
EL734_call_depth--;
return True;
}
EL734_SetErrcode (info_ptr, rply_ptr0, "J");
return False;
}
}
/*
**---------------------------------------------------------------------------
** EL734_SetLowSpeed: Set the start/stop speed (G register)
*/
int EL734_SetLowSpeed (
/* =================
*/ void **handle,
int lo) {
int status, my_lo, my_hi, my_ramp;
struct EL734info *info_ptr;
char cmnd0[32];
char *rply_ptr0;
/*----------------------------------------------
*/
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_SetLowSpeed")) return False;
/*----------------------------------------------
** Send G cmnd to EL734
*/
sprintf (cmnd0, "g %d %d\r", info_ptr->motor, lo);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, NULL);
if (!status) {
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (*rply_ptr0 == '\0') {
/*
** The command was accepted - check value is set OK.
*/
status = EL734_GetSpeeds (handle, &my_lo, &my_hi, &my_ramp);
if (!status) return False;
if (lo != my_lo) {
EL734_errcode = EL734__VFY_ERR;
return False;
}
EL734_call_depth--;
return True;
}
EL734_SetErrcode (info_ptr, rply_ptr0, "G");
return False;
}
}
/*
**---------------------------------------------------------------------------
** EL734_SetRamp: Set the start/stop ramp (E register)
*/
int EL734_SetRamp (
/* =============
*/ void **handle,
int ramp) {
int status, my_lo, my_hi, my_ramp;
struct EL734info *info_ptr;
char cmnd0[32];
char *rply_ptr0;
/*----------------------------------------------
*/
info_ptr = (struct EL734info *) *handle;
if (!EL734_AddCallStack (info_ptr, "EL734_SetRamp")) return False;
/*----------------------------------------------
** Send E cmnd to EL734
*/
sprintf (cmnd0, "e %d %d\r", info_ptr->motor, ramp);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, NULL);
if (!status) {
EL734_errcode = EL734__BAD_ASYNSRV;
return False;
}else {
rply_ptr0 = AsynSrv_GetReply (
&info_ptr->asyn_info, &info_ptr->from_host, NULL);
if (rply_ptr0 == NULL) rply_ptr0 = "?no_response";
if (*rply_ptr0 == '\0') {
/*
** The command was accepted - check value is set OK.
*/
status = EL734_GetSpeeds (handle, &my_lo, &my_hi, &my_ramp);
if (!status) return False;
if (ramp != my_ramp) {
EL734_errcode = EL734__VFY_ERR;
return False;
}
EL734_call_depth--;
return True;
}
EL734_SetErrcode (info_ptr, rply_ptr0, "E");
return False;
}
}
/*
**---------------------------------------------------------------------------
** EL734_Stop: Send a stop command to motor.
*/
int EL734_Stop (
@ -2106,7 +2542,7 @@ char cILLGText[256];
/*----------------------------------------------
** Send S cmnd to EL734
*/
sprintf (cmnd0, "S %d\r", info_ptr->motor);
sprintf (cmnd0, "s %d\r", info_ptr->motor);
status = AsynSrv_SendCmnds (&info_ptr->asyn_info,
&info_ptr->to_host, &info_ptr->from_host,
cmnd0, NULL);
@ -2137,10 +2573,6 @@ char cILLGText[256];
int *fp_cntr,
int *fr_cntr,
float *ist_posit) {
#ifdef LINUX
#define nanosleep_d9 nanosleep
#endif
#ifdef __VMS
#include <lib$routines.h>
#define hibernate lib$wait (0.25)
@ -2149,7 +2581,7 @@ char cILLGText[256];
#include <time.h>
struct timespec delay = {0, 250000000};
struct timespec delay_left;
#define hibernate nanosleep_d9 (&delay, &delay_left)
#define hibernate nanosleep (&delay, &delay_left)
#endif
int msr, ss;
struct EL734info *info_ptr;