Jean Mercier
/
jmAll
Command all jmCLIG modules from serial port
Diff: jmStepperAxis.c
- Revision:
- 0:9112e09912db
diff -r 000000000000 -r 9112e09912db jmStepperAxis.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmStepperAxis.c Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,173 @@ +/************************************************************************* + * @file jmStepperAxis.c + * @brief Command Line Interface StepperAxis Module + * + * @version 1.0 + * @date Feb 12, 2011 + */ + +#include "jmMessages.h" +#include "jmStepperAxis.h" +#include "LPC17xx.h" +#include "main.h" +#include "jmCommands.h" +#include "jmMessages.h" +#include "jmRingBuffer.h" +#include "stdio.h" +#include "jmSwitch.h" +#include "jmStepper.h" + +#ifndef nonStop + #define nonStop 65535 +#endif + +#define NotInit 0 +#define Initialized 1 +#define CW 1 +#define CCW 0 +#define Open 1 +#define Close 0 +#define bothLimitSwitchActivated 4 +#define LimitCWReached 3 +#define LimitCCWReached 2 +#define LogicOK 1 +#define true 1 +#define false 0 + +// static structures creation +struct StructStepperAxis sStepperAxis[stepperAxisQty]; + +/** Module Data Structure Initialization + * @brief All State Machines put to sleep. + * @param[in] none + * @returns none + */ +void StepperAxisInit(void){ + int i; + for(i=0;i<stepperAxisQty;i++){ + sStepperAxis[i].active = false; + } +} + +/** @brief stepperAxis Command Line Interface. + * Set up a stepper axis from one stepper and two limit switch modules + * Command Line Format: stepperAxis id stepperID limitCWid limitCCWid + * @param[in] Extracted from command line id stepperID limitCWid limitCCWid + * @returns Message: GPPSTA id stepperID limitCWid limitCCWid status + */ +void cli_StepperAxis(void){ +unsigned int id, stepperID, limitCWid, limitCCWid; + + if(ExtractUInteger(pLine,&id,0,stepperAxisQty-1)){ // extract stepper axis id + if(ExtractUInteger(pLine,&stepperID,0,stepperQty-1)){ // extract stepper id + if(ExtractUInteger(pLine,&limitCWid,0,switchQty-1)){ // extract Limit Switch CW id + if(ExtractUInteger(pLine,&limitCCWid,0,switchQty-1)){ // extract Limit Switch CCW id + + sStepperAxis[id].active=true; + sStepperAxis[id].stepperID=stepperID; + sStepperAxis[id].limitCW=limitCWid; + sStepperAxis[id].limitCCW=limitCCWid; + + // chip report to GUI + rGPPSTA(id); + if(Feedback)printf("StepperAxis %d StepperID %d limitCCWid %d limitCWid %d\n",id,stepperID,limitCCWid,limitCWid); + return; + }// CCW + }// CW + }// stepper + }// axis + if(Help)printf("stepperAxis (Stepper id)0..3 (limit switch CCW id)0..7 (limit switch CW id)0..7\n"); + // Ignore pending command line + NextCommand(nl,pLine); +} + +/** @brief + * @param[in] none + * @returns + */ +void StepperAxisSM(void) +{ + int i; + for(i=0;i<stepperAxisQty;i++) + { + if(sStepperAxis[i].active==true) + { + uint8_t oldStatus = sStepperAxis[i].status; + + // Limits Reached + // two limits switches activated ? + if(sSwitch[sStepperAxis[i].limitCW].state == Close && sSwitch[sStepperAxis[i].limitCCW].state==Close){ + sStepper[sStepperAxis[i].stepperID].nSteps=0; // stop stepper + sStepperAxis[i].status = bothLimitSwitchActivated; + if(oldStatus != bothLimitSwitchActivated)rGPPSTA(i); // report change + continue; + } + // Limit Switch CW activated and step direction CW + if(sSwitch[sStepperAxis[i].limitCW].state == Close && sStepper[sStepperAxis[i].stepperID].cw ==CW){ + sStepper[sStepperAxis[i].stepperID].nSteps=0; // stop stepper + sStepperAxis[i].status = LimitCWReached; + if(oldStatus != LimitCWReached)rGPPSTA(i); // report change + continue; + } + + // Limit Switch CCW activated and step direction CCW + if(sSwitch[sStepperAxis[i].limitCCW].state == Close && sStepper[sStepperAxis[i].stepperID].cw ==CCW){ + sStepper[sStepperAxis[i].stepperID].nSteps=0; // stop stepper + sStepperAxis[i].status = LimitCCWReached; + if(oldStatus != LimitCCWReached)rGPPSTA(i); // report change + continue; + } + + // safe operating area + // no limit switch activated + if(sSwitch[sStepperAxis[i].limitCW].state == Open && sSwitch[sStepperAxis[i].limitCCW].state == Open){ + sStepperAxis[i].status = LogicOK; + if(oldStatus != LogicOK)rGPPSTA(i); // report change + continue; + } + + // Limit Switch CW activated and step direction CCW + if(sSwitch[sStepperAxis[i].limitCW].state == Close && sStepper[sStepperAxis[i].stepperID].cw ==CCW){ + sStepperAxis[i].status = LogicOK; + if(oldStatus != LogicOK)rGPPSTA(i); // report change + continue; + } + + // Limit Switch CCW activated and step direction CW + if(sSwitch[sStepperAxis[i].limitCCW].state == Close && sStepper[sStepperAxis[i].stepperID].cw ==CW){ + sStepperAxis[i].status = LogicOK; + if(oldStatus != LogicOK)rGPPSTA(i); // report change + continue; + } + } + } +} + +/** Module Get Module Process Properties Command Line Interface + * @brief Command Line Interface to Get Module Public Process Properties + * @param[in] id Extracted from command line id Process identification + * @returns none + */ +void cli_GPPSTA(void) +{ unsigned int id; + if(ExtractUInteger(pLine,&id,0,stepperAxisQty-1)){ // extract id + rGPPSTA(id); + return; + } + + if(Help)printf("GPPSTA (StepperAxis id)0..%d\n",stepperAxisQty-1); + // Ignore pending command line + NextCommand(nl,pLine); +} + +/** Public Properties Message + * @brief Send Process Properties to update GUI + * @param[in] id Process identification + * @returns Message: GPPSTA id stepperID limitCWid limitCCWid status + */ +void rGPPSTA(unsigned int id ){ + int status; + if(sStepperAxis[id].active==false)status=0; + else status = sStepperAxis[id].status; + printf("GPPSTA %d %d %d %d %d\n",id,sStepperAxis[id].stepperID,sStepperAxis[id].limitCCW,sStepperAxis[id].limitCW ,status); +}