Read up to 8 debounced switches from serial port

Dependencies:   mbed

Committer:
jm
Date:
Sat Feb 12 16:46:49 2011 +0000
Revision:
0:f3a5f6fe1c03
jmSwitch Command Line Interface Module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jm 0:f3a5f6fe1c03 1 /*************************************************************************
jm 0:f3a5f6fe1c03 2 * @file jmSwitch.c
jm 0:f3a5f6fe1c03 3 * @brief Switch Debounce Module
jm 0:f3a5f6fe1c03 4 *
jm 0:f3a5f6fe1c03 5 * @version 1.0
jm 0:f3a5f6fe1c03 6 * @date Feb 12, 2011
jm 0:f3a5f6fe1c03 7 */
jm 0:f3a5f6fe1c03 8
jm 0:f3a5f6fe1c03 9 #include "jmRingBuffer.h"
jm 0:f3a5f6fe1c03 10 #include "jmMessages.h"
jm 0:f3a5f6fe1c03 11 #include "jmSwitch.h"
jm 0:f3a5f6fe1c03 12 #include "LPC17xx.h"
jm 0:f3a5f6fe1c03 13 #include "main.h"
jm 0:f3a5f6fe1c03 14 #include "jmCommands.h"
jm 0:f3a5f6fe1c03 15 #include "jmMessages.h"
jm 0:f3a5f6fe1c03 16 #include "jmRingBuffer.h"
jm 0:f3a5f6fe1c03 17 #include "stdio.h"
jm 0:f3a5f6fe1c03 18
jm 0:f3a5f6fe1c03 19 #define swClose 0
jm 0:f3a5f6fe1c03 20 #define swOpen 1
jm 0:f3a5f6fe1c03 21 #define swNotInit 2
jm 0:f3a5f6fe1c03 22
jm 0:f3a5f6fe1c03 23
jm 0:f3a5f6fe1c03 24 // Static structure creation
jm 0:f3a5f6fe1c03 25 struct StructSwitch sSwitch[switchQty];
jm 0:f3a5f6fe1c03 26
jm 0:f3a5f6fe1c03 27 /***********************************************************************
jm 0:f3a5f6fe1c03 28 * @brief Limit Switch Module Reset
jm 0:f3a5f6fe1c03 29 * @param[in] none
jm 0:f3a5f6fe1c03 30 * @return none
jm 0:f3a5f6fe1c03 31 **********************************************************************/
jm 0:f3a5f6fe1c03 32 void SwitchModuleReset(void){
jm 0:f3a5f6fe1c03 33 int i;
jm 0:f3a5f6fe1c03 34 for(i=0;i<switchQty;i++){
jm 0:f3a5f6fe1c03 35 sSwitch[i].state=swNotInit;
jm 0:f3a5f6fe1c03 36 }
jm 0:f3a5f6fe1c03 37 }
jm 0:f3a5f6fe1c03 38
jm 0:f3a5f6fe1c03 39 /***********************************************************************
jm 0:f3a5f6fe1c03 40 * @brief Initialize an input Switch process
jm 0:f3a5f6fe1c03 41 * Format: command name (arg info)min..max values
jm 0:f3a5f6fe1c03 42 * Command Line Format: swInit (Switch id)0..7 (Pin number)0..432 (Debounce)1..255
jm 0:f3a5f6fe1c03 43 * @param[in] Extracted from command line (Switch id)0..7 (Pin number)0..432 (Debounce)1..255
jm 0:f3a5f6fe1c03 44 * @return Send Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 45 **********************************************************************/
jm 0:f3a5f6fe1c03 46 void cli_SwitchInit(void){
jm 0:f3a5f6fe1c03 47 //get switch id, DIP number, debounce time and update structure
jm 0:f3a5f6fe1c03 48 unsigned int swNum, pin, debounce, state, port,bitValue;
jm 0:f3a5f6fe1c03 49 if(ExtractUInteger(pLine,&swNum,0,7)){
jm 0:f3a5f6fe1c03 50 if(ExtractUInteger(pLine,&pin,0,432)){
jm 0:f3a5f6fe1c03 51 if(ExtractUInteger(pLine,&debounce,1,255)){
jm 0:f3a5f6fe1c03 52 // Get port, bit and bit value
jm 0:f3a5f6fe1c03 53 port = pin/100;
jm 0:f3a5f6fe1c03 54 bitValue = 1<<(pin%100);
jm 0:f3a5f6fe1c03 55
jm 0:f3a5f6fe1c03 56 sSwitch[swNum].pin = (uint8_t)pin;
jm 0:f3a5f6fe1c03 57 sSwitch[swNum].port = jmGPIO[port];
jm 0:f3a5f6fe1c03 58 sSwitch[swNum].bitValue = bitValue;
jm 0:f3a5f6fe1c03 59 sSwitch[swNum].debounce = (uint8_t)debounce;
jm 0:f3a5f6fe1c03 60 // read Switch present state
jm 0:f3a5f6fe1c03 61 state = sSwitch[swNum].port->FIOPIN &= sSwitch[swNum].bitValue;
jm 0:f3a5f6fe1c03 62 if(state>0)sSwitch[swNum].state = swOpen;
jm 0:f3a5f6fe1c03 63 else sSwitch[swNum].state = swClose;
jm 0:f3a5f6fe1c03 64 rGPPS0(swNum); // Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 65 if(Feedback)printf("SW %d Pin %d Debounce %d Value %d\n",swNum,pin,debounce,state);
jm 0:f3a5f6fe1c03 66
jm 0:f3a5f6fe1c03 67 return;
jm 0:f3a5f6fe1c03 68 }
jm 0:f3a5f6fe1c03 69 }
jm 0:f3a5f6fe1c03 70 }
jm 0:f3a5f6fe1c03 71 if(Help)printf("swInit (Switch id)0..7 (Pin number)0..432 (Debounce)1..255\n");
jm 0:f3a5f6fe1c03 72
jm 0:f3a5f6fe1c03 73 // Ignore pending command line
jm 0:f3a5f6fe1c03 74 NextCommand(nl,pLine);
jm 0:f3a5f6fe1c03 75 }
jm 0:f3a5f6fe1c03 76
jm 0:f3a5f6fe1c03 77 /***********************************************************************
jm 0:f3a5f6fe1c03 78 * @brief Switch Edge Detection
jm 0:f3a5f6fe1c03 79 * @param[in] none
jm 0:f3a5f6fe1c03 80 * @return Send Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 81 **********************************************************************/
jm 0:f3a5f6fe1c03 82 void SwitchEdgeDetect(void){
jm 0:f3a5f6fe1c03 83 unsigned int presentState,i;
jm 0:f3a5f6fe1c03 84
jm 0:f3a5f6fe1c03 85 for(i=0;i<switchQty;i++){ // for each switch SM
jm 0:f3a5f6fe1c03 86 if(sSwitch[i].state < swNotInit){ // Switch initialized ?
jm 0:f3a5f6fe1c03 87 if(sSwitch[i].eggTimer==0){ // debouncing ?
jm 0:f3a5f6fe1c03 88
jm 0:f3a5f6fe1c03 89 presentState = sSwitch[i].port->FIOPIN &= sSwitch[i].bitValue;
jm 0:f3a5f6fe1c03 90
jm 0:f3a5f6fe1c03 91 if(presentState > 0)presentState = swOpen; // present switch state
jm 0:f3a5f6fe1c03 92 else presentState = swClose;
jm 0:f3a5f6fe1c03 93
jm 0:f3a5f6fe1c03 94 if(sSwitch[i].state > presentState ){ // High to Low edge ?
jm 0:f3a5f6fe1c03 95 sSwitch[i].eggTimer = sSwitch[i].debounce; // load debounce time
jm 0:f3a5f6fe1c03 96 // memorize presentState
jm 0:f3a5f6fe1c03 97 sSwitch[i].state = presentState;
jm 0:f3a5f6fe1c03 98 rGPPS0(i); // GPPS0 message
jm 0:f3a5f6fe1c03 99 }
jm 0:f3a5f6fe1c03 100 else{
jm 0:f3a5f6fe1c03 101 if(presentState > sSwitch[i].state ){ // Low to High edge ?
jm 0:f3a5f6fe1c03 102 sSwitch[i].eggTimer = sSwitch[i].debounce;// load debounce time
jm 0:f3a5f6fe1c03 103 // memorize presentState
jm 0:f3a5f6fe1c03 104 sSwitch[i].state = presentState;
jm 0:f3a5f6fe1c03 105 rGPPS0(i); // GPPS0 message
jm 0:f3a5f6fe1c03 106 }
jm 0:f3a5f6fe1c03 107 }
jm 0:f3a5f6fe1c03 108 }
jm 0:f3a5f6fe1c03 109 }
jm 0:f3a5f6fe1c03 110 }
jm 0:f3a5f6fe1c03 111 }
jm 0:f3a5f6fe1c03 112
jm 0:f3a5f6fe1c03 113 /***********************************************************************
jm 0:f3a5f6fe1c03 114 * @brief Command line interface to read Limit Switch Status
jm 0:f3a5f6fe1c03 115 * Format: command name (arg info)min..max values
jm 0:f3a5f6fe1c03 116 * Command Line Format: swRead (Switch id number)0..7
jm 0:f3a5f6fe1c03 117 * @param[in] Extracted from command line (switch id number)0..7
jm 0:f3a5f6fe1c03 118 * @return Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 119 **********************************************************************/
jm 0:f3a5f6fe1c03 120 void cli_SwitchRead(void){
jm 0:f3a5f6fe1c03 121 unsigned int swNumber;
jm 0:f3a5f6fe1c03 122 if(ExtractUInteger(pLine,&swNumber,0,7)){
jm 0:f3a5f6fe1c03 123 // One Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 124 rGPPS0(swNumber);
jm 0:f3a5f6fe1c03 125 return;
jm 0:f3a5f6fe1c03 126 }
jm 0:f3a5f6fe1c03 127 if(Help)printf("swRead (Switch id number)0..7\n");
jm 0:f3a5f6fe1c03 128 // Ignore pending command line
jm 0:f3a5f6fe1c03 129 NextCommand(nl,pLine);
jm 0:f3a5f6fe1c03 130 }
jm 0:f3a5f6fe1c03 131
jm 0:f3a5f6fe1c03 132 /** Get Module Process Properties Command Line Interface
jm 0:f3a5f6fe1c03 133 * @brief Command Line Interface to Get All Public Process Properties
jm 0:f3a5f6fe1c03 134 * @param[in] none
jm 0:f3a5f6fe1c03 135 * @returns 8 Messages: GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 136 */
jm 0:f3a5f6fe1c03 137 void cli_GPPS0(void){
jm 0:f3a5f6fe1c03 138 int i;
jm 0:f3a5f6fe1c03 139 for(i=0;i<switchQty;i++){
jm 0:f3a5f6fe1c03 140 rGPPS0(i); // Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 141 }
jm 0:f3a5f6fe1c03 142 }
jm 0:f3a5f6fe1c03 143
jm 0:f3a5f6fe1c03 144 /** Public Properties Message
jm 0:f3a5f6fe1c03 145 * @brief Send Process Properties to update GUI
jm 0:f3a5f6fe1c03 146 * @param[in] id Process identification
jm 0:f3a5f6fe1c03 147 * @returns Message GPPS0 id pin debounce state
jm 0:f3a5f6fe1c03 148 */
jm 0:f3a5f6fe1c03 149 void rGPPS0(unsigned int id )
jm 0:f3a5f6fe1c03 150 {
jm 0:f3a5f6fe1c03 151 printf("GPPS0 %d %d %d %d\n",id,sSwitch[id].pin,sSwitch[id].debounce,sSwitch[id].state);
jm 0:f3a5f6fe1c03 152 }