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

newstg.c

Go to the documentation of this file.
00001 /*
00002   newstg.c
00003 
00004   Servo To Go board functions for new boards
00005 
00006   Modification history:
00007 
00008   26-Oct-2001 WPS created
00009 */
00010 
00011 /*
00012   Porting Notes:
00013 
00014   The code that writes and read the encoders to get the number of axes
00015   causes encoder values to be 0 until the axes moves around a bit.
00016 */
00017 
00018 /* ident tag */
00019 #ifndef __GNUC__
00020 #ifndef __attribute__
00021 #define __attribute__(x)
00022 #endif
00023 #endif
00024 
00025 static char __attribute__((unused)) ident[] = "$Id: newstg.c,v 1.6 2001/10/31 20:21:47 wshackle Exp $";
00026 
00027 
00028 #if !defined(rtlinux) && !defined(rtai)
00029 #include <stdio.h>
00030 #endif
00031 
00032 #include "newstg.h"               /* these decls */
00033 #include "extintf.h"            /* EXT_ENCODER_INDEX_MODEL */
00034 
00035 /* base address-- override default at compile time in stg.h,
00036    or at module load time with STG_BASE_ADDRESS=value */
00037 unsigned short STG_BASE_ADDRESS = DEFAULT_STG_BASE_ADDRESS;
00038 int FIND_STG_BASE_ADDRESS=1;
00039 
00040 int STG_IRQ=DEFAULT_STG_IRQ;
00041 
00042 #define MAX_AXES 8
00043 
00044 #include "stgdefs.h"
00045 
00046 /* Implementations of external functions */
00047 
00048 #include "locsysio.h"
00049 
00050 /* saved outputs, for stgAioCheck(), since we can't really read outputs */
00051 static double checkedOutputs[MAX_AXES];
00052 
00053 #define STG_INIT_WAIT 1000      /* usecs to wait after stgMotInit() */
00054 int stgMotInit(const char * stuff)
00055 {
00056   int t;
00057 
00058   /* call STG init, which is the "constructor" */
00059   ServoToGoConstructor(STG_IRQ);
00060   StopInterrupts();      /* we don't want interrupts */
00061 
00062   /* output 0's to amps */
00063   for (t = 0; t < GetAxes(); t++)
00064     {
00065       /* write 0 to DACs */
00066       stgDacWrite(t, 0.0);
00067     }
00068 
00069   /* init digital IO directions */
00070   stgDioInit(0);
00071 
00072   /* need to force a wait here-- calls to stgEncoderReadAll()
00073      immediately after this return garbage. Is there status to
00074      poll on for 'ready'? */
00075   for (t = 0; t < STG_INIT_WAIT; t++)
00076     {
00077       /* do a dummy 1 usec write */
00078       outb(0x80, 0);
00079     }
00080 
00081   return 0;
00082 }
00083 
00084 int stgMotQuit(void)
00085 {
00086   int t;
00087 
00088   for (t = 0; t < GetAxes(); t++)
00089     {
00090       /* write 0's to DACs */
00091       stgDacWrite(t, 0.0);
00092     }
00093 
00094   ServoToGoDestructor();
00095 
00096   return 0;
00097 }
00098 
00099 int stgAdcNum(void)
00100 {
00101   return GetAxes();
00102 }
00103 
00104 int stgAdcStart(int adc)
00105 {
00106   if (adc < 0 ||
00107       adc >= GetAxes()) {
00108     return 0;                 /* don't care */
00109   }
00110 
00111   StartADC((unsigned short) adc);
00112 
00113   return 0;
00114 }
00115 
00116 #define STG_ADC_WAIT_USEC 20    /* microsecs to wait for conversion */
00117 
00118 void stgAdcWait(void)
00119 {
00120   int t;
00121 
00122   for (t = 0; t < STG_ADC_WAIT_USEC; t++) {
00123     outb(0x80, 0);              /* 0x80 is historical dummy, 1 usec write */
00124   }
00125 }
00126 
00127 int stgAdcRead(int adc, double * volts)
00128 {
00129   if (adc < 0 ||
00130       adc >= GetAxes()) {
00131     return 0;                 /* don't care */
00132   }
00133 
00134   *volts = (double) SpinReadADC((unsigned short) adc);
00135 
00136   return 0;
00137 }
00138 
00139 int stgDacNum(void)
00140 {
00141   return GetAxes();
00142 }
00143 
00144 int stgDacWrite(int dac, double volts)
00145 {
00146   long lCounts;
00147 
00148   if (dac < 0 ||
00149       dac >= GetAxes())
00150     {
00151       return 0;                 /* don't care */
00152     }
00153 
00154   checkedOutputs[dac] = volts;
00155 
00156   // WPS -- Hack: This made little sense to be but this hack seems necessary.
00157   lCounts = (long) (( volts * 0x1FFF) / 20.0);
00158 
00159   RawDAC( dac, lCounts);
00160 
00161   return 0;
00162 }
00163 
00164 int stgDacWriteAll(int max, double * volts)
00165 {
00166   int t;
00167   int smax;
00168 
00169   /* clip smax to max supported-- if they want more, ignore */
00170   if (max > GetAxes()) {
00171     smax = GetAxes();
00172   }
00173   else {
00174     smax = max;
00175   }
00176 
00177   for (t = 0; t < smax; t++) {
00178     if (0 != stgDacWrite(t, volts[t])){
00179       return -1;
00180     }
00181   }
00182 
00183   return 0;
00184 }
00185 
00186 unsigned int stgEncoderIndexModel(void)
00187 {
00188   return EXT_ENCODER_INDEX_MODEL_MANUAL;
00189 }
00190 
00191 int stgEncoderSetIndexModel(unsigned int model)
00192 {
00193   if (model != EXT_ENCODER_INDEX_MODEL_MANUAL)
00194     {
00195       return -1;
00196     }
00197 
00198   return 0;
00199 }
00200 
00201 int stgEncoderNum(void)
00202 {
00203   return GetAxes();
00204 }
00205 
00206 int stgEncoderRead(int encoder, double * counts)
00207 {
00208   double allCounts[GetAxes()];
00209 
00210   if (encoder < 0 ||
00211       encoder >= GetAxes()) {
00212     *counts = 0.0;
00213     return 0;
00214   }
00215 
00216   stgEncoderReadAll(encoder + 1, allCounts);
00217 
00218   *counts = allCounts[encoder];
00219 
00220   return 0;
00221 }
00222 
00223 int stgEncoderReadAll(int max, double * counts)
00224 {
00225   LONGBYTE lbEnc[MAX_AXES];
00226   int t;
00227   int smax;                     /* how many we actually have */
00228 
00229   /* clip smax to max supported-- if they want more, give
00230      them zeros */
00231   if (max > GetAxes()) {
00232     smax = GetAxes();
00233   }
00234   else {
00235     smax = max;
00236   }
00237 
00238   EncoderLatch();
00239   EncReadAll( lbEnc);
00240 
00241   /* fill ours with the actual values */
00242   for (t = 0; t < smax; t++) {
00243     counts[t] = (double) lbEnc[t].Long;
00244   }
00245   /* and fill the rest with zeros */
00246   for (t = smax; t < max; t++) {
00247     counts[t] = 0.0;
00248   }
00249 
00250   return 0;
00251 }
00252 
00253 int stgEncoderResetIndex(int encoder)
00254 {
00255   unsigned char latch_mask;
00256   if (encoder < 0 ||
00257       encoder >= GetAxes())
00258     {
00259       return 0;
00260     }
00261   
00262 
00263   if(GetModel() == MODEL1)
00264     {
00265       SelectIndexAxis( encoder);
00266       ResetIndexLatch();
00267     }
00268   else
00269     {
00270       latch_mask = 0xFF & ~(1 << encoder);
00271       ResetIndexLatches(0);
00272     }
00273 
00274   return 0;
00275 }
00276 
00277 int stgEncoderReadLatch(int encoder, int * flag)
00278 {      
00279   
00280   if(GetModel() == MODEL1)
00281     {
00282       SelectIndexAxis(encoder);
00283       *flag = IndexPulseLatch();
00284     }
00285   else
00286     {
00287       *flag = GetIndexLatches();
00288       *flag = ((*flag & (1 << encoder)) != 0);
00289     }
00290 
00291   return 0;
00292 }
00293 
00294 /* basically same code as IndexPulseLatch() except mask is 2 bits higher */
00295 int stgEncoderReadLevel(int encoder, int * flag)
00296 {
00297   SelectIndexAxis(encoder);
00298   *flag = IndexPulse();
00299 
00300   return 0;
00301 }
00302 
00303 /* Note: board only supports 6 axes max of digital in, out for limit and
00304    home switches, amp enables  */
00305 
00306 /* digital input bit masks, 32-bit word */
00307 /* maps to ports A and B */
00308 #define HOME_0    0x00000001
00309 #define MIN_LIM_0 0x00000002
00310 #define MAX_LIM_0 0x00000004
00311 #define FAULT_0   0x00000008
00312 #define HOME_1    0x00000010
00313 #define MIN_LIM_1 0x00000020
00314 #define MAX_LIM_1 0x00000040
00315 #define FAULT_1   0x00000080
00316 #define HOME_2    0x00000100
00317 #define MIN_LIM_2 0x00000200
00318 #define MAX_LIM_2 0x00000400
00319 #define FAULT_2   0x00000800
00320 #define HOME_3    0x00001000
00321 #define MIN_LIM_3 0x00002000
00322 #define MAX_LIM_3 0x00004000
00323 #define FAULT_3   0x00008000
00324 
00325 #ifdef STG_8_AXES
00326 /* skip C, maps to port D */
00327 #define HOME_4    0x01000000
00328 #define MIN_LIM_4 0x02000000
00329 #define MAX_LIM_4 0x04000000
00330 #define FAULT_4   0x08000000
00331 #define HOME_5    0x10000000
00332 #define MIN_LIM_5 0x20000000
00333 #define MAX_LIM_5 0x40000000
00334 #define FAULT_5   0x80000000
00335 
00336 #endif
00337 
00338 /* no space for axes 7 and 8, so these won't go through */
00339 int stgMaxLimitSwitchRead(int axis, int * flag)
00340 {
00341   long bits;
00342   int retval = 0;
00343 
00344   bits = RawDIAll();
00345   *flag = 0;
00346 
00347   switch (axis)
00348     {
00349     case 0:
00350       if (bits & MAX_LIM_0)
00351         {
00352           *flag = 1;
00353         }
00354       break;
00355 
00356     case 1:
00357       if (bits & MAX_LIM_1)
00358         {
00359           *flag = 1;
00360         }
00361       break;
00362 
00363     case 2:
00364       if (bits & MAX_LIM_2)
00365         {
00366           *flag = 1;
00367         }
00368       break;
00369 
00370     case 3:
00371       if (bits & MAX_LIM_3)
00372         {
00373           *flag = 1;
00374         }
00375       break;
00376 
00377 #ifdef STG_8_AXES
00378     case 4:
00379       if (bits & MAX_LIM_4)
00380         {
00381           *flag = 1;
00382         }
00383       break;
00384 
00385     case 5:
00386       if (bits & MAX_LIM_5)
00387         {
00388           *flag = 1;
00389         }
00390       break;
00391 
00392 #endif
00393 
00394     default:
00395       retval = -1;
00396       break;
00397     }
00398 
00399   return retval;
00400 }
00401 
00402 /* no space for axes 7 and 8, so these won't go through */
00403 int stgMinLimitSwitchRead(int axis, int * flag)
00404 {
00405   long bits;
00406   int retval = 0;
00407 
00408   bits = RawDIAll();
00409   *flag = 0;
00410 
00411   switch (axis)
00412     {
00413     case 0:
00414       if (bits & MIN_LIM_0)
00415         {
00416           *flag = 1;
00417         }
00418       break;
00419 
00420     case 1:
00421       if (bits & MIN_LIM_1)
00422         {
00423           *flag = 1;
00424         }
00425       break;
00426 
00427     case 2:
00428       if (bits & MIN_LIM_2)
00429         {
00430           *flag = 1;
00431         }
00432       break;
00433 
00434     case 3:
00435       if (bits & MIN_LIM_3)
00436         {
00437           *flag = 1;
00438         }
00439       break;
00440 
00441 #ifdef STG_8_AXES
00442     case 4:
00443       if (bits & MIN_LIM_4)
00444         {
00445           *flag = 1;
00446         }
00447       break;
00448 
00449     case 5:
00450       if (bits & MIN_LIM_5)
00451         {
00452           *flag = 1;
00453         }
00454       break;
00455 
00456 #endif
00457 
00458     default:
00459       retval = -1;
00460       break;
00461     }
00462 
00463   return retval;
00464 }
00465 
00466 /* no space for axes 7 and 8, so these won't go through */
00467 int stgHomeSwitchRead(int axis, int *flag)
00468 {
00469   long bits;
00470   int retval = 0;
00471 
00472   bits = RawDIAll();
00473   *flag = 0;
00474 
00475   switch (axis)
00476     {
00477     case 0:
00478       if (bits & HOME_0)
00479         {
00480           *flag = 1;
00481         }
00482       break;
00483 
00484     case 1:
00485       if (bits & HOME_1)
00486         {
00487           *flag = 1;
00488         }
00489       break;
00490 
00491     case 2:
00492       if (bits & HOME_2)
00493         {
00494           *flag = 1;
00495         }
00496       break;
00497 
00498     case 3:
00499       if (bits & HOME_3)
00500         {
00501           *flag = 1;
00502         }
00503       break;
00504 
00505 #ifdef STG_8_AXES
00506     case 4:
00507       if (bits & HOME_4)
00508         {
00509           *flag = 1;
00510         }
00511       break;
00512 
00513     case 5:
00514       if (bits & HOME_5)
00515         {
00516           *flag = 1;
00517         }
00518       break;
00519 
00520 #endif
00521 
00522     default:
00523       retval = -1;
00524       break;
00525     }
00526 
00527   return retval;
00528 }
00529 
00530 /* there is space for axes 7 and 8, so these will go through */
00531 int stgAmpEnable(int axis, int enable)
00532 {
00533   if (axis < 0 || axis >= GetAxes())
00534     {
00535       return 0;
00536     }
00537 
00538   RawDOBitValPort( axis, (unsigned char) enable, 2); /* 2 is port C */
00539 
00540   return 0;
00541 }
00542 
00543 /* no space for axes 7 and 8, so these won't go through */
00544 int stgAmpFault(int axis, int * flag)
00545 {
00546   long bits;
00547   int retval = 0;
00548 
00549   bits = RawDIAll();
00550   *flag = 0;
00551 
00552   switch (axis)
00553     {
00554     case 0:
00555       if (bits & FAULT_0)
00556         {
00557           *flag = 1;
00558         }
00559       break;
00560 
00561     case 1:
00562       if (bits & FAULT_1)
00563         {
00564           *flag = 1;
00565         }
00566       break;
00567 
00568     case 2:
00569       if (bits & FAULT_2)
00570         {
00571           *flag = 1;
00572         }
00573       break;
00574 
00575     case 3:
00576       if (bits & FAULT_3)
00577         {
00578           *flag = 1;
00579         }
00580       break;
00581 
00582 #ifdef STG_8_AXES
00583     case 4:
00584       if (bits & FAULT_4)
00585         {
00586           *flag = 1;
00587         }
00588       break;
00589 
00590     case 5:
00591       if (bits & FAULT_5)
00592         {
00593           *flag = 1;
00594         }
00595       break;
00596 
00597 #endif
00598 
00599     default:
00600       retval = -1;
00601       break;
00602     }
00603 
00604   return retval;
00605 }
00606 
00607 /*
00608   Analog and Digital IO
00609 
00610   Analog and digital IO are mapped directly onto the board with no care
00611   that they don't collide with axes functions above. This is good in the
00612   sense that you can effect motion, bad in the same sense. This means that
00613   you should leave indices 0..axis-1 alone and use the higher indices for
00614   general-purpose IO. For example, if you have a 4-axis board and only
00615   3 real axes, you can use digital input at indices 12..15 for anything.
00616 
00617   Analog input is an option for the board. There are 8 inputs, which
00618   don't collide with any motion IO so you can use indices 0..7
00619   regardless of how many motion axes you have.
00620 
00621   If you have an 8 axis board, only 6 axis can be fully used for motion
00622   since there is not enough digital input for all the home and limit switches.
00623 
00624   For a 4-axis board, there are:
00625   24 digital inputs (includes limit switches and amp faults at 0..15)
00626   8 digital outputs (includes amp enables at 0..3)
00627   8 analog inputs (with option)
00628   4 analog outputs (includes amp outputs at 0..3)
00629 
00630   For an 8-axis board (6 motion axes max), there are:
00631   24 digital inputs (includes limit switches and amp faults at 0..23)
00632   8 digital outputs (includes amp enables at 0..5)
00633   8 analog inputs (with option)
00634   8 analog outputs (includes amp outputs at 0..5)
00635 
00636   Here's the actual map. If you aren't using some axes then their
00637   slots are up for grabs.
00638 
00639   DIGITAL INPUT
00640   -------------
00641   Index   Function      Connector/Pin
00642   -----   --------      -------------
00643   00      X home sw     P1/47
00644   01      X +lim sw     P1/45
00645   02      X -lim sw     P1/43
00646   03      X amp fault   P1/41
00647   04      Y home sw     P1/39
00648   05      Y +lim sw     P1/37
00649   06      Y -lim sw     P1/35
00650   07      Y amp fault   P1/33
00651   08      Z home sw     P1/31
00652   09      Z +lim sw     P1/29
00653   10      Z -lim sw     P1/27
00654   11      Z amp fault   P1/25
00655   12      U home sw     P1/23
00656   13      U +lim sw     P1/21
00657   14      U -lim sw     P1/19
00658   15      U amp fault   P1/17
00659   16      V home sw     P2/31
00660   17      V +lim sw     P2/29
00661   18      V -lim sw     P2/27
00662   19      V amp fault   P2/25
00663   20      W home sw     P2/23
00664   21      W +lim sw     P2/21
00665   22      W -lim sw     P2/19
00666   23      W amp fault   P2/17
00667 
00668   DIGITAL OUTPUT
00669   -------------
00670   Index   Function      Connector/Pin
00671   -----   --------      -------------
00672   00      X amp enable  P1/15
00673   01      Y amp enable  P1/13
00674   02      Z amp enable  P1/11
00675   03      U amp enable  P1/9
00676   04      V amp enable  P1/7
00677   05      W amp enable  P1/5
00678   06      (none)        P1/3
00679   07      (none)        P1/1
00680 
00681   ANALOG INPUT
00682   -------------
00683   Index   Function      Connector/Pin
00684   -----   --------      -------------
00685   00*     (none)        P2/1
00686   01*     (none)        P2/3
00687   02*     (none)        P2/5
00688   03*     (none)        P2/7
00689   04*     (none)        P2/9
00690   05*     (none)        P2/11
00691   06*     (none)        P2/13
00692   07*     (none)        P2/15
00693 
00694   ANALOG OUTPUT
00695   -------------
00696   Index   Function      Connector/Pin
00697   -----   --------      -------------
00698   00      X amp ref     P3/2
00699   01      Y amp ref     P3/8
00700   02      Z amp ref     P3/5
00701   03      U amp ref     P3/11
00702   04**    V amp ref     P4/2
00703   05**    W amp ref     P4/8
00704   06**    (none)        P4/5
00705   07**    (none)        P4/11
00706 
00707   * = only available as option
00708   ** = only available for 8-axis boards, with STG_8_AXES defined
00709 
00710   */
00711 
00712 int stgDioInit(const char * stuff)
00713 {
00714   /* set digital IO bits for A,B input, C output */
00715   DioDirection2( 0x0C);
00716 
00717   return 0;
00718 }
00719 
00720 int stgDioQuit(void)
00721 {
00722   return 0;
00723 }
00724 
00725 int stgDioMaxInputs(void)
00726 {
00727   return 24;
00728 }
00729 
00730 int stgDioMaxOutputs(void)
00731 {
00732   return 24;
00733 }
00734 
00735 int stgDioRead(int index, int *value)
00736 {
00737   long port = index/8;
00738   long bit_number = index%8;
00739 
00740   if(0 == value)
00741     {
00742       return -1;
00743     }
00744   *value = RawDIBitPort(bit_number, port);
00745 
00746   return 0;
00747 }
00748 
00749 /* writes go to the C register */
00750 int stgDioWrite(int index, int value)
00751 {
00752 
00753   long port = index/8;
00754   long bit_number = index%8;
00755 
00756 
00757   RawDOBitValPort(port,(value != 0),bit_number);
00758    return 0;
00759 }
00760 
00761 /* we can really read the outputs in the C register */
00762 int stgDioCheck(int index, int *value)
00763 {
00764   long port = 2;
00765   long bit_number = index%8;
00766 
00767   if(0 == value)
00768     {
00769       return -1;
00770     }
00771   *value = RawDIBitPort(bit_number, port);
00772   return 0;
00773 }
00774 
00775 /* can read bytes 0..2 */
00776 int stgDioByteRead(int index, unsigned char *byte)
00777 {
00778   if(byte ==0)
00779     {
00780       return -1;
00781     }
00782   *byte = RawDIPort(index);
00783   return 0;
00784 }
00785 
00786 /* can read shorts 0..1, 0 is BA, 1 is 0D */
00787 int stgDioShortRead(int index, unsigned short *sh)
00788 {
00789   unsigned char lo, hi;
00790 
00791   if (index == 0)
00792     {
00793       lo = RawDIPort(0);
00794       hi = RawDIPort(1);
00795 
00796       *sh = (hi << 8) + lo;
00797       return 0;
00798     }
00799 
00800   if (index == 1)
00801     {
00802       lo = RawDIPort(1);
00803 
00804       *sh = lo;
00805       return 0;
00806     }
00807 
00808   *sh = 0;
00809   return -1;
00810 }
00811 
00812 /* can only read 1 word, and this is 0DBA */
00813 int stgDioWordRead(int index, unsigned int *word)
00814 {
00815   if (index != 0)
00816     {
00817       *word = 0;
00818       return -1;
00819     }
00820 
00821   *word = RawDIPort(3) << 16;
00822   *word += RawDIPort(1) << 8;
00823   *word += RawDIPort(0);
00824 
00825   return 0;
00826 }
00827 
00828 /* index is 0 only for port C */
00829 int stgDioByteWrite(int index, unsigned char byte)
00830 {
00831   if(index == 0)
00832     {
00833       RawDOBytePort(byte,2);
00834       return 0;
00835     }
00836   
00837   return -1;
00838 }
00839 
00840 /* can't do a short write-- only 1 byte of digital out */
00841 int stgDioShortWrite(int index, unsigned short sh)
00842 {
00843   return -1;
00844 }
00845 
00846 /* can't do a word write-- only 1 byte of digital out */
00847 int stgDioWordWrite(int index, unsigned int word)
00848 {
00849   return -1;
00850 }
00851 
00852 /* can do a byte check on output C register */
00853 int stgDioByteCheck(int index, unsigned char *byte)
00854 {
00855   if(byte ==0)
00856     {
00857       return -1;
00858     }
00859 
00860   if (index == 0)
00861     {
00862       *byte = RawDIPort(2);
00863       return 0;
00864     }
00865 
00866   *byte = 0;
00867   return -1;
00868 }
00869 
00870 /* can't read a short-- only 8 bits of digital out */
00871 int stgDioShortCheck(int index, unsigned short *sh)
00872 {
00873   *sh = 0;
00874   return -1;
00875 }
00876 
00877 /* cant' read a word-- only 8 bits of digital out */
00878 int stgDioWordCheck(int index, unsigned int *word)
00879 {
00880   *word = 0;
00881   return -1;
00882 }
00883 
00884 int stgAioInit(const char * stuff)
00885 {
00886   /* nothing need be done */
00887   return 0;
00888 }
00889 
00890 int stgAioQuit(void)
00891 {
00892   return 0;
00893 }
00894 
00895 int stgAioMaxInputs(void)
00896 {
00897   return 8;                     /* make sure you have this option */
00898 }
00899 
00900 int stgAioMaxOutputs(void)
00901 {
00902   return GetAxes();
00903 }
00904 
00905 int stgAioStart(int index)
00906 {
00907   return stgAdcStart(index);
00908 }
00909 
00910 void stgAioWait(void)
00911 {
00912   stgAdcWait();
00913 }
00914 
00915 int stgAioRead(int index, double *volts)
00916 {
00917   return stgAdcRead(index, volts);
00918 }
00919 
00920 int stgAioWrite(int index, double volts)
00921 {
00922   return stgDacWrite(index, volts);
00923 }
00924 
00925 int stgAioCheck(int index, double *volts)
00926 {
00927   if (index < 0 || index >= GetAxes()) {
00928     *volts = 0.0;
00929     return 0;
00930   }
00931 
00932   /* can't read outputs directly, so return stored value */
00933   *volts = checkedOutputs[index];
00934 
00935   return 0;
00936 }
00937 
00938 int stgModel()
00939 {
00940   return GetModel();
00941 }

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