00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
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"               
00033 #include "extintf.h"            
00034 
00035 
00036 
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 
00047 
00048 #include "locsysio.h"
00049 
00050 
00051 static double checkedOutputs[MAX_AXES];
00052 
00053 #define STG_INIT_WAIT 1000      
00054 int stgMotInit(const char * stuff)
00055 {
00056   int t;
00057 
00058   
00059   ServoToGoConstructor(STG_IRQ);
00060   StopInterrupts();      
00061 
00062   
00063   for (t = 0; t < GetAxes(); t++)
00064     {
00065       
00066       stgDacWrite(t, 0.0);
00067     }
00068 
00069   
00070   stgDioInit(0);
00071 
00072   
00073 
00074 
00075   for (t = 0; t < STG_INIT_WAIT; t++)
00076     {
00077       
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       
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;                 
00109   }
00110 
00111   StartADC((unsigned short) adc);
00112 
00113   return 0;
00114 }
00115 
00116 #define STG_ADC_WAIT_USEC 20    
00117 
00118 void stgAdcWait(void)
00119 {
00120   int t;
00121 
00122   for (t = 0; t < STG_ADC_WAIT_USEC; t++) {
00123     outb(0x80, 0);              
00124   }
00125 }
00126 
00127 int stgAdcRead(int adc, double * volts)
00128 {
00129   if (adc < 0 ||
00130       adc >= GetAxes()) {
00131     return 0;                 
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;                 
00152     }
00153 
00154   checkedOutputs[dac] = volts;
00155 
00156   
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   
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;                     
00228 
00229   
00230 
00231   if (max > GetAxes()) {
00232     smax = GetAxes();
00233   }
00234   else {
00235     smax = max;
00236   }
00237 
00238   EncoderLatch();
00239   EncReadAll( lbEnc);
00240 
00241   
00242   for (t = 0; t < smax; t++) {
00243     counts[t] = (double) lbEnc[t].Long;
00244   }
00245   
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 
00295 int stgEncoderReadLevel(int encoder, int * flag)
00296 {
00297   SelectIndexAxis(encoder);
00298   *flag = IndexPulse();
00299 
00300   return 0;
00301 }
00302 
00303 
00304 
00305 
00306 
00307 
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 
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 
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 
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 
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 
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); 
00539 
00540   return 0;
00541 }
00542 
00543 
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 
00609 
00610 
00611 
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 
00644 
00645 
00646 
00647 
00648 
00649 
00650 
00651 
00652 
00653 
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 
00664 
00665 
00666 
00667 
00668 
00669 
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686 
00687 
00688 
00689 
00690 
00691 
00692 
00693 
00694 
00695 
00696 
00697 
00698 
00699 
00700 
00701 
00702 
00703 
00704 
00705 
00706 
00707 
00708 
00709 
00710 
00711 
00712 int stgDioInit(const char * stuff)
00713 {
00714   
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 
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 
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 
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 
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 
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 
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 
00841 int stgDioShortWrite(int index, unsigned short sh)
00842 {
00843   return -1;
00844 }
00845 
00846 
00847 int stgDioWordWrite(int index, unsigned int word)
00848 {
00849   return -1;
00850 }
00851 
00852 
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 
00871 int stgDioShortCheck(int index, unsigned short *sh)
00872 {
00873   *sh = 0;
00874   return -1;
00875 }
00876 
00877 
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   
00887   return 0;
00888 }
00889 
00890 int stgAioQuit(void)
00891 {
00892   return 0;
00893 }
00894 
00895 int stgAioMaxInputs(void)
00896 {
00897   return 8;                     
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   
00933   *volts = checkedOutputs[index];
00934 
00935   return 0;
00936 }
00937 
00938 int stgModel()
00939 {
00940   return GetModel();
00941 }