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 "canon.hh"             
00020 #include "emcio.hh"             
00021 #include "emcglb.h"             
00022 #include "initool.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: minimilltool.cc,v 1.4 2001/06/29 20:27:29 wshackle Exp $";
00032 
00033 
00034 #define auxStatus ((EMC_AUX_STAT *) statusInData[auxSubNum])
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 static int loadToolTable(const char *filename, CANON_TOOL_TABLE toolTable[])
00043 {
00044   int t;
00045   FILE *fp;
00046   char buffer[CANON_TOOL_ENTRY_LEN];
00047   const char *name;
00048 
00049   
00050   if (filename[0] == 0)
00051     {
00052       name = TOOL_TABLE_FILE;
00053     }
00054   else
00055     {
00056       
00057       name = filename;
00058     }
00059 
00060   
00061   if (NULL == (fp = fopen(name, "r")))
00062     {
00063       
00064       return -1;
00065     }
00066 
00067   
00068   for (t = 0; t <= CANON_TOOL_MAX; t++)
00069     {
00070       
00071       toolTable[t].id = 0;
00072       toolTable[t].length = 0.0;
00073       toolTable[t].diameter = 0.0;
00074     }
00075 
00076   
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087   
00088   if (NULL == fgets(buffer, 256, fp))
00089     {
00090       
00091       fclose(fp);
00092       return -1;
00093     }
00094 
00095   while (!feof(fp))
00096     {
00097       int pocket;
00098       int id;
00099       double length;
00100       double diameter;
00101 
00102       
00103       if (NULL == fgets(buffer, CANON_TOOL_ENTRY_LEN, fp))
00104         {
00105           break;
00106         }
00107 
00108       if (4 != sscanf(buffer, "%d %d %lf %lf",
00109                       &pocket, &id, &length, &diameter))
00110         {
00111           
00112           continue;
00113         }
00114       else
00115         {
00116           if (pocket < 0 || pocket > CANON_TOOL_MAX)
00117             {
00118               continue;
00119             }
00120           else
00121             {
00122               toolTable[pocket].id = id;
00123               toolTable[pocket].length = length;
00124               toolTable[pocket].diameter = diameter;
00125             }
00126         }
00127     }
00128 
00129   
00130   fclose(fp);
00131 
00132   return 0;
00133 }
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 static int saveToolTable(const char *filename, CANON_TOOL_TABLE toolTable[])
00142 {
00143   int pocket;
00144   FILE *fp;
00145   const char *name;
00146 
00147   
00148   if (filename[0] == 0)
00149     {
00150       name = TOOL_TABLE_FILE;
00151     }
00152   else
00153     {
00154       
00155       name = filename;
00156     }
00157 
00158   
00159   if (NULL == (fp = fopen(name, "w")))
00160     {
00161       
00162       return -1;
00163     }
00164 
00165   
00166   fprintf(fp, "POC\tFMS\tLEN\t\tDIAM\n");
00167 
00168   for (pocket = 1; pocket <= CANON_TOOL_MAX; pocket++)
00169     {
00170       fprintf(fp, "%d\t%d\t%f\t%f\n",
00171               pocket,
00172               toolTable[pocket].id,
00173               toolTable[pocket].length,
00174               toolTable[pocket].diameter);
00175     }
00176 
00177   
00178   fclose(fp);
00179 
00180   return 0;
00181 }
00182 
00183 
00184 
00185 EMC_TOOL_MODULE::EMC_TOOL_MODULE()
00186 {
00187   EMC_TOOL_INIT initMsg;
00188 
00189   setErrorLogChannel(new NML(nmlErrorFormat, "emcError", "tool", EMC_NMLFILE));
00190 
00191   setCmdChannel(new RCS_CMD_CHANNEL(emcFormat, "toolCmd", "tool", EMC_NMLFILE));
00192 
00193   setStatChannel(new RCS_STAT_CHANNEL(emcFormat, "toolSts", "tool", EMC_NMLFILE), &ioStatus);
00194 
00195   auxSubNum = addSubordinate(new RCS_CMD_CHANNEL(emcFormat, "auxCmd", "tool", EMC_NMLFILE), new RCS_STAT_CHANNEL(emcFormat, "auxSts", "tool", EMC_NMLFILE));
00196 
00197   
00198   deltaClock = 0.0;
00199 
00200   
00201   initMsg.serial_number = 1;    
00202   commandIn->write(initMsg);
00203 }
00204 
00205 
00206 
00207 EMC_TOOL_MODULE::~EMC_TOOL_MODULE(void)
00208 {
00209 }
00210 
00211 void EMC_TOOL_MODULE::DECISION_PROCESS(void)
00212 {
00213   switch (commandInData->type)
00214     {
00215     case EMC_SET_DEBUG_TYPE:
00216       
00217 
00218 
00219       EMC_DEBUG = ((EMC_SET_DEBUG *) commandInData)->debug;
00220       ioStatus.debug = EMC_DEBUG;
00221       status = RCS_DONE;
00222       stateNext(S0);
00223       break;
00224 
00225     case EMC_TOOL_INIT_TYPE:
00226       INIT((EMC_TOOL_INIT *) commandInData);
00227       break;
00228 
00229     case EMC_TOOL_HALT_TYPE:
00230       HALT((EMC_TOOL_HALT *) commandInData);
00231       break;
00232 
00233     case EMC_TOOL_ABORT_TYPE:
00234       ABORT((EMC_TOOL_ABORT *) commandInData);
00235       break;
00236 
00237     case EMC_TOOL_PREPARE_TYPE:
00238       TOOL_PREPARE((EMC_TOOL_PREPARE *) commandInData);
00239       break;
00240 
00241     case EMC_TOOL_LOAD_TYPE:
00242       TOOL_LOAD((EMC_TOOL_LOAD *) commandInData);
00243       break;
00244 
00245     case EMC_TOOL_UNLOAD_TYPE:
00246       TOOL_UNLOAD((EMC_TOOL_UNLOAD *) commandInData);
00247       break;
00248 
00249     case EMC_TOOL_LOAD_TOOL_TABLE_TYPE:
00250       TOOL_LOAD_TOOL_TABLE((EMC_TOOL_LOAD_TOOL_TABLE *) commandInData);
00251       break;
00252 
00253     case EMC_TOOL_SET_OFFSET_TYPE:
00254       TOOL_SET_OFFSET((EMC_TOOL_SET_OFFSET *) commandInData);
00255       break;
00256 
00257     case EMC_AUX_ESTOP_ON_TYPE:
00258       AUX_ESTOP_ON((EMC_AUX_ESTOP_ON *) commandInData);
00259       break;
00260 
00261     case EMC_AUX_ESTOP_OFF_TYPE:
00262       AUX_ESTOP_OFF((EMC_AUX_ESTOP_OFF *) commandInData);
00263       break;
00264 
00265     case EMC_AUX_DIO_WRITE_TYPE:
00266       AUX_DIO_WRITE((EMC_AUX_DIO_WRITE *) commandInData);
00267       break;
00268 
00269     case EMC_AUX_AIO_WRITE_TYPE:
00270       AUX_AIO_WRITE((EMC_AUX_AIO_WRITE *) commandInData);
00271       break;
00272 
00273     default:
00274       REPORT_ERROR(commandInData);
00275       break;
00276     }
00277 }
00278 
00279 void EMC_TOOL_MODULE::PRE_PROCESS(void)
00280 {
00281 }
00282 
00283 void EMC_TOOL_MODULE::POST_PROCESS(void)
00284 {
00285   
00286   ioStatus.aux = *auxStatus;
00287 
00288   
00289   ioStatus.heartbeat++;
00290 }
00291 
00292 void EMC_TOOL_MODULE::INIT(EMC_TOOL_INIT *cmdIn)
00293 {
00294   EMC_AUX_INIT auxInitMsg;
00295 
00296   if (STATE_MATCH(NEW_COMMAND))
00297     {
00298       
00299       iniTool(EMC_INIFILE);
00300       loadToolTable(TOOL_TABLE_FILE, ioStatus.tool.toolTable);
00301 
00302       
00303       sendCommand(&auxInitMsg, auxSubNum);
00304 
00305       status = RCS_EXEC;
00306       stateNext(S1);
00307 
00308     }
00309   else if (STATE_MATCH(S0))
00310     {
00311       
00312     }
00313   else if (STATE_MATCH(S1,
00314                        auxStatus->status == RCS_DONE))
00315     {
00316       
00317       status = RCS_DONE;
00318       stateNext(S0);
00319     }
00320   else if (STATE_MATCH(S1,
00321                        auxStatus->status == RCS_ERROR))
00322     {
00323       
00324       status = RCS_ERROR;
00325       stateNext(S0);
00326     }
00327   else if (STATE_MATCH(S1))
00328     {
00329       
00330     }
00331 }
00332 
00333 void EMC_TOOL_MODULE::HALT(EMC_TOOL_HALT *cmdIn)
00334 {
00335   EMC_AUX_HALT auxHaltMsg;
00336 
00337   if (STATE_MATCH(NEW_COMMAND))
00338     {
00339       sendCommand(&auxHaltMsg, auxSubNum);
00340 
00341       status = RCS_EXEC;
00342       stateNext(S1);
00343     }
00344   else if (STATE_MATCH(S0))
00345     {
00346       
00347     }
00348   else if (STATE_MATCH(S1,
00349                        auxStatus->status == RCS_DONE))
00350 
00351     {
00352       
00353 
00354       status = RCS_DONE;
00355       stateNext(S0);
00356     }
00357   else if (STATE_MATCH(S1,
00358                        auxStatus->status == RCS_ERROR))
00359     {
00360       
00361 
00362       status = RCS_ERROR;
00363       stateNext(S0);
00364     }
00365   else if (STATE_MATCH(S1))
00366     {
00367       
00368     }
00369 }
00370 
00371 void EMC_TOOL_MODULE::ABORT(EMC_TOOL_ABORT *cmdIn)
00372 {
00373   EMC_AUX_ABORT auxAbortMsg;
00374 
00375   if (STATE_MATCH(NEW_COMMAND))
00376     {
00377       sendCommand(&auxAbortMsg, auxSubNum);
00378 
00379       status = RCS_EXEC;
00380       stateNext(S1);
00381     }
00382   else if (STATE_MATCH(S0))
00383     {
00384       
00385     }
00386   else if (STATE_MATCH(S1,
00387                        auxStatus->status == RCS_DONE))
00388     {
00389       
00390 
00391       status = RCS_DONE;
00392       stateNext(S0);
00393     }
00394   else if (STATE_MATCH(S1,
00395                        auxStatus->status == RCS_ERROR))
00396     {
00397       
00398 
00399       status = RCS_ERROR;
00400       stateNext(S0);
00401     }
00402   else if (STATE_MATCH(S1))
00403     {
00404       
00405     }
00406 }
00407 
00408 void EMC_TOOL_MODULE::REPORT_ERROR(RCS_CMD_MSG *cmdIn)
00409 {
00410   if (STATE_MATCH(NEW_COMMAND))
00411     {
00412       rcs_print_error("EMC_TOOL_MODULE: unknown command %d\n",
00413                       cmdIn->type);
00414       status = RCS_ERROR;
00415       stateNext(S0);
00416     }
00417   else if (STATE_MATCH(S0))
00418     {
00419       
00420     }
00421 }
00422 
00423 void EMC_TOOL_MODULE::TOOL_PREPARE(EMC_TOOL_PREPARE *cmdIn)
00424 {
00425   if (STATE_MATCH(NEW_COMMAND))
00426     {
00427       ioStatus.tool.toolPrepped = cmdIn->tool;
00428 
00429       status = RCS_DONE;
00430       stateNext(S0);
00431     }
00432   else if (STATE_MATCH(S0))
00433     {
00434       
00435     }
00436 }
00437 
00438 void EMC_TOOL_MODULE::TOOL_LOAD(EMC_TOOL_LOAD *cmdIn)
00439 {
00440   if (STATE_MATCH(NEW_COMMAND))
00441     {
00442       ioStatus.tool.toolInSpindle = ioStatus.tool.toolPrepped;
00443       ioStatus.tool.toolPrepped = 0;
00444 
00445       status = RCS_DONE;
00446       stateNext(S0);
00447     }
00448   else if (STATE_MATCH(S0))
00449     {
00450       
00451     }
00452 }
00453 
00454 void EMC_TOOL_MODULE::TOOL_UNLOAD(EMC_TOOL_UNLOAD *cmdIn)
00455 {
00456   if (STATE_MATCH(NEW_COMMAND))
00457     {
00458       ioStatus.tool.toolInSpindle = 0;
00459 
00460       status = RCS_DONE;
00461       stateNext(S0);
00462     }
00463   else if (STATE_MATCH(S0))
00464     {
00465       
00466     }
00467 }
00468 
00469 void EMC_TOOL_MODULE::TOOL_LOAD_TOOL_TABLE(EMC_TOOL_LOAD_TOOL_TABLE *cmdIn)
00470 {
00471   if (STATE_MATCH(NEW_COMMAND))
00472     {
00473       if (0 != loadToolTable(cmdIn->file, ioStatus.tool.toolTable))
00474         {
00475           status = RCS_ERROR;
00476         }
00477       else
00478         {
00479           status = RCS_DONE;
00480         }
00481       stateNext(S0);
00482     }
00483   else if (STATE_MATCH(S0))
00484     {
00485       
00486     }
00487 }
00488 
00489 void EMC_TOOL_MODULE::TOOL_SET_OFFSET(EMC_TOOL_SET_OFFSET *cmdIn)
00490 {
00491   if (STATE_MATCH(NEW_COMMAND))
00492     {
00493       if (cmdIn->tool < 0 || cmdIn->tool > CANON_TOOL_MAX)
00494         {
00495           status = RCS_ERROR;
00496           stateNext(S0);
00497         }
00498       else
00499         {
00500           
00501           ioStatus.tool.toolTable[cmdIn->tool].length = cmdIn->length;
00502           ioStatus.tool.toolTable[cmdIn->tool].diameter = cmdIn->diameter;
00503 
00504           if (0 != saveToolTable(TOOL_TABLE_FILE, ioStatus.tool.toolTable))
00505             {
00506               status = RCS_ERROR;
00507             }
00508           else
00509             {
00510               status = RCS_DONE;
00511             }
00512           stateNext(S0);
00513         }
00514     }
00515   else if (STATE_MATCH(S0))
00516     {
00517       
00518     }
00519 }
00520 
00521 
00522 void EMC_TOOL_MODULE::AUX_ESTOP_ON(EMC_AUX_ESTOP_ON *cmdIn)
00523 {
00524   EMC_AUX_ESTOP_ON estopOnMsg;
00525 
00526   if (STATE_MATCH(NEW_COMMAND))
00527     {
00528       sendCommand(&estopOnMsg, auxSubNum);
00529 
00530       status = RCS_EXEC;
00531       stateNext(S1);
00532     }
00533   else if (STATE_MATCH(S0))
00534     {
00535       
00536     }
00537   else if (STATE_MATCH(S1,
00538                        auxStatus->status == RCS_DONE))
00539     {
00540       status = RCS_DONE;
00541       stateNext(S0);
00542     }
00543   else if (STATE_MATCH(S1,
00544                        auxStatus->status == RCS_ERROR))
00545     {
00546       status = RCS_ERROR;
00547       stateNext(S0);
00548     }
00549   else if (STATE_MATCH(S1,
00550                        auxStatus->status == RCS_EXEC))
00551     {
00552       
00553     }
00554 }
00555 
00556 void EMC_TOOL_MODULE::AUX_ESTOP_OFF(EMC_AUX_ESTOP_OFF *cmdIn)
00557 {
00558   EMC_AUX_ESTOP_OFF estopOffMsg;
00559 
00560   if (STATE_MATCH(NEW_COMMAND))
00561     {
00562       sendCommand(&estopOffMsg, auxSubNum);
00563 
00564       status = RCS_EXEC;
00565       stateNext(S1);
00566     }
00567   else if (STATE_MATCH(S0))
00568     {
00569       
00570     }
00571   else if (STATE_MATCH(S1,
00572                        auxStatus->status == RCS_DONE))
00573     {
00574       status = RCS_DONE;
00575       stateNext(S0);
00576     }
00577   else if (STATE_MATCH(S1,
00578                        auxStatus->status == RCS_ERROR))
00579     {
00580       status = RCS_ERROR;
00581       stateNext(S0);
00582     }
00583   else if (STATE_MATCH(S1,
00584                        auxStatus->status == RCS_EXEC))
00585     {
00586       
00587     }
00588 }
00589 
00590 void EMC_TOOL_MODULE::AUX_DIO_WRITE(EMC_AUX_DIO_WRITE *cmdIn)
00591 {
00592   EMC_AUX_DIO_WRITE dioWriteMsg = *cmdIn;
00593 
00594   if (STATE_MATCH(NEW_COMMAND))
00595     {
00596       sendCommand(&dioWriteMsg, auxSubNum);
00597 
00598       status = RCS_EXEC;
00599       stateNext(S1);
00600     }
00601   else if (STATE_MATCH(S0))
00602     {
00603       
00604     }
00605   else if (STATE_MATCH(S1,
00606                        auxStatus->status == RCS_DONE))
00607     {
00608       status = RCS_DONE;
00609       stateNext(S0);
00610     }
00611   else if (STATE_MATCH(S1,
00612                        auxStatus->status == RCS_ERROR))
00613     {
00614       status = RCS_ERROR;
00615       stateNext(S0);
00616     }
00617   else if (STATE_MATCH(S1,
00618                        auxStatus->status == RCS_EXEC))
00619     {
00620       
00621     }
00622 }
00623 
00624 void EMC_TOOL_MODULE::AUX_AIO_WRITE(EMC_AUX_AIO_WRITE *cmdIn)
00625 {
00626   EMC_AUX_AIO_WRITE aioWriteMsg = *cmdIn;
00627 
00628   if (STATE_MATCH(NEW_COMMAND))
00629     {
00630       sendCommand(&aioWriteMsg, auxSubNum);
00631 
00632       status = RCS_EXEC;
00633       stateNext(S1);
00634     }
00635   else if (STATE_MATCH(S0))
00636     {
00637       
00638     }
00639   else if (STATE_MATCH(S1,
00640                        auxStatus->status == RCS_DONE))
00641     {
00642       status = RCS_DONE;
00643       stateNext(S0);
00644     }
00645   else if (STATE_MATCH(S1,
00646                        auxStatus->status == RCS_ERROR))
00647     {
00648       status = RCS_ERROR;
00649       stateNext(S0);
00650     }
00651   else if (STATE_MATCH(S1,
00652                        auxStatus->status == RCS_EXEC))
00653     {
00654       
00655     }
00656 }