Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

usrmotintf.c File Reference

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <float.h>
#include "_timer.h"
#include "_shm.h"
#include "rcs_prnt.hh"
#include "emcmot.h"
#include "emcmotcfg.h"
#include "emcmotglb.h"
#include "usrmotintf.h"
#include "emcmotlog.h"
#include "inifile.h"

Include dependency graph for usrmotintf.c:

Include dependency graph

Go to the source code of this file.

Defines

#define __attribute__(x)
#define BUFFERLEN   256

Functions

char __attribute__ ((unused)) ident[]="$Id
int usrmotIniLoad (const char *filename)
int usrmotWriteEmcmotCommand (EMCMOT_COMMAND *c)
int usrmotReadEmcmotStatus (EMCMOT_STATUS *s)
int usrmotReadEmcmotConfig (EMCMOT_CONFIG *s)
int usrmotReadEmcmotDebug (EMCMOT_DEBUG *s)
int usrmotReadEmcmotError (char *e)
int htostr (char *s, unsigned short h)
void printEmcPose (EmcPose *pose)
void printTPstruct (TP_STRUCT *tp)
void usrmotPrintEmcmotDebug (EMCMOT_DEBUG d, int which)
void usrmotPrintEmcmotConfig (EMCMOT_CONFIG c, int which)
void usrmotPrintEmcmotStatus (EMCMOT_STATUS s, int which)
int usrmotInit (void)
int usrmotExit (void)
int usrmotDumpLog (const char *filename, int include_header)
int usrmotLoadComp (int axis, const char *file)
int usrmotAlter (int axis, double alter)
int usrmotQueryAlter (int axis, double *alter)
int usrmotPrintComp (int axis)

Variables

EMCMOT_STRUCTemcmotStruct = 0
int emcmot_comm_timeout_count = 0
int emcmot_status_split_count = 0
int emcmot_config_split_count = 0
int emcmot_debug_split_count = 0


Define Documentation

#define BUFFERLEN   256
 

#define __attribute__  
 

Definition at line 80 of file usrmotintf.c.


Function Documentation

char __attribute__ (unused)    [static]
 

Definition at line 84 of file usrmotintf.c.

00084                                                   : usrmotintf.c,v 1.19 2001/11/05 16:59:55 wshackle Exp $";
00085 
00086 #include <stdio.h>
00087 #include <string.h>             /* memcpy() */
00088 #include <stdlib.h>             /* sizeof() */
00089 #include <float.h>              /* DBL_MIN */
00090 #include "_timer.h"             /* rcslib esleep() */
00091 #include "_shm.h"               /* rcslib shm_t, rcs_shm_open(), ... */
00092 #include "rcs_prnt.hh"          /* set_rcs_print_destination(), ... */
00093 #include "emcmot.h"             /* EMCMOT_STATUS,CMD */
00094 #include "emcmotcfg.h"          /* EMCMOT_ERROR_NUM,LEN */
00095 #include "emcmotglb.h"          /* SHMEM_BASE_ADDRESS, SHMEM_KEY */
00096 #include "usrmotintf.h"         /* these decls */
00097 #include "emcmotlog.h"          /* EMCMOT_LOG */
00098 #include "inifile.h"            /* iniFind() */
00099 
00100 #ifdef linux
00101 
00102 /* Linux uses mmap-style comm with RT process */
00103 #include <stdio.h>
00104 #include <errno.h>
00105 #include <sys/time.h>
00106 #include <sys/types.h>
00107 #include <sys/stat.h>
00108 #include <fcntl.h>
00109 #include <unistd.h>
00110 #include <sys/ioctl.h>
00111 
00112 #define READ_TIMEOUT_SEC 0      /* seconds for timeout */
00113 #define READ_TIMEOUT_USEC 100000 /* microseconds for timeout */
00114 
00115 #ifdef HAVE_RTAI
00116 #include <stdlib.h>
00117 #include <stdio.h>
00118 #include <unistd.h>
00119 #include <signal.h>
00120 #include <sys/types.h>
00121 #include <sys/stat.h>
00122 #include <fcntl.h>
00123 #include <sys/mman.h>
00124 #include <errno.h>
00125 #include <unistd.h>
00126 
00127 #include "rtai_shm.h"
00128 #endif
00129 
00130 #ifndef NO_RTL
00131 #if defined(linux_2_2) || defined(linux_2_3) || defined(linux_2_4)
00132 #include "mbuff.h"              /* mbuff_alloc(),mbuff_free() */
00133 #define USE_RTL_MBUFF
00134 #else
00135 #include <sys/mman.h>           /* mmap, munmap, PROT_READ */
00136 #ifndef MAP_FAILED              /* kernel 2.0.29 left this out */
00137 #define MAP_FAILED ((void *) -1)
00138 #endif
00139 #endif /* linux_2_2, linux_2_3, linux_2_4 */
00140 
00141 #endif /* not NO_RTL */
00142 
00143 #endif /* linux */
00144 
00145 static int inited = 0;          /* flag if inited */
00146 static int usingShmem = 0;
00147 static shm_t *shmem = NULL;
00148 
00149 static EMCMOT_COMMAND *emcmotCommand = 0;
00150 static EMCMOT_STATUS *emcmotStatus = 0;
00151 static EMCMOT_CONFIG *emcmotConfig = 0;
00152 static EMCMOT_DEBUG *emcmotDebug = 0;
00153 static EMCMOT_ERROR *emcmotError = 0;
00154 static EMCMOT_LOG *emcmotLog = 0;
00155 static EMCMOT_COMP *emcmotComp[EMCMOT_MAX_AXIS] = {0};

int htostr char *    s,
unsigned short    h
[static]
 

Definition at line 485 of file usrmotintf.c.

Referenced by usrmotPrintEmcmotConfig(), and usrmotPrintEmcmotStatus().

00486 {
00487   int t;
00488 
00489   for (t = 15; t >= 0; t--)
00490     {
00491       s[t] = h % 2 ? '1' : '0';
00492       h >>= 1;
00493     }
00494   s[16] = 0;                    /* null terminate */
00495 
00496   return 0;
00497 }

void printEmcPose EmcPose   pose
 

Definition at line 499 of file usrmotintf.c.

Referenced by printTPstruct().

00500 {
00501   printf("x=%f\ty=%f\tz=%f\ta=%f\tb=%f\tc=%f",
00502          pose->tran.x, pose->tran.y, pose->tran.z, pose->a,pose->b,pose->c);
00503 }

void printTPstruct TP_STRUCT   tp
 

Definition at line 506 of file usrmotintf.c.

Referenced by usrmotPrintEmcmotDebug().

00507 {
00508   printf("queueSize=%d\n",tp->queueSize);
00509   printf("cycleTime=%f\n",tp->cycleTime);
00510   printf("vMax=%f\n",tp->vMax);
00511   printf("vScale=%f\n",tp->vScale);
00512   printf("vRestore=%f\n",tp->vRestore);
00513   printf("aMax=%f\n",tp->aMax);
00514   printf("vLimit=%f\n",tp->vLimit);
00515   printf("wMax=%f\n",tp->wMax);
00516   printf("wDotMax=%f\n",tp->wDotMax);
00517   printf("nextId=%d\n",tp->nextId);
00518   printf("execId=%d\n",tp->execId);
00519   printf("termCond=%d\n",tp->termCond);
00520   printf("currentPos :");
00521   printEmcPose(&tp->currentPos);
00522   printf("\n");
00523   printf("goalPos :");
00524   printEmcPose(&tp->goalPos);
00525   printf("\n");
00526   printf("done=%d\n",tp->done);
00527   printf("depth=%d\n",tp->depth);
00528   printf("activeDepth=%d\n",tp->activeDepth);
00529   printf("aborting=%d\n",tp->aborting);
00530   printf("pausing=%d\n",tp->pausing);
00531 }

int usrmotAlter int    axis,
double    alter
 

Definition at line 1597 of file usrmotintf.c.

Referenced by emcAxisAlter(), and main().

01598 {
01599   /* check axis range */
01600   if (axis < 0 || axis >= EMCMOT_MAX_AXIS)
01601   {
01602     fprintf(stderr, "axis out of range for alter\n");
01603     return -1;
01604   }
01605 
01606   /* first check if comp pointer is valid */
01607   if (emcmotComp[axis] == 0)
01608   {
01609     fprintf(stderr, "compensation data structure not present\n");
01610     return -1;
01611   }
01612 
01613   /* set alter value */
01614   emcmotComp[axis]->alter = alter;
01615 
01616   return 0;
01617 }

int usrmotDumpLog const char *    filename,
int    include_header
 

Definition at line 1177 of file usrmotintf.c.

Referenced by emcLogClose(), and main().

01178 {
01179   FILE * fp;
01180   EMCMOT_LOG_STRUCT ls;
01181   int axis;
01182   int first_point = 1;
01183   double start_time=0;
01184   int start_time_set=0;
01185 
01186   /* open output log file */
01187   if (NULL == (fp = fopen(filename, "w")))
01188   {
01189     fprintf(stderr, "can't open dump file %s\n", filename);
01190     return -1;
01191   }
01192 
01193 
01194   /* get the data */
01195   while (emcmotLog->howmany > 0)
01196   {
01197     if (-1 == emcmotLogGet(emcmotLog, &ls))
01198     {
01199       break;
01200     }
01201 
01202 
01203   if(include_header && first_point)
01204     {
01205       first_point=0;
01206       fprintf(fp,"#!/bin/sh\n");
01207       fprintf(fp,"exec cat $0 | head -n 16 | tail -n 12 | sed s#THIS_PLOT_FILE#$0#g |  gnuplot -persist\n");
01208       fprintf(fp,"exit\n"); 
01209       fprintf(fp,"\n");
01210       
01211       fprintf(fp,"# This file contains both the gnuplot plotting instructions\n"); 
01212       fprintf(fp,"# and the data logged, by EMC.\n");
01213       fprintf(fp,"# For this to work, the data must begin after 2 blank lines,\n");
01214       fprintf(fp,"# and the line \"exit\" must appear before the data.\n");
01215       fprintf(fp,"# (lines beginning with \"#\" are ignored.)\n");
01216       fprintf(fp,"print \"Running THIS_PLOT_FILE . . .\\n\"\n");
01217       switch(ls.type)
01218         {
01219 
01220         case EMCMOT_LOG_TYPE_AXIS_POS:
01221           fprintf(fp,"print \"Plotting axis position values . . .\\n\"\n");
01222           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"input\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"output\"\n");
01223           break;
01224 
01225         case EMCMOT_LOG_TYPE_ALL_OUTPOS:
01226           fprintf(fp,"print \"Plotting all output values . . .\\n\"\n");
01227           fprintf(fp,"set multiplot; set size 1,0.33; ");
01228      
01229           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01230             {
01231               fprintf(fp,"set origin 0,%f; plot \"THIS_PLOT_FILE\" index 1 using 1:%d title \"output[%d]\"; ", axis*0.33, axis+2, axis);
01232             }
01233           fprintf(fp, "set nomultiplot;\n");
01234           break;
01235 
01236         case EMCMOT_LOG_TYPE_ALL_INPOS:
01237           fprintf(fp,"print \"Plotting all input values . . .\\n\"\n");
01238           fprintf(fp,"set multiplot; set size 1,0.33; ");
01239      
01240           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01241             {
01242               fprintf(fp,"set origin 0,%f; plot \"THIS_PLOT_FILE\" index 1 using 1:%d title \"input[%d]\"; ", axis*0.33, axis+2, axis);
01243             }
01244           fprintf(fp, "set nomultiplot;\n");
01245           break;
01246 
01247 
01248 
01249         case EMCMOT_LOG_TYPE_CMD:
01250           fprintf(fp,"print \"Plotting command/commandNum values . . .\\n\"\n");
01251           fprintf(fp,"set multiplot; set size 1,0.5; plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"command\"; set origin 0,0.5; plot  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"cmdNumber\"; set nomultiplot;\n");
01252           break;
01253 
01254         case EMCMOT_LOG_TYPE_AXIS_VEL:
01255           fprintf(fp,"print \"Plotting axis velocity values . . .\\n\"\n");
01256           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"cmdVel\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"actualVel\"\n");
01257           break;
01258 
01259 
01260         case EMCMOT_LOG_TYPE_ALL_FERROR:
01261           fprintf(fp,"print \"Plotting all following errors. . .\\n\"\n");
01262           fprintf(fp,"set multiplot; set size 1,0.33; ");
01263      
01264           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01265             {
01266               fprintf(fp,"set origin 0,%f; plot \"THIS_PLOT_FILE\" index 1 using 1:%d title \"ferror[%d]\"; ", axis*0.33, axis+2, axis);
01267             }
01268           fprintf(fp, "set nomultiplot;\n");
01269           break;
01270 
01271         case EMCMOT_LOG_TYPE_TRAJ_POS:
01272           fprintf(fp,"print \"Plotting all traj positions. . .\\n\"\n");
01273           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"X\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"Y\",  \"THIS_PLOT_FILE\" index 1 using 1:4 title \"Z\"\n");
01274           break;
01275 
01276         case EMCMOT_LOG_TYPE_TRAJ_VEL:
01277           fprintf(fp,"print \"Plotting all traj velocities . . .\\n\"\n");
01278           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"X Velocity\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"Y Velocity\",  \"THIS_PLOT_FILE\" index 1 using 1:4 title \"Z Velocity\",  \"THIS_PLOT_FILE\" index 1 using 1:5 title \"Velocity Magnitude\"\n");
01279           break;
01280 
01281         case EMCMOT_LOG_TYPE_TRAJ_ACC: 
01282           fprintf(fp,"print \"Plotting all traj accellerations . . .\\n\"\n");
01283           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"X Accelleration\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"Y Accelleration\",  \"THIS_PLOT_FILE\" index 1 using 1:4 title \"Z Accelleration\",  \"THIS_PLOT_FILE\" index 1 using 1:5 title \"Accelleration Magnitude\"\n");
01284           break;
01285 
01286 
01287         case EMCMOT_LOG_TYPE_POS_VOLTAGE:           
01288           fprintf(fp,"print \"Plotting EMC position and voltage data . . .\\n\"\n");
01289           fprintf(fp,"set multiplot; set size 1,0.5; plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"pos\"; set origin 0,0.5; plot  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"volt\"; set nomultiplot;\n");
01290           break;
01291 
01292         default:
01293           fprintf(fp,"print \"Plotting unknown data values . . .\\n\"\n");
01294           fprintf(fp,"plot \"THIS_PLOT_FILE\" index 1 using 1:2 title \"data1\",  \"THIS_PLOT_FILE\" index 1 using 1:3 title \"data2\"\n");
01295           break;
01296            
01297         }
01298       fprintf(fp,"exit\n");
01299       fprintf(fp,"\n");
01300       fprintf(fp,"\n");
01301       switch(ls.type)
01302         {
01303         case EMCMOT_LOG_TYPE_AXIS_POS:
01304           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\n","time","input","output");
01305           break;
01306 
01307         case EMCMOT_LOG_TYPE_ALL_INPOS:
01308           fprintf(fp,"#%17.17s\t","time");
01309           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01310             {
01311               char input_name[20];;
01312               sprintf(input_name,"input[%d]",axis);
01313               fprintf(fp,"%17.17s\t",input_name);
01314             }
01315           break;
01316 
01317         case EMCMOT_LOG_TYPE_ALL_OUTPOS:
01318           fprintf(fp,"#%17.17s\t","time");
01319           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01320             {
01321               char input_name[20];;
01322               sprintf(input_name,"output[%d]",axis);
01323               fprintf(fp,"%17.17s\t",input_name);
01324             }
01325           fprintf(fp, "\n");
01326           break;
01327 
01328         case EMCMOT_LOG_TYPE_CMD:
01329           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\n","time","command","cmdNumber");
01330           break;
01331 
01332         case EMCMOT_LOG_TYPE_AXIS_VEL:
01333           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\n","time","cmdVel","actVel");
01334           break;
01335 
01336         case EMCMOT_LOG_TYPE_ALL_FERROR:
01337           fprintf(fp,"#%17.17s\t","time");
01338           for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01339             {
01340               char input_name[20];;
01341               sprintf(input_name,"ferror[%d]",axis);
01342               fprintf(fp,"%17.17s\t",input_name);
01343             }
01344           fprintf(fp, "\n");
01345           break;
01346 
01347         case EMCMOT_LOG_TYPE_TRAJ_POS:
01348           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\t%17.17s\n","time","X","Y","Z");
01349           break;
01350 
01351         case EMCMOT_LOG_TYPE_TRAJ_VEL:
01352           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\t%17.17s\t%17.17s\n","time","Xvel","Yvel","Zvel","VelMag");
01353           break;
01354 
01355         case EMCMOT_LOG_TYPE_TRAJ_ACC:
01356           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\t%17.17s\t%17.17s\n","time","Xacc","Yacc","Zacc","AccMag");
01357           break;
01358 
01359         case EMCMOT_LOG_TYPE_POS_VOLTAGE:           
01360           fprintf(fp,"#%17.17s\t%17.17s\t%17.17s\n","time","pos","volt");
01361           break;
01362 
01363         default:
01364           fprintf(fp,"#\n");
01365           break;
01366         }
01367     }
01368 
01369     switch (ls.type)
01370     {
01371     case EMCMOT_LOG_TYPE_AXIS_POS:
01372       if(!start_time_set)
01373         {
01374           start_time_set=1;
01375           start_time = ls.item.axisPos.time;
01376         }
01377       fprintf(fp, "%.10e\t%.10e\t%.10e\n",
01378               ls.item.axisPos.time-start_time,
01379               ls.item.axisPos.input,
01380               ls.item.axisPos.output);
01381       break;
01382 
01383     case EMCMOT_LOG_TYPE_ALL_INPOS:
01384       if(!start_time_set)
01385         {
01386           start_time_set=1;
01387           start_time = ls.item.allInpos.time;
01388         }
01389       fprintf(fp, "%.10e", ls.item.allInpos.time);
01390       for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01391       {
01392         fprintf(fp, "\t%.10e", ls.item.allInpos.input[axis]);
01393       }
01394       fprintf(fp, "\n");
01395       break;
01396 
01397     case EMCMOT_LOG_TYPE_ALL_OUTPOS: 
01398       if(!start_time_set)
01399         {
01400           start_time_set=1;
01401           start_time = ls.item.allOutpos.time;
01402         }
01403       fprintf(fp, "%.10e", ls.item.allOutpos.time);
01404       for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01405       {
01406         fprintf(fp, "\t%.10e", ls.item.allOutpos.output[axis]);
01407       }
01408       fprintf(fp, "\n");
01409       break;
01410 
01411     case EMCMOT_LOG_TYPE_CMD:
01412       if(!start_time_set)
01413         {
01414           start_time_set=1;
01415           start_time = ls.item.cmd.time;
01416         }
01417       fprintf(fp, "%.10e\t%d\t%d\n",
01418               ls.item.cmd.time-start_time,
01419               ls.item.cmd.command,
01420               ls.item.cmd.commandNum);
01421       break;
01422 
01423     case EMCMOT_LOG_TYPE_AXIS_VEL:
01424       if(!start_time_set)
01425         {
01426           start_time_set=1;
01427           start_time = ls.item.axisVel.time;
01428         }
01429       fprintf(fp, "%.10e\t%.10e\t%.10e\n",
01430               ls.item.axisVel.time-start_time,
01431               ls.item.axisVel.cmdVel,
01432               ls.item.axisVel.actVel);
01433       break;
01434 
01435     case EMCMOT_LOG_TYPE_ALL_FERROR:
01436        if(!start_time_set)
01437         {
01438           start_time_set=1;
01439           start_time = ls.item.allFerror.time;
01440         }
01441        fprintf(fp, "%.10e", ls.item.allFerror.time);
01442        for (axis = 0; axis < EMCMOT_LOG_NUM_AXES; axis++)
01443          {
01444            fprintf(fp, "\t%.10e", ls.item.allFerror.ferror[axis]);
01445          }
01446        fprintf(fp, "\n");
01447        break;
01448 
01449     case EMCMOT_LOG_TYPE_TRAJ_POS:
01450        if(!start_time_set)
01451         {
01452           start_time_set=1;
01453           start_time = ls.item.trajPos.time;
01454         }
01455       fprintf(fp, "%.10e\t%.10e\t%.10e\t%.10e\n",
01456               ls.item.trajPos.time-start_time,
01457               ls.item.trajPos.pos.x,
01458               ls.item.trajPos.pos.y,
01459               ls.item.trajPos.pos.z);
01460       break;
01461 
01462     case EMCMOT_LOG_TYPE_TRAJ_VEL:
01463       if(!start_time_set)
01464         {
01465           start_time_set=1;
01466           start_time = ls.item.trajVel.time;
01467         }
01468       fprintf(fp, "%.10e\t%.10e\t%.10e\t%.10e\t%.10e\n",
01469               ls.item.trajVel.time-start_time,
01470               ls.item.trajVel.vel.x,
01471               ls.item.trajVel.vel.y,
01472               ls.item.trajVel.vel.z,
01473               ls.item.trajVel.mag);
01474       break;
01475 
01476     case EMCMOT_LOG_TYPE_TRAJ_ACC:
01477       if(!start_time_set)
01478         {
01479           start_time_set=1;
01480           start_time = ls.item.trajAcc.time;
01481         }
01482       fprintf(fp, "%.10e\t%.10e\t%.10e\t%.10e\t%.10e\n",
01483               ls.item.trajAcc.time-start_time,
01484               ls.item.trajAcc.acc.x,
01485               ls.item.trajAcc.acc.y,
01486               ls.item.trajAcc.acc.z,
01487               ls.item.trajAcc.mag);
01488       break;
01489 
01490     case EMCMOT_LOG_TYPE_POS_VOLTAGE:
01491       if(!start_time_set)
01492         {
01493           start_time_set=1;
01494           start_time = ls.item.posVoltage.time;
01495         }
01496       fprintf(fp, "%.10e\t%.10e\t%.10e\n",
01497               ls.item.posVoltage.time-start_time,
01498               ls.item.posVoltage.pos,
01499               ls.item.posVoltage.voltage);
01500       break;
01501 
01502     default:
01503       break;
01504     }
01505   }
01506 
01507   /* close output file */
01508   fclose(fp);
01509 
01510   chmod(filename, 00775);
01511   return 0;
01512 }

int usrmotExit void   
 

Definition at line 1135 of file usrmotintf.c.

Referenced by emcAxisHalt(), emcIoHalt(), emcTrajHalt(), and main().

01136 {
01137   int axis;
01138 
01139   if (usingShmem)
01140   {
01141     if (NULL != shmem)
01142     {
01143       rcs_shm_close(shmem);
01144       shmem = NULL;
01145     }
01146   }
01147   else
01148   {
01149 #ifdef HAVE_RTAI
01150     rtai_free(SHMEM_KEY,emcmotStruct);
01151 #else
01152 #if defined(linux) && !defined(NO_RTL)
01153 #ifdef USE_RTL_MBUFF
01154     mbuff_free("emcmotStruct", emcmotStruct);
01155 #else
01156     munmap((void *) emcmotStruct, sizeof(EMCMOT_STRUCT));
01157 #endif
01158 #endif
01159 #endif
01160   }
01161 
01162   emcmotStruct = 0;
01163   emcmotCommand = 0;
01164   emcmotStatus = 0;
01165   emcmotError = 0;
01166   emcmotLog = 0;
01167   for (axis = 0; axis < EMCMOT_MAX_AXIS; axis++)
01168   {
01169     emcmotComp[axis] = 0;
01170   }
01171 
01172   inited = 0;
01173   return 0;
01174 }

int usrmotIniLoad const char *    filename
 

Definition at line 160 of file usrmotintf.c.

Referenced by emcAxisInit(), emcIoInit(), emcTrajInit(), and main().

00161 {
00162   FILE *fp;
00163   const char *inistring;
00164   int saveInt;
00165   double saveDouble;
00166 
00167   /* open it */
00168   if (NULL == (fp = fopen(filename, "r")))
00169   {
00170     rcs_print("can't find emcmot ini file %s\n", filename);
00171     return -1;
00172   }
00173 
00174   saveInt = SHMEM_KEY;
00175   if (NULL != (inistring = iniFind(fp, "SHMEM_KEY", "EMCMOT")))
00176   {
00177     if (1 == sscanf(inistring, "%i", &SHMEM_KEY))
00178     {
00179       /* found it */
00180     }
00181     else
00182     {
00183       /* found, but invalid */
00184       SHMEM_KEY = saveInt;
00185       rcs_print("invalid [EMCMOT] SHMEM_KEY in %s (%s); using default %d\n",
00186                 filename, inistring, SHMEM_KEY);
00187     }
00188   }
00189   else
00190   {
00191     /* not found, using default */
00192     rcs_print("[EMCMOT] SHMEM_KEY not found in %s; using default %d\n",
00193               filename, SHMEM_KEY);
00194   }
00195 
00196   saveInt = SHMEM_BASE_ADDRESS;
00197   if (NULL != (inistring = iniFind(fp, "SHMEM_BASE_ADDRESS", "EMCMOT")))
00198   {
00199     if (1 == sscanf(inistring, "%lu", &SHMEM_BASE_ADDRESS))
00200     {
00201       /* found it */
00202     }
00203     else
00204     {
00205       /* found, but invalid */
00206       SHMEM_BASE_ADDRESS = saveInt;
00207       rcs_print("invalid [EMCMOT] SHMEM_BASE_ADDRESS in %s (%s); using default %d\n",
00208                 filename, inistring, SHMEM_BASE_ADDRESS);
00209     }
00210   }
00211   else
00212   {
00213     /* not found, using default */
00214     rcs_print("[EMCMOT] SHMEM_BASE_ADDRESS not found in %s; using default %d\n",
00215               filename, SHMEM_BASE_ADDRESS);
00216 
00217   }
00218 
00219   saveDouble = EMCMOT_COMM_TIMEOUT;
00220   if (NULL != (inistring = iniFind(fp, "COMM_TIMEOUT", "EMCMOT")))
00221   {
00222     if (1 == sscanf(inistring, "%lf", &EMCMOT_COMM_TIMEOUT))
00223     {
00224       /* found it */
00225     }
00226     else
00227     {
00228       /* found, but invalid */
00229       EMCMOT_COMM_TIMEOUT = saveDouble;
00230       rcs_print("invalid [EMCMOT] COMM_TIMEOUT in %s (%s); using default %f\n",
00231                 filename, inistring, EMCMOT_COMM_TIMEOUT);
00232     }
00233   }
00234   else
00235   {
00236     /* not found, using default */
00237     rcs_print("[EMCMOT] COMM_TIMEOUT not found in %s; using default %f\n",
00238               filename, EMCMOT_COMM_TIMEOUT);
00239   }
00240 
00241   saveDouble = EMCMOT_COMM_WAIT;
00242   if (NULL != (inistring = iniFind(fp, "COMM_WAIT", "EMCMOT")))
00243   {
00244     if (1 == sscanf(inistring, "%lf", &EMCMOT_COMM_WAIT))
00245     {
00246       /* found it */
00247     }
00248     else
00249     {
00250       /* found, but invalid */
00251       EMCMOT_COMM_WAIT = saveDouble;
00252       rcs_print("invalid [EMCMOT] COMM_WAIT in %s (%s); using default %f\n",
00253                 filename, inistring, EMCMOT_COMM_WAIT);
00254     }
00255   }
00256   else
00257   {
00258     /* not found, using default */
00259     rcs_print("[EMCMOT] COMM_WAIT not found in %s; using default %f\n",
00260               filename, EMCMOT_COMM_WAIT);
00261   }
00262 
00263   fclose(fp);
00264 
00265   return 0;
00266 }

int usrmotInit void   
 

Definition at line 1038 of file usrmotintf.c.

Referenced by emcAxisInit(), emcIoInit(), emcTrajInit(), and main().

01039 {
01040   int axis;
01041 
01042 #if defined(linux) && !defined(USE_RTL_MBUFF) && !defined(HAVE_RTAI)
01043   int fd;
01044 #endif
01045   RCS_PRINT_DESTINATION_TYPE dest;
01046 
01047   usingShmem = 0;
01048 
01049   /* try OS shared memory first, inhibiting error messages */
01050   dest = get_rcs_print_destination();
01051   set_rcs_print_destination(RCS_PRINT_TO_NULL);
01052   shmem = rcs_shm_open(SHMEM_KEY, sizeof(EMCMOT_STRUCT), 0);
01053   if (NULL != shmem &&
01054       NULL != shmem->addr)
01055   {
01056     /* map shmem area into local address space */
01057     emcmotStruct = (EMCMOT_STRUCT *) shmem->addr;
01058     usingShmem = 1;
01059   }
01060   set_rcs_print_destination(dest);
01061 
01062   if (! usingShmem)
01063   {
01064 #ifdef HAVE_RTAI
01065   emcmotStruct = rtai_malloc(SHMEM_KEY,sizeof(EMCMOT_STRUCT));
01066   if (emcmotStruct == NULL)
01067     {
01068       fprintf(stderr,"rtai_alloc(%d (0x%X), %d (0x%X) ) failed\n",
01069               SHMEM_KEY, SHMEM_KEY, sizeof(EMCMOT_STRUCT), sizeof(EMCMOT_STRUCT));
01070       return -1;
01071     }
01072 #else
01073 
01074 #if !defined(linux) || defined(NO_RTL)
01075     /* only linux can use mapmem-- give up */
01076     return -1;
01077 
01078 #else
01079 
01080 #ifdef USE_RTL_MBUFF
01081     emcmotStruct = (EMCMOT_STRUCT *) mbuff_alloc("emcmotStruct",sizeof(EMCMOT_STRUCT));
01082     if (emcmotStruct == NULL)
01083     {
01084       fprintf(stderr,"mbuff_alloc failed\n");
01085       return -1;
01086     }
01087 #else
01088 
01089     /* open mem device */
01090     fd = open("/dev/mem", O_RDWR);
01091     if (fd < 0)
01092     {
01093       perror("open /dev/mem");
01094       return -1;
01095     }
01096 
01097     /* map it */
01098     emcmotStruct = (EMCMOT_STRUCT *) mmap(0, sizeof(EMCMOT_STRUCT),
01099                                           PROT_READ | PROT_WRITE,
01100                                           MAP_FILE | MAP_SHARED,
01101                                           fd, SHMEM_BASE_ADDRESS);
01102 
01103     /* close the fd since it's no longer used */
01104     close(fd);
01105 
01106     if (MAP_FAILED == emcmotStruct)
01107     {
01108       perror("mmap");
01109       return -1;
01110     }
01111 #endif /* USE_RTL_MBUFF */
01112 
01113 #endif /* linux */
01114 #endif
01115 
01116   }
01117 
01118   /* got it */
01119   emcmotCommand = &(emcmotStruct->command);
01120   emcmotStatus = &(emcmotStruct->status);
01121   emcmotDebug = &(emcmotStruct->debug);
01122   emcmotConfig = &(emcmotStruct->config);
01123   emcmotError = &(emcmotStruct->error);
01124   emcmotLog = &(emcmotStruct->log);
01125   for (axis = 0; axis < EMCMOT_MAX_AXIS; axis++)
01126   {
01127     emcmotComp[axis] = &(emcmotStruct->comp[axis]);
01128   }
01129 
01130   inited = 1;
01131 
01132   return 0;
01133 }

int usrmotLoadComp int    axis,
const char *    file
 

Definition at line 1514 of file usrmotintf.c.

Referenced by emcAxisLoadComp(), and main().

01515 {
01516   FILE * fp;
01517 #define BUFFERLEN 256
01518   char buffer[BUFFERLEN];
01519   double nom, fwd, rev;
01520   int index = 0;
01521   int total = 0;
01522 
01523   /* check axis range */
01524   if (axis < 0 || axis >= EMCMOT_MAX_AXIS)
01525   {
01526     fprintf(stderr, "axis out of range for compensation\n");
01527     return -1;
01528   }
01529 
01530   /* first check if comp pointer is valid */
01531   if (emcmotComp[axis] == 0)
01532   {
01533     fprintf(stderr, "compensation data structure not present\n");
01534     return -1;
01535   }
01536 
01537   /* open input comp file */
01538   if (NULL == (fp = fopen(file, "r")))
01539   {
01540     fprintf(stderr, "can't open compensation file %s\n", file);
01541     return -1;
01542   }
01543 
01544   while (! feof(fp))
01545   {
01546     if (NULL == fgets(buffer, BUFFERLEN, fp))
01547     {
01548       break;
01549     }
01550     /*
01551        expecting nominal-forward-reverse triplets, e.g.,
01552        0.000000      0.000000      -0.001279
01553        0.100000      0.098742       0.051632
01554        0.200000      0.171529       0.194216
01555     */
01556     if (3 != sscanf(buffer, "%lf %lf %lf", &nom, &fwd, &rev))
01557     {
01558       break;
01559     }
01560     if (index >= EMCMOT_COMP_SIZE)
01561     {
01562       break;
01563     }
01564     emcmotComp[axis]->nominal[index] = nom;
01565     emcmotComp[axis]->forward[index] = fwd;
01566     emcmotComp[axis]->reverse[index] = rev;
01567     index++;
01568     total++;
01569   }
01570   fclose(fp);
01571 
01572   if (total > 1)
01573   {
01574     emcmotComp[axis]->avgint = (emcmotComp[axis]->nominal[total - 1] -
01575                                 emcmotComp[axis]->nominal[0]) / (total - 1);
01576   }
01577 
01578   /* ->total is the flag to emcmot that the comp table is valid, so
01579      only set this to be >1 if the data is really valid: total > 1
01580      and avgint > 0 */
01581   if (total > 1 &&
01582       emcmotComp[axis]->avgint > DBL_MIN)
01583   {
01584     emcmotComp[axis]->total = total;
01585   }
01586   else
01587   {
01588     fprintf(stderr, "compensation file %s has too few distinct points\n", file);
01589     return -1;
01590   }
01591 
01592   /* leave alter alone */
01593 
01594   return 0;
01595 }

int usrmotPrintComp int    axis
 

Definition at line 1641 of file usrmotintf.c.

Referenced by main().

01642 {
01643   int t;
01644 
01645   /* check axis range */
01646   if (axis < 0 || axis >= EMCMOT_MAX_AXIS)
01647   {
01648     fprintf(stderr, "axis out of range for compensation\n");
01649     return -1;
01650   }
01651 
01652   /* first check if comp pointer is valid */
01653   if (emcmotComp[axis] == 0)
01654   {
01655     fprintf(stderr, "compensation data structure not present\n");
01656     return -1;
01657   }
01658 
01659   printf("total:  %d\n", emcmotComp[axis]->total);
01660   printf("avgint: %f\n", emcmotComp[axis]->avgint);
01661   printf("alter:  %f\n", emcmotComp[axis]->alter);
01662   for (t = 0; t < emcmotComp[axis]->total; t++)
01663   {
01664     printf("%f\t%f\t%f\n",
01665            emcmotComp[axis]->nominal[t],
01666            emcmotComp[axis]->forward[t],
01667            emcmotComp[axis]->reverse[t]);
01668   }
01669 
01670   return 0;
01671 }

void usrmotPrintEmcmotConfig EMCMOT_CONFIG    c,
int    which
 

Definition at line 744 of file usrmotintf.c.

Referenced by main().

00745 {
00746   int t;
00747   char m[32];
00748 
00749   switch(which)
00750     {
00751     case 0:
00752       printf("debug level   \t%d\n", c.debug);
00753       printf("traj time:    \t%f\n", c.trajCycleTime);
00754       printf("servo time:   \t%f\n", c.servoCycleTime);
00755       printf("interp rate:  \t%d\n", c.interpolationRate);
00756       printf("v limit:      \t%f\n", c.limitVel);
00757       printf("axis vlimit:  \t");
00758       for (t = 0; t < EMCMOT_MAX_AXIS; t++) {
00759         printf("%f ", c.axisLimitVel[t]);
00760       }
00761       printf("\n");
00762       printf("probe index: %d\n",c.probeIndex);
00763       printf("probe polarity: %d\n",c.probePolarity);
00764       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00765         {
00766           htostr(m, c.axisPolarity[t]);
00767           printf("%s ", m);
00768         }
00769       printf("\n");
00770       break;
00771 
00772   case 1:
00773     printf("pid:\tP\tI\tD\tFF0\tFF1\tFF2\tBCKLSH\tBIAS\tMAXI\tDEADBAND\tCYCLE TIME\n");
00774     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00775     {
00776       printf("\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%f\t%f\n",
00777              c.pid[t].p, c.pid[t].i, c.pid[t].d,
00778              c.pid[t].ff0, c.pid[t].ff1, c.pid[t].ff2,
00779              c.pid[t].backlash, c.pid[t].bias,
00780              c.pid[t].maxError, c.pid[t].deadband, c.pid[t].cycleTime);
00781     }
00782     printf("\n");
00783     break;
00784 
00785 
00786   case 3:
00787     printf("pos limits:   ");
00788     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00789     {
00790       printf("\t%f", c.maxLimit[t]);
00791     }
00792 
00793     printf("\nneg limits:   ");
00794     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00795     {
00796       printf("\t%f", c.minLimit[t]);
00797     }
00798 
00799     printf("\nmax output:   ");
00800     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00801     {
00802       printf("\t%f", c.maxOutput[t]);
00803     }
00804 
00805     printf("\nmin output:   ");
00806     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00807     {
00808       printf("\t%f", c.minOutput[t]);
00809     }
00810 
00811     printf("\nmax ferror:   ");
00812     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00813     {
00814       printf("\t%f", c.maxFerror[t]);
00815     }
00816     printf("\n");
00817 
00818     printf("\nmin ferror:   ");
00819     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00820     {
00821       printf("\t%f", c.minFerror[t]);
00822     }
00823     printf("\n");
00824 
00825     printf("\nhome offsets:  ");
00826     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00827     {
00828       printf("\t%f", c.homeOffset[t]);
00829     }
00830     printf("\n");
00831 
00832 
00833     break;
00834 
00835 
00836       
00837     default:
00838       break;
00839     }
00840 
00841 }

void usrmotPrintEmcmotDebug EMCMOT_DEBUG    d,
int    which
 

Definition at line 533 of file usrmotintf.c.

Referenced by main().

00534 {
00535   int t;
00536 
00537   printf("running time: \t%f\n", d.running_time);
00538   switch(which)
00539     {
00540     case 0:
00541       printf("split:        \t%d\n", d.split);
00542       printf("teleop desiredVel: \t%f\t%f\t%f\t%f\t%f\t%f\n",
00543              d.teleop_data.desiredVel.tran.x, 
00544              d.teleop_data.desiredVel.tran.y,
00545              d.teleop_data.desiredVel.tran.z,
00546              d.teleop_data.desiredVel.a,
00547              d.teleop_data.desiredVel.b,
00548              d.teleop_data.desiredVel.c);
00549       printf("teleop currentVel: \t%f\t%f\t%f\t%f\t%f\t%f\n",
00550              d.teleop_data.currentVel.tran.x, 
00551              d.teleop_data.currentVel.tran.y,
00552              d.teleop_data.currentVel.tran.z,
00553              d.teleop_data.currentVel.a,
00554              d.teleop_data.currentVel.b,
00555              d.teleop_data.currentVel.c);
00556       printf("teleop desiredAccell: \t%f\t%f\t%f\t%f\t%f\t%f\n",
00557              d.teleop_data.desiredAccell.tran.x, 
00558              d.teleop_data.desiredAccell.tran.y,
00559              d.teleop_data.desiredAccell.tran.z,
00560              d.teleop_data.desiredAccell.a,
00561              d.teleop_data.desiredAccell.b,
00562              d.teleop_data.desiredAccell.c);
00563       printf("teleop currentAccell: \t%f\t%f\t%f\t%f\t%f\t%f\n",
00564              d.teleop_data.currentAccell.tran.x, 
00565              d.teleop_data.currentAccell.tran.y,
00566              d.teleop_data.currentAccell.tran.z,
00567              d.teleop_data.currentAccell.a,
00568              d.teleop_data.currentAccell.b,
00569              d.teleop_data.currentAccell.c);
00570       break;
00571       printf("\nferror:        ");
00572       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00573         {
00574           printf("\t%f", d.ferrorCurrent[t]);
00575         }
00576       printf("\n");
00577       
00578       printf("\nferror High:        ");
00579       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00580         {
00581           printf("\t%f", d.ferrorHighMark[t]);
00582         }
00583       printf("\n");
00584 
00585     case 5:
00586       printf("traj  m/m/a:\t%f\t%f\t%f\n", d.tMin, d.tMax, d.tAvg);
00587       printf("tMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00588              d.tMmxavg.sum, d.tMmxavg.in, d.tMmxavg.size, d.tMmxavg.index);
00589 #if 0
00590       if(  d.tMmxavg.in > 0  && d.tMmxavg.size > 0)
00591         {
00592           printf("tMmxavg : nums \n\t ");
00593           for(t = 0; t < d.tMmxavg.in && t < d.tMmxavg.size; t++)
00594             {
00595               printf("%3.3e \t",d.tMmxavgSpace[t]);
00596               if(t%8 == 0 && t>0)
00597                 {
00598                   printf("\n\t ");
00599                 }
00600             }
00601         }
00602 #endif
00603       printf("\n");
00604       printf("servo m/m/a:\t%f\t%f\t%f\n", d.sMin, d.sMax, d.sAvg);
00605       printf("sMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00606              d.sMmxavg.sum, d.sMmxavg.in, d.sMmxavg.size, d.sMmxavg.index);
00607 
00608 #if 0
00609       if(  d.sMmxavg.in > 0  && d.sMmxavg.size > 0)
00610         {
00611           printf("sMmxavg : nums \n\t ");
00612           for(t = 0; t < d.sMmxavg.in && t < d.sMmxavg.size; t++)
00613             {
00614               printf("%3.3e \t",d.sMmxavgSpace[t]);
00615               if(t%8 == 0 && t>0)
00616                 {
00617                   printf("\n\t ");
00618                 }
00619             }
00620         }
00621 #endif
00622       printf("\n");
00623       printf("(off) m/m/a:\t%f\t%f\t%f\n", d.nMin, d.nMax, d.nAvg);
00624       printf("nMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00625              d.nMmxavg.sum, d.nMmxavg.in, d.nMmxavg.size, d.nMmxavg.index);
00626 #if 0
00627       if(  d.nMmxavg.in > 0  && d.nMmxavg.size > 0)
00628         {
00629           printf("nMmxavg : nums \n\t ");
00630           for(t = 0; t < d.nMmxavg.in && t < d.nMmxavg.size; t++)
00631             {
00632               printf("%3.3e \t",d.nMmxavgSpace[t]);
00633               if(t%8 == 0 && t>0)
00634                 {
00635               printf("\n\t ");
00636                 }
00637             }
00638         }
00639 #endif
00640       printf("\n");
00641 
00642       printf("(cycle to cycle  time) m/m/a:\t%f\t%f\t%f\n", d.yMin, d.yMax, d.yAvg);
00643       printf("yMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00644              d.yMmxavg.sum, d.yMmxavg.in, d.yMmxavg.size, d.yMmxavg.index);
00645 #if 0
00646       if(  d.yMmxavg.in > 0  && d.yMmxavg.size > 0)
00647         {
00648           printf("nMmxavg : nums \n\t ");
00649           for(t = 0; t < d.yMmxavg.in && t < d.yMmxavg.size; t++)
00650             {
00651               printf("%3.3e \t",d.yMmxavgSpace[t]);
00652               if(t%8 == 0 && t>0)
00653                 {
00654               printf("\n\t ");
00655                 }
00656             }
00657         }
00658 #endif
00659 
00660       printf("\n");
00661 
00662 
00663       printf("(frequency compute  time) m/m/a:\t%f\t%f\t%f\n", d.fMin, d.fMax, d.fAvg);
00664       printf("fMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00665              d.fMmxavg.sum, d.fMmxavg.in, d.fMmxavg.size, d.fMmxavg.index);
00666 #if 0
00667       if(  d.fMmxavg.in > 0  && d.fMmxavg.size > 0)
00668         {
00669           printf("nMmxavg : nums \n\t ");
00670           for(t = 0; t < d.fMmxavg.in && t < d.fMmxavg.size; t++)
00671             {
00672               printf("%3.3e \t",d.fMmxavgSpace[t]);
00673               if(t%8 == 0 && t>0)
00674                 {
00675               printf("\n\t ");
00676                 }
00677             }
00678         }
00679 #endif
00680 
00681       printf("\n");
00682 
00683 
00684       printf("(frequecy cycle to cycle  time) m/m/a:\t%f\t%f\t%f\n", d.fyMin, d.fyMax, d.fyAvg);
00685       printf("nMmxavg : sum=%f, in=%d, size=%d, index=%d\n",
00686              d.fyMmxavg.sum, d.fyMmxavg.in, d.fyMmxavg.size, d.fyMmxavg.index);
00687 #if 0
00688       if(  d.fyMmxavg.in > 0  && d.fyMmxavg.size > 0)
00689         {
00690           printf("nMmxavg : nums \n\t ");
00691           for(t = 0; t < d.fyMmxavg.in && t < d.fyMmxavg.size; t++)
00692             {
00693               printf("%3.3e \t",d.fyMmxavgSpace[t]);
00694               if(t%8 == 0 && t>0)
00695                 {
00696               printf("\n\t ");
00697                 }
00698             }
00699         }
00700 #endif
00701 
00702       printf("\n");
00703       break;
00704       
00705     case 6:
00706     case 7:
00707     case 8:
00708     case 9:
00709     case 10:
00710     case 11:
00711       printf("freeAxis[%d]:\n",which-6);
00712       printTPstruct(&d.freeAxis[which-6]);
00713       break;
00714 
00715     case 12:
00716       printf("\noldInput:  ");
00717       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00718         {
00719           printf("\t%f", d.oldInput[t]);
00720         }
00721       printf("\nrawInput:  ");
00722       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00723         {
00724           printf("\t%f", d.rawInput[t]);
00725         }
00726       printf("\ninverseInputScale:  ");
00727       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00728         {
00729           printf("\t%f", d.inverseInputScale[t]);
00730         }
00731       printf("\nbcompincr:  ");
00732       for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00733         {
00734           printf("\t%f", d.bcompincr[t]);
00735         }
00736       
00737     default:
00738       break;
00739     }
00740 
00741 }

void usrmotPrintEmcmotStatus EMCMOT_STATUS    s,
int    which
 

Definition at line 845 of file usrmotintf.c.

Referenced by main().

00846 {
00847   int t;
00848   char m[32];
00849 
00850   switch (which)
00851   {
00852   case 0:
00853     printf("mode:         \t%s\n",
00854            s.motionFlag & EMCMOT_MOTION_TELEOP_BIT ? "teleop" :
00855            (s.motionFlag & EMCMOT_MOTION_COORD_BIT ? "coord" : "free")
00856            );
00857     printf("cmd:          \t%d\n", s.commandEcho);
00858     printf("cmd num:      \t%d\n", s.commandNumEcho);
00859     printf("heartbeat:    \t%u\n", s.heartbeat);
00860     printf("compute time: \t%f\n", s.computeTime);
00861     printf("axes enabled: \t");
00862     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00863     {
00864       printf("%d", s.axisFlag[t] & EMCMOT_AXIS_ENABLE_BIT ? 1 : 0);
00865     }
00866     printf("\n");
00867     printf("cmd pos:      \t%f\t%f\t%f\t%f\t%f\t%f\n",
00868            s.pos.tran.x, s.pos.tran.y, s.pos.tran.z,
00869            s.pos.a, s.pos.b, s.pos.c);
00870     printf("act pos:      \t%f\t%f\t%f\t%f\t%f\t%f\n",
00871            s.actualPos.tran.x, s.actualPos.tran.y, s.actualPos.tran.z,
00872            s.actualPos.a, s.actualPos.b, s.actualPos.c
00873            );
00874     printf("axis pos:     ");
00875     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00876     {
00877       printf("\t%f", s.axisPos[t]);
00878     }
00879     printf("\n");
00880     printf("velocity:     \t%f\n", s.vel);
00881     printf("accel:        \t%f\n", s.acc);
00882     printf("id:           \t%d\n", s.id);
00883     printf("depth:        \t%d\n", s.depth);
00884     printf("active depth: \t%d\n", s.activeDepth);
00885     printf("inpos:        \t%d\n",
00886            s.motionFlag & EMCMOT_MOTION_INPOS_BIT ? 1 : 0);
00887     printf("vscales:      \tQ: %.2f", s.qVscale);
00888     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00889     {
00890       printf("\t%d: %.2f", t, s.axVscale[t]);
00891     }
00892     printf("\n");
00893     printf("logging:      \t%s and %s, size %d, skipping %d, type %d\n",
00894            s.logOpen == 0 ? "closed" : "open",
00895            s.logStarted == 0 ? "stopped" : "started",
00896            s.logSize, s.logSkip, s.logType);
00897     printf("homing:       \t");
00898     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00899     {
00900       printf("%d", s.axisFlag[0] & EMCMOT_AXIS_HOMING_BIT ? 1 : 0);
00901     }
00902     printf("\n");
00903     printf("enabled:     \t%s\n",
00904            s.motionFlag & EMCMOT_MOTION_ENABLE_BIT ? "ENABLED" : "DISABLED");
00905 #ifdef ENABLE_PROBING
00906     printf("probe value: %d\n",s.probeval);
00907     printf("probe Tripped: %d\n",s.probeTripped);
00908     printf("probing: %d\n",s.probing);
00909     printf("probed pos:      \t%f\t%f\t%f\n",
00910            s.probedPos.tran.x, s.probedPos.tran.y, s.probedPos.tran.z);
00911 #endif
00912     break;
00913 
00914   case 2:
00915     htostr(m, s.motionFlag);
00916     printf("motion:   %s\n", m);
00917     printf("axes:     ");
00918     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00919     {
00920       htostr(m, s.axisFlag[t]);
00921       printf("%s ", m);
00922     }
00923     printf("\n");
00924     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00925     {
00926       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_ENABLE_BIT) != 0));
00927     }
00928     printf("enable\n");
00929     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00930     {
00931       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_ACTIVE_BIT) != 0));
00932     }
00933     printf("active\n");
00934     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00935     {
00936       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_INPOS_BIT) != 0));
00937     }
00938     printf("inpos\n");
00939     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00940     {
00941       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_ERROR_BIT) != 0));
00942     }
00943     printf("error\n");
00944     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00945     {
00946       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_MAX_SOFT_LIMIT_BIT) != 0));
00947     }
00948     printf("max_soft_limit\n");
00949     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00950     {
00951       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_MIN_SOFT_LIMIT_BIT) != 0));
00952     }
00953     printf("min_soft_limit\n");
00954     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00955     {
00956       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_MAX_HARD_LIMIT_BIT) != 0));
00957     }
00958     printf("max_hard_limit\n");
00959     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00960     {
00961       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_MIN_HARD_LIMIT_BIT) != 0));
00962     }
00963     printf("min_hard_limit\n");
00964     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00965     {
00966       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_HOME_SWITCH_BIT) != 0));
00967     }
00968     printf("home_switch\n");
00969     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00970     {
00971       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_HOMING_BIT) != 0));
00972     }
00973     printf("homing\n");
00974     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00975     {
00976       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_HOMED_BIT) != 0));
00977     }
00978     printf("homed\n");
00979     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00980     {
00981       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_FERROR_BIT) != 0));
00982     }
00983     printf("ferror\n");
00984     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00985     {
00986       printf("%d\t", ((s.axisFlag[t] & EMCMOT_AXIS_FAULT_BIT) != 0));
00987     }
00988     printf("fault\n");
00989     printf("\npolarity: ");
00990     printf("limit override: %d\n", s.overrideLimits);
00991     break;
00992 
00993   case 4:
00994     printf("output scales: ");
00995     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
00996     {
00997       printf("\t%f", s.outputScale[t]);
00998     }
00999 
01000     printf("\noutput offsets:");
01001     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
01002     {
01003       printf("\t%f", s.outputOffset[t]);
01004     }
01005 
01006     printf("\nscaled outputs:");
01007     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
01008     {
01009       printf("\t%f", s.output[t]);
01010     }
01011 
01012     printf("\ninput scales:  ");
01013     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
01014     {
01015       printf("\t%f", s.inputScale[t]);
01016     }
01017 
01018     printf("\ninput offsets: ");
01019     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
01020     {
01021       printf("\t%f", s.inputOffset[t]);
01022     }
01023 
01024     printf("\nscaled inputs: ");
01025     for (t = 0; t < EMCMOT_MAX_AXIS; t++)
01026     {
01027       printf("\t%f", s.input[t]);
01028     }
01029 
01030     break;
01031 
01032 
01033   default:
01034     break;
01035   }
01036 }

int usrmotQueryAlter int    axis,
double *    alter
 

Definition at line 1619 of file usrmotintf.c.

Referenced by emcAxisUpdate(), and main().

01620 {
01621   /* check axis range */
01622   if (axis < 0 || axis >= EMCMOT_MAX_AXIS)
01623   {
01624     fprintf(stderr, "axis out of range for alter query\n");
01625     return -1;
01626   }
01627 
01628   /* first check if comp pointer is valid */
01629   if (emcmotComp[axis] == 0)
01630   {
01631     fprintf(stderr, "compensation data structure not present\n");
01632     return -1;
01633   }
01634 
01635   /* set alter value */
01636   *alter = emcmotComp[axis]->alter;
01637 
01638   return 0;
01639 }

int usrmotReadEmcmotConfig EMCMOT_CONFIG   s
 

Definition at line 382 of file usrmotintf.c.

Referenced by emcMotionUpdate(), and main().

00383 {
00384   if (usingShmem)
00385   {
00386     /* check for shmem still around */
00387     if (0 == emcmotConfig)
00388     {
00389       return EMCMOT_COMM_ERROR_CONNECT;
00390     }
00391 
00392     memcpy(s, emcmotConfig, sizeof(EMCMOT_CONFIG));
00393   }
00394   else
00395   {
00396     /* check for shmem still around */
00397     if (0 == emcmotConfig)
00398     {
00399       return EMCMOT_COMM_ERROR_CONNECT;
00400     }
00401 
00402     memcpy(s, emcmotConfig, sizeof(EMCMOT_CONFIG));
00403   }
00404 
00405   /* got it, now check head-tail matches */
00406 #ifndef IGNORE_SPLIT_READS
00407   if (s->head != s->tail)
00408   {
00409 #if 0
00410     emcmot_config_split_count++;
00411     if (emcmot_config_split_count > 2 && emcmot_config_split_count%100 == 0)
00412     {
00413       rcs_print("emcmot_config_split_count = %d\n",emcmot_config_split_count);
00414     }
00415 #endif
00416     return EMCMOT_COMM_SPLIT_READ_TIMEOUT;
00417   }
00418 #endif
00419 
00420   emcmot_config_split_count = 0;
00421   return EMCMOT_COMM_OK;
00422 }

int usrmotReadEmcmotDebug EMCMOT_DEBUG   s
 

Definition at line 425 of file usrmotintf.c.

Referenced by emcMotionUpdate(), and main().

00426 {
00427   if (usingShmem)
00428   {
00429     /* check for shmem still around */
00430     if (0 == emcmotDebug)
00431     {
00432       return EMCMOT_COMM_ERROR_CONNECT;
00433     }
00434 
00435     memcpy(s, emcmotDebug, sizeof(EMCMOT_DEBUG));
00436   }
00437   else
00438   {
00439     /* check for shmem still around */
00440     if (0 == emcmotDebug)
00441     {
00442       return EMCMOT_COMM_ERROR_CONNECT;
00443     }
00444 
00445     memcpy(s, emcmotDebug, sizeof(EMCMOT_DEBUG));
00446   }
00447 
00448   /* got it, now check head-tail matches */
00449 #ifndef IGNORE_SPLIT_READS
00450   if (s->head != s->tail)
00451   {
00452 #if 0
00453     emcmot_debug_split_count++;
00454     if (emcmot_debug_split_count > 2 && emcmot_debug_split_count%100 == 0)
00455     {
00456       rcs_print("emcmot_debug_split_count = %d\n",emcmot_debug_split_count);
00457     }
00458 #endif
00459     return EMCMOT_COMM_SPLIT_READ_TIMEOUT;
00460   }
00461 #endif
00462 
00463   emcmot_debug_split_count = 0;
00464   return EMCMOT_COMM_OK;
00465 }

int usrmotReadEmcmotError char *    e
 

Definition at line 468 of file usrmotintf.c.

Referenced by emcMotionUpdate(), and main().

00469 {
00470   /* check to see if ptr still around */
00471   if (emcmotError == 0)
00472   {
00473     return -1;
00474   }
00475 
00476   /* returns 0 if something, -1 if not */
00477   return emcmotErrorGet(emcmotError, e);
00478 }

int usrmotReadEmcmotStatus EMCMOT_STATUS   s
 

Definition at line 338 of file usrmotintf.c.

Referenced by emcMotionUpdate(), main(), and usrmotWriteEmcmotCommand().

00339 {
00340   if (usingShmem)
00341   {
00342     /* check for shmem still around */
00343     if (0 == emcmotStatus)
00344     {
00345       return EMCMOT_COMM_ERROR_CONNECT;
00346     }
00347 
00348     memcpy(s, emcmotStatus, sizeof(EMCMOT_STATUS));
00349   }
00350   else
00351   {
00352     /* check for shmem still around */
00353     if (0 == emcmotStatus)
00354     {
00355       return EMCMOT_COMM_ERROR_CONNECT;
00356     }
00357 
00358     memcpy(s, emcmotStatus, sizeof(EMCMOT_STATUS));
00359   }
00360 
00361   /* got it, now check head-tail matches */
00362 #ifndef IGNORE_SPLIT_READS
00363   if (s->head != s->tail)
00364   {
00365 #if 0
00366     emcmot_status_split_count++;
00367     if (emcmot_status_split_count > 2 && emcmot_status_split_count%100 == 0)
00368     {
00369       rcs_print("emcmot_status_split_count = %d\n",emcmot_status_split_count);
00370     }
00371 #endif
00372     return EMCMOT_COMM_SPLIT_READ_TIMEOUT;
00373   }
00374 #endif
00375 
00376   emcmot_status_split_count = 0;
00377   return EMCMOT_COMM_OK;
00378 }

int usrmotWriteEmcmotCommand EMCMOT_COMMAND   c
 

Definition at line 271 of file usrmotintf.c.

Referenced by emcAxisAbort(), emcAxisAbsJog(), emcAxisActivate(), emcAxisDeactivate(), emcAxisDisable(), emcAxisEnable(), emcAxisHome(), emcAxisIncrJog(), emcAxisJog(), emcAxisOverrideLimits(), emcAxisSetCycleTime(), emcAxisSetEnablePolarity(), emcAxisSetFaultPolarity(), emcAxisSetFerror(), emcAxisSetGains(), emcAxisSetHome(), emcAxisSetHomeOffset(), emcAxisSetHomeSwitchPolarity(), emcAxisSetHomingPolarity(), emcAxisSetHomingVel(), emcAxisSetInputScale(), emcAxisSetMaxLimitSwitchPolarity(), emcAxisSetMaxOutputLimit(), emcAxisSetMaxPositionLimit(), emcAxisSetMaxVelocity(), emcAxisSetMinFerror(), emcAxisSetMinLimitSwitchPolarity(), emcAxisSetMinOutputLimit(), emcAxisSetMinPositionLimit(), emcAxisSetOutput(), emcAxisSetOutputScale(), emcIoInit(), emcLogClose(), emcLogOpen(), emcLogStart(), emcLogStop(), emcMotionSetAout(), emcMotionSetDebug(), emcMotionSetDout(), emcSpindleDisable(), emcSpindleEnable(), emcSpindleOn(), emcTrajAbort(), emcTrajCircularMove(), emcTrajClearProbeTrippedFlag(), emcTrajDisable(), emcTrajEnable(), emcTrajLinearMove(), emcTrajPause(), emcTrajProbe(), emcTrajResume(), emcTrajSetAcceleration(), emcTrajSetCycleTime(), emcTrajSetHome(), emcTrajSetMaxVelocity(), emcTrajSetMode(), emcTrajSetProbeIndex(), emcTrajSetProbePolarity(), emcTrajSetScale(), emcTrajSetTeleopVector(), emcTrajSetTermCond(), emcTrajSetVelocity(), emcTrajStep(), and main().

00272 {
00273   EMCMOT_STATUS s;
00274   static int commandNum = 0;
00275   static unsigned char headCount = 0;
00276   double end;
00277 
00278   c->head = ++headCount;
00279   c->tail = c->head;
00280   c->commandNum = ++commandNum;
00281 
00282   if (usingShmem)
00283   {
00284     /* check for shmem still around */
00285     if (0 == emcmotCommand)
00286     {
00287       return EMCMOT_COMM_ERROR_CONNECT;
00288     } /* end of if */
00289 
00290     *emcmotCommand = *c;
00291   } /* end of if */
00292   else
00293   {
00294     /* check for mapped mem still around */
00295     if (0 == emcmotCommand)
00296     {
00297       return EMCMOT_COMM_ERROR_CONNECT;
00298     } /* end of if */
00299 
00300     *emcmotCommand = *c;
00301   } /* end of else */
00302 
00303   /* poll for receipt of command */
00304 
00305   /* set timeout for comm failure, now + timeout */
00306   end = etime() + EMCMOT_COMM_TIMEOUT;
00307 
00308   /* now check to see if it got it */
00309   while (etime() < end)
00310   {
00311     /* update status */
00312     if (0 == usrmotReadEmcmotStatus(&s) &&
00313         s.commandNumEcho == commandNum)
00314     {
00315       /* now check emcmot status flag */
00316       if (s.commandStatus == EMCMOT_COMMAND_OK)
00317       {
00318         return EMCMOT_COMM_OK;
00319       } /* end of if */
00320       else
00321       {
00322         return EMCMOT_COMM_ERROR_COMMAND;
00323       } /* end of else */
00324     } /* end of if */
00325     /* rcs_print("s.commandNumEcho = %d, commandNum=%d\n",s.commandNumEcho, commandNum); */
00326   } /* end of while loop */
00327 
00328   emcmot_comm_timeout_count++;
00329   /*  rcs_print("emcmot_comm_timeout_count=%d\n", emcmot_comm_timeout_count); */
00330   return EMCMOT_COMM_ERROR_TIMEOUT;
00331 }


Variable Documentation

EMCMOT_STRUCT* emcmotStruct = 0 [static]
 

Definition at line 156 of file usrmotintf.c.

int emcmot_comm_timeout_count = 0
 

Definition at line 268 of file usrmotintf.c.

int emcmot_config_split_count = 0
 

Definition at line 334 of file usrmotintf.c.

int emcmot_debug_split_count = 0
 

Definition at line 335 of file usrmotintf.c.

int emcmot_status_split_count = 0
 

Definition at line 333 of file usrmotintf.c.


Generated on Sun Dec 2 15:28:34 2001 for EMC by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001