#include <stdio.h>#include <string.h>#include <stdarg.h>#include <stdlib.h>#include <signal.h>#include <float.h>#include "rcs.hh"#include "emc.hh"#include "canon.hh"#include "nml_mod.hh"#include "inifile.h"#include "interpl.hh"#include "emcglb.h"Include dependency graph for emctaskmain.cc:

Go to the source code of this file.
|
|
Definition at line 436 of file emctaskmain.cc. |
|
|
|
|
|
|
|
|
|
|
|
Value: if (stepping) { \
if (! steppingWait) { \
steppingWait = 1; \
steppedLine = emcStatus->task.currentLine; \
} \
else { \
if (emcStatus->task.currentLine != steppedLine) { \
break; \
} \
} \
}Definition at line 2099 of file emctaskmain.cc. Referenced by emcTaskExecute().
|
|
|
Definition at line 232 of file emctaskmain.cc. |
|
|
|
|
|
|
|
|
|
|
|
Definition at line 236 of file emctaskmain.cc. 00236 : emctaskmain.cc,v 1.28 2001/11/14 19:07:12 wshackle Exp $";
00237
00238 // command line args-- global so that other modules can access
00239 int Argc;
00240 char **Argv;
00241
00242 // NML channels
00243 static RCS_CMD_CHANNEL * emcCommandBuffer = 0;
00244 static RCS_STAT_CHANNEL * emcStatusBuffer = 0;
00245 static NML * emcErrorBuffer = 0;
00246
00247 // NML command channel data pointer
00248 static RCS_CMD_MSG * emcCommand = 0;
00249
00250 // global EMC status
00251 EMC_STAT * emcStatus = 0;
00252
00253 // timer stuff
00254 static RCS_TIMER * timer = 0;
00255
00256 // flag signifying that ini file [TASK] CYCLE_TIME is <= 0.0, so
00257 // we should not delay at all between cycles. This means also that
00258 // the EMC_TASK_CYCLE_TIME global will be set to the measured cycle
00259 // time each cycle, in case other code references this.
00260 static int emcTaskNoDelay = 0;
00261 static double EMC_TASK_CYCLE_TIME_ORIG = 0.0;
00262
00263 // delay counter
00264 static double taskExecDelayTimeout = 0.0;
00265
00266 // emcTaskQueueCommand puts cmd on interp_list
00267 static int emcTaskQueueCommand(NMLmsg * cmd);
00268
00269 // emcTaskIssueCommand issues command immediately
00270 static int emcTaskIssueCommand(NMLmsg * cmd);
00271
00272 // pending command to be sent out by emcTaskExecute()
00273 static NMLmsg * emcTaskCommand = 0;
00274
00275 // general purpose log file
00276 static FILE *logFp = NULL;
00277 #define LOG_FILE "emc.log" // FIXME-- ini file param
00278
00279
00280 // signal handling code to stop main loop
00281 static int done;
00282 static int emctask_shutdown(void);
00283 static int pseudoMdiLineNumber = -1;
00284
00285 static void emctask_quit(int sig)
00286 {
00287 // set main's done flag
00288 done = 1;
00289
00290 // restore signal handler
00291 signal(SIGINT, emctask_quit);
00292 }
|
|
||||||||||||
|
Definition at line 451 of file emctaskmain.cc. Referenced by emcTaskPlan().
00452 {
00453 NMLmsg * cmd = 0;
00454 // let's create some shortcuts to casts at compile time
00455 #define operator_error_msg ((EMC_OPERATOR_ERROR *) cmd)
00456 #define linear_move ((EMC_TRAJ_LINEAR_MOVE *) cmd)
00457 #define circular_move ((EMC_TRAJ_CIRCULAR_MOVE *) cmd)
00458
00459 while (il->len() > 0) {
00460 cmd = il->get();
00461
00462 switch (cmd->type) {
00463
00464 case EMC_OPERATOR_ERROR_TYPE:
00465 emcOperatorError(operator_error_msg->id, operator_error_msg->error);
00466 break;
00467
00468 case EMC_TRAJ_LINEAR_MOVE_TYPE:
00469 if (linear_move->end.tran.x > stat->motion.axis[0].maxPositionLimit) {
00470 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +X limit");
00471 return -1;
00472 }
00473 if (linear_move->end.tran.y > stat->motion.axis[1].maxPositionLimit) {
00474 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +Y limit");
00475 return -1;
00476 }
00477 if (linear_move->end.tran.z > stat->motion.axis[2].maxPositionLimit) {
00478 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +Z limit");
00479 return -1;
00480 }
00481 if (linear_move->end.tran.x < stat->motion.axis[0].minPositionLimit) {
00482 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -X limit");
00483 return -1;
00484 }
00485 if (linear_move->end.tran.y < stat->motion.axis[1].minPositionLimit) {
00486 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -Y limit");
00487 return -1;
00488 }
00489 if (linear_move->end.tran.z < stat->motion.axis[2].minPositionLimit) {
00490 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -Z limit");
00491 return -1;
00492 }
00493 break;
00494
00495 case EMC_TRAJ_CIRCULAR_MOVE_TYPE:
00496 if (circular_move->end.tran.x > stat->motion.axis[0].maxPositionLimit) {
00497 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +X limit");
00498 return -1;
00499 }
00500 if (circular_move->end.tran.y > stat->motion.axis[1].maxPositionLimit) {
00501 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +Y limit");
00502 return -1;
00503 }
00504 if (circular_move->end.tran.z > stat->motion.axis[2].maxPositionLimit) {
00505 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds +Z limit");
00506 return -1;
00507 }
00508 if (circular_move->end.tran.x < stat->motion.axis[0].minPositionLimit) {
00509 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -X limit");
00510 return -1;
00511 }
00512 if (circular_move->end.tran.y < stat->motion.axis[1].minPositionLimit) {
00513 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -Y limit");
00514 return -1;
00515 }
00516 if (circular_move->end.tran.z < stat->motion.axis[2].minPositionLimit) {
00517 emcOperatorError(0, "%s\n%s", stat->task.command, "exceeds -Z limit");
00518 return -1;
00519 }
00520 break;
00521
00522 default:
00523 break;
00524 }
00525 }
00526
00527 return 0;
00528
00529 // get rid of the compile-time cast shortcuts
00530 #undef circular_move_msg
00531 #undef linear_move_msg
00532 #undef operator_error_msg
00533 }
|
|
||||||||||||||||
|
Definition at line 360 of file emctaskmain.cc. Referenced by emcTaskIssueCommand().
00361 {
00362 EMC_OPERATOR_DISPLAY display_msg;
00363 va_list ap;
00364
00365 // check channel for validity
00366 if (emcErrorBuffer == NULL)
00367 return -1;
00368 if (! emcErrorBuffer->valid())
00369 return -1;
00370
00371 // write args to NML message (ignore int display code)
00372 va_start(ap, fmt);
00373 vsprintf(display_msg.display, fmt, ap);
00374 va_end(ap);
00375
00376 // force a NULL at the end for safety
00377 display_msg.display[EMC_OPERATOR_DISPLAY_LEN-1] = 0;
00378
00379 // write it
00380 return emcErrorBuffer->write(display_msg);
00381 }
|
|
||||||||||||||||
|
Definition at line 296 of file emctaskmain.cc. 00297 {
00298 EMC_OPERATOR_ERROR error_msg;
00299 va_list ap;
00300
00301 // check channel for validity
00302 if (emcErrorBuffer == NULL)
00303 return -1;
00304 if (! emcErrorBuffer->valid())
00305 return -1;
00306
00307
00308 if(NULL == fmt)
00309 {
00310 return -1;
00311 }
00312 if(0 == *fmt)
00313 {
00314 return -1;
00315 }
00316
00317 // prepend error code, leave off 0 ad-hoc code
00318 error_msg.error[0] = 0;
00319 if (0 != id)
00320 {
00321 sprintf(error_msg.error, "[%d] ", id);
00322 }
00323
00324 // append error string
00325 va_start(ap, fmt);
00326 vsprintf(&error_msg.error[strlen(error_msg.error)], fmt, ap);
00327 va_end(ap);
00328
00329 // force a NULL at the end for safety
00330 error_msg.error[EMC_OPERATOR_ERROR_LEN-1] = 0;
00331
00332 // write it
00333 rcs_print("%s\n",error_msg.error);
00334 return emcErrorBuffer->write(error_msg);
00335 }
|
|
||||||||||||||||
|
Definition at line 337 of file emctaskmain.cc. Referenced by emcTaskIssueCommand().
00338 {
00339 EMC_OPERATOR_TEXT text_msg;
00340 va_list ap;
00341
00342 // check channel for validity
00343 if (emcErrorBuffer == NULL)
00344 return -1;
00345 if (! emcErrorBuffer->valid())
00346 return -1;
00347
00348 // write args to NML message (ignore int text code)
00349 va_start(ap, fmt);
00350 vsprintf(text_msg.text, fmt, ap);
00351 va_end(ap);
00352
00353 // force a NULL at the end for safety
00354 text_msg.text[EMC_OPERATOR_TEXT_LEN-1] = 0;
00355
00356 // write it
00357 return emcErrorBuffer->write(text_msg);
00358 }
|
|
|
|
Definition at line 1289 of file emctaskmain.cc. Referenced by emcTaskExecute().
01290 {
01291 if (0 == cmd) {
01292 return EMC_TASK_EXEC_DONE;
01293 }
01294
01295 switch (cmd->type) {
01296 // operator messages, if queued, will go out when everything before
01297 // them is done
01298 case EMC_OPERATOR_ERROR_TYPE:
01299 case EMC_OPERATOR_TEXT_TYPE:
01300 case EMC_OPERATOR_DISPLAY_TYPE:
01301 case EMC_TRAJ_PROBE_TYPE: // prevent blending of this
01302 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE: // and this
01303 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01304 break;
01305
01306 case EMC_TRAJ_LINEAR_MOVE_TYPE:
01307 case EMC_TRAJ_CIRCULAR_MOVE_TYPE:
01308 case EMC_TRAJ_SET_VELOCITY_TYPE:
01309 case EMC_TRAJ_SET_TERM_COND_TYPE:
01310 return EMC_TASK_EXEC_WAITING_FOR_IO;
01311 break;
01312
01313 case EMC_TRAJ_SET_OFFSET_TYPE:
01314 // this applies the tool length offset variable after previous motions
01315 case EMC_TRAJ_SET_ORIGIN_TYPE:
01316 // this applies the program origin after previous motions
01317 return EMC_TASK_EXEC_WAITING_FOR_MOTION;
01318 break;
01319
01320 case EMC_TOOL_LOAD_TYPE:
01321 case EMC_TOOL_UNLOAD_TYPE:
01322 case EMC_COOLANT_MIST_ON_TYPE:
01323 case EMC_COOLANT_MIST_OFF_TYPE:
01324 case EMC_COOLANT_FLOOD_ON_TYPE:
01325 case EMC_COOLANT_FLOOD_OFF_TYPE:
01326 case EMC_SPINDLE_ON_TYPE:
01327 case EMC_SPINDLE_OFF_TYPE:
01328 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01329 break;
01330
01331 case EMC_TOOL_PREPARE_TYPE:
01332 case EMC_LUBE_ON_TYPE:
01333 case EMC_LUBE_OFF_TYPE:
01334 return EMC_TASK_EXEC_WAITING_FOR_IO;
01335 break;
01336
01337 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
01338 case EMC_TOOL_SET_OFFSET_TYPE:
01339 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01340 break;
01341
01342 case EMC_TASK_PLAN_PAUSE_TYPE:
01343 /* pause on the interp list is queued, so wait
01344 until all are done */
01345 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01346 break;
01347
01348 case EMC_TASK_PLAN_END_TYPE:
01349 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01350 break;
01351
01352 case EMC_TASK_PLAN_INIT_TYPE:
01353 case EMC_TASK_PLAN_RUN_TYPE:
01354 case EMC_TASK_PLAN_SYNCH_TYPE:
01355 case EMC_TASK_PLAN_EXECUTE_TYPE:
01356 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01357 break;
01358
01359 case EMC_TRAJ_DELAY_TYPE:
01360 return EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO;
01361 break;
01362
01363 case EMC_MOTION_SET_AOUT_TYPE:
01364 case EMC_MOTION_SET_DOUT_TYPE:
01365 return EMC_TASK_EXEC_DONE;
01366 break;
01367
01368 default:
01369 // unrecognized command
01370 if (EMC_DEBUG & EMC_DEBUG_TASK_ISSUE) {
01371 rcs_print_error("preconditions: unrecognized command %d:%s\n",cmd->type,
01372 emc_symbol_lookup(cmd->type));
01373 }
01374 return EMC_TASK_EXEC_ERROR;
01375 break;
01376 }
01377
01378 return EMC_TASK_EXEC_DONE;
01379 }
|
|
|
Definition at line 2113 of file emctaskmain.cc. Referenced by main().
02114 {
02115 int retval = 0;
02116
02117 switch (emcStatus->task.execState) {
02118 case EMC_TASK_EXEC_ERROR:
02119
02120 // FIXME-- duplicate code for abort,
02121 // also near end of main, when aborting on subordinate errors,
02122 // and in emcTaskIssueCommand()
02123
02124 // abort everything
02125 emcTaskAbort();
02126
02127 // without emcTaskPlanClose(), a new run command resumes at
02128 // aborted line-- feature that may be considered later
02129 {
02130 int was_open = taskplanopen;
02131 emcTaskPlanClose();
02132 if (EMC_DEBUG & EMC_DEBUG_INTERP && was_open) {
02133 rcs_print("emcTaskPlanClose() called at %s:%d\n",__FILE__,__LINE__);
02134 }
02135 }
02136
02137
02138 // clear out pending command
02139 emcTaskCommand = 0;
02140 interp_list.clear();
02141
02142 // clear out the interpreter state
02143 emcStatus->task.interpState = EMC_TASK_INTERP_IDLE;
02144 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02145 stepping = 0;
02146 steppingWait = 0;
02147
02148 // now queue up command to resynch interpreter
02149 emcTaskQueueCommand(&taskPlanSynchCmd);
02150
02151 retval = -1;
02152 break;
02153
02154 case EMC_TASK_EXEC_DONE:
02155 STEPPING_CHECK();
02156 if (! emcStatus->motion.traj.queueFull &&
02157 emcStatus->task.interpState != EMC_TASK_INTERP_PAUSED) {
02158 if (0 == emcTaskCommand) {
02159 // need a new command
02160 emcTaskCommand = interp_list.get();
02161 // interp_list now has line number associated with this-- get it
02162 if( 0 != emcTaskCommand)
02163 {
02164 emcStatus->task.currentLine = interp_list.get_line_number();
02165 // and set it for all subsystems which use queued ids
02166 emcTrajSetMotionId(emcStatus->task.currentLine);
02167 if (emcStatus->motion.traj.queueFull) {
02168 emcStatus->task.execState = EMC_TASK_EXEC_WAITING_FOR_MOTION_QUEUE;
02169 }
02170 else {
02171 emcStatus->task.execState =
02172 emcTaskCheckPreconditions(emcTaskCommand);
02173 }
02174 }
02175 }
02176 else {
02177 // have an outstanding command
02178 if (0 != emcTaskIssueCommand(emcTaskCommand)) {
02179 emcStatus->task.execState = EMC_TASK_EXEC_ERROR;
02180 retval = -1;
02181 }
02182 else {
02183 emcStatus->task.execState =
02184 emcTaskCheckPostconditions(emcTaskCommand);
02185 }
02186 emcTaskCommand = 0; // reset it
02187 }
02188 }
02189 break;
02190
02191 case EMC_TASK_EXEC_WAITING_FOR_MOTION_QUEUE:
02192 STEPPING_CHECK();
02193 if (! emcStatus->motion.traj.queueFull) {
02194 if (0 != emcTaskCommand) {
02195 emcStatus->task.execState = emcTaskCheckPreconditions(emcTaskCommand);
02196 }
02197 else {
02198 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02199 }
02200 }
02201 break;
02202
02203 case EMC_TASK_EXEC_WAITING_FOR_PAUSE:
02204 STEPPING_CHECK();
02205 if (emcStatus->task.interpState != EMC_TASK_INTERP_PAUSED) {
02206 if (0 != emcTaskCommand) {
02207 if (emcStatus->motion.traj.queue > 0) {
02208 emcStatus->task.execState = EMC_TASK_EXEC_WAITING_FOR_MOTION_QUEUE;
02209 }
02210 else {
02211 emcStatus->task.execState = emcTaskCheckPreconditions(emcTaskCommand);
02212 }
02213 }
02214 else {
02215 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02216 }
02217 }
02218 break;
02219
02220
02221 case EMC_TASK_EXEC_WAITING_FOR_MOTION:
02222 STEPPING_CHECK();
02223 if (emcStatus->motion.status == RCS_ERROR) {
02224 // emcOperatorError(0, "error in motion controller");
02225 emcStatus->task.execState = EMC_TASK_EXEC_ERROR;
02226 }
02227 else if (emcStatus->motion.status == RCS_DONE) {
02228 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02229 }
02230 break;
02231
02232 case EMC_TASK_EXEC_WAITING_FOR_IO:
02233 STEPPING_CHECK();
02234 if (emcStatus->io.status == RCS_ERROR) {
02235 // emcOperatorError(0, "error in IO controller");
02236 emcStatus->task.execState = EMC_TASK_EXEC_ERROR;
02237 }
02238 else if (emcStatus->io.status == RCS_DONE) {
02239 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02240 }
02241 break;
02242
02243 case EMC_TASK_EXEC_WAITING_FOR_MOTION_AND_IO:
02244 STEPPING_CHECK();
02245 if (emcStatus->motion.status == RCS_ERROR) {
02246 // emcOperatorError(0, "error in motion controller");
02247 emcStatus->task.execState = EMC_TASK_EXEC_ERROR;
02248 }
02249 else if (emcStatus->io.status == RCS_ERROR) {
02250 // emcOperatorError(0, "error in IO controller");
02251 emcStatus->task.execState = EMC_TASK_EXEC_ERROR;
02252 }
02253 else if (emcStatus->motion.status == RCS_DONE &&
02254 emcStatus->io.status == RCS_DONE) {
02255 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02256 }
02257 break;
02258
02259 case EMC_TASK_EXEC_WAITING_FOR_DELAY:
02260 STEPPING_CHECK();
02261 #if defined(LINUX_KERNEL_2_2)
02262 if (taskExecDelayTimeout <= 0.0) {
02263 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02264 }
02265 else {
02266 taskExecDelayTimeout -= EMC_TASK_CYCLE_TIME;
02267 }
02268 #else
02269 if (etime() >= taskExecDelayTimeout) {
02270 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02271 }
02272 #endif
02273 break;
02274
02275 default:
02276 // coding error
02277 if (EMC_DEBUG & EMC_DEBUG_TASK_ISSUE) {
02278 rcs_print_error("invalid execState");
02279 }
02280 retval = -1;
02281 break;
02282 }
02283
02284 return retval;
02285 }
|
|
|
Definition at line 1394 of file emctaskmain.cc. Referenced by emcTaskExecute(), and emcTaskPlan().
01395 {
01396 int retval = 0;
01397 int execRetval = 0;
01398
01399 if (0 == cmd) {
01400 return 0;
01401 }
01402
01403 if (EMC_DEBUG & EMC_DEBUG_TASK_ISSUE) {
01404 rcs_print("Issuing %s -- \t (%s)\n", emcSymbolLookup(cmd->type),
01405 emcCommandBuffer->msg2str(cmd));
01406 }
01407
01408 switch (cmd->type) {
01409 // general commands
01410
01411 case EMC_OPERATOR_ERROR_TYPE:
01412 retval = emcOperatorError(((EMC_OPERATOR_ERROR *) cmd)->id,
01413 ((EMC_OPERATOR_ERROR *) cmd)->error);
01414 break;
01415
01416 case EMC_OPERATOR_TEXT_TYPE:
01417 retval = emcOperatorText(((EMC_OPERATOR_TEXT *) cmd)->id,
01418 ((EMC_OPERATOR_TEXT *) cmd)->text);
01419 break;
01420
01421 case EMC_OPERATOR_DISPLAY_TYPE:
01422 retval = emcOperatorDisplay(((EMC_OPERATOR_DISPLAY *) cmd)->id,
01423 ((EMC_OPERATOR_DISPLAY *) cmd)->display);
01424 break;
01425
01426 // axis commands
01427
01428 case EMC_AXIS_DISABLE_TYPE:
01429 disable_msg = (EMC_AXIS_DISABLE *) cmd;
01430 retval = emcAxisDisable(disable_msg->axis);
01431 break;
01432
01433 case EMC_AXIS_ENABLE_TYPE:
01434 enable_msg = (EMC_AXIS_ENABLE *) cmd;
01435 retval = emcAxisEnable(enable_msg->axis);
01436 break;
01437
01438 case EMC_AXIS_HOME_TYPE:
01439 home_msg = (EMC_AXIS_HOME *) cmd;
01440 retval = emcAxisHome(home_msg->axis);
01441 break;
01442
01443 case EMC_AXIS_JOG_TYPE:
01444 jog_msg = (EMC_AXIS_JOG *) cmd;
01445 retval = emcAxisJog(jog_msg->axis, jog_msg->vel);
01446 break;
01447
01448 case EMC_AXIS_ABORT_TYPE:
01449 axis_abort_msg = (EMC_AXIS_ABORT *) cmd;
01450 retval = emcAxisAbort(axis_abort_msg->axis);
01451 break;
01452
01453 case EMC_AXIS_INCR_JOG_TYPE:
01454 incr_jog_msg = (EMC_AXIS_INCR_JOG *) cmd;
01455 retval = emcAxisIncrJog(incr_jog_msg->axis,
01456 incr_jog_msg->incr,
01457 incr_jog_msg->vel);
01458 break;
01459
01460 case EMC_AXIS_ABS_JOG_TYPE:
01461 abs_jog_msg = (EMC_AXIS_ABS_JOG *) cmd;
01462 retval = emcAxisAbsJog(abs_jog_msg->axis,
01463 abs_jog_msg->pos,
01464 abs_jog_msg->vel);
01465 break;
01466
01467 case EMC_AXIS_SET_GAINS_TYPE:
01468 set_gains_msg = (EMC_AXIS_SET_GAINS *) cmd;
01469 retval = emcAxisSetGains(set_gains_msg->axis,
01470 set_gains_msg->p,
01471 set_gains_msg->i,
01472 set_gains_msg->d,
01473 set_gains_msg->ff0,
01474 set_gains_msg->ff1,
01475 set_gains_msg->ff2,
01476 set_gains_msg->backlash,
01477 set_gains_msg->bias,
01478 set_gains_msg->maxError,
01479 set_gains_msg->deadband);
01480 break;
01481
01482 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
01483 set_cycle_time_msg = (EMC_AXIS_SET_CYCLE_TIME *) cmd;
01484 retval = emcAxisSetCycleTime(set_cycle_time_msg->axis,
01485 set_cycle_time_msg->cycleTime);
01486 break;
01487
01488 case EMC_AXIS_SET_INPUT_SCALE_TYPE:
01489 set_input_scale_msg = (EMC_AXIS_SET_INPUT_SCALE *) cmd;
01490 retval = emcAxisSetInputScale(set_input_scale_msg->axis,
01491 set_input_scale_msg->scale,
01492 set_input_scale_msg->offset);
01493 break;
01494
01495 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
01496 set_output_scale_msg = (EMC_AXIS_SET_OUTPUT_SCALE *) cmd;
01497 retval = emcAxisSetOutputScale(set_output_scale_msg->axis,
01498 set_output_scale_msg->scale,
01499 set_output_scale_msg->offset);
01500 break;
01501
01502 case EMC_AXIS_SET_FERROR_TYPE:
01503 set_ferror_msg = (EMC_AXIS_SET_FERROR *) cmd;
01504 retval = emcAxisSetFerror(set_ferror_msg->axis,
01505 set_ferror_msg->ferror);
01506 break;
01507
01508 case EMC_AXIS_SET_MIN_FERROR_TYPE:
01509 set_min_ferror_msg = (EMC_AXIS_SET_MIN_FERROR *) cmd;
01510 retval = emcAxisSetMinFerror(set_min_ferror_msg->axis,
01511 set_min_ferror_msg->ferror);
01512 break;
01513
01514 case EMC_AXIS_SET_MAX_POSITION_LIMIT_TYPE:
01515 set_max_limit_msg = (EMC_AXIS_SET_MAX_POSITION_LIMIT *) cmd;
01516 retval = emcAxisSetMaxPositionLimit(set_max_limit_msg->axis,
01517 set_max_limit_msg->limit);
01518 break;
01519
01520 case EMC_AXIS_SET_MIN_POSITION_LIMIT_TYPE:
01521 set_min_limit_msg = (EMC_AXIS_SET_MIN_POSITION_LIMIT *) cmd;
01522 retval = emcAxisSetMinPositionLimit(set_min_limit_msg->axis,
01523 set_min_limit_msg->limit);
01524 break;
01525
01526 case EMC_AXIS_HALT_TYPE:
01527 axis_halt_msg = (EMC_AXIS_HALT *) cmd;
01528 retval = emcAxisHalt(axis_halt_msg->axis);
01529 break;
01530
01531 case EMC_AXIS_OVERRIDE_LIMITS_TYPE:
01532 axis_lim_msg = (EMC_AXIS_OVERRIDE_LIMITS *) cmd;
01533 retval = emcAxisOverrideLimits(axis_lim_msg->axis);
01534 break;
01535
01536 case EMC_AXIS_SET_OUTPUT_TYPE:
01537 axis_output_msg = (EMC_AXIS_SET_OUTPUT *) cmd;
01538 retval = emcAxisSetOutput(axis_output_msg->axis,
01539 axis_output_msg->output);
01540 break;
01541
01542 case EMC_AXIS_LOAD_COMP_TYPE:
01543 axis_load_comp_msg = (EMC_AXIS_LOAD_COMP *) cmd;
01544 retval = emcAxisLoadComp(axis_load_comp_msg->axis,
01545 axis_load_comp_msg->file);
01546 break;
01547
01548 case EMC_AXIS_ALTER_TYPE:
01549 axis_alter_msg = (EMC_AXIS_ALTER *) cmd;
01550 retval = emcAxisAlter(axis_alter_msg->axis,
01551 axis_alter_msg->alter);
01552 break;
01553
01554 // traj commands
01555
01556 case EMC_TRAJ_SET_SCALE_TYPE:
01557 emcTrajSetScaleMsg =
01558 (EMC_TRAJ_SET_SCALE *) cmd;
01559 retval = emcTrajSetScale(emcTrajSetScaleMsg->scale);
01560 break;
01561
01562 case EMC_TRAJ_SET_VELOCITY_TYPE:
01563 emcTrajSetVelocityMsg =
01564 (EMC_TRAJ_SET_VELOCITY *) cmd;
01565 retval = emcTrajSetVelocity(emcTrajSetVelocityMsg->velocity);
01566 break;
01567
01568 case EMC_TRAJ_LINEAR_MOVE_TYPE:
01569 emcTrajLinearMoveMsg = (EMC_TRAJ_LINEAR_MOVE *) cmd;
01570 retval = emcTrajLinearMove(emcTrajLinearMoveMsg->end);
01571 break;
01572
01573 case EMC_TRAJ_CIRCULAR_MOVE_TYPE:
01574 emcTrajCircularMoveMsg = (EMC_TRAJ_CIRCULAR_MOVE *) cmd;
01575 retval = emcTrajCircularMove(emcTrajCircularMoveMsg->end,
01576 emcTrajCircularMoveMsg->center,
01577 emcTrajCircularMoveMsg->normal,
01578 emcTrajCircularMoveMsg->turn);
01579 break;
01580
01581 case EMC_TRAJ_PAUSE_TYPE:
01582 retval = emcTrajPause();
01583 break;
01584
01585 case EMC_TRAJ_RESUME_TYPE:
01586 retval = emcTrajResume();
01587 break;
01588
01589 case EMC_TRAJ_ABORT_TYPE:
01590 retval = emcTrajAbort();
01591 break;
01592
01593 case EMC_TRAJ_DELAY_TYPE:
01594 emcTrajDelayMsg = (EMC_TRAJ_DELAY *) cmd;
01595 #if defined(LINUX_KERNEL_2_2)
01596 // load the timeout delta clock
01597 taskExecDelayTimeout = emcTrajDelayMsg->delay;
01598 #else
01599 // set the timeout clock to expire at 'now' + delay time
01600 taskExecDelayTimeout = etime() + emcTrajDelayMsg->delay;
01601 #endif
01602 retval = 0;
01603 break;
01604
01605 case EMC_TRAJ_SET_TERM_COND_TYPE:
01606 emcTrajSetTermCondMsg = (EMC_TRAJ_SET_TERM_COND *) cmd;
01607 retval = emcTrajSetTermCond(emcTrajSetTermCondMsg->cond);
01608 break;
01609
01610 case EMC_TRAJ_SET_OFFSET_TYPE:
01611 // update tool offset
01612 emcStatus->task.toolOffset.tran.z =
01613 ((EMC_TRAJ_SET_OFFSET *) cmd)->offset.tran.z;
01614 retval = 0;
01615 break;
01616
01617 case EMC_TRAJ_SET_ORIGIN_TYPE:
01618 // struct-copy program origin
01619 emcStatus->task.origin =
01620 ((EMC_TRAJ_SET_ORIGIN *) cmd)->origin;
01621 retval = 0;
01622 break;
01623
01624 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
01625 retval = emcTrajSetProbeIndex(((EMC_TRAJ_SET_PROBE_INDEX *)cmd)->index);
01626 break;
01627
01628 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
01629 retval = emcTrajSetProbePolarity(((EMC_TRAJ_SET_PROBE_POLARITY *)cmd)->polarity);
01630 break;
01631
01632 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
01633 retval = emcTrajClearProbeTrippedFlag();
01634 break;
01635
01636 case EMC_TRAJ_PROBE_TYPE:
01637 retval = emcTrajProbe(((EMC_TRAJ_PROBE *)cmd)->pos);
01638 break;
01639
01640 case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE:
01641 if (((EMC_TRAJ_SET_TELEOP_ENABLE *) cmd)->enable) {
01642 retval = emcTrajSetMode(EMC_TRAJ_MODE_TELEOP);
01643 }
01644 else {
01645 retval = emcTrajSetMode(EMC_TRAJ_MODE_FREE);
01646 }
01647 break;
01648
01649 case EMC_TRAJ_SET_TELEOP_VECTOR_TYPE:
01650 retval = emcTrajSetTeleopVector(((EMC_TRAJ_SET_TELEOP_VECTOR *)cmd)->vector);
01651 break;
01652
01653 case EMC_MOTION_SET_AOUT_TYPE:
01654 retval = emcMotionSetAout(((EMC_MOTION_SET_AOUT *)cmd)->index,
01655 ((EMC_MOTION_SET_AOUT *)cmd)->start,
01656 ((EMC_MOTION_SET_AOUT *)cmd)->end);
01657 break;
01658
01659 case EMC_MOTION_SET_DOUT_TYPE:
01660 retval = emcMotionSetDout(((EMC_MOTION_SET_DOUT *)cmd)->index,
01661 ((EMC_MOTION_SET_DOUT *)cmd)->start,
01662 ((EMC_MOTION_SET_DOUT *)cmd)->end);
01663 break;
01664
01665 case EMC_SET_DEBUG_TYPE:
01666 /* set the debug level here */
01667 EMC_DEBUG = ((EMC_SET_DEBUG *) cmd)->debug;
01668 /* and in IO and motion */
01669 emcIoSetDebug(EMC_DEBUG);
01670 emcMotionSetDebug(EMC_DEBUG);
01671 /* and reflect it in the status-- this isn't updated continually */
01672 emcStatus->debug = EMC_DEBUG;
01673 break;
01674
01675 // unimplemented ones
01676
01677 // IO commands
01678
01679 case EMC_SPINDLE_ON_TYPE:
01680 spindle_on_msg = (EMC_SPINDLE_ON *) cmd;
01681 retval = emcSpindleOn(spindle_on_msg->speed);
01682 break;
01683
01684 case EMC_SPINDLE_OFF_TYPE:
01685 retval = emcSpindleOff();
01686 break;
01687
01688 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
01689 retval = emcSpindleBrakeRelease();
01690 break;
01691
01692 case EMC_SPINDLE_INCREASE_TYPE:
01693 retval = emcSpindleIncrease();
01694 break;
01695
01696 case EMC_SPINDLE_DECREASE_TYPE:
01697 retval = emcSpindleDecrease();
01698 break;
01699
01700 case EMC_SPINDLE_CONSTANT_TYPE:
01701 retval = emcSpindleConstant();
01702 break;
01703
01704 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
01705 retval = emcSpindleBrakeEngage();
01706 break;
01707
01708 case EMC_COOLANT_MIST_ON_TYPE:
01709 retval = emcCoolantMistOn();
01710 break;
01711
01712 case EMC_COOLANT_MIST_OFF_TYPE:
01713 retval = emcCoolantMistOff();
01714 break;
01715
01716 case EMC_COOLANT_FLOOD_ON_TYPE:
01717 retval = emcCoolantFloodOn();
01718 break;
01719
01720 case EMC_COOLANT_FLOOD_OFF_TYPE:
01721 retval = emcCoolantFloodOff();
01722 break;
01723
01724 case EMC_LUBE_ON_TYPE:
01725 retval = emcLubeOn();
01726 break;
01727
01728 case EMC_LUBE_OFF_TYPE:
01729 retval = emcLubeOff();
01730 break;
01731
01732 case EMC_TOOL_PREPARE_TYPE:
01733 tool_prepare_msg = (EMC_TOOL_PREPARE *) cmd;
01734 retval = emcToolPrepare(tool_prepare_msg->tool);
01735 break;
01736
01737 case EMC_TOOL_LOAD_TYPE:
01738 retval = emcToolLoad();
01739 break;
01740
01741 case EMC_TOOL_UNLOAD_TYPE:
01742 retval = emcToolUnload();
01743 break;
01744
01745 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
01746 load_tool_table_msg = (EMC_TOOL_LOAD_TOOL_TABLE *) cmd;
01747 retval = emcToolLoadToolTable(load_tool_table_msg->file);
01748 break;
01749
01750 case EMC_TOOL_SET_OFFSET_TYPE:
01751 emc_tool_set_offset_msg = (EMC_TOOL_SET_OFFSET *) cmd;
01752 retval = emcToolSetOffset(emc_tool_set_offset_msg->tool,
01753 emc_tool_set_offset_msg->length,
01754 emc_tool_set_offset_msg->diameter);
01755 break;
01756
01757 // task commands
01758
01759 case EMC_TASK_INIT_TYPE:
01760 retval = emcTaskInit();
01761 break;
01762
01763 case EMC_TASK_ABORT_TYPE:
01764
01765 // FIXME-- duplicate code for abort,
01766 // also near end of main, when aborting on subordinate errors,
01767 // and in emcTaskExecute()
01768
01769 // abort everything
01770 emcTaskAbort();
01771
01772 // without emcTaskPlanClose(), a new run command resumes at
01773 // aborted line-- feature that may be considered later
01774 {
01775 int was_open = taskplanopen;
01776 emcTaskPlanClose();
01777 if (EMC_DEBUG & EMC_DEBUG_INTERP && was_open) {
01778 rcs_print("emcTaskPlanClose() called at %s:%d\n",__FILE__,__LINE__);
01779 }
01780 }
01781
01782 // clear out the pending command
01783 emcTaskCommand = 0;
01784 interp_list.clear();
01785
01786 // clear out the interpreter state
01787 emcStatus->task.interpState = EMC_TASK_INTERP_IDLE;
01788 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
01789 stepping = 0;
01790 steppingWait = 0;
01791
01792 // now queue up command to resynch interpreter
01793 emcTaskQueueCommand(&taskPlanSynchCmd);
01794
01795 retval = 0;
01796 break;
01797
01798 // mode and state commands
01799
01800 case EMC_TASK_SET_MODE_TYPE:
01801 mode_msg = (EMC_TASK_SET_MODE *) cmd;
01802 if (mode_msg->mode == EMC_TASK_MODE_MANUAL &&
01803 emcStatus->task.mode != EMC_TASK_MODE_MANUAL) {
01804 // leaving auto or mdi mode for manual
01805
01806 // FIXME-- duplicate code for abort,
01807 // also near end of main, when aborting on subordinate errors,
01808 // and in emcTaskExecute()
01809
01810 // abort everything
01811 emcTaskAbort();
01812
01813 // without emcTaskPlanClose(), a new run command resumes at
01814 // aborted line-- feature that may be considered later
01815 {
01816 int was_open = taskplanopen;
01817 emcTaskPlanClose();
01818 if (EMC_DEBUG & EMC_DEBUG_INTERP && was_open) {
01819 rcs_print("emcTaskPlanClose() called at %s:%d\n",__FILE__,__LINE__);
01820 }
01821 }
01822
01823 // clear out the pending command
01824 emcTaskCommand = 0;
01825 interp_list.clear();
01826
01827 // clear out the interpreter state
01828 emcStatus->task.interpState = EMC_TASK_INTERP_IDLE;
01829 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
01830 stepping = 0;
01831 steppingWait = 0;
01832
01833 // now queue up command to resynch interpreter
01834 emcTaskQueueCommand(&taskPlanSynchCmd);
01835 retval = 0;
01836 }
01837 retval = emcTaskSetMode(mode_msg->mode);
01838 break;
01839
01840 case EMC_TASK_SET_STATE_TYPE:
01841 state_msg = (EMC_TASK_SET_STATE *) cmd;
01842 retval = emcTaskSetState(state_msg->state);
01843 break;
01844
01845 // interpreter commands
01846
01847 case EMC_TASK_PLAN_OPEN_TYPE:
01848 open_msg = (EMC_TASK_PLAN_OPEN *) cmd;
01849 retval = emcTaskPlanOpen(open_msg->file);
01850 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01851 rcs_print("emcTaskPlanOpen(%s) returned %d\n",open_msg->file,
01852 retval);
01853 }
01854 #ifdef NEW_INTERPRETER
01855 if(retval > RS274NGC_MIN_ERROR)
01856 {
01857 retval = -1;
01858 }
01859 #endif
01860 if (-1 == retval) {
01861 emcOperatorError(0, "can't open %s", open_msg->file);
01862 }
01863 else {
01864 strcpy(emcStatus->task.file, open_msg->file);
01865 retval = 0;
01866 }
01867 break;
01868
01869 case EMC_TASK_PLAN_EXECUTE_TYPE:
01870 stepping = 0;
01871 steppingWait = 0;
01872 execute_msg = (EMC_TASK_PLAN_EXECUTE *) cmd;
01873 if (execute_msg->command[0] != 0) {
01874 if(emcStatus->task.mode == EMC_TASK_MODE_MDI)
01875 {
01876 interp_list.set_line_number(--pseudoMdiLineNumber);
01877 }
01878 execRetval = emcTaskPlanExecute(execute_msg->command);
01879 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01880 rcs_print("emcTaskPlanExecute(%s) returned %d\n",execute_msg->command,execRetval);
01881 }
01882 if (execRetval == 2 /* RS274NGC_ENDFILE */ ) {
01883 // this is an end-of-file
01884 // need to flush execution, so signify no more reading
01885 // until all is done
01886 emcTaskPlanSetWait();
01887 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01888 rcs_print("emcTaskPlanSetWait() called\n");
01889 }
01890 // and resynch the interpreter WM
01891 emcTaskQueueCommand(&taskPlanSynchCmd);
01892 // it's success, so retval really is 0
01893 retval = 0;
01894 }
01895 #ifdef NEW_INTERPRETER
01896 else if (execRetval != 0 ) {
01897 #else
01898 else if (execRetval == -1 /* RS274NGC_ERROR */ ) {
01899 #endif
01900 retval = -1;
01901 }
01902 else {
01903 // other codes are OK
01904 retval = 0;
01905 }
01906 }
01907 break;
01908
01909 case EMC_TASK_PLAN_RUN_TYPE:
01910 stepping = 0;
01911 steppingWait = 0;
01912 if(!taskplanopen && emcStatus->task.file[0] != 0)
01913 {
01914 emcTaskPlanOpen(emcStatus->task.file);
01915 }
01916 run_msg = (EMC_TASK_PLAN_RUN *) cmd;
01917 programStartLine = run_msg->line;
01918 emcStatus->task.interpState = EMC_TASK_INTERP_READING;
01919 retval = 0;
01920 break;
01921
01922 case EMC_TASK_PLAN_PAUSE_TYPE:
01923 emcTrajPause();
01924 if (emcStatus->task.interpState != EMC_TASK_INTERP_PAUSED) {
01925 interpResumeState = emcStatus->task.interpState;
01926 }
01927 emcStatus->task.interpState = EMC_TASK_INTERP_PAUSED;
01928 retval = 0;
01929 break;
01930
01931 case EMC_TASK_PLAN_RESUME_TYPE:
01932 emcTrajResume();
01933 emcStatus->task.interpState = interpResumeState;
01934 stepping = 0;
01935 steppingWait = 0;
01936 retval = 0;
01937 break;
01938
01939 case EMC_TASK_PLAN_END_TYPE:
01940 retval = 0;
01941 break;
01942
01943 case EMC_TASK_PLAN_INIT_TYPE:
01944 retval = emcTaskPlanInit();
01945 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01946 rcs_print("emcTaskPlanInit() returned %d\n",retval);
01947 }
01948 #ifdef NEW_INTERPRETER
01949 if(retval > RS274NGC_MIN_ERROR)
01950 {
01951 retval = -1;
01952 }
01953 #endif
01954 break;
01955
01956 case EMC_TASK_PLAN_SYNCH_TYPE:
01957 retval = emcTaskPlanSynch();
01958 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01959 rcs_print("emcTaskPlanSynch() returned %d\n",retval);
01960 }
01961 #ifdef NEW_INTERPRETER
01962 if(retval > RS274NGC_MIN_ERROR)
01963 {
01964 retval = -1;
01965 }
01966 #endif
01967 break;
01968
01969 case EMC_LOG_OPEN_TYPE:
01970 log_open_msg = (EMC_LOG_OPEN *) cmd;
01971 retval = emcLogOpen(log_open_msg->file,
01972 log_open_msg->type,
01973 log_open_msg->size,
01974 log_open_msg->skip,
01975 log_open_msg->which,
01976 log_open_msg->triggerType,
01977 log_open_msg->triggerVar,
01978 log_open_msg->triggerThreshold);
01979 break;
01980
01981 case EMC_LOG_START_TYPE:
01982 retval = emcLogStart();
01983 break;
01984
01985 case EMC_LOG_STOP_TYPE:
01986 retval = emcLogStop();
01987 break;
01988
01989 case EMC_LOG_CLOSE_TYPE:
01990 retval = emcLogClose();
01991 break;
01992
01993 default:
01994 // unrecognized command
01995 if (EMC_DEBUG & EMC_DEBUG_TASK_ISSUE) {
01996 rcs_print_error("ignoring issue of unknown command %d:%s\n", cmd->type,
01997 emc_symbol_lookup(cmd->type));
01998 }
01999 retval = 0; // don't consider this an error
02000 break;
02001 }
02002
02003 if (retval == -1) {
02004 if (EMC_DEBUG & EMC_DEBUG_TASK_ISSUE) {
02005 rcs_print_error("error executing command %d:%s\n", cmd->type,
02006 emc_symbol_lookup(cmd->type));
02007 }
02008 }
02009
02010 return retval;
02011 }
|
|
|
Definition at line 540 of file emctaskmain.cc. Referenced by main().
00541 {
00542 NMLTYPE type;
00543 static char errstring[200];
00544 int retval = 0;
00545 int readRetval;
00546 int execRetval;
00547
00548 // check for new command
00549 if (emcCommand->serial_number !=
00550 emcStatus->echo_serial_number) {
00551 // flag it here locally as a new command
00552 type = emcCommand->type;
00553 }
00554 else {
00555 // no new command-- reset local flag
00556 type = 0;
00557 }
00558
00559 // handle any new command
00560 switch (emcStatus->task.state) {
00561 case EMC_TASK_STATE_OFF:
00562 case EMC_TASK_STATE_ESTOP:
00563 case EMC_TASK_STATE_ESTOP_RESET:
00564
00565 // now switch on the mode
00566 switch (emcStatus->task.mode) {
00567 case EMC_TASK_MODE_MANUAL:
00568 case EMC_TASK_MODE_AUTO:
00569 case EMC_TASK_MODE_MDI:
00570
00571 // now switch on the command
00572 switch (type) {
00573 case 0:
00574 case EMC_NULL_TYPE:
00575 // no command
00576 break;
00577
00578 // immediate commands
00579 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
00580 case EMC_AXIS_SET_GAINS_TYPE:
00581 case EMC_AXIS_DISABLE_TYPE:
00582 case EMC_AXIS_ENABLE_TYPE:
00583 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
00584 case EMC_AXIS_SET_FERROR_TYPE:
00585 case EMC_AXIS_SET_MIN_FERROR_TYPE:
00586 case EMC_AXIS_ABORT_TYPE:
00587 case EMC_AXIS_SET_OUTPUT_TYPE:
00588 case EMC_AXIS_LOAD_COMP_TYPE:
00589 case EMC_AXIS_ALTER_TYPE:
00590 case EMC_TRAJ_SET_SCALE_TYPE:
00591 case EMC_TRAJ_SET_VELOCITY_TYPE:
00592 case EMC_TASK_INIT_TYPE:
00593 case EMC_TASK_SET_MODE_TYPE:
00594 case EMC_TASK_SET_STATE_TYPE:
00595 case EMC_TASK_PLAN_INIT_TYPE:
00596 case EMC_TASK_PLAN_OPEN_TYPE:
00597 case EMC_TASK_ABORT_TYPE:
00598 case EMC_LOG_OPEN_TYPE:
00599 case EMC_LOG_START_TYPE:
00600 case EMC_LOG_STOP_TYPE:
00601 case EMC_LOG_CLOSE_TYPE:
00602 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
00603 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
00604 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
00605 case EMC_TRAJ_PROBE_TYPE:
00606 case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE:
00607 case EMC_SET_DEBUG_TYPE:
00608 retval = emcTaskIssueCommand(emcCommand);
00609 break;
00610
00611 // one case where we need to be in manual mode
00612 case EMC_AXIS_OVERRIDE_LIMITS_TYPE:
00613 retval = 0;
00614 if (emcStatus->task.mode == EMC_TASK_MODE_MANUAL) {
00615 retval = emcTaskIssueCommand(emcCommand);
00616 }
00617 break;
00618
00619 // queued commands
00620
00621 case EMC_TASK_PLAN_EXECUTE_TYPE:
00622 // resynch the interpreter, since we may have moved externally
00623 emcTaskIssueCommand(&taskPlanSynchCmd);
00624 // and now call for interpreter execute
00625 retval = emcTaskIssueCommand(emcCommand);
00626 break;
00627
00628 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
00629 case EMC_TOOL_SET_OFFSET_TYPE:
00630 // send to IO
00631 emcTaskQueueCommand(emcCommand);
00632 // signify no more reading
00633 emcTaskPlanSetWait();
00634 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00635 rcs_print("emcTaskPlanSetWait() called\n");
00636 }
00637
00638 // then resynch interpreter
00639 emcTaskQueueCommand(&taskPlanSynchCmd);
00640 break;
00641
00642 default:
00643 emcOperatorError(0, "command (%s) cannot be executed until the machine is out of E-stop and turned on", emc_symbol_lookup(type));
00644 retval = -1;
00645 break;
00646
00647 } // switch (type)
00648
00649 default:
00650 // invalid mode
00651 break;
00652
00653 } // switch (mode)
00654
00655 break; // case EMC_TASK_STATE_OFF,ESTOP,ESTOP_RESET
00656
00657 case EMC_TASK_STATE_ON:
00658 /* we can do everything (almost) when the machine is on, so
00659 let's switch on the execution mode */
00660 switch (emcStatus->task.mode) {
00661 case EMC_TASK_MODE_MANUAL: // ON, MANUAL
00662 switch (type) {
00663 case 0:
00664 case EMC_NULL_TYPE:
00665 // no command
00666 break;
00667
00668 // immediate commands
00669
00670 case EMC_AXIS_DISABLE_TYPE:
00671 case EMC_AXIS_ENABLE_TYPE:
00672 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
00673 case EMC_AXIS_SET_GAINS_TYPE:
00674 case EMC_AXIS_SET_INPUT_SCALE_TYPE:
00675 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
00676 case EMC_AXIS_SET_FERROR_TYPE:
00677 case EMC_AXIS_SET_MIN_FERROR_TYPE:
00678 case EMC_AXIS_SET_MAX_POSITION_LIMIT_TYPE:
00679 case EMC_AXIS_SET_MIN_POSITION_LIMIT_TYPE:
00680 case EMC_AXIS_ABORT_TYPE:
00681 case EMC_AXIS_HALT_TYPE:
00682 case EMC_AXIS_HOME_TYPE:
00683 case EMC_AXIS_JOG_TYPE:
00684 case EMC_AXIS_INCR_JOG_TYPE:
00685 case EMC_AXIS_ABS_JOG_TYPE:
00686 case EMC_AXIS_OVERRIDE_LIMITS_TYPE:
00687 case EMC_AXIS_SET_OUTPUT_TYPE:
00688 case EMC_AXIS_ALTER_TYPE:
00689 case EMC_TRAJ_PAUSE_TYPE:
00690 case EMC_TRAJ_RESUME_TYPE:
00691 case EMC_TRAJ_ABORT_TYPE:
00692 case EMC_TRAJ_SET_SCALE_TYPE:
00693 case EMC_SPINDLE_ON_TYPE:
00694 case EMC_SPINDLE_OFF_TYPE:
00695 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
00696 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
00697 case EMC_SPINDLE_INCREASE_TYPE:
00698 case EMC_SPINDLE_DECREASE_TYPE:
00699 case EMC_SPINDLE_CONSTANT_TYPE:
00700 case EMC_COOLANT_MIST_ON_TYPE:
00701 case EMC_COOLANT_MIST_OFF_TYPE:
00702 case EMC_COOLANT_FLOOD_ON_TYPE:
00703 case EMC_COOLANT_FLOOD_OFF_TYPE:
00704 case EMC_LUBE_ON_TYPE:
00705 case EMC_LUBE_OFF_TYPE:
00706 case EMC_TASK_SET_MODE_TYPE:
00707 case EMC_TASK_SET_STATE_TYPE:
00708 case EMC_TASK_ABORT_TYPE:
00709 case EMC_TASK_PLAN_PAUSE_TYPE:
00710 case EMC_TASK_PLAN_RESUME_TYPE:
00711 case EMC_TASK_PLAN_INIT_TYPE:
00712 case EMC_TASK_PLAN_SYNCH_TYPE:
00713 case EMC_LOG_OPEN_TYPE:
00714 case EMC_LOG_START_TYPE:
00715 case EMC_LOG_STOP_TYPE:
00716 case EMC_LOG_CLOSE_TYPE:
00717 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
00718 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
00719 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
00720 case EMC_TRAJ_PROBE_TYPE:
00721 case EMC_TRAJ_SET_TELEOP_ENABLE_TYPE:
00722 case EMC_TRAJ_SET_TELEOP_VECTOR_TYPE:
00723 case EMC_SET_DEBUG_TYPE:
00724 retval = emcTaskIssueCommand(emcCommand);
00725 break;
00726
00727 // queued commands
00728
00729 case EMC_TASK_PLAN_EXECUTE_TYPE:
00730 // resynch the interpreter, since we may have moved externally
00731 emcTaskIssueCommand(&taskPlanSynchCmd);
00732 // and now call for interpreter execute
00733 retval = emcTaskIssueCommand(emcCommand);
00734 break;
00735
00736 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
00737 case EMC_TOOL_SET_OFFSET_TYPE:
00738 // send to IO
00739 emcTaskQueueCommand(emcCommand);
00740 // signify no more reading
00741 emcTaskPlanSetWait();
00742 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00743 rcs_print("emcTaskPlanSetWait() called\n");
00744 }
00745 // then resynch interpreter
00746 emcTaskQueueCommand(&taskPlanSynchCmd);
00747 break;
00748
00749 // otherwise we can't handle it
00750 default:
00751 sprintf(errstring,"can't do that (%s) in manual mode",
00752 emc_symbol_lookup(type));
00753 emcOperatorError(0, errstring);
00754 retval = -1;
00755 break;
00756
00757 } // switch (type) in ON, MANUAL
00758
00759 break; // case EMC_TASK_MODE_MANUAL
00760
00761 case EMC_TASK_MODE_AUTO: // ON, AUTO
00762 switch (emcStatus->task.interpState) {
00763 case EMC_TASK_INTERP_IDLE: // ON, AUTO, IDLE
00764 switch (type) {
00765 case 0:
00766 case EMC_NULL_TYPE:
00767 // no command
00768 break;
00769
00770 // immediate commands
00771
00772 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
00773 case EMC_AXIS_SET_GAINS_TYPE:
00774 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
00775 case EMC_AXIS_SET_FERROR_TYPE:
00776 case EMC_AXIS_SET_MIN_FERROR_TYPE:
00777 case EMC_AXIS_SET_OUTPUT_TYPE:
00778 case EMC_AXIS_ALTER_TYPE:
00779 case EMC_TRAJ_PAUSE_TYPE:
00780 case EMC_TRAJ_RESUME_TYPE:
00781 case EMC_TRAJ_ABORT_TYPE:
00782 case EMC_TRAJ_SET_SCALE_TYPE:
00783 case EMC_SPINDLE_ON_TYPE:
00784 case EMC_SPINDLE_OFF_TYPE:
00785 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
00786 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
00787 case EMC_SPINDLE_INCREASE_TYPE:
00788 case EMC_SPINDLE_DECREASE_TYPE:
00789 case EMC_SPINDLE_CONSTANT_TYPE:
00790 case EMC_COOLANT_MIST_ON_TYPE:
00791 case EMC_COOLANT_MIST_OFF_TYPE:
00792 case EMC_COOLANT_FLOOD_ON_TYPE:
00793 case EMC_COOLANT_FLOOD_OFF_TYPE:
00794 case EMC_LUBE_ON_TYPE:
00795 case EMC_LUBE_OFF_TYPE:
00796 case EMC_TASK_SET_MODE_TYPE:
00797 case EMC_TASK_SET_STATE_TYPE:
00798 case EMC_TASK_ABORT_TYPE:
00799 case EMC_TASK_PLAN_INIT_TYPE:
00800 case EMC_TASK_PLAN_OPEN_TYPE:
00801 case EMC_TASK_PLAN_RUN_TYPE:
00802 case EMC_TASK_PLAN_EXECUTE_TYPE:
00803 case EMC_TASK_PLAN_PAUSE_TYPE:
00804 case EMC_TASK_PLAN_RESUME_TYPE:
00805 case EMC_LOG_OPEN_TYPE:
00806 case EMC_LOG_START_TYPE:
00807 case EMC_LOG_STOP_TYPE:
00808 case EMC_LOG_CLOSE_TYPE:
00809 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
00810 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
00811 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
00812 case EMC_TRAJ_PROBE_TYPE:
00813 case EMC_SET_DEBUG_TYPE:
00814 retval = emcTaskIssueCommand(emcCommand);
00815 break;
00816
00817 case EMC_TASK_PLAN_STEP_TYPE:
00818 // handles case where first action is to step the program
00819 taskPlanRunCmd.line = 1; // run from start
00820 // FIXME-- can have GUI set this; send a run instead of a step
00821 retval = emcTaskIssueCommand(&taskPlanRunCmd);
00822 // issuing an EMC_TASK_PLAN_RUN message clears the stepping
00823 // flag-- reset it here
00824 stepping = 1; // set step flag
00825 steppingWait = 0; // don't wait for first one
00826 break;
00827
00828 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
00829 case EMC_TOOL_SET_OFFSET_TYPE:
00830 // send to IO
00831 emcTaskQueueCommand(emcCommand);
00832 // signify no more reading
00833 emcTaskPlanSetWait();
00834 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00835 rcs_print("emcTaskPlanSetWait() called\n");
00836 }
00837 // then resynch interpreter
00838 emcTaskQueueCommand(&taskPlanSynchCmd);
00839 break;
00840
00841 // otherwise we can't handle it
00842 default:
00843 sprintf(errstring,"can't do that (%s) in auto mode with the interpreter idle",
00844 emc_symbol_lookup(type));
00845 emcOperatorError(0, errstring);
00846 retval = -1;
00847 break;
00848
00849 } // switch (type) in ON, AUTO, IDLE
00850
00851 break; // EMC_TASK_INTERP_IDLE
00852
00853 case EMC_TASK_INTERP_READING: // ON, AUTO, READING
00854 switch (type) {
00855 case 0:
00856 case EMC_NULL_TYPE:
00857 // no command
00858 break;
00859
00860 // immediate commands
00861
00862 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
00863 case EMC_AXIS_SET_GAINS_TYPE:
00864 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
00865 case EMC_AXIS_SET_FERROR_TYPE:
00866 case EMC_AXIS_SET_MIN_FERROR_TYPE:
00867 case EMC_AXIS_SET_OUTPUT_TYPE:
00868 case EMC_AXIS_ALTER_TYPE:
00869 case EMC_TRAJ_PAUSE_TYPE:
00870 case EMC_TRAJ_RESUME_TYPE:
00871 case EMC_TRAJ_ABORT_TYPE:
00872 case EMC_TRAJ_SET_SCALE_TYPE:
00873 case EMC_SPINDLE_INCREASE_TYPE:
00874 case EMC_SPINDLE_DECREASE_TYPE:
00875 case EMC_SPINDLE_CONSTANT_TYPE:
00876 case EMC_TASK_PLAN_PAUSE_TYPE:
00877 case EMC_TASK_PLAN_RESUME_TYPE:
00878 case EMC_TASK_SET_MODE_TYPE:
00879 case EMC_TASK_SET_STATE_TYPE:
00880 case EMC_TASK_ABORT_TYPE:
00881 case EMC_LOG_OPEN_TYPE:
00882 case EMC_LOG_START_TYPE:
00883 case EMC_LOG_STOP_TYPE:
00884 case EMC_LOG_CLOSE_TYPE:
00885 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
00886 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
00887 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
00888 case EMC_TRAJ_PROBE_TYPE:
00889 case EMC_SET_DEBUG_TYPE:
00890 retval = emcTaskIssueCommand(emcCommand);
00891 break;
00892
00893 case EMC_TASK_PLAN_STEP_TYPE:
00894 stepping = 1; // set stepping mode in case it's not
00895 steppingWait = 0; // clear the wait
00896 break;
00897
00898 // otherwise we can't handle it
00899 default:
00900 sprintf(errstring,"can't do that (%s) in auto mode with the interpreter reading",
00901 emc_symbol_lookup(type));
00902 emcOperatorError(0, errstring);
00903 retval = -1;
00904 break;
00905
00906 } // switch (type) in ON, AUTO, READING
00907
00908 // now handle interpreter call logic
00909 if (interp_list.len() <= EMC_TASK_INTERP_MAX_LEN) {
00910 if (emcTaskPlanIsWait()) {
00911 // delay reading of next line until all is done
00912 if (interp_list.len() == 0 &&
00913 emcTaskCommand == 0 &&
00914 emcStatus->task.execState == EMC_TASK_EXEC_DONE) {
00915 emcTaskPlanClearWait();
00916 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00917 rcs_print("emcTaskPlanClearWait() called\n");
00918 }
00919 }
00920 }
00921 else {
00922 readRetval = emcTaskPlanRead();
00923 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00924 rcs_print("emcTaskPlanRead() returned %d\n",readRetval);
00925 }
00926 #ifdef NEW_INTERPRETER
00927 if(readRetval > RS274NGC_MIN_ERROR ||
00928 readRetval == 3 /* RS274NGC_ENDFILE */ ||
00929 #else
00930 if (readRetval != -1 /* RS274NGC_ERROR */ ||
00931 #endif
00932 readRetval == 1 /* RS274NGC_EXIT */ ||
00933 readRetval == 2 /* RS274NGC_ENDFILE, RS274NGC_EXECUTE_FINISH */ )
00934
00935 {
00936 // end of file
00937 emcStatus->task.interpState = EMC_TASK_INTERP_WAITING;
00938 }
00939 else {
00940 // got a good line
00941 // record the line number and command
00942 emcStatus->task.readLine = emcTaskPlanLine();
00943 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00944 rcs_print("emcTaskPlanLine() returned %d\n", emcStatus->task.readLine);
00945 }
00946
00947 interp_list.set_line_number(emcStatus->task.readLine);
00948 emcTaskPlanCommand((char *) &emcStatus->task.command);
00949 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00950 rcs_print("emcTaskPlanCommand(%s) called. (line_number=%d)\n", ((char *) &emcStatus->task.command),emcStatus->task.readLine);
00951 }
00952 // and execute it
00953 execRetval = emcTaskPlanExecute(0);
00954 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00955 rcs_print("emcTaskPlanExecute(0) return %d\n", execRetval);
00956 }
00957 if (execRetval == -1 /* RS274NGC_ERROR */ ||
00958 #ifdef NEW_INTERPRETER
00959 execRetval > RS274NGC_MIN_ERROR ||
00960 #endif
00961 execRetval == 1 /* RS274NGC_EXIT */ ) {
00962 // end of file
00963 emcStatus->task.interpState = EMC_TASK_INTERP_WAITING;
00964 }
00965 #ifdef NEW_INTERPRETER
00966 else if (execRetval == 2 /* RS274NGC_EXECUTE_FINISH */ )
00967 #else
00968 else if (execRetval == 3 /* RS274NGC_EXECUTE_FINISH */ )
00969 #endif
00970 {
00971 // RS274NGC_EXECUTE_FINISH signifies
00972 // that no more reading should be done until everything
00973 // outstanding is completed
00974 emcTaskPlanSetWait();
00975 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
00976 rcs_print("emcTaskPlanSetWait() called\n");
00977 }
00978 // and resynch interp WM
00979 emcTaskQueueCommand(&taskPlanSynchCmd);
00980 }
00981 #ifdef NEW_INTERPRETER
00982 else if (execRetval != 0 ) {
00983 // end of file
00984 emcStatus->task.interpState = EMC_TASK_INTERP_WAITING;
00985 }
00986 #endif
00987 else {
00988
00989 // executed a good line
00990 }
00991
00992 // throw the results away if we're supposed to read
00993 // through it
00994 if (programStartLine < 0 ||
00995 emcStatus->task.readLine < programStartLine) {
00996 // we're stepping over lines, so check them for
00997 // limits, etc. and clear then out
00998 if (0 != checkInterpList(&interp_list, emcStatus)) {
00999 // problem with actions, so do same as we did
01000 // for a bad read from emcTaskPlanRead() above
01001 emcStatus->task.interpState = EMC_TASK_INTERP_WAITING;
01002 }
01003 // and clear it regardless
01004 interp_list.clear();
01005 }
01006 } // else read was OK, so execute
01007 } // else not emcTaskPlanIsWait
01008 } // if interp len is less than max
01009
01010 break; // EMC_TASK_INTERP_READING
01011
01012 case EMC_TASK_INTERP_PAUSED: // ON, AUTO, PAUSED
01013 switch (type) {
01014 case 0:
01015 case EMC_NULL_TYPE:
01016 // no command
01017 break;
01018
01019 // immediate commands
01020
01021 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
01022 case EMC_AXIS_SET_GAINS_TYPE:
01023 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
01024 case EMC_AXIS_SET_FERROR_TYPE:
01025 case EMC_AXIS_SET_MIN_FERROR_TYPE:
01026 case EMC_AXIS_SET_OUTPUT_TYPE:
01027 case EMC_AXIS_ALTER_TYPE:
01028 case EMC_TRAJ_PAUSE_TYPE:
01029 case EMC_TRAJ_RESUME_TYPE:
01030 case EMC_TRAJ_ABORT_TYPE:
01031 case EMC_TRAJ_SET_SCALE_TYPE:
01032 case EMC_SPINDLE_ON_TYPE:
01033 case EMC_SPINDLE_OFF_TYPE:
01034 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
01035 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
01036 case EMC_SPINDLE_INCREASE_TYPE:
01037 case EMC_SPINDLE_DECREASE_TYPE:
01038 case EMC_SPINDLE_CONSTANT_TYPE:
01039 case EMC_COOLANT_MIST_ON_TYPE:
01040 case EMC_COOLANT_MIST_OFF_TYPE:
01041 case EMC_COOLANT_FLOOD_ON_TYPE:
01042 case EMC_COOLANT_FLOOD_OFF_TYPE:
01043 case EMC_LUBE_ON_TYPE:
01044 case EMC_LUBE_OFF_TYPE:
01045 case EMC_TASK_SET_MODE_TYPE:
01046 case EMC_TASK_SET_STATE_TYPE:
01047 case EMC_TASK_ABORT_TYPE:
01048 case EMC_TASK_PLAN_EXECUTE_TYPE:
01049 case EMC_TASK_PLAN_PAUSE_TYPE:
01050 case EMC_TASK_PLAN_RESUME_TYPE:
01051 case EMC_LOG_OPEN_TYPE:
01052 case EMC_LOG_START_TYPE:
01053 case EMC_LOG_STOP_TYPE:
01054 case EMC_LOG_CLOSE_TYPE:
01055 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
01056 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
01057 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
01058 case EMC_TRAJ_PROBE_TYPE:
01059 case EMC_SET_DEBUG_TYPE:
01060 retval = emcTaskIssueCommand(emcCommand);
01061 break;
01062
01063 case EMC_TASK_PLAN_STEP_TYPE:
01064 if (emcStatus->motion.traj.paused &&
01065 emcStatus->motion.traj.queue > 0) {
01066 // there are pending motions paused; step them
01067 emcTrajStep();
01068 }
01069 else {
01070 // motion is not paused, or it is but there is no queue,
01071 // so we can resume normal interpretation in step mode
01072 emcTrajResume();
01073 stepping = 1; // set stepping mode in case it's not
01074 steppingWait = 0; // clear the wait
01075 emcStatus->task.interpState = interpResumeState;
01076 }
01077 break;
01078
01079 // otherwise we can't handle it
01080 default:
01081 sprintf(errstring,"can't do that (%s) in auto mode with the interpreter paused",
01082 emc_symbol_lookup(type));
01083 emcOperatorError(0, errstring);
01084 retval = -1;
01085 break;
01086
01087 } // switch (type) in ON, AUTO, PAUSED
01088
01089 break; // EMC_TASK_INTERP_PAUSED
01090
01091 case EMC_TASK_INTERP_WAITING:
01092 // interpreter ran to end
01093 // handle input commands
01094 switch (type) {
01095 case 0:
01096 case EMC_NULL_TYPE:
01097 // no command
01098 break;
01099
01100 // immediate commands
01101
01102 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
01103 case EMC_AXIS_SET_GAINS_TYPE:
01104 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
01105 case EMC_AXIS_SET_FERROR_TYPE:
01106 case EMC_AXIS_SET_MIN_FERROR_TYPE:
01107 case EMC_AXIS_SET_OUTPUT_TYPE:
01108 case EMC_AXIS_ALTER_TYPE:
01109 case EMC_TRAJ_PAUSE_TYPE:
01110 case EMC_TRAJ_RESUME_TYPE:
01111 case EMC_TRAJ_ABORT_TYPE:
01112 case EMC_TRAJ_SET_SCALE_TYPE:
01113 case EMC_SPINDLE_INCREASE_TYPE:
01114 case EMC_SPINDLE_DECREASE_TYPE:
01115 case EMC_SPINDLE_CONSTANT_TYPE:
01116 case EMC_TASK_PLAN_EXECUTE_TYPE:
01117 case EMC_TASK_PLAN_PAUSE_TYPE:
01118 case EMC_TASK_PLAN_RESUME_TYPE:
01119 case EMC_TASK_SET_MODE_TYPE:
01120 case EMC_TASK_SET_STATE_TYPE:
01121 case EMC_TASK_ABORT_TYPE:
01122 case EMC_LOG_OPEN_TYPE:
01123 case EMC_LOG_START_TYPE:
01124 case EMC_LOG_STOP_TYPE:
01125 case EMC_LOG_CLOSE_TYPE:
01126 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
01127 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
01128 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
01129 case EMC_TRAJ_PROBE_TYPE:
01130 case EMC_SET_DEBUG_TYPE:
01131 retval = emcTaskIssueCommand(emcCommand);
01132 break;
01133
01134 case EMC_TASK_PLAN_STEP_TYPE:
01135 stepping = 1; // set stepping mode in case it's not
01136 steppingWait = 0; // clear the wait
01137 break;
01138
01139 // otherwise we can't handle it
01140 default:
01141 sprintf(errstring,"can't do that (%s) in auto mode with the interpreter waiting",
01142 emc_symbol_lookup(type));
01143 emcOperatorError(0, errstring);
01144 retval = -1;
01145 break;
01146
01147 } // switch (type) in ON, AUTO, WAITING
01148
01149 // now handle call logic
01150 // check for subsystems done
01151 if (interp_list.len() == 0 &&
01152 emcTaskCommand == 0 &&
01153 emcStatus->motion.traj.queue == 0 &&
01154 emcStatus->io.status == RCS_DONE)
01155 // finished
01156 {
01157 int was_open = taskplanopen;
01158 if(was_open)
01159 {
01160 emcTaskPlanClose();
01161 if (EMC_DEBUG & EMC_DEBUG_INTERP && was_open) {
01162 rcs_print("emcTaskPlanClose() called at %s:%d\n",__FILE__,__LINE__);
01163 }
01164 // then resynch interpreter
01165 emcTaskQueueCommand(&taskPlanSynchCmd);
01166 }
01167 else
01168 {
01169 emcStatus->task.interpState = EMC_TASK_INTERP_IDLE;
01170 }
01171 emcStatus->task.readLine = 0;
01172 interp_list.set_line_number(0);
01173 }
01174 else {
01175 // still executing
01176 }
01177
01178 break; // end of case EMC_TASK_INTERP_WAITING
01179
01180 default:
01181 // coding error
01182 rcs_print_error("invalid mode(%d)",emcStatus->task.mode);
01183 retval = -1;
01184 break;
01185
01186 } // switch (mode) in ON, AUTO
01187
01188 break; // case EMC_TASK_MODE_AUTO
01189
01190 case EMC_TASK_MODE_MDI: // ON, MDI
01191 switch (type) {
01192 case 0:
01193 case EMC_NULL_TYPE:
01194 // no command
01195 break;
01196
01197 // immediate commands
01198
01199 case EMC_AXIS_SET_CYCLE_TIME_TYPE:
01200 case EMC_AXIS_SET_GAINS_TYPE:
01201 case EMC_AXIS_SET_OUTPUT_SCALE_TYPE:
01202 case EMC_AXIS_SET_FERROR_TYPE:
01203 case EMC_AXIS_SET_MIN_FERROR_TYPE:
01204 case EMC_AXIS_SET_OUTPUT_TYPE:
01205 case EMC_AXIS_ALTER_TYPE:
01206 case EMC_TRAJ_SET_SCALE_TYPE:
01207 case EMC_SPINDLE_ON_TYPE:
01208 case EMC_SPINDLE_OFF_TYPE:
01209 case EMC_SPINDLE_BRAKE_RELEASE_TYPE:
01210 case EMC_SPINDLE_BRAKE_ENGAGE_TYPE:
01211 case EMC_SPINDLE_INCREASE_TYPE:
01212 case EMC_SPINDLE_DECREASE_TYPE:
01213 case EMC_SPINDLE_CONSTANT_TYPE:
01214 case EMC_COOLANT_MIST_ON_TYPE:
01215 case EMC_COOLANT_MIST_OFF_TYPE:
01216 case EMC_COOLANT_FLOOD_ON_TYPE:
01217 case EMC_COOLANT_FLOOD_OFF_TYPE:
01218 case EMC_LUBE_ON_TYPE:
01219 case EMC_LUBE_OFF_TYPE:
01220 case EMC_TASK_SET_MODE_TYPE:
01221 case EMC_TASK_SET_STATE_TYPE:
01222 case EMC_TASK_PLAN_INIT_TYPE:
01223 case EMC_TASK_PLAN_OPEN_TYPE:
01224 case EMC_TASK_PLAN_EXECUTE_TYPE:
01225 case EMC_TASK_PLAN_PAUSE_TYPE:
01226 case EMC_TASK_PLAN_RESUME_TYPE:
01227 case EMC_TASK_ABORT_TYPE:
01228 case EMC_LOG_OPEN_TYPE:
01229 case EMC_LOG_START_TYPE:
01230 case EMC_LOG_STOP_TYPE:
01231 case EMC_LOG_CLOSE_TYPE:
01232 case EMC_TRAJ_SET_PROBE_INDEX_TYPE:
01233 case EMC_TRAJ_SET_PROBE_POLARITY_TYPE:
01234 case EMC_TRAJ_CLEAR_PROBE_TRIPPED_FLAG_TYPE:
01235 case EMC_TRAJ_PROBE_TYPE:
01236 case EMC_SET_DEBUG_TYPE:
01237 retval = emcTaskIssueCommand(emcCommand);
01238 break;
01239
01240 case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
01241 case EMC_TOOL_SET_OFFSET_TYPE:
01242 // send to IO
01243 emcTaskQueueCommand(emcCommand);
01244 // signify no more reading
01245 emcTaskPlanSetWait();
01246 if (EMC_DEBUG & EMC_DEBUG_INTERP) {
01247 rcs_print("emcTaskPlanSetWait() called\n");
01248 }
01249 // then resynch interpreter
01250 emcTaskQueueCommand(&taskPlanSynchCmd);
01251 break;
01252
01253 // otherwise we can't handle it
01254 default:
01255
01256 sprintf(errstring,"can't do that (%s) in MDI mode",
01257 emc_symbol_lookup(type));
01258 emcOperatorError(0, errstring);
01259 retval = -1;
01260 break;
01261
01262 } // switch (type) in ON, MDI
01263
01264 break; // case EMC_TASK_MODE_MDI
01265
01266 default:
01267 break;
01268
01269 } // switch (mode)
01270
01271 break; // case EMC_TASK_STATE_ON
01272
01273 default:
01274 break;
01275
01276 } // switch (task.state)
01277
01278 return retval;
01279 }
|
|
|
Definition at line 1382 of file emctaskmain.cc. Referenced by emcTaskExecute(), emcTaskIssueCommand(), emcTaskPlan(), and main().
01383 {
01384 if (0 == cmd) {
01385 return 0;
01386 }
01387
01388 interp_list.append(cmd);
01389
01390 return 0;
01391 }
|
|
|
Definition at line 2505 of file emctaskmain.cc. Referenced by emctask_startup(), and main().
02506 {
02507 // shut down the subsystems
02508
02509 if( 0 != emcStatus)
02510 {
02511 emcTaskHalt();
02512 emcTaskPlanExit();
02513 emcMotionHalt();
02514 emcIoHalt();
02515 }
02516
02517 // delete the timer
02518 if (0 != timer)
02519 {
02520 delete timer;
02521 timer = 0;
02522 }
02523
02524 // delete the NML channels
02525
02526 if (0 != emcErrorBuffer)
02527 {
02528 delete emcErrorBuffer;
02529 emcErrorBuffer = 0;
02530 }
02531
02532 if (0 != emcStatusBuffer)
02533 {
02534 delete emcStatusBuffer;
02535 emcStatusBuffer = 0;
02536 emcStatus = 0;
02537 }
02538
02539 if (0 != emcCommandBuffer)
02540 {
02541 delete emcCommandBuffer;
02542 emcCommandBuffer = 0;
02543 emcCommand = 0;
02544 }
02545
02546 if( 0 != emcStatus)
02547 {
02548 delete emcStatus;
02549 emcStatus = 0;
02550 }
02551 return 0;
02552 }
|
|
|
Definition at line 2288 of file emctaskmain.cc. Referenced by main().
02289 {
02290 double end;
02291 int good;
02292
02293 #define RETRY_TIME 10.0 // seconds to wait for subsystems to come up
02294 #define RETRY_INTERVAL 1.0 // seconds between wait tries for a subsystem
02295
02296 // get our status data structure
02297 emcStatus = new EMC_STAT;
02298
02299 // get the NML command buffer
02300 if (! (EMC_DEBUG & EMC_DEBUG_NML)) {
02301 set_rcs_print_destination(RCS_PRINT_TO_NULL); // inhibit diag messages
02302 }
02303 end = RETRY_TIME;
02304 good = 0;
02305 do {
02306 if (NULL != emcCommandBuffer) {
02307 delete emcCommandBuffer;
02308 }
02309 emcCommandBuffer = new RCS_CMD_CHANNEL(emcFormat, "emcCommand", "emc", EMC_NMLFILE);
02310 if (emcCommandBuffer->valid()) {
02311 good = 1;
02312 break;
02313 }
02314 esleep(RETRY_INTERVAL);
02315 end -= RETRY_INTERVAL;
02316 if(done)
02317 {
02318 emctask_shutdown();
02319 exit(1);
02320 }
02321 } while (end > 0.0);
02322 set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // restore diag messages
02323 if (! good) {
02324 rcs_print_error("can't get emcCommand buffer\n");
02325 return -1;
02326 }
02327 // get our command data structure
02328 emcCommand = emcCommandBuffer->get_address();
02329
02330 // get the NML status buffer
02331 if (! (EMC_DEBUG & EMC_DEBUG_NML)) {
02332 set_rcs_print_destination(RCS_PRINT_TO_NULL); // inhibit diag messages
02333 }
02334 end = RETRY_TIME;
02335 good = 0;
02336 do {
02337 if (NULL != emcStatusBuffer) {
02338 delete emcStatusBuffer;
02339 }
02340 emcStatusBuffer = new RCS_STAT_CHANNEL(emcFormat, "emcStatus", "emc", EMC_NMLFILE);
02341 if (emcStatusBuffer->valid()) {
02342 good = 1;
02343 break;
02344 }
02345 esleep(RETRY_INTERVAL);
02346 end -= RETRY_INTERVAL;
02347 if(done)
02348 {
02349 emctask_shutdown();
02350 exit(1);
02351 }
02352 } while (end > 0.0);
02353 set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // restore diag messages
02354 if (! good) {
02355 rcs_print_error("can't get emcStatus buffer\n");
02356 return -1;
02357 }
02358
02359 if (! (EMC_DEBUG & EMC_DEBUG_NML)) {
02360 set_rcs_print_destination(RCS_PRINT_TO_NULL); // inhibit diag messages
02361 }
02362 end = RETRY_TIME;
02363 good = 0;
02364 do {
02365 if (NULL != emcErrorBuffer) {
02366 delete emcErrorBuffer;
02367 }
02368 emcErrorBuffer = new NML(nmlErrorFormat, "emcError", "emc", EMC_NMLFILE);
02369 if (emcErrorBuffer->valid()) {
02370 good = 1;
02371 break;
02372 }
02373 esleep(RETRY_INTERVAL);
02374 end -= RETRY_INTERVAL;
02375 if(done)
02376 {
02377 emctask_shutdown();
02378 exit(1);
02379 }
02380 } while (end > 0.0);
02381 set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // restore diag messages
02382 if (! good) {
02383 rcs_print_error("can't get emcError buffer\n");
02384 return -1;
02385 }
02386
02387 // get the timer
02388 if (! emcTaskNoDelay) {
02389 timer = new RCS_TIMER(EMC_TASK_CYCLE_TIME);
02390 }
02391
02392 // initialize the subsystems
02393
02394 // IO first
02395
02396 if (! (EMC_DEBUG & EMC_DEBUG_NML)) {
02397 set_rcs_print_destination(RCS_PRINT_TO_NULL); // inhibit diag messages
02398 }
02399 end = RETRY_TIME;
02400 good = 0;
02401 do {
02402 if (0 == emcIoInit()) {
02403 good = 1;
02404 break;
02405 }
02406 esleep(RETRY_INTERVAL);
02407 end -= RETRY_INTERVAL;
02408 if(done)
02409 {
02410 emctask_shutdown();
02411 exit(1);
02412 }
02413 } while (end > 0.0);
02414 set_rcs_print_destination(RCS_PRINT_TO_STDOUT); // restore diag messages
02415 if (! good) {
02416 rcs_print_error("can't initialize IO\n");
02417 return -1;
02418 }
02419
02420 end = RETRY_TIME;
02421 good = 0;
02422 do {
02423 if (0 == emcIoUpdate(&emcStatus->io)) {
02424 good = 1;
02425 break;
02426 }
02427 esleep(RETRY_INTERVAL);
02428 end -= RETRY_INTERVAL;
02429 if(done)
02430 {
02431 emctask_shutdown();
02432 exit(1);
02433 }
02434 } while (end > 0.0);
02435 if (! good) {
02436 rcs_print_error("can't read IO status\n");
02437 return -1;
02438 }
02439
02440 // now motion
02441
02442 end = RETRY_TIME;
02443 good = 0;
02444 do {
02445 if (0 == emcMotionInit()) {
02446 good = 1;
02447 break;
02448 }
02449 esleep(RETRY_INTERVAL);
02450 end -= RETRY_INTERVAL;
02451 if(done)
02452 {
02453 emctask_shutdown();
02454 exit(1);
02455 }
02456 } while (end > 0.0);
02457 if (! good) {
02458 rcs_print_error("can't initialize motion\n");
02459 return -1;
02460 }
02461
02462 end = RETRY_TIME;
02463 good = 0;
02464 do {
02465 if (0 == emcMotionUpdate(&emcStatus->motion)) {
02466 good = 1;
02467 break;
02468 }
02469 esleep(RETRY_INTERVAL);
02470 end -= RETRY_INTERVAL;
02471 if(done)
02472 {
02473 emctask_shutdown();
02474 exit(1);
02475 }
02476 } while (end > 0.0);
02477 if (! good) {
02478 rcs_print_error("can't read motion status\n");
02479 return -1;
02480 }
02481
02482 // now the interpreter
02483 if (0 != emcTaskPlanInit()) {
02484 rcs_print_error("can't initialize interpreter\n");
02485 return -1;
02486 }
02487
02488 if(done)
02489 {
02490 emctask_shutdown();
02491 exit(1);
02492 }
02493
02494 // now task
02495 if (0 != emcTaskInit()) {
02496 rcs_print_error("can't initialize task\n");
02497 return -1;
02498 }
02499 emcTaskUpdate(&emcStatus->task);
02500
02501 return 0;
02502 }
|
|
|
Definition at line 2554 of file emctaskmain.cc. 02555 {
02556 INIFILE inifile;
02557 const char *inistring;
02558 char version[INIFILE_MAX_LINELEN];
02559 double saveDouble;
02560
02561 // open it
02562 if (-1 == inifile.open(filename)) {
02563 return -1;
02564 }
02565
02566 if (NULL != (inistring = inifile.find("DEBUG", "EMC"))) {
02567 // copy to global
02568 if (1 != sscanf(inistring, "%i", &EMC_DEBUG)) {
02569 EMC_DEBUG = 0;
02570 }
02571 }
02572 else {
02573 // not found, use default
02574 EMC_DEBUG = 0;
02575 }
02576 if (EMC_DEBUG & EMC_DEBUG_RCS) {
02577 // set_rcs_print_flag(PRINT_EVERYTHING);
02578 max_rcs_errors_to_print=-1;
02579 }
02580
02581 if (EMC_DEBUG & EMC_DEBUG_VERSIONS) {
02582 if (NULL != (inistring = inifile.find("VERSION", "EMC"))) {
02583 // print version
02584 sscanf(inistring, "$Revision: %s", version);
02585 rcs_print("Version: %s\n", version);
02586 }
02587 else {
02588 // not found, not fatal
02589 rcs_print("Version: (not found)\n");
02590 }
02591
02592 if (NULL != (inistring = inifile.find("MACHINE", "EMC"))) {
02593 // print machine
02594 rcs_print("Machine: %s\n", inistring);
02595 }
02596 else {
02597 // not found, not fatal
02598 rcs_print("Machine: (not found)\n");
02599 }
02600 }
02601
02602 if (NULL != (inistring = inifile.find("NML_FILE", "EMC"))) {
02603 // copy to global
02604 strcpy(EMC_NMLFILE, inistring);
02605 }
02606 else {
02607 // not found, use default
02608 }
02609
02610 if (NULL != (inistring = inifile.find("RS274NGC_STARTUP_CODE","EMC"))) {
02611 // copy to global
02612 strcpy(RS274NGC_STARTUP_CODE, inistring);
02613 }
02614 else {
02615 // not found, use default
02616 }
02617
02618 saveDouble = EMC_TASK_CYCLE_TIME;
02619 EMC_TASK_CYCLE_TIME_ORIG = EMC_TASK_CYCLE_TIME;
02620 emcTaskNoDelay = 0;
02621 if (NULL != (inistring = inifile.find("CYCLE_TIME", "TASK"))) {
02622 if (1 == sscanf(inistring, "%lf", &EMC_TASK_CYCLE_TIME)) {
02623 // found it
02624 // if it's <= 0.0, then flag that we don't want to
02625 // wait at all, which will set the EMC_TASK_CYCLE_TIME
02626 // global to the actual time deltas
02627 if (EMC_TASK_CYCLE_TIME <= 0.0) {
02628 emcTaskNoDelay = 1;
02629 }
02630 }
02631 else {
02632 // found, but invalid
02633 EMC_TASK_CYCLE_TIME = saveDouble;
02634 rcs_print("invalid [TASK] CYCLE_TIME in %s (%s); using default %f\n",
02635 filename, inistring, EMC_TASK_CYCLE_TIME);
02636 }
02637 }
02638 else {
02639 // not found, using default
02640 rcs_print("[TASK] CYCLE_TIME not found in %s; using default %f\n",
02641 filename, EMC_TASK_CYCLE_TIME);
02642 }
02643
02644 // close it
02645 inifile.close();
02646
02647 return 0;
02648 }
|
|
||||||||||||
|
Definition at line 2655 of file emctaskmain.cc. 02656 {
02657 int taskAborted = 0; // flag to prevent flurry of task aborts
02658 int taskPlanError = 0;
02659 int taskExecuteError = 0;
02660 #ifndef LINUX_KERNEL_2_2
02661 double startTime, endTime;
02662 #endif
02663
02664 double minTime, maxTime;
02665
02666 // copy command line args
02667 Argc = argc;
02668 Argv = argv;
02669
02670 // trap ^C
02671 // loop until done
02672 done = 0;
02673 signal(SIGINT, emctask_quit);
02674
02675 // set print destination to stdout, for console apps
02676 set_rcs_print_destination(RCS_PRINT_TO_STDOUT);
02677
02678 // blank out the annoying RCS version message
02679 rcs_version_printed = 1;
02680
02681 // open the general purpose file log
02682 if (NULL == (logFp = fopen(LOG_FILE, "w"))) {
02683 // can't log; ignore
02684 }
02685
02686 // process command line args
02687 if (0 != emcGetArgs(argc, argv)) {
02688 rcs_print_error("error in argument list\n");
02689 exit(1);
02690 }
02691
02692 if (done) {
02693 emctask_shutdown();
02694 exit(1);
02695 }
02696
02697 // initialize globals
02698 emcInitGlobals();
02699
02700 if (done) {
02701 emctask_shutdown();
02702 exit(1);
02703 }
02704
02705 // get configuration information
02706 iniLoad(EMC_INIFILE);
02707
02708 if (done) {
02709 emctask_shutdown();
02710 exit(1);
02711 }
02712
02713 // initialize everything
02714 if (0 != emctask_startup()) {
02715 emctask_shutdown();
02716 exit(1);
02717 }
02718
02719 // set the default startup modes
02720 emcTaskSetState(EMC_TASK_STATE_ESTOP);
02721 emcTaskSetMode(EMC_TASK_MODE_MANUAL);
02722
02723 // reflect the initial value of EMC_DEBUG in emcStatus->debug
02724 emcStatus->debug = EMC_DEBUG;
02725
02726 #if ! defined(LINUX_KERNEL_2_2)
02727 startTime = etime(); // set start time before entering loop;
02728 // it will be set at end of loop from now on
02729 minTime = DBL_MAX; // set to value that can never be exceeded
02730 maxTime = 0.0; // set to value that can never be underset
02731 #endif
02732 while (! done) {
02733 // read command
02734 if (0 != emcCommandBuffer->peek()) {
02735 // got a new command, so clear out errors
02736 taskPlanError = 0;
02737 taskExecuteError = 0;
02738 }
02739
02740 // run control cycle
02741 if (0 != emcTaskPlan()) {
02742 taskPlanError = 1;
02743 }
02744 if (0 != emcTaskExecute()) {
02745 taskExecuteError = 1;
02746 }
02747
02748 // update subordinate status
02749
02750 emcIoUpdate(&emcStatus->io);
02751 emcMotionUpdate(&emcStatus->motion);
02752
02753 // synchronize subordinate states
02754 if (emcStatus->io.aux.estop) {
02755 if (emcStatus->motion.traj.enabled) {
02756 if(EMC_DEBUG & EMC_DEBUG_IO_POINTS)
02757 {
02758 rcs_print("emcStatus->io.aux.estop=%d\n", emcStatus->io.aux.estop);
02759 rcs_print("emcStatus->io.aux.estopIn=%d\n", emcStatus->io.aux.estopIn);
02760 }
02761 emcTrajDisable();
02762 }
02763 if (emcStatus->io.coolant.mist) {
02764 emcCoolantMistOff();
02765 }
02766 if (emcStatus->io.coolant.flood) {
02767 emcCoolantFloodOff();
02768 }
02769 if (emcStatus->io.lube.on) {
02770 emcLubeOff();
02771 }
02772 if (emcStatus->io.spindle.enabled) {
02773 emcSpindleOff();
02774 }
02775 }
02776
02777 // check for subordinate errors, and halt task if so
02778 if (emcStatus->motion.status == RCS_ERROR ||
02779 emcStatus->io.status == RCS_ERROR) {
02780
02781 // FIXME-- duplicate code for abort,
02782 // also in emcTaskExecute()
02783 // and in emcTaskIssueCommand()
02784
02785 if (! taskAborted) {
02786 // abort everything
02787 emcTaskAbort();
02788
02789 // without emcTaskPlanClose(), a new run command resumes at
02790 // aborted line-- feature that may be considered later
02791 {
02792 int was_open = taskplanopen;
02793 emcTaskPlanClose();
02794 if (EMC_DEBUG & EMC_DEBUG_INTERP && was_open) {
02795 rcs_print("emcTaskPlanClose() called at %s:%d\n",__FILE__,__LINE__);
02796 }
02797 }
02798
02799 // clear out the pending command
02800 emcTaskCommand = 0;
02801 interp_list.clear();
02802
02803 // clear out the interpreter state
02804 emcStatus->task.interpState = EMC_TASK_INTERP_IDLE;
02805 emcStatus->task.execState = EMC_TASK_EXEC_DONE;
02806 stepping = 0;
02807 steppingWait = 0;
02808
02809 // now queue up command to resynch interpreter
02810 emcTaskQueueCommand(&taskPlanSynchCmd);
02811 taskAborted = 1;
02812 }
02813 }
02814 else {
02815 taskAborted = 0;
02816 }
02817
02818 // update task-specific status
02819 emcTaskUpdate(&emcStatus->task);
02820
02821 // handle RCS_STAT_MSG base class members explicitly, since this
02822 // is not an NML_MODULE and they won't be set automatically
02823
02824 // do task
02825 emcStatus->task.command_type = emcCommand->type;
02826 emcStatus->task.echo_serial_number = emcCommand->serial_number;
02827
02828 // do top level
02829 emcStatus->command_type = emcCommand->type;
02830 emcStatus->echo_serial_number = emcCommand->serial_number;
02831
02832 if (taskPlanError || taskExecuteError ||
02833 emcStatus->task.execState == EMC_TASK_EXEC_ERROR ||
02834 emcStatus->motion.status == RCS_ERROR ||
02835 emcStatus->io.status == RCS_ERROR) {
02836 emcStatus->status = RCS_ERROR;
02837 emcStatus->task.status = RCS_ERROR;
02838 }
02839 else if (! taskPlanError && ! taskExecuteError &&
02840 emcStatus->task.execState == EMC_TASK_EXEC_DONE &&
02841 emcStatus->motion.status == RCS_DONE &&
02842 emcStatus->io.status == RCS_DONE &&
02843 interp_list.len() == 0 &&
02844 emcTaskCommand == 0 &&
02845 emcStatus->task.interpState == EMC_TASK_INTERP_IDLE) {
02846 emcStatus->status = RCS_DONE;
02847 emcStatus->task.status = RCS_DONE;
02848 }
02849 else {
02850 emcStatus->status = RCS_EXEC;
02851 emcStatus->task.status = RCS_EXEC;
02852 }
02853 // ignore state, line, source_line, and source_file[] since they're N/A
02854
02855 // Check for some error/warning conditions and warn the operator.
02856 // The GUI would be a better place to check these but we will have lot's
02857 // of gui's and some will neglect to check these flags.
02858 for (int i = 0; i < EMC_AXIS_MAX; i++) {
02859 if (last_emc_status.motion.axis[i].fault == 0 &&
02860 emcStatus->motion.axis[i].fault == 1) {
02861 emcOperatorError(0,"Amplifier fault on axis %d.", i);
02862 }
02863 last_emc_status.motion.axis[i].fault = emcStatus->motion.axis[i].fault;
02864 if (last_emc_status.motion.axis[i].minSoftLimit == 0 &&
02865 emcStatus->motion.axis[i].minSoftLimit == 1) {
02866 emcOperatorError(0,"Minimum Software Limit on axis %d exceeded.", i);
02867 }
02868 last_emc_status.motion.axis[i].minSoftLimit = emcStatus->motion.axis[i].minSoftLimit;
02869 if (last_emc_status.motion.axis[i].maxSoftLimit == 0 &&
02870 emcStatus->motion.axis[i].maxSoftLimit == 1) {
02871 emcOperatorError(0,"Maximum Software Limit on axis %d exceeded.", i);
02872 }
02873 last_emc_status.motion.axis[i].maxSoftLimit = emcStatus->motion.axis[i].maxSoftLimit;
02874 if (last_emc_status.motion.axis[i].minHardLimit == 0 &&
02875 emcStatus->motion.axis[i].minHardLimit == 1) {
02876 emcOperatorError(0,"Minimum Hardware Limit on axis %d exceeded.", i);
02877 }
02878 last_emc_status.motion.axis[i].minHardLimit = emcStatus->motion.axis[i].minHardLimit;
02879 if (last_emc_status.motion.axis[i].maxHardLimit == 0 &&
02880 emcStatus->motion.axis[i].maxHardLimit == 1) {
02881 emcOperatorError(0,"Maximum Hardware Limit on axis %d exceeded.", i);
02882 }
02883 last_emc_status.motion.axis[i].maxHardLimit = emcStatus->motion.axis[i].maxHardLimit;
02884 }
02885
02886 // write it
02887 // since emcStatus was passed to the WM init functions, it
02888 // will be updated in the _update() functions above. There's
02889 // no need to call the individual functions on all WM items.
02890 emcStatusBuffer->write(emcStatus);
02891
02892 // wait on timer cycle, if specified, or calculate actual
02893 // interval if ini file says to run full out via
02894 // [TASK] CYCLE_TIME <= 0.0
02895 if (emcTaskNoDelay) {
02896 #if defined(LINUX_KERNEL_2_2)
02897 // work around bug in gettimeofday() by running off nominal time
02898 EMC_TASK_CYCLE_TIME = EMC_TASK_CYCLE_TIME_ORIG;
02899 minTime = maxTime = EMC_TASK_CYCLE_TIME_ORIG;
02900 #else
02901 endTime = etime();
02902 EMC_TASK_CYCLE_TIME = endTime - startTime;
02903 if (EMC_TASK_CYCLE_TIME < minTime && ! done) {
02904 minTime = EMC_TASK_CYCLE_TIME;
02905 }
02906 else if (EMC_TASK_CYCLE_TIME > maxTime && ! done) {
02907 maxTime = EMC_TASK_CYCLE_TIME;
02908 }
02909 startTime = endTime;
02910 #endif
02911 }
02912 else {
02913 #if defined(LINUX_KERNEL_2_2)
02914 // work around bug in gettimeofday() by running off nominal time
02915 esleep(EMC_TASK_CYCLE_TIME);
02916 #else
02917 timer->wait();
02918 #endif
02919 }
02920 } // end of while (! done)
02921
02922 // clean up everything
02923 emctask_shutdown();
02924
02925 if (NULL != logFp) {
02926 fclose(logFp);
02927 logFp = NULL;
02928 }
02929
02930 // FIXME-- debugging
02931 if (emcTaskNoDelay) {
02932 printf("cycle times (seconds): %f min, %f max\n", minTime, maxTime);
02933 }
02934
02935 // and leave
02936 exit(0);
02937 }
|
|
|
Definition at line 391 of file emctaskmain.cc. |
|
|
Definition at line 389 of file emctaskmain.cc. |
|
|
Definition at line 403 of file emctaskmain.cc. |
|
|
Definition at line 384 of file emctaskmain.cc. |
|
|
Definition at line 400 of file emctaskmain.cc. |
|
|
Definition at line 402 of file emctaskmain.cc. |
|
|
Definition at line 401 of file emctaskmain.cc. |
|
|
Definition at line 385 of file emctaskmain.cc. |
|
|
Definition at line 412 of file emctaskmain.cc. |
|
|
Definition at line 413 of file emctaskmain.cc. |
|
|
Definition at line 408 of file emctaskmain.cc. |
|
|
Definition at line 409 of file emctaskmain.cc. |
|
|
Definition at line 407 of file emctaskmain.cc. |
|
|
Definition at line 405 of file emctaskmain.cc. |
|
|
Definition at line 410 of file emctaskmain.cc. |
|
|
Definition at line 406 of file emctaskmain.cc. |
|
|
Definition at line 418 of file emctaskmain.cc. |
|
|
Definition at line 386 of file emctaskmain.cc. |
|
|
Definition at line 422 of file emctaskmain.cc. |
|
|
Definition at line 387 of file emctaskmain.cc. |
|
|
Definition at line 390 of file emctaskmain.cc. |
|
|
Definition at line 432 of file emctaskmain.cc. |
|
|
Definition at line 388 of file emctaskmain.cc. |
|
|
Definition at line 2650 of file emctaskmain.cc. |
|
|
Definition at line 417 of file emctaskmain.cc. |
|
|
Definition at line 425 of file emctaskmain.cc. |
|
|
Definition at line 419 of file emctaskmain.cc. |
|
|
Definition at line 423 of file emctaskmain.cc. |
|
|
Definition at line 433 of file emctaskmain.cc. |
|
|
Definition at line 421 of file emctaskmain.cc. |
|
|
Definition at line 392 of file emctaskmain.cc. |
|
|
Definition at line 396 of file emctaskmain.cc. |
|
|
Definition at line 393 of file emctaskmain.cc. |
|
|
Definition at line 394 of file emctaskmain.cc. |
|
|
Definition at line 398 of file emctaskmain.cc. |
|
|
Definition at line 397 of file emctaskmain.cc. |
|
|
Definition at line 399 of file emctaskmain.cc. |
|
|
Definition at line 395 of file emctaskmain.cc. |
|
|
Definition at line 415 of file emctaskmain.cc. |
|
|
Definition at line 420 of file emctaskmain.cc. |
|
|
Definition at line 440 of file emctaskmain.cc. |
|
|
Definition at line 438 of file emctaskmain.cc. |
|
|
Definition at line 439 of file emctaskmain.cc. |
|
|
Definition at line 429 of file emctaskmain.cc. |
|
|
Definition at line 428 of file emctaskmain.cc. |
|
|
Definition at line 430 of file emctaskmain.cc. |
|
|
Definition at line 416 of file emctaskmain.cc. |
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001