00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "rcs.hh"
00018 #include "emc.hh"
00019 #include "emcio.hh"
00020 #include "emcglb.h"
00021 #include "extintf.h"
00022 #include "inispin.hh"
00023
00024
00025 #ifndef __GNUC__
00026 #ifndef __attribute__
00027 #define __attribute__(x)
00028 #endif
00029 #endif
00030
00031 static char __attribute__((unused)) ident[] = "$Id: bridgeportspin.cc,v 1.3 2001/06/29 20:27:29 wshackle Exp $";
00032
00033
00034
00035 static void spindleForward()
00036 {
00037 extDioWrite(SPINDLE_REVERSE_INDEX, ! SPINDLE_REVERSE_POLARITY);
00038 extDioWrite(SPINDLE_FORWARD_INDEX, SPINDLE_FORWARD_POLARITY);
00039 }
00040
00041 static void spindleReverse()
00042 {
00043 extDioWrite(SPINDLE_FORWARD_INDEX, ! SPINDLE_FORWARD_POLARITY);
00044 extDioWrite(SPINDLE_REVERSE_INDEX, SPINDLE_REVERSE_POLARITY);
00045 }
00046
00047 static void spindleStop()
00048 {
00049 extDioWrite(SPINDLE_FORWARD_INDEX, ! SPINDLE_FORWARD_POLARITY);
00050 extDioWrite(SPINDLE_REVERSE_INDEX, ! SPINDLE_REVERSE_POLARITY);
00051 }
00052
00053 static void spindleBrake(int on)
00054 {
00055 if (on)
00056 {
00057 extDioWrite(SPINDLE_BRAKE_INDEX, SPINDLE_BRAKE_POLARITY);
00058 }
00059 else
00060 {
00061 extDioWrite(SPINDLE_BRAKE_INDEX, ! SPINDLE_BRAKE_POLARITY);
00062 }
00063 }
00064
00065 static void spindleIncrease()
00066 {
00067 extDioWrite(SPINDLE_DECREASE_INDEX, ! SPINDLE_DECREASE_POLARITY);
00068 extDioWrite(SPINDLE_INCREASE_INDEX, SPINDLE_INCREASE_POLARITY);
00069 }
00070
00071 static void spindleDecrease()
00072 {
00073 extDioWrite(SPINDLE_INCREASE_INDEX, ! SPINDLE_INCREASE_POLARITY);
00074 extDioWrite(SPINDLE_DECREASE_INDEX, SPINDLE_DECREASE_POLARITY);
00075 }
00076
00077 static void spindleConstant()
00078 {
00079 extDioWrite(SPINDLE_INCREASE_INDEX, ! SPINDLE_INCREASE_POLARITY);
00080 extDioWrite(SPINDLE_DECREASE_INDEX, ! SPINDLE_DECREASE_POLARITY);
00081 }
00082
00083 static int isSpindleDirection()
00084 {
00085 int f, r;
00086
00087 extDioCheck(SPINDLE_FORWARD_INDEX, &f);
00088 extDioCheck(SPINDLE_REVERSE_INDEX, &r);
00089
00090
00091 if (f == SPINDLE_FORWARD_POLARITY)
00092 {
00093 return 1;
00094 }
00095
00096 if (r == SPINDLE_REVERSE_POLARITY)
00097 {
00098 return -1;
00099 }
00100
00101 return 0;
00102 }
00103
00104 static int isSpindleIncrease()
00105 {
00106 int i;
00107
00108 extDioCheck(SPINDLE_INCREASE_INDEX, &i);
00109
00110 return i == SPINDLE_INCREASE_POLARITY;
00111 }
00112
00113 static int isSpindleDecrease()
00114 {
00115 int d;
00116
00117 extDioCheck(SPINDLE_DECREASE_INDEX, &d);
00118
00119 return d == SPINDLE_DECREASE_POLARITY;
00120 }
00121
00122 static int isSpindleBrake()
00123 {
00124 int b;
00125
00126 extDioCheck(SPINDLE_BRAKE_INDEX, &b);
00127
00128 if (b == SPINDLE_BRAKE_POLARITY)
00129 {
00130 return 1;
00131 }
00132
00133 return 0;
00134 }
00135
00136
00137
00138 EMC_SPINDLE_MODULE::EMC_SPINDLE_MODULE()
00139 {
00140 setErrorLogChannel(new NML(nmlErrorFormat, "emcError", "spindle", EMC_NMLFILE));
00141
00142 setCmdChannel(new RCS_CMD_CHANNEL(emcFormat, "spindleCmd", "spindle", EMC_NMLFILE));
00143
00144 setStatChannel(new RCS_STAT_CHANNEL(emcFormat, "spindleSts", "spindle", EMC_NMLFILE), &spindleStatus);
00145 }
00146
00147
00148
00149 EMC_SPINDLE_MODULE::~EMC_SPINDLE_MODULE(void)
00150 {
00151 }
00152
00153 void EMC_SPINDLE_MODULE::DECISION_PROCESS(void)
00154 {
00155 switch (commandInData->type)
00156 {
00157 case EMC_SPINDLE_INIT_TYPE:
00158 INIT((EMC_SPINDLE_INIT *) commandInData);
00159 break;
00160
00161 case EMC_SPINDLE_HALT_TYPE:
00162 HALT((EMC_SPINDLE_HALT *) commandInData);
00163 break;
00164
00165 case EMC_SPINDLE_ABORT_TYPE:
00166 ABORT((EMC_SPINDLE_ABORT *) commandInData);
00167 break;
00168
00169 case EMC_SPINDLE_FORWARD_TYPE:
00170 SPINDLE_FORWARD((EMC_SPINDLE_FORWARD *) commandInData);
00171 break;
00172
00173 case EMC_SPINDLE_REVERSE_TYPE:
00174 SPINDLE_REVERSE((EMC_SPINDLE_REVERSE *) commandInData);
00175 break;
00176
00177 case EMC_SPINDLE_STOP_TYPE:
00178 SPINDLE_STOP((EMC_SPINDLE_STOP *) commandInData);
00179 break;
00180
00181 case EMC_SPINDLE_INCREASE_TYPE:
00182 SPINDLE_INCREASE((EMC_SPINDLE_INCREASE *) commandInData);
00183 break;
00184
00185 case EMC_SPINDLE_DECREASE_TYPE:
00186 SPINDLE_DECREASE((EMC_SPINDLE_DECREASE *) commandInData);
00187 break;
00188
00189 case EMC_SPINDLE_CONSTANT_TYPE:
00190 SPINDLE_CONSTANT((EMC_SPINDLE_CONSTANT *) commandInData);
00191 break;
00192
00193 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
00194 SPINDLE_BRAKE_RELEASE((EMC_SPINDLE_BRAKE_RELEASE *) commandInData);
00195 break;
00196
00197 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
00198 SPINDLE_BRAKE_ENGAGE((EMC_SPINDLE_BRAKE_ENGAGE *) commandInData);
00199 break;
00200
00201 default:
00202 REPORT_ERROR(commandInData);
00203 break;
00204 }
00205 }
00206
00207 void EMC_SPINDLE_MODULE::PRE_PROCESS(void)
00208 {
00209 }
00210
00211 void EMC_SPINDLE_MODULE::POST_PROCESS(void)
00212 {
00213
00214 spindleStatus.speed = 0.0;
00215 spindleStatus.direction = isSpindleDirection();
00216 spindleStatus.brake = isSpindleBrake();
00217 spindleStatus.increasing = isSpindleIncrease() ? 1 :
00218 isSpindleDecrease() ? -1 : 0;
00219 spindleStatus.enabled = (spindleStatus.direction != 0);
00220 }
00221
00222 void EMC_SPINDLE_MODULE::INIT(EMC_SPINDLE_INIT *cmdIn)
00223 {
00224 if (STATE_MATCH(NEW_COMMAND))
00225 {
00226
00227 iniSpindle(EMC_INIFILE);
00228
00229
00230 spindleStop();
00231 spindleBrake(1);
00232 spindleConstant();
00233
00234 status = RCS_DONE;
00235 stateNext(S0);
00236 }
00237 else if (STATE_MATCH(S0))
00238 {
00239
00240 }
00241 }
00242
00243 void EMC_SPINDLE_MODULE::HALT(EMC_SPINDLE_HALT *cmdIn)
00244 {
00245 if (STATE_MATCH(NEW_COMMAND))
00246 {
00247
00248 spindleStop();
00249 spindleBrake(1);
00250 spindleConstant();
00251
00252 status = RCS_DONE;
00253 stateNext(S0);
00254 }
00255 else if (STATE_MATCH(S0))
00256 {
00257
00258 }
00259 }
00260
00261 void EMC_SPINDLE_MODULE::ABORT(EMC_SPINDLE_ABORT *cmdIn)
00262 {
00263 if (STATE_MATCH(NEW_COMMAND))
00264 {
00265
00266 spindleStop();
00267 spindleBrake(1);
00268 spindleConstant();
00269
00270 status = RCS_DONE;
00271 stateNext(S0);
00272 }
00273 else if (STATE_MATCH(S0))
00274 {
00275
00276 }
00277 }
00278
00279 void EMC_SPINDLE_MODULE::REPORT_ERROR(RCS_CMD_MSG *cmdIn)
00280 {
00281 if (STATE_MATCH(NEW_COMMAND))
00282 {
00283 rcs_print_error("EMC_SPINDLE_MODULE: unknown command %d\n",
00284 cmdIn->type);
00285 status = RCS_ERROR;
00286 stateNext(S0);
00287 }
00288 else if (STATE_MATCH(S0))
00289 {
00290
00291 }
00292 }
00293
00294 void EMC_SPINDLE_MODULE::SPINDLE_FORWARD(EMC_SPINDLE_FORWARD *cmdIn)
00295 {
00296 if (STATE_MATCH(NEW_COMMAND))
00297 {
00298 spindleForward();
00299
00300 status = RCS_DONE;
00301 stateNext(S0);
00302 }
00303 else if (STATE_MATCH(S0))
00304 {
00305
00306 }
00307 }
00308
00309 void EMC_SPINDLE_MODULE::SPINDLE_REVERSE(EMC_SPINDLE_REVERSE *cmdIn)
00310 {
00311 if (STATE_MATCH(NEW_COMMAND))
00312 {
00313 spindleReverse();
00314
00315 status = RCS_DONE;
00316 stateNext(S0);
00317 }
00318 else if (STATE_MATCH(S0))
00319 {
00320
00321 }
00322 }
00323
00324 void EMC_SPINDLE_MODULE::SPINDLE_STOP(EMC_SPINDLE_STOP *cmdIn)
00325 {
00326 if (STATE_MATCH(NEW_COMMAND))
00327 {
00328 spindleStop();
00329
00330 status = RCS_DONE;
00331 stateNext(S0);
00332 }
00333 else if (STATE_MATCH(S0))
00334 {
00335
00336 }
00337 }
00338
00339 void EMC_SPINDLE_MODULE::SPINDLE_INCREASE(EMC_SPINDLE_INCREASE *cmdIn)
00340 {
00341 if (STATE_MATCH(NEW_COMMAND))
00342 {
00343 spindleIncrease();
00344
00345 status = RCS_DONE;
00346 stateNext(S0);
00347 }
00348 else if (STATE_MATCH(S0))
00349 {
00350
00351 }
00352 }
00353
00354 void EMC_SPINDLE_MODULE::SPINDLE_DECREASE(EMC_SPINDLE_DECREASE *cmdIn)
00355 {
00356 if (STATE_MATCH(NEW_COMMAND))
00357 {
00358 spindleDecrease();
00359
00360 status = RCS_DONE;
00361 stateNext(S0);
00362 }
00363 else if (STATE_MATCH(S0))
00364 {
00365
00366 }
00367 }
00368
00369 void EMC_SPINDLE_MODULE::SPINDLE_CONSTANT(EMC_SPINDLE_CONSTANT *cmdIn)
00370 {
00371 if (STATE_MATCH(NEW_COMMAND))
00372 {
00373 spindleConstant();
00374
00375 status = RCS_DONE;
00376 stateNext(S0);
00377 }
00378 else if (STATE_MATCH(S0))
00379 {
00380
00381 }
00382 }
00383
00384 void EMC_SPINDLE_MODULE::SPINDLE_BRAKE_RELEASE(EMC_SPINDLE_BRAKE_RELEASE *cmdIn)
00385 {
00386 if (STATE_MATCH(NEW_COMMAND))
00387 {
00388 spindleBrake(0);
00389
00390 status = RCS_DONE;
00391 stateNext(S0);
00392 }
00393 else if (STATE_MATCH(S0))
00394 {
00395
00396 }
00397 }
00398
00399 void EMC_SPINDLE_MODULE::SPINDLE_BRAKE_ENGAGE(EMC_SPINDLE_BRAKE_ENGAGE *cmdIn)
00400 {
00401 if (STATE_MATCH(NEW_COMMAND))
00402 {
00403 spindleBrake(1);
00404
00405 status = RCS_DONE;
00406 stateNext(S0);
00407 }
00408 else if (STATE_MATCH(S0))
00409 {
00410
00411 }
00412 }