Jean Mercier
/
jmStepperAxis
Control up to 4 steppers axis with limit switch logic from serial port
Diff: jmSwitch.c
- Revision:
- 0:3e676fcd9c71
diff -r 000000000000 -r 3e676fcd9c71 jmSwitch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmSwitch.c Sat Feb 12 16:49:03 2011 +0000 @@ -0,0 +1,152 @@ +/************************************************************************* + * @file jmSwitch.c + * @brief Switch Debounce Module + * + * @version 1.0 + * @date Feb 12, 2011 +*/ + +#include "jmRingBuffer.h" +#include "jmMessages.h" +#include "jmSwitch.h" +#include "LPC17xx.h" +#include "main.h" +#include "jmCommands.h" +#include "jmMessages.h" +#include "jmRingBuffer.h" +#include "stdio.h" + +#define swClose 0 +#define swOpen 1 +#define swNotInit 2 + + +// Static structure creation +struct StructSwitch sSwitch[switchQty]; + +/*********************************************************************** + * @brief Limit Switch Module Reset + * @param[in] none + * @return none + **********************************************************************/ +void SwitchModuleReset(void){ + int i; + for(i=0;i<switchQty;i++){ + sSwitch[i].state=swNotInit; + } +} + +/*********************************************************************** + * @brief Initialize an input Switch process + * Format: command name (arg info)min..max values + * Command Line Format: swInit (Switch id)0..7 (Pin number)0..432 (Debounce)1..255 + * @param[in] Extracted from command line (Switch id)0..7 (Pin number)0..432 (Debounce)1..255 + * @return Send Message GPPS0 id pin debounce state + **********************************************************************/ +void cli_SwitchInit(void){ + //get switch id, DIP number, debounce time and update structure + unsigned int swNum, pin, debounce, state, port,bitValue; + if(ExtractUInteger(pLine,&swNum,0,7)){ + if(ExtractUInteger(pLine,&pin,0,432)){ + if(ExtractUInteger(pLine,&debounce,1,255)){ + // Get port, bit and bit value + port = pin/100; + bitValue = 1<<(pin%100); + + sSwitch[swNum].pin = (uint8_t)pin; + sSwitch[swNum].port = jmGPIO[port]; + sSwitch[swNum].bitValue = bitValue; + sSwitch[swNum].debounce = (uint8_t)debounce; + // read Switch present state + state = sSwitch[swNum].port->FIOPIN &= sSwitch[swNum].bitValue; + if(state>0)sSwitch[swNum].state = swOpen; + else sSwitch[swNum].state = swClose; + rGPPS0(swNum); // Message GPPS0 id pin debounce state + if(Feedback)printf("SW %d Pin %d Debounce %d Value %d\n",swNum,pin,debounce,state); + + return; + } + } + } + if(Help)printf("swInit (Switch id)0..7 (Pin number)0..432 (Debounce)1..255\n"); + + // Ignore pending command line + NextCommand(nl,pLine); +} + +/*********************************************************************** + * @brief Switch Edge Detection + * @param[in] none + * @return Send Message GPPS0 id pin debounce state + **********************************************************************/ +void SwitchEdgeDetect(void){ + unsigned int presentState,i; + + for(i=0;i<switchQty;i++){ // for each switch SM + if(sSwitch[i].state < swNotInit){ // Switch initialized ? + if(sSwitch[i].eggTimer==0){ // debouncing ? + + presentState = sSwitch[i].port->FIOPIN &= sSwitch[i].bitValue; + + if(presentState > 0)presentState = swOpen; // present switch state + else presentState = swClose; + + if(sSwitch[i].state > presentState ){ // High to Low edge ? + sSwitch[i].eggTimer = sSwitch[i].debounce; // load debounce time + // memorize presentState + sSwitch[i].state = presentState; + rGPPS0(i); // GPPS0 message + } + else{ + if(presentState > sSwitch[i].state ){ // Low to High edge ? + sSwitch[i].eggTimer = sSwitch[i].debounce;// load debounce time + // memorize presentState + sSwitch[i].state = presentState; + rGPPS0(i); // GPPS0 message + } + } + } + } + } +} + +/*********************************************************************** + * @brief Command line interface to read Limit Switch Status + * Format: command name (arg info)min..max values + * Command Line Format: swRead (Switch id number)0..7 + * @param[in] Extracted from command line (switch id number)0..7 + * @return Message GPPS0 id pin debounce state + **********************************************************************/ +void cli_SwitchRead(void){ + unsigned int swNumber; + if(ExtractUInteger(pLine,&swNumber,0,7)){ + // One Message GPPS0 id pin debounce state + rGPPS0(swNumber); + return; + } + if(Help)printf("swRead (Switch id number)0..7\n"); + // Ignore pending command line + NextCommand(nl,pLine); +} + +/** Get Module Process Properties Command Line Interface + * @brief Command Line Interface to Get All Public Process Properties + * @param[in] none + * @returns 8 Messages: GPPS0 id pin debounce state + */ +void cli_GPPS0(void){ + int i; + for(i=0;i<switchQty;i++){ + rGPPS0(i); // Message GPPS0 id pin debounce state + } +} + +/** Public Properties Message + * @brief Send Process Properties to update GUI + * @param[in] id Process identification + * @returns Message GPPS0 id pin debounce state + */ +void rGPPS0(unsigned int id ) +{ + printf("GPPS0 %d %d %d %d\n",id,sSwitch[id].pin,sSwitch[id].debounce,sSwitch[id].state); +}