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 }