Command all jmCLIG modules from serial port

jmStepperAxis.c

Committer:
jm
Date:
2011-02-12
Revision:
0:9112e09912db

File content as of revision 0:9112e09912db:

/*************************************************************************
 * @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);
}