Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:9112e09912db, committed 2011-02-12
- Comitter:
 - jm
 - Date:
 - Sat Feb 12 16:50:25 2011 +0000
 - Commit message:
 - jmAll Command Line Interface Module
 
Changed in this revision
diff -r 000000000000 -r 9112e09912db jmCommands.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmCommands.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,153 @@
+/** @file  jmCommands.c
+ *  Auto Generated by jmCLIG
+ *  Saturday, February 12, 2011  11:21 AM
+ *  @version  2011.01.05
+ */
+
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "jmLPC17xx_gpio.h"
+#include "jmMotor.h"
+#include "jmPulse.h"
+#include "jmStepper.h"
+#include "jmStepperAxis.h"
+#include "jmSwitch.h"
+
+const char jmCLIG[] = {"\njmCLIG Version  2011.01.05 \nInstance Saturday, February 12, 2011  11:21 AM\n"};
+
+// Command Name Table
+const char cmdNames[]=
+   {
+      'i','p','o','r','t',0,
+      'i','p','o','r','t','s',0,
+      'G','P','P','G','0',0,
+      'g','p','i','o','B','i','t','s',0,
+      'g','p','i','o','B','i','t',0,
+      'b','i','t','R','e','a','d',0,
+      'l','i','s','t',0,
+      'v','e','r',0,
+      'h','e','l','p',0,
+      'f','e','e','d','b','a','c','k',0,
+      'e','c','h','o',0,
+      'm','o','t','o','r',0,
+      'G','P','P','M','T',0,
+      'm','o','t','o','r','S','p','e','e','d',0,
+      'p','u','l','s','e',0,
+      'p','u','l','s','e','I','n','i','t',0,
+      'p','u','l','s','e','S','t','o','p',0,
+      'G','P','P','P','0',0,
+      's','t','e','p','p','e','r',0,
+      's','t','e','p','p','e','r','S','t','o','p',0,
+      'G','P','P','S','T',0,
+      's','t','e','p','S','p','e','e','d',0,
+      's','t','e','p','p','e','r','A','x','i','s',0,
+      'G','P','P','S','T','A',0,
+      's','w','R','e','a','d',0,
+      's','w','I','n','i','t',0,
+      'G','P','P','S','0',0,
+      'i','n','i','t',0,
+      0
+   };
+
+//  Section Definitions
+#define iport 0
+#define iports 1
+#define GPPG0 2
+#define gpioBits 3
+#define gpioBit 4
+#define bitRead 5
+#define list 6
+#define ver 7
+#define help 8
+#define feedback 9
+#define echo 10
+#define motor 11
+#define GPPMT 12
+#define motorSpeed 13
+#define pulse 14
+#define pulseInit 15
+#define pulseStop 16
+#define GPPP0 17
+#define stepper 18
+#define stepperStop 19
+#define GPPST 20
+#define stepSpeed 21
+#define stepperAxis 22
+#define GPPSTA 23
+#define swRead 24
+#define swInit 25
+#define GPPS0 26
+#define init 27
+
+
+/***********************************************************************
+ * @brief	Command steering
+ * Command Associated with Command Number is Executed
+ * @param[in]	cmdNum Command Number
+ * @return		none
+ **********************************************************************/
+void Action(int cmdNum){
+   switch(cmdNum){
+     case iport   : cli_PortInfo();
+             break;
+     case iports   : PortsInfo();
+             break;
+     case GPPG0   : cli_GPPG0();
+             break;
+     case gpioBits   : cli_gpioBits();
+             break;
+     case gpioBit   : cli_gpioBit();
+             break;
+     case bitRead   : cli_BitRead();
+             break;
+     case list   : cli_list();
+             break;
+     case ver   : cli_version();
+             break;
+     case help   : cli_help();
+             break;
+     case feedback   : cli_feedback();
+             break;
+     case echo   : cli_echo();
+             break;
+     case motor   : cli_Motor();
+             break;
+     case GPPMT   : cli_GPPMT();
+             break;
+     case motorSpeed   : cli_MotorSpeed();
+             break;
+     case pulse   : cli_Pulse();
+             break;
+     case pulseInit   : PulseInit();
+             break;
+     case pulseStop   : cli_PulseStop();
+             break;
+     case GPPP0   : cli_GPPP0();
+             break;
+     case stepper   : cli_Stepper();
+             break;
+     case stepperStop   : cli_StepperStop();
+             break;
+     case GPPST   : cli_GPPST();
+             break;
+     case stepSpeed   : cli_StepSpeed();
+             break;
+     case stepperAxis   : cli_StepperAxis();
+             break;
+     case GPPSTA   : cli_GPPSTA();
+             break;
+     case swRead   : cli_SwitchRead();
+             break;
+     case swInit   : cli_SwitchInit();
+             break;
+     case GPPS0   : cli_GPPS0();
+             break;
+     case init   : Inits();
+             break;
+     default : UnknownCommand();
+               NextCommand(nl,pLine);
+   }
+}
+
diff -r 000000000000 -r 9112e09912db jmCommands.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmCommands.h Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,18 @@ +/** @file jmCommands.h +* Auto Generated by jmCLIG +* @version Saturday, February 12, 2011 11:21 AM +*/ + +#ifndef jmCommandsdef + #define jmCommandsdef 1 + + #define nbCommands 28 + + // Strings + extern const char jmCLIG[77]; + extern const char cmdNames[208]; + +#endif + +// Prototypes +void Action(int);
diff -r 000000000000 -r 9112e09912db jmInterpreter.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmInterpreter.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,46 @@
+/*************************************************************************
+ * @file     jmInterpreter.c
+ * @brief    Command Line Interpreter
+ *                  
+ * @date    December 27,2010 
+*/
+
+#include "jmInterpreter.h"
+#include "jmRingBuffer.h"
+#include "jmCommands.h"
+
+/** @brief Interpret a command line.
+ * Interpreter uses Command Line Buffer to fecth command name
+ * and redirects execution to associated function.
+ * @param none
+ * @returns none
+ */
+void Interpret(void){ 
+  unsigned int i,k;
+  unsigned char Command, found;
+  char Word[WordMaxSize];
+  Command =0;
+  found = 0;
+  
+  if(NotEmpty(pLine)){
+     ExtractWord(pLine,Word);              // Command name extraction 
+     for(i=0, k=0;i<sizeof(cmdNames);i++){ // lookup in names array
+         if(cmdNames[i]!=Word[k]){         // if different
+            while(cmdNames[i]!=0)i++;      // next entry in names array
+            Command++;                     // update command index
+            k=0;
+         }
+         else{
+           if(Word[k]==0){             
+              found=1; 
+            } 
+           else k++;
+         } //else
+    
+         if(found)break; 
+     }  //for
+   }
+  
+  // Command execution
+  Action(Command);
+}
diff -r 000000000000 -r 9112e09912db jmInterpreter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmInterpreter.h Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,9 @@ +/************************************************************************* + * @file jmInterpreter.h + * @brief Command Line Interpreter + * + * @date December 27,2010 +*/ + +// Prototypes +void Interpret(void);
diff -r 000000000000 -r 9112e09912db jmLPC17xx_gpio.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmLPC17xx_gpio.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,279 @@
+/*************************************************************************
+ * @file    jmLPC17xx_gpio.c
+ * @brief    Command Line Interface Module for LPC_GPIO
+ *                  
+ * @version    1.1
+ * @date    Jan 24, 2011
+ */
+
+#include "jmLPC17xx_gpio.h"
+#include "LPC17xx.h"
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "stdio.h"
+
+
+#define DIR 0
+#define PIN 1
+#define MASK 2
+#define CLR 3
+#define SET 4
+
+#define Clear 0
+#define Set 1
+#define Toggle 2
+
+/***********************************************************************
+ * @brief        Send port registers content
+ * @param[in]    portNum    (Port Number value)0..4
+ * @return        none
+ **********************************************************************/
+void PortInfo(unsigned int portNum){
+   if(portNum <5){
+      printf("Port %1d\n",portNum);
+      printf("FIODIR   \t0x%08X\n",jmGPIO[portNum]->FIODIR);
+      printf("FIOMASK  \t0x%08X\n",jmGPIO[portNum]->FIOMASK);
+      printf("FIOPIN   \t0x%08X\n",jmGPIO[portNum]->FIOPIN);
+      printf("FIOSET   \t0x%08X\n",jmGPIO[portNum]->FIOSET);
+      printf("FIOCLR   \t0x%08X\n",jmGPIO[portNum]->FIOCLR);
+      printf("\n");
+   }
+}
+
+/***********************************************************************
+ * @brief        Send all ports registers content
+ * @param[in]    none
+ * @return        none
+ **********************************************************************/
+void PortsInfo(void){
+   unsigned int portNum;
+   for(portNum=0;portNum<5;portNum++) PortInfo(portNum);
+}
+
+/***********************************************************************
+ * @brief    iport Command Line Interface.
+ * Send port register content
+ * Command Line Format: iport (portNumber)0..4 
+ * @example iport 1     Will printout Port1 registers content
+ * @param[in]    Extracted from command line ring buffer (PortNumber)0..4
+ * @return        none
+ **********************************************************************/
+void cli_PortInfo(void){
+   unsigned int portNum;
+
+   if(ExtractUInteger(pLine,&portNum,0,4))
+      PortInfo(portNum);
+   else{
+      if(Help)printf("iport (portNumber)0..4\n");
+      // Ignore pending command line
+      NextCommand(nl,pLine);
+   }
+}
+
+
+/***********************************************************************
+ * @brief        Command line interface to read and send Port.Bit per bit position
+ * Command Line Format: bitRead  (Port Number)0..4 (Bit position)0..31
+ * ex: bitRead  1 18  read and send P1.18 input pin value
+ * pin must be previously set to input in GPIODIR and associated GPIOMASK bit= 0
+ * @param[in]    Extracted from command line (Port Number)0..4 (Bit position)0..31
+ * @return        none
+ **********************************************************************/
+void cli_BitRead(void){
+  unsigned int portNumber, bitPosition, bitValue;
+   // Extract pin number from Command Line
+   if(ExtractUInteger(pLine,&portNumber,0,4)){
+      // Extract bit position from Command Line
+      if(ExtractUInteger(pLine,&bitPosition,0,31)){
+         // Extract state from Command Line
+         bitValue = 1<<bitPosition;
+         if(jmGPIO[portNumber]->FIOPIN & bitValue)bitValue =1;
+         printf("P%d.%d %d\n",portNumber,bitPosition,bitValue);
+          return;
+      }
+   } 
+   if(Help)printf("bitRead (Port Number)0..4 (Bit position)0..31\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** Read GPIO Registers 
+ * @brief        Command Line Interface to Read and Send GPIO register value
+ * @param[in]    Extracted from command line GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2
+ * @returns    Message: GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF 
+ */
+void cli_GPPG0(void){
+   uint32_t value=0;
+   unsigned int port, reg;
+   if(ExtractUInteger(pLine,&port,0,4)){    // extract port id
+         if(ExtractUInteger(pLine,®,0,4)){  // extract register id
+         switch(reg){
+             case DIR: value = jmGPIO[port]->FIODIR; break;
+            case PIN: value = jmGPIO[port]->FIOPIN; break;
+            case MASK: value = jmGPIO[port]->FIOMASK; break;
+            case CLR: value = jmGPIO[port]->FIOCLR; break;
+            case SET: value = jmGPIO[port]->FIOSET; break;
+        }
+        printf("GPPG0 %d %d 0x%08X\n",port,reg,value);
+          return;
+      }
+    }
+  if(Help)printf("GPPG0 (Port)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4\n");  
+  // Ignore pending command line
+  NextCommand(nl,pLine);
+}
+
+/***********************************************************************
+ * @brief        Command line interface to access GPIO register bits
+ * Use with care. Designed to be used with gui which locks non MBED DIP pins
+ * Command Line Format:   gpioBits (Port id)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4 (value)0..0xFFFFFFFF (clear/set/toggle)0..2\n
+ * @param[in]    Extracted from command line   (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF 
+ * @return        Message: GPPG0 (Port)0..4 (Register DIR/PIN/MASK)0..2 (value)0..0xFFFFFFFF 
+ **********************************************************************/
+void cli_gpioBits(void){
+  unsigned int port, reg, value, action;
+   // Extract port id from Command Line
+   if(ExtractUInteger(pLine,&port,0,4)){
+      // Extract register id from Command Line
+      if(ExtractUInteger(pLine,®,0,4)){
+          // Extract value from Command Line
+          if(ExtractUInteger(pLine,&value,0,0xFFFFFFFF)){
+             // Extract state from Command Line
+             if(ExtractUInteger(pLine,&action,0,2)){
+                switch(reg){
+                   case DIR:
+                       switch(action){
+                           case Clear: jmGPIO[port]->FIODIR &= ~value;
+                              break;
+                           case Set: jmGPIO[port]->FIODIR |= value;
+                              break;
+                           case Toggle: jmGPIO[port]->FIODIR ^= value;
+                              break;
+                        }
+                        break;
+                   case PIN:
+                       switch(action){
+                           case Clear: jmGPIO[port]->FIOPIN &= ~value;
+                              break;
+                           case Set: jmGPIO[port]->FIOPIN |= value;
+                              break;
+                           case Toggle: jmGPIO[port]->FIOPIN ^= value;
+                              break;
+                        }
+                        break;
+                   case MASK:
+                       switch(action){
+                           case Clear: jmGPIO[port]->FIOMASK &= ~value;
+                              break;
+                           case Set: jmGPIO[port]->FIOMASK |= value;
+                              break;
+                           case Toggle: jmGPIO[port]->FIOMASK ^= value;
+                              break;
+                        }
+                        break;
+                   case CLR:
+                       switch(action){
+                           case Clear: jmGPIO[port]->FIOCLR &= ~value;
+                              break;
+                           case Set: jmGPIO[port]->FIOCLR |= value;
+                              break;
+                           case Toggle: jmGPIO[port]->FIOCLR ^= value;
+                              break;
+                        }
+                        break;
+                   case SET:
+                       switch(action){
+                           case Clear: jmGPIO[port]->FIOSET &= ~value;
+                              break;
+                           case Set: jmGPIO[port]->FIOSET |= value;
+                              break;
+                           case Toggle: jmGPIO[port]->FIOSET ^= value;
+                              break;
+                        }
+                        break;
+
+                }
+                // gui feedback  
+                switch(reg)
+                {    
+                    case DIR: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIODIR);
+                        break;
+                    case PIN: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOPIN);
+                        break;
+                    case MASK: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOMASK);
+                        break;
+                    case CLR: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOCLR);
+                        break;
+                    case SET: printf("GPPG0 %d %d 0x%08X\n",port,reg,jmGPIO[port]->FIOSET);
+                        break;
+                }
+                if(Feedback)printf("GPIO %d %d 0x%08X %d\n",port,reg,value,action);
+                return;
+             }
+         }
+      }
+   } 
+   if(Help)printf("gpioBits (Port id)0..4 (Register DIR/PIN/MASK/CLR/SET)0..4 (value)0..0xFFFFFFFF (clear/set/toggle)0..2\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** @brief   Reset/Set/Toggle an output pin
+ * Also sets pin as outputs.
+ * @param[in]    pin      pin id (value)0..432
+ * @param[in]    action  0..2 Clear/Set/Toggle
+ * @returns     Return Message: GPPB0 pin state
+ */
+void gpio(unsigned int pin, unsigned int action){
+   // Get port and bit for that pin
+   uint32_t bitValue;
+   uint8_t port;
+
+   // Get port, bit and bit value
+   port = pin/100;
+   bitValue = 1<<(pin%100);
+   
+   // set mbed pin direction as output
+   jmGPIO[port]->FIODIR |= bitValue;
+   // make sure FIOMASK bit is enable
+   jmGPIO[port]->FIOMASK &= ~bitValue;
+
+   switch(action)
+   {
+    case Clear:     jmGPIO[port]->FIOPIN &= ~bitValue; // reset pin low 
+                break;
+    case Set:    jmGPIO[port]->FIOPIN |= bitValue;  // set pin High
+                break;
+    case Toggle:jmGPIO[port]->FIOPIN ^= bitValue; // toggle pin 
+                break;
+   }
+   if( (jmGPIO[port]->FIOPIN & bitValue) == 0)bitValue = 0;
+   else bitValue = 1;
+
+   // Report bit modification
+   printf("GPPB0 %d %d\n",pin, bitValue);
+}
+
+/** @brief   Command line to Reset/Set/Toggle an output pin
+ * Also sets pin as outputs.  Not all pins are available
+ * Use with care. Designed to be used with gui which locks non MBED DIP pins
+ * Command Line Format:   gpioBit (Pin id)0..432 (action clear/set/toggle)0..2
+ * @param[in]    From command line: (Pin id)0..432 (action clear/set/toggle)0..2
+ * @returns     Return Message: GPPB0 pin state
+ */
+void cli_gpioBit(void){
+  unsigned int pin, action;
+   // Extract pin number from Command Line
+   if(ExtractUInteger(pLine,&pin,0,432)){
+      // Extract action from Command Line
+      if(ExtractUInteger(pLine,&action,0,2)){
+         gpio(pin,action);
+         return;
+      }
+   } 
+   if(Help)printf("Use with care ! gpioBit (pin Number)0..432 (action Clear/Set/Toggle)0..2\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
diff -r 000000000000 -r 9112e09912db jmLPC17xx_gpio.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmLPC17xx_gpio.h Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,38 @@ +/***********************************************************************//** + * @file jmLPC17xx_gpio.h + * @brief LPC17xx GPIO Command Line Interface + * + * @version 1.0 + * @date Feb 2, 2011 + */ + +// Section Port Information +void PortInfo(unsigned int portNumber); +void PortsInfo(void); +void cli_PortInfo(void); + +// Section Port All Bits Access +void cli_GPPG0(void); +void cli_gpioBits(void); +void cli_gpioBit(void); +void gpio(unsigned int pin, unsigned int action); + +// Section Port Bitd +void cli_BitRead(void); + +//-------------------------- CLIG PLUGS -------------------- +// CLIG-INCLUDE +/* +#include "jmLPC17xx_gpio.h" +*/ + +// CLIG-CMD +/* +iport cli_PortInfo(); +iports PortsInfo(); +GPPG0 cli_GPPG0(); +gpioBits cli_gpioBits(); +gpioBit cli_gpioBit(); +bitRead cli_BitRead(); +*/ +//-------------------------- END CLIG PLUGS --------------------
diff -r 000000000000 -r 9112e09912db jmMessages.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmMessages.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,125 @@
+/*************************************************************************
+ * @file     jmMessages.c
+ * @brief    Control System Messages
+ *                  
+ * @date    December 27,2010 
+*/
+
+#include "jmCommands.h"
+#include "jmRingBuffer.h"
+#include "stdio.h"
+#include "jmMessages.h"
+#include "stdint.h"
+
+uint8_t Help;
+uint8_t Feedback;
+uint8_t Echo;
+
+
+/** @brief Enable only help messages
+ * @param none
+ * @returns none
+ */
+void InitMessages(void){
+   Help = 1;
+   Echo = 0;
+   Feedback = 0;
+}
+ 
+/** @brief Send all command names in a project
+ * @param none
+ * @returns none
+ */
+void cli_list(void){
+   int i,j;
+   printf("Commands:\n");
+   printf(".......................\n");
+   // for each command 
+   for(i=0,j=0; i<nbCommands; i++,j++){
+      // print name
+      while(cmdNames[j]) printf("%c",cmdNames[j++]); 
+      printf("\n"); 
+   }
+   printf("........................\n");
+}
+
+/** @brief Send Message Unknown Command from interpreter
+ * @param none
+ * @returns none
+ */
+void UnknownCommand(void){
+   printf("\n?\n");
+}
+
+/** @brief Send Build Version Message
+ * @param none
+ * @returns none
+ */
+void cli_version(void){
+    printf(jmCLIG);
+}
+
+/** @brief Help Command Line Control.
+ * Enable/disable help messages
+ * When enabled, Typing name only prints Command Format
+ * @param none
+ * @returns none 
+ */
+void cli_help(void){
+    unsigned int  value;
+   if(ExtractUInteger(pLine,&value,0,1)){
+      if(value == 1)  printf("Help Enabled ! type command name to print its format\n");
+       else printf("Help Disabled !\n");
+        
+        Help = (uint8_t) value;                // save status
+        return;
+   } 
+   // Error on input, show format
+   if(Help)printf("help  (value)0..1\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** @brief Feedback Command Line Control. 
+ * Enable/disable feedback messages
+ * When enabled, feedback from user input commands are returned
+ * @param none
+ * @returns none 
+ */
+void cli_feedback(void){
+    unsigned int  value;
+   if(ExtractUInteger(pLine,&value,0,1)){
+      if(value == 1)  printf("Feedback Enabled !\n");
+       else    printf("Feedback Disabled !\n");
+       
+        Feedback = (uint8_t)value;        // save status
+        return;
+   } 
+
+   // Error on input, show format
+   if(Help)printf("feedback  (value)0..1\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** @brief Echo Command Line Control.
+ * Enable/disable communication echoes
+ * When enabled, user inputs are echoed back
+ * @param none
+ * @returns none 
+ */
+void cli_echo(void){
+    unsigned int  value;
+   if(ExtractUInteger(pLine,&value,0,1)){
+      if(value == 1)  printf("Echo Enabled !\n");
+       else    printf("Echo Disabled !\n");
+        
+        Echo = (uint8_t)value;         // save status
+       return;
+   } 
+
+   // Error on input, show format
+   if(Help)printf("echo  (value)0..1\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
diff -r 000000000000 -r 9112e09912db jmMessages.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jmMessages.h Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,35 @@ +/************************************************************************* + * @file jmMessages.h + * @brief Control System Messages + * + * @date December 27,2010 +*/ + +#include "stdint.h" + +// variables to enable/disable messages +extern uint8_t Help; +extern uint8_t Feedback; +extern uint8_t Echo; + +// Prototypes +void InitMessages(void); +void cli_list(void); +void cli_version(void); +void UnknownCommand(void); +void cli_help(void); +void cli_feedback(void); +void cli_echo(void); + + +//-------------------------- CLIG PLUGS -------------------- +// CLIG-CMD +/* +list cli_list(); +ver cli_version(); +help cli_help(); +feedback cli_feedback(); +echo cli_echo(); +*/ + +//------------------------ END CLIG PLUGS -----------------
diff -r 000000000000 -r 9112e09912db jmMotor.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmMotor.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,238 @@
+/*************************************************************************
+ * @file    jmMotor.c                 
+ * @version 1.0
+ * @date    Feb 12, 2011
+ */
+
+#include "jmMotor.h"
+#include "LPC17xx.h"
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "stdio.h"
+
+#ifndef nonStop
+  #define nonStop 65535  // for continuous mode operation
+#endif
+
+#define mtNotInit 0
+#define mtRunningCW 1
+#define mtRunningCCW 2
+#define mtStopped 3
+
+// Module Data Structure
+struct StructMotor sMotor[motorQty]; // static creation
+
+/** Module Data Structure Initialization
+ * @brief   All State Machines non initialized
+ * @param[in]    none
+ * @returns none
+ */
+void MotorInit(void){
+   int i;
+   for(i=0;i<motorQty;i++){
+     sMotor[i].active = mtNotInit;
+   }
+}
+
+/** Speed control for motors (1 or up to 4)
+ * @brief motorSpeed Command Line Interface.
+ * Format: command name (arg info)min..max values 
+ * motorSpeed (Motor IDs ORed)1..15 (tOn Value)0..255 (tOff Value)0..255
+ * @param[in] Extracted from command line (Motor IDs ORed)1..15 (tOn Value)0..255 (tOff Value)0..255 
+ * @returns Message: motorSpeed ids tOn tOff
+ */
+void cli_MotorSpeed(void){
+   unsigned int id, i, tOn,tOff;
+   if(ExtractUInteger(pLine,&id,1,15)){          //extract id
+      if(ExtractUInteger(pLine,&tOn,0,255)){      //extract tOn
+         if(ExtractUInteger(pLine,&tOff,0,255)){ //extract tOff
+              for(i=0;i<motorQty;i++){              // check each motor
+                  if(id & 1<<i){                 // motor included ?     
+                      if(sMotor[i].active){         // motor initialized ?
+                           sMotor[i].tOn=(uint8_t)tOn;
+                           sMotor[i].tOff=(uint8_t)tOff;
+
+                         
+                         if(tOn==0){             // 0% ?
+                             sMotor[i].cycles=0;            
+                            sMotor[i].drivePort->FIOPIN &= ~sMotor[i].driveBitValue;    // output pin low 
+                          }
+    
+                          if(tOff==0){              // 100% ?            
+                            sMotor[i].drivePort->FIOPIN |= sMotor[i].driveBitValue;    // output pin high
+                          }
+    
+                          if(tOn!=0 && tOff!=0){   // PWM ?
+                             // change motor tOn and tOff values
+                             sMotor[i].cycles=nonStop;
+                          }
+                          // report to gui
+                          rGPPMT(i);
+                      }    
+                  }             
+              }
+          }
+      }
+
+      if(Feedback)printf("MotorSpeed ID %d tOn %d tOff %d\n",id,tOn, tOff);
+      return;
+   }
+   if(Help)printf("motorSpeed (Motor IDs ORed)1..15 (tOn Value)1..255 (tOff Value)1..255\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+
+/***********************************************************************
+ * @brief    Module State Machine.  
+ * Enable different motor control concurrently.
+ * @param none
+ * @returns Message at end of cycles: GPPMT id dirPin drivePinB tOn tOff status
+ */ 
+void MotorSM(void){
+  int i;
+   for(i=0;i<motorQty;i++){ // for each SM define by pins
+     // SM active ?
+     if(!sMotor[i].active) continue;
+   
+     if(sMotor[i].cycles!=0){  // Cycles to DO ?
+       switch(sMotor[i].state){       
+
+         // pulse is low
+         case  0: if(sMotor[i].eggTimer==0){             // time to change ?     
+                     sMotor[i].drivePort->FIOPIN |= sMotor[i].driveBitValue;  // set pin High         
+                     sMotor[i].eggTimer=sMotor[i].tOn;   // load timer with tOn   
+                     sMotor[i].state=1;                  // next state 
+                  }
+                  break;
+
+         // pulse is High
+         case  1: if(sMotor[i].eggTimer==0){                    // time to change ?
+                     sMotor[i].drivePort->FIOPIN &= ~sMotor[i].driveBitValue;    // reset pin low      
+                     sMotor[i].eggTimer=sMotor[i].tOff;  // load timer with tOff  
+                     if(sMotor[i].cycles != nonStop){    // continuous mode ?
+                        if(--sMotor[i].cycles == 0)      // decrease qty if not continuous mode
+                           rGPPMT(i);   // Message: GPPMT id dirPin drivePinB tOn tOff status
+                     }
+                     sMotor[i].state=0;                  // state 0
+                  }
+                  break;
+         }//switch
+       }//if
+  }//for
+}//MotorSM
+
+
+/** @brief motor Command Line Interface
+ * Command Line Interface to control Motor on mbed pins DIP5 to 30.
+ * Format: command name (arg info)min..max values 
+ * Command Line Format: motor (Motor ID)0..3 (Direction Pin)0..432 (Drive Pin)0..432 (Direction)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]
+ * @param[in]    Extracted from command line ((Motor ID)0..3 (Direction Pin)0..432 (Drive Pin)0..432 (Direction)0..1 (tOn)1..255 (tOff)1..255 (Cycles)[1..65535]
+ * @returns    Message: GPPMT id dirPin drivePinB tOn tOff status
+ */
+void cli_Motor(void){
+   unsigned int id,dirPin,drivePin, dir, tOn,tOff,cycles;
+
+   if(ExtractUInteger(pLine,&id,0,motorQty-1)){         // extract motor id
+      if(ExtractUInteger(pLine,&dirPin,0,432)){            // extract direction    pin
+         if(ExtractUInteger(pLine,&drivePin,0,432)){       // extract drive pin
+            if(ExtractUInteger(pLine,&dir,0,1)){            // extract direction
+                if(ExtractUInteger(pLine,&tOn,0,255)){       // extract tOn
+                   if(ExtractUInteger(pLine,&tOff,0,255)){   // extract tOff
+                       // extract cycles and test for nonStop mode
+                       if(!ExtractUInteger(pLine,&cycles,1,nonStop))cycles = nonStop;
+    
+                       sMotor[id].dirBitValue = 1<<(dirPin%100);
+                       sMotor[id].driveBitValue = 1<<(drivePin%100);;
+                       sMotor[id].drivePort = jmGPIO[drivePin/100];
+                       sMotor[id].dirPort = jmGPIO[dirPin/100];
+                       sMotor[id].active = 1;
+            
+                       // Port.Pin set to outputs
+                       sMotor[id].dirPort->FIODIR |= sMotor[id].dirBitValue;
+                       sMotor[id].drivePort->FIODIR |= sMotor[id].driveBitValue;
+        
+                       sMotor[id].direction = dir;
+                       sMotor[id].tOn = (uint8_t)tOn;
+                       sMotor[id].tOff = (uint8_t)tOff;
+                       sMotor[id].cycles = (uint16_t)cycles;
+                       sMotor[id].state = 0;
+                       sMotor[id].eggTimer = 0;
+                       sMotor[id].dirPin = dirPin;
+                       sMotor[id].drivePin = drivePin;
+    
+                      // set output direction bit according to given direction
+                      if(dir) sMotor[id].dirPort->FIOPIN |=    sMotor[id].dirBitValue;
+                      else sMotor[id].dirPort->FIOPIN &=    ~sMotor[id].dirBitValue;
+    
+                      // 100%
+                      if(tOff==0){
+                         sMotor[id].drivePort->FIOPIN |= sMotor[id].driveBitValue;
+                         // SM off
+                         sMotor[id].cycles = 0;
+                      }
+    
+                      // 0%
+                      if(tOn==0){
+                         sMotor[id].drivePort->FIOPIN &= ~sMotor[id].driveBitValue;
+                         // SM off
+                         sMotor[id].cycles = 0;
+                      }
+                      
+                      rGPPMT(id);   // Message: GPPMT id dirPin drivePinB tOn tOff status
+        
+                      if(Feedback)printf("Motor %d DirPin %d DrivePin %d Dir %d tOn %d tOff %d Cycles %d\n",id,
+                                         dirPin, drivePin, dir,tOn,tOff,cycles); 
+                       return;
+                }
+             }
+          }
+       }
+       }
+    // Ignore pending command line
+       NextCommand(nl,pLine);
+    return;
+   }
+
+   if(Help)printf("motor (Motor ID)0..%d (Direction Pin)0..432 (Drive Pin)0..432 (Direction)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]\n",motorQty-1);  
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** 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
+ * @returns    Message: GPPMT id dirPin drivePinB tOn tOff status
+ */
+void cli_GPPMT(void)
+{    unsigned int id;
+   if(ExtractUInteger(pLine,&id,0,motorQty-1)){  // extract id
+       rGPPMT(id);   // Message: GPPMT id dirPin drivePinB tOn tOff status
+       return;
+    }
+
+    if(Help)printf("GPPST (Motor id)0..%d\n",motorQty-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: GPPMT id dirPin drivePinB tOn tOff status
+ */
+void rGPPMT(unsigned int id ){
+    int status;
+    if( sMotor[id].active )
+    {   if(sMotor[id].cycles == 0)status = mtStopped;
+        else 
+        {
+         if( sMotor[id].direction) status = mtRunningCW;
+         else status = mtRunningCCW;
+        }
+    }
+    else  status = mtNotInit;                     
+    printf("GPPMT %d %d %d %d %d %d\n",id,sMotor[id].dirPin,sMotor[id].drivePin,sMotor[id].tOn,sMotor[id].tOff,status);
+}
diff -r 000000000000 -r 9112e09912db jmMotor.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmMotor.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,85 @@
+/*************************************************************************
+ * @file    jmMotor.h
+ * @brief   Control motor drive, direction and repetition on mbed DIP5 to 30.
+ *          Up to 4 motors can be controlled at the same time.
+ *             
+ * @version 1.0
+ * @date    Feb 12, 2011
+ */
+
+/*
+   * Module Command Line Interface 
+     Format: command name (arg info)min..max values [optional argument]
+   
+     motor (Motor ID)0..3 (Direction Pin)0..432 (Drive Pin)0..432 (Rotation cw/ccw)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]
+
+   * Module Events
+         On terminating cycles, send Message: GPPMT id dirPin drivePinB tOn tOff status
+
+   *  Module Feedback and Help messages may be enabled/disabled by Command Lines.
+         feedback (enable/disable)0..1
+         help (enable/disable)0..1
+*/
+
+#ifndef Motordef
+  #define Motordef 1
+
+  #define motorQty 4 // max number of motor
+  
+  #include "LPC17xx.h"
+
+  // Module Data Structure
+  extern struct StructMotor{
+     uint8_t active; 
+     uint8_t direction; 
+     uint8_t tOff;       
+     uint8_t tOn;
+     uint8_t state;
+     uint16_t dirPin;
+     uint16_t drivePin;
+     uint16_t eggTimer;
+     uint16_t cycles;
+     uint32_t dirBitValue;
+     LPC_GPIO_TypeDef * dirPort;
+     uint32_t driveBitValue;
+     LPC_GPIO_TypeDef * drivePort;
+  }sMotor[motorQty]; 
+#endif
+
+// Module Prototypes
+void cli_Motor(void);
+void MotorInit(void);
+void MotorSM(void);
+void cli_MotorSpeed(void);
+void cli_GPPMT(void);
+void rGPPMT(unsigned int id);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmMotor.h"
+*/
+
+// CLIG-CMD
+/*
+motor cli_Motor();
+GPPMT cli_GPPMT();
+motorSpeed cli_MotorSpeed();
+*/
+
+// CLIG-INIT
+/*
+   MotorInit();
+*/
+
+// CLIG-TIMER
+/*
+   // Module jmMotor
+   for(i=0;i<motorQty;i++)if(sMotor[i].eggTimer>0)sMotor[i].eggTimer--;
+*/
+
+// CLIG-SM
+/*
+     MotorSM();
+*/
+
diff -r 000000000000 -r 9112e09912db jmPulse.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmPulse.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,247 @@
+/**
+ * @file	jmPulse.c				 
+ * @version	1.0
+ * @date	Feb 12, 2011
+ */
+
+#include "jmPulse.h"
+#include "jmRingBuffer.h"
+#include "LPC17xx.h"
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "stdio.h"
+
+#ifndef nonStop
+  #define nonStop 65535  // for continuous mode operation
+#endif
+
+// output defenitions
+#define Low 0
+#define High 1
+#define StatusOffset 3
+
+// State definitions
+#define puNotInit	0
+#define puStopped 2
+#define Pulse 1
+
+struct StructPulse sPulse[pulseQty]; // static creation
+
+/** Module Data Structure Initialization
+ * @brief   All State Machines put to sleep.
+ * @param[in]	none
+ * @returns none
+ */
+void PulseInit(void){
+   int i;
+   for(i=0;i<pulseQty;i++){
+     sPulse[i].state = puNotInit;
+   }
+}
+
+/** 
+ * @brief   Stop one or all pulse Machines
+ * @param[in] Extracted from command line (Pulse Number)0..7 255 for all
+ * @returns   Return Message: GPPP0 id pin tOn tOff status
+ */
+void cli_PulseStop(void){
+   unsigned int id,i;
+
+   if(ExtractUInteger(pLine,&id,0,255)){    // extract pulseNumber
+ 	  // put id pulse machine to sleep 
+	  if(id < pulseQty){
+		  sPulse[id].cycles = 0;
+		  sPulse[id].state = puStopped;
+		  rGPPP0(id);
+		  return;
+	  }
+
+	  if(id == 255){
+		  // stop all controllers
+		  for(i=0;i<pulseQty;i++){
+	          sPulse[i].cycles = 0;
+			  sPulse[i].state = puStopped;
+	      }
+	  }
+
+	  cli_GPPP0();	// Return 8 Messages: GPPP0 id pin tOn tOff status
+	  return;
+    }
+  if(Help)printf("pulseStop (Pulse number)0..%d \n",pulseQty-1);  
+  // Ignore pending command line
+  NextCommand(nl,pLine);
+}
+
+
+/** Module Pulse Command Line Interface
+ * @brief		Command Line Interface to control PWM/Pulse on output pins.
+ * @param[in]	Extracted from command line (Pulse Controller Number)0..7 (Pin id)0..432 (tOn)0..255 (tOff)0..255) (cycles)1..65535
+ * @returns    none
+ */
+void cli_Pulse(void){
+   unsigned int pulseNum, pinNumber,tOn,tOff,cycles;
+   if(ExtractUInteger(pLine,&pulseNum,0,pulseQty-1)){    // extract pulseNumber
+      if(ExtractUInteger(pLine,&pinNumber,0,432)){       // extract pin id
+         if(ExtractUInteger(pLine,&tOn,0,255)){          // extract tOn
+            if(ExtractUInteger(pLine,&tOff,0,255)){      // extract tOff
+               // extract cycles and test for nonStop mode
+               if(!ExtractUInteger(pLine,&cycles,1,65535))cycles = nonStop;
+
+			   SetPulseParam(pulseNum, pinNumber, tOn, tOff, cycles);
+	           if(Feedback)printf("pulse %d Pin%d tOn:%d  tOff:%d  Cycles:%d\n",pulseNum,pinNumber,tOn,tOff,cycles); 
+               return;
+           }
+        }
+      }
+    }
+  if(Help)printf("pulse (Pulse number)0..%d (Pin id)0..432 (tOn)0..255 (tOff)0..255 (Cycles)[1..0xFFFF]\n",pulseQty-1);  
+  // Ignore pending command line
+  NextCommand(nl,pLine);
+}
+
+/** Module Parameter Setting Function
+ * @brief   Enables PWM/pulse State Machine,
+ * Also sets mbed pin as outputs.
+ * @param[in]	num      pulse controller number (value)0..7  
+ * @param[in]	pin      pin id (value)0..432
+ * @param[in]	tOn      on time interval in ticks (tOn)0..255
+ * @param[in]	tOff     off time interval in ticks (tOff)0..255
+ * @param[in]	cycles   repetition number of tOn-tOff cycles
+ * @param[in]	state    set state: inactive, pulse, high, low
+ * @returns     Return Message: GPPP0 id pin state
+ */
+void SetPulseParam(uint8_t num, uint16_t pin, uint8_t tOn, uint8_t tOff, uint16_t cycles){
+   // Get port and bit for that pin
+   uint32_t bitValue;
+   uint8_t port;
+
+   // Get port, bit and bit value
+   port = pin/100;
+   bitValue = 1<<(pin%100);
+
+   sPulse[num].port = jmGPIO[port];
+   sPulse[num].pin = (uint8_t)pin;
+   sPulse[num].bitValue = bitValue;
+   
+   // set mbed pin direction as output
+   jmGPIO[port]->FIODIR |= bitValue;
+   // make sure FIOMASK bit is enable
+   jmGPIO[port]->FIOMASK &= ~bitValue;
+
+   
+   // Low State
+   if(tOn == 0 && tOff != 0)
+   {
+		jmGPIO[port]->FIOPIN &= ~bitValue; // reset pin low 
+		sPulse[num].output = Low;
+		sPulse[num].state = puStopped;
+   }
+   // High State 
+   if(tOn != 0 && tOff == 0)	 
+   {
+		jmGPIO[port]->FIOPIN |= bitValue;  // set pin High
+		sPulse[num].output = High;
+		sPulse[num].state = puStopped;
+   }
+   // Toggle output
+   if(tOn == 0 && tOff == 0) 
+   {
+	   jmGPIO[port]->FIOPIN ^= bitValue; // toggle pin 
+	   // Toggle state
+	   if(sPulse[num].output == High)sPulse[num].output = Low;
+	   else sPulse[num].output = High;
+	   sPulse[num].state = puStopped;
+   }
+   // Start Pulse controller
+   if(tOn != 0 && tOff != 0 && cycles !=0){	         
+       sPulse[num].state = Pulse;	
+	   sPulse[num].tOn = (uint8_t)tOn;
+	   sPulse[num].tOff = (uint8_t)tOff;
+	   sPulse[num].cycles = (uint16_t)cycles;
+	   sPulse[num].eggTimer = 0;
+   }
+      // Stop Pulse controller
+   if(tOn != 0 && tOff != 0 && cycles ==0){	         
+	   sPulse[num].cycles = 0;
+       sPulse[num].state = puStopped;
+   }
+
+   // Report process modification
+   rGPPP0(num);	//Return Message: GPPP0 id pin tOn tOff status
+}
+
+/***********************************************************************
+ * @brief	Module State Machine.  
+ * Enable different pwm/pulse rates concurrently.
+ * @param none
+ * @returns    When cycles Done, Return Message: GPPP0 id pin tOn tOff status
+ */ 
+void PulseSM(void){
+  int i;
+   for(i=0;i<pulseQty;i++){ // for each SM define by pins
+	 
+	 if(sPulse[i].state == puStopped) continue; //controller running ?
+	     
+	 if(sPulse[i].cycles!=0){  // Cycles to DO ?
+	   switch(sPulse[i].output){       
+
+		 // output is low
+		 case  Low: if(sPulse[i].eggTimer==0){                      // time to change ?     
+					 sPulse[i].port->FIOPIN |= sPulse[i].bitValue;  // set pin High         
+					 sPulse[i].eggTimer=sPulse[i].tOn;              // load timer with tOn   
+					 sPulse[i].output=High;                         // udpate structure
+				  }
+				  break;
+
+		 // output is High
+		 case  High: if(sPulse[i].eggTimer==0){					       // time to change ?
+					 sPulse[i].port->FIOPIN &= ~sPulse[i].bitValue;    // reset pin low  
+					 sPulse[i].output=Low;                             // update structure    
+					 sPulse[i].eggTimer=sPulse[i].tOff;                // load timer with tOff  
+					 if(sPulse[i].cycles != nonStop){                  // continuous mode ?
+						if(--sPulse[i].cycles == 0){      // decrease qty if not continuous mode
+							sPulse[i].state = puStopped;					// stop controller
+							// report end of cycles
+                            rGPPP0(i); //Message: GPPP0 id pin tOn tOff status
+						}
+					 }
+				  }
+				  break;
+		 }//switch
+	 }//if cycles
+  }//for
+}//PulseSM
+
+/** Module Get Module Process Properties Command Line Interface
+ * @brief		Command Line Interface to Get Module Public Process Properties
+ * @param[in]	Extracted from command line GPPP0 id
+ * @returns    Message: GPPP0 id pin tOn tOff status
+ */
+void cli_GPPP0(void)
+{	unsigned int id;
+   if(ExtractUInteger(pLine,&id,0,7)){    // extract pulse id Number
+       rGPPP0(id); //Message: GPPP0 id pin tOn tOff status
+	   return;
+	}
+
+    if(Help)printf("GPPP0 (Pulse id)0..%d\n",pulseQty-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: GPPP0 id pin tOn tOff status
+ */
+void rGPPP0(unsigned int id ){
+    int status;
+	if(id < pulseQty){
+	   if( sPulse[id].state == puStopped)status = sPulse[id].output +StatusOffset;
+	   else  status = sPulse[id].state;
+	   printf("GPPP0 %d %d %d %d %d\n",id,sPulse[id].pin,sPulse[id].tOn,sPulse[id].tOff,status);
+
+	}
+}
diff -r 000000000000 -r 9112e09912db jmPulse.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmPulse.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,92 @@
+/*************************************************************************
+ * @file	jmPulse.h
+ * @brief	Control pulse duration and repetition on digital mbed pins
+ *          Up to 8 pins can be controlled at the same time.
+ *          Single pulse or PWM like waveforms can be generated.
+ *             
+ * @version	1.1
+ * @date	Feb 12, 2011
+ */
+
+/*
+   * Module Command Line Interface 
+     Format: command name (arg info)min..max values [optional argument]
+     
+     pulse (pulse number)0..3 (pin number)0..432 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]
+      Ex: pulse 0 118 5 10 20     Pulse Port1 Bit 18 High for 5 tick units, then Low for 10 ticks and repeat 20 times,
+                                 then Return Message: GPPP0 id pin tOn tOff status
+
+      Ex: pulse 0 118 1 0	Set output Port1 Bit 18 High
+      Ex: pulse 0 118 0 1	Reset output Port1 Bit 18 Low
+	  Ex: pulse 0 118 0 0	Toggle Port1 Bit 18 state
+
+   * Module Events
+         On terminating pulse cycles, Return Message: GPPP0 id pin tOn tOff status
+
+   *  Module Feedback and Help messages may be enabled/disabled by Command Lines.
+         feedback (enable/disable)0..1
+         help (enable/disable)0..1
+*/
+
+#ifndef Pulsedef
+  #define Pulsedef 1
+
+  #define pulseQty 8 // number of pins for pulse
+
+  #include "LPC17xx.h"
+
+  // Module Data Structure
+  extern struct StructPulse{
+     uint16_t pin;
+	 uint8_t tOff;       
+     uint8_t tOn;
+	 uint8_t output;
+     uint8_t state;
+     uint16_t eggTimer;
+     uint16_t cycles;
+     uint32_t bitValue;
+	 LPC_GPIO_TypeDef * port;
+  }sPulse[pulseQty];
+
+
+#endif
+
+// Module Prototypes
+void PulseInit(void);
+void cli_Pulse(void);
+void PulseSM(void);
+void SetPulseParam(uint8_t pulseNum, uint16_t pin, uint8_t tOn, uint8_t tOff, uint16_t cycles);
+void cli_GPPP0(void);
+void rGPPP0(unsigned int id);
+void cli_PulseStop(void);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmPulse.h"
+*/
+
+// CLIG-CMD
+/*
+pulse cli_Pulse();
+pulseInit PulseInit();
+pulseStop cli_PulseStop();
+GPPP0 cli_GPPP0();
+*/
+
+// CLIG-INIT
+/*
+   PulseInit();
+*/
+
+// CLIG-TIMER
+/*
+   // Module jmPulse
+   for(i=0;i<pulseQty;i++)if(sPulse[i].eggTimer>0)sPulse[i].eggTimer--;
+*/
+
+// CLIG-SM
+/*
+     PulseSM();
+*/
+
diff -r 000000000000 -r 9112e09912db jmRingBuffer.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmRingBuffer.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,215 @@
+/*************************************************************************
+ * @file     jmRingBuffer.c
+ * @brief    Command Line Rx Ring Buffer
+ *                  
+ * @date    Feb 12, 2011 
+*/
+
+
+#include "jmRingBuffer.h"
+#include "stdio.h"
+
+// static creation of Command Line Buffer
+struct RingBuffer  Line, *pLine; 
+
+/** @brief Command line ring buffer initialization.
+ * @param none
+ * @returns none 
+ */
+void InitCommandLineRingBuffer(void){
+ pLine = &Line;
+ FlushRingBuffer(pLine);
+}
+
+/** @brief Move ring head pointer foward.
+ * @param *p pointer to ring buffer
+ * @returns none 
+ */
+void NextHead(struct RingBuffer *p)              
+{    p->head++;            
+    if(p->head >= DimRingBuffer) 
+       p->head=0;          
+}
+
+/** @brief Move ring tail pointer foward.
+ * @param pointer to ring buffer
+ * @returns none 
+ */
+void NextTail(struct RingBuffer *p)              
+{    p->tail++;              
+    if(p->tail >= DimRingBuffer)   
+       p->tail=0;            
+}
+      
+/** @brief Check if buffer full.
+ * @param *p pointer to ring buffer
+ * @returns true if full, false otherwise 
+ */ 
+bool Full(struct RingBuffer *p)
+{  if(p->qty >= DimRingBuffer)         
+       return true;
+   else
+      return false;
+}
+  
+/** @brief Insert a char in buffer.
+ * @param c unsigned char to be inserted
+ * @param *p pointer to ring buffer
+ * @returns none 
+ */
+void Insert(unsigned char c, struct RingBuffer *p)
+{  if(Full(p))              
+      NextHead(p);            
+   else
+      p->qty++;                  
+ 
+   p->Buffer[p->tail]=c;          
+   NextTail(p);                   
+}
+
+/** @brief Check if ring buffer not empty.
+ * @param *p pointer to ring buffer
+ * @returns true if full, false otherwise
+ */ 
+bool NotEmpty(struct RingBuffer *p)
+{  if(p->qty == 0)                
+      return false ;                          
+   else 
+      return true;                          
+}
+
+/** @brief Extract a char from ring buffer.
+ * @param *p pointer to ring buffer
+ * @returns unsigned char
+ */
+unsigned char Extract(struct RingBuffer *p)      
+{  unsigned char c;
+   c = p->Buffer[p->head];     
+   if(NotEmpty(p))            
+   {  NextHead(p);            
+      p->qty--;                
+   }
+   return c;
+}
+
+/** @brief Flush ring buffer.
+ * @param *p pointer to ring buffer
+ * @returns none
+ */
+void FlushRingBuffer(struct RingBuffer *p)    
+{  int i;
+   p->head = 0;
+   p->tail = 0;
+   p->qty = 0;
+   for(i=0;i<DimRingBuffer;i++)p->Buffer[i]=0;
+}
+
+/** @brief Delete last char from ring buffer.
+ * @param *p pointer to ring buffer
+ * @returns none
+ */
+void DelChar(struct RingBuffer *p)
+{ if(p->qty != 0){
+     if(p->tail==0)p->tail=DimRingBuffer;
+     else p->tail--;  
+     p->qty--;    
+   }
+}
+
+/** @brief Remove a command line from ring buffer. 
+ * @param c end command identifier unsigned char
+ * @param *p pointer to ring buffer
+ * @returns none
+ */
+void NextCommand(unsigned char c, struct RingBuffer *p){
+   // remove all char till end identifier is found
+   while(NotEmpty(p) && p->Buffer[p->head] != c)
+   {  NextHead(p);            
+      p->qty--;                 
+   }
+
+   // remove end identifier
+   if(NotEmpty(p)&& p->Buffer[p->head] == c)               
+   {  NextHead(p);             
+      p->qty--;                 
+   }
+}
+
+/** @brief View ring buffer content.
+ * Print ring buffer content
+ * @param *p pointer to ring buffer
+ * @returns none
+ */
+void ViewRingBuffer(struct RingBuffer *p){
+   int i,j;
+
+   printf("\nRingBuffer Qty: %d \nContent: ",p->qty);
+
+   for(j=0,i=p->head;j<p->qty;j++){
+      printf("%c",p->Buffer[i]); 
+      if(i++>DimRingBuffer)i=0; 
+   }
+   printf("\n");
+}
+
+/** @brief Extract a word from ring buffer.
+ * The extracted word is put in the array pointed by word
+ * @param p pointer to a ring buffer 
+ * @param word pointer to array of char
+ * @returns true if a word is extracted otherwise returns false
+ */ 
+bool ExtractWord(struct RingBuffer *p, char * word){   
+   unsigned char c;
+   int i,j;
+   j=0;
+
+   if(NotEmpty(p)){
+        for(i=0;i<WordMaxSize-1;i++){
+          // extract a char from Rx ring buffer
+          c=Extract(p);
+    
+          // remove leading blanks
+          if(c==' ' && j==0)continue;
+    
+          // end of word or end of command line
+          if(c==' ' || c==nl)break;
+    
+          // build the Word
+          word[j++]=c;
+       }
+       // 0 string termination
+       word[j]=0;
+       if(j>0)return true;
+    }
+    return false;
+}
+
+/** @brief Extract an unsigned int from ring buffer.
+ * Convert a word from buffer into an integer between min and max values
+ * Value converted should be between min and max values.
+ * Value should be decimal or hexadecimal (beginning by 0x or 0X)
+ * @param p pointer to ring buffer
+ * @param result pointer to unsigned int
+ * @param min minimum limit
+ * @param max maximum limit
+ * @returns true if value is converted beetween limits, including limits.
+ */
+bool ExtractUInteger(struct RingBuffer *p, unsigned int *result, unsigned int min, unsigned int max){
+   unsigned int i ;
+   char word[WordMaxSize-1];
+
+   if(ExtractWord(p,word)){       // Extract string value
+      if(word[0]=='0' && (word[1]=='x' || word[1]=='X')) {
+         sscanf(word,"%x",&i);  // convert hexadecimal input
+      }
+      else
+         sscanf(word,"%d",&i);  // convert decimal input
+
+      if(i>=min && i<=max){
+         *result = i;
+         return true;
+      }
+   }
+   *result = 0;
+   return false;
+}
diff -r 000000000000 -r 9112e09912db jmRingBuffer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmRingBuffer.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,36 @@
+/*************************************************************************
+ * @file     jmRingBuffer.h
+ * @brief    Command Line Rx Ring Buffer
+ *                  
+ * @date  Feb12, 2011
+*/
+
+#ifndef jmRingBufferDef
+ #define jmRingBufferDef 1 
+ 
+ #define nl 10 // new line
+ #define WordMaxSize 21
+ #define DimRingBuffer  41    
+     
+
+ // Ring Buffer data structure
+ extern  struct RingBuffer                 
+  {  unsigned char  Buffer[DimRingBuffer];      
+     unsigned char  head;               
+     unsigned char  tail;                 
+     unsigned char  qty;   
+  }Line, *pLine;
+#endif
+
+// Prototypes
+bool Full(struct RingBuffer *p);
+void Insert(unsigned char c, struct RingBuffer *p);
+bool NotEmpty(struct RingBuffer *p);
+unsigned char Extract(struct RingBuffer *p);      
+void FlushRingBuffer(struct RingBuffer *p); 
+void DelChar(struct RingBuffer *p);
+void InitCommandLineRingBuffer(void);
+void NextCommand(unsigned char c, struct RingBuffer *p);
+void ViewRingBuffer(struct RingBuffer *p);
+bool ExtractWord(struct RingBuffer *p, char *param);
+bool ExtractUInteger(struct RingBuffer *p, unsigned int *result, unsigned int min, unsigned int max);
diff -r 000000000000 -r 9112e09912db jmStepper.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmStepper.c	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,225 @@
+/*************************************************************************
+ * @file	jmStepper.c
+ * @brief	Command Line Interface Stepper Module
+ * 				 
+ * @version	1.0
+ * @date	Feb 12, 2011
+ */
+
+#include "jmMessages.h"
+#include "jmStepper.h"
+#include "LPC17xx.h"
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "stdio.h"
+
+#ifndef nonStop
+   #define nonStop 65535
+#endif
+
+#define stNotInit 0
+#define stRunningCW 1
+#define stRunningCCW 2
+#define stStopped 3
+
+// static structures creation
+struct StructStepper sStepper[stepperQty];
+
+/** Module Data Structure Initialization
+ * @brief   All State Machines put to sleep.
+ * @param[in]	none
+ * @returns none
+ */
+void StepperInit(void){
+   int i;
+   for(i=0;i<stepperQty;i++){
+     sStepper[i].active = stNotInit;
+   }
+}
+
+/**  @brief Step Function
+ * Change Coil drives according to stepper number and direction.
+ * For 2 bit hardware controllers (full steps, full torque)
+ * @param[in]	number     (stepper number)0..3  
+ * @param[in]	CW         (direction)0..1
+ * @returns none
+ */
+void Step(int number, uint8_t CW){
+  uint8_t seq = sStepper[number].seq;
+   if(CW){
+      if(seq)sStepper[number].portCoilA->FIOPIN ^=sStepper[number].CoilA_bitValue;
+      else sStepper[number].portCoilB->FIOPIN ^=sStepper[number].CoilB_bitValue;
+   }
+   else {
+      if(seq)sStepper[number].portCoilB->FIOPIN ^=sStepper[number].CoilB_bitValue;
+      else sStepper[number].portCoilA->FIOPIN ^=sStepper[number].CoilA_bitValue;
+   }
+   sStepper[number].seq = !seq;
+}
+
+
+/**  
+ * @brief stepperStop Command Line Interface.
+ * Format: command name (arg info)min..max values 
+ * @param[in]	number   Extracted from command line (stepper ORed ids)1..15  
+ * @returns none
+ */
+void cli_StepperStop(void){
+   unsigned int value, i;
+   if(ExtractUInteger(pLine,&value,1,15)){ 
+      for(i=0;i<stepperQty;i++){
+         if(value & 1<<i)sStepper[i].nSteps=0;
+		 rGPPST(i);  // GPPST id pinA pinB delay status
+      }
+
+      if(Feedback)printf("StepperStop %d\n",value);
+      return;
+   }
+   if(Help)printf("stepperStop (Value)1..15\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/** Speed control for step motors (1 or up to 4)
+ * @brief stepSpeed Command Line Interface.
+ * Format: command name (arg info)min..max values 
+ * @param[in] Extracted from command line (stepper ORed ids)1..15  
+ * @returns Message: stepSpeed ids value
+ */
+void cli_StepSpeed(void){
+   unsigned int id, i, delay;
+   if(ExtractUInteger(pLine,&id,1,15)){ 
+      if(ExtractUInteger(pLine,&delay,1,255)){ 
+	      for(i=0;i<stepperQty;i++){
+	         // change delay for one stepper
+			 if(id & 1<<i)sStepper[i].delay=(uint8_t)delay;
+			 // report to gui
+			 printf("stepSpeed %d %d\n",id,delay);
+	      }
+	  }
+
+      if(Feedback)printf("StepperSpeed ID %d Delay %d\n",id,delay);
+      return;
+   }
+   if(Help)printf("stepSpeed (Stepper IDs ORed)1..15 (Delay Value)1..255\n");
+   // Ignore pending command line
+   NextCommand(nl,pLine);
+}
+
+/**  @brief Module State Machine.
+ * @param[in]	none 
+ * @returns    On Ending steps, Send Message: GPPST id pinA pinB delay status
+ */
+void StepperSM(void){
+   int i;
+
+   for(i=0;i<stepperQty;i++){                      // for each stepper
+      if(sStepper[i].active){                      // SM initialized ?  
+         if(sStepper[i].nSteps!=0){                // step to do ?
+            if(sStepper[i].eggTimer==0){           // time to step ?
+               Step(i,sStepper[i].cw);             // step
+               sStepper[i].eggTimer=sStepper[i].delay;  // set delay timer for next step
+               if(sStepper[i].nSteps<nonStop){     // continuous mode ?
+                  if(--sStepper[i].nSteps == 0)    // decrease step qty if not continuous mode
+                     rGPPST(i);   // Message GPPST id pinA pinB delay status
+               }
+            }     
+         }
+      }
+   }
+}
+
+
+/**  @brief stepper Command Line Interface.
+ * This function controls the stepper 
+ * Command Line Format: stepper (value)0..3 (direction)0..1 (PinA)0..432 (PinB)0..432 (delay)1..255 (steps)1..65535  
+ * @param[in]	Extracted from command line (value)0..3 (PinA)0..432 (PinB)0..432 (direction)0..1 (delay)1..255 (steps)1..65535 
+ * @returns    Message: GPPST id pinA pinB delay status
+ */
+void cli_Stepper(void){
+unsigned int id,cw, delay, steps, pinA, pinB, port, bitValue;
+
+   if(ExtractUInteger(pLine,&id,0,stepperQty-1)){       // extract stepper id
+   	 if(ExtractUInteger(pLine,&pinA,0,432)){			// extract pinA
+	 	 if(ExtractUInteger(pLine,&pinB,0,432)){		// extract pinB
+		      if(ExtractUInteger(pLine,&cw,0,1)){               // extract direction
+		         if(ExtractUInteger(pLine,&delay,1,255)){       // extract step delay
+		            if(!ExtractUInteger(pLine,&steps,1,65535)){ // check for optionnal steps arg
+		               steps = nonStop;  // default to nonStop
+		            }
+			     				  
+				  // Get ports, bit and bit values
+				  sStepper[id].pinA=(uint8_t)pinA;
+				  sStepper[id].pinB=(uint8_t)pinB;
+			      port = pinA/100;
+			      bitValue = 1<<(pinA%100);
+				  sStepper[id].portCoilA = jmGPIO[port];    // Coil A port
+	              sStepper[id].CoilA_bitValue = bitValue; // Coil A bit
+	
+				  port = pinB/100;
+			      bitValue = 1<<(pinB%100);
+				  sStepper[id].portCoilB = jmGPIO[port];    // Coil B port
+	              sStepper[id].CoilB_bitValue = bitValue; // Coil B bit
+	
+	              sStepper[id].active = 1;            // initialized true
+	
+	              // Port.Pin set to outputs
+	              sStepper[id].portCoilA->FIODIR |= sStepper[id].CoilA_bitValue;
+	              sStepper[id].portCoilB->FIODIR |= sStepper[id].CoilB_bitValue;
+					
+		          sStepper[id].cw =cw;           
+		          sStepper[id].delay = (uint8_t)delay;
+		          sStepper[id].nSteps = (uint16_t)steps;
+		            
+				  // chip report to GUI
+				  rGPPST(id); //Message: GPPST id pinA pinB delay status
+
+				  if(Feedback)printf("Stepper:%d PinA:%d PinB:%d CW:%d Delay:%d Steps:%d\n",id,pinA,pinB,cw,delay,steps);              
+		          return;
+		        }// delay
+		      }// direction
+			}// pinB
+		}// pinA
+    }// stepper number
+    if(Help)printf("stepper (Stepper id)0..3 (PinA)0..432 (PinB)0..432 (Direction cw/ccw)0..1 (Delay)1..255 [(Steps)1..65535]\n"); 
+    // Ignore pending command line
+    NextCommand(nl,pLine);
+}
+
+/** 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    Message: GPPST id pinA pinB delay status
+ */
+void cli_GPPST(void)
+{	unsigned int id;
+   if(ExtractUInteger(pLine,&id,0,stepperQty-1)){  // extract id Number
+       rGPPST(id);   // Message: GPPST id pinA pinB delay status
+	   return;
+	}
+
+    if(Help)printf("GPPST (Stepper id)0..%d\n",stepperQty-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: GPPST id pinA pinB ddelay status
+ */
+void rGPPST(unsigned int id ){
+    int status;
+	if( sStepper[id].active )
+	{   if(sStepper[id].nSteps == 0)status = stStopped;
+	    else 
+		{
+		 if( sStepper[id].cw) status = stRunningCW;
+		 else status = stRunningCCW;
+		}
+	}
+	else  status = stNotInit;					 
+	printf("GPPST %d %d %d %d %d\n",id,sStepper[id].pinA,sStepper[id].pinB,sStepper[id].delay,status);
+}
diff -r 000000000000 -r 9112e09912db jmStepper.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmStepper.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,99 @@
+/*************************************************************************
+ * @file	jmStepper.h
+ * @brief	Stepper Control Interface
+ *          You can use 4,5,6 and 8 wire steppers.
+ *          Each output pin must have two drivers. 
+ * 			One driver must be the inverted output pin.
+ *          The other driver is the non inverted output pin.
+ *          This way the steppers operate in full step, full torque mode.
+ *             .
+ * @version	1.0
+ * @date	Feb 12, 2010
+ */
+
+/*
+   * Module Command Line Interface 
+     Format: command name (arg info)min..max values [optional argument]
+      stepper (Stepper number)0..3 (Pin CoilA)0..432 (Pin CoilB)0..432 (Direction)0..1 (Delay)1..255 [(Steps)1..65535] 
+      stepperStop (steppers value)1..15
+
+      Example for stepper on pins Port1.31 Port1.30	  DIP20 DIP19
+	  stepper 0 131 130 1 1     shortest delays between steps (fastest speed) continuous mode
+      stepper 0 131 130 0 1 1   one step in reverse direction 
+      stepper 0 131 130 1 10 5  5 steps in foward direction with 10 unit ticks between steps
+
+   * Module Events
+      GPPST (stepper id)0..3   
+         On Ending steps, Send Message: GPPST id pinA pinB delay status
+
+   *  Module Feedback and Help messages may be enabled/disabled by Command Lines.
+		 feedback (enable/disable)0..1
+         help (enable/disable)0..1
+
+*/
+
+#ifndef jmStepperdef
+  #define jmStepperdef 1
+
+  #define stepperQty 4 // 4 steppers max 
+
+  #include "LPC17xx.h"
+
+  // Module Data Structure
+  extern struct StructStepper{
+   uint8_t cw;  
+   uint8_t active; 
+   uint8_t seq;   
+   uint8_t delay;            
+   uint8_t eggTimer;  
+   uint16_t nSteps;
+   uint16_t pinA;
+   uint16_t pinB;
+   uint32_t CoilA_bitValue;
+   uint32_t CoilB_bitValue;
+   LPC_GPIO_TypeDef *portCoilA;
+   LPC_GPIO_TypeDef *portCoilB;
+ }sStepper[stepperQty];
+
+#endif
+
+// Module Prototypes
+void StepperInit(void);
+void StepperSM(void);
+void cli_Stepper(void);
+void Step(int number, bool CW);
+void cli_StepperStop(void);
+void cli_GPPST(void);
+void rGPPST(unsigned int id);
+void cli_StepSpeed(void);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmStepper.h"
+*/
+
+// CLIG-INIT
+/*
+   StepperInit();
+*/
+
+// CLIG-TIMER
+/*
+   // Module jmStepper
+   for(i=0;i<stepperQty;i++)if(sStepper[i].eggTimer>0)sStepper[i].eggTimer--;
+*/
+
+// CLIG-CMD
+/*
+stepper cli_Stepper();
+stepperStop cli_StepperStop();
+GPPST cli_GPPST();
+stepSpeed cli_StepSpeed();
+*/
+
+// CLIG-SM
+/*
+     StepperSM();
+*/
+//-------------------------- END CLIG PLUGS --------------------
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);
+}
diff -r 000000000000 -r 9112e09912db jmStepperAxis.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmStepperAxis.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,74 @@
+/*************************************************************************
+ * @file	jmStepperAxis.h
+ * @brief	
+ *             .
+ * @version	1.0
+ * @date	Feb 12, 2011
+ */
+
+/*
+   * Module Command Line Interface 
+     Format: command name (arg info)min..max values [optional argument]
+
+
+   * Module Events
+
+   *  Module Feedback and Help messages may be enabled/disabled by Command Lines.
+		 feedback (enable/disable)0..1
+         help (enable/disable)0..1
+
+*/
+
+#ifndef jmStepperAxisdef
+  #define jmStepperAxisdef 1
+
+  #define stepperAxisQty 4 // 4 steppers max 
+
+  #include "LPC17xx.h"
+
+  // Module Data Structure
+  extern struct StructStepperAxis{
+   uint8_t active;    
+   uint8_t limitCW;  
+   uint8_t limitCCW; 
+   uint8_t stepperID; 
+   uint8_t status;  
+ }sStepperAxis[stepperAxisQty];
+
+#endif
+
+// Module Prototypes
+void StepperAxisInit(void);
+void StepperAxisSM(void);
+void cli_StepperAxis(void);
+void rGPPSTA(unsigned int id );
+void cli_GPPSTA(void);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmStepperAxis.h"
+*/
+
+// CLIG-INIT
+/*
+   StepperAxisInit();
+*/
+
+// CLIG-NEEDS
+/*
+jmStepper
+jmSwitch
+*/
+
+// CLIG-CMD
+/*
+stepperAxis cli_StepperAxis();
+GPPSTA cli_GPPSTA();
+*/
+
+// CLIG-SM
+/*
+     StepperAxisSM();
+*/
+//-------------------------- END CLIG PLUGS --------------------
diff -r 000000000000 -r 9112e09912db jmSwitch.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmSwitch.c	Sat Feb 12 16:50:25 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); 
+}
diff -r 000000000000 -r 9112e09912db jmSwitch.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmSwitch.h	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,77 @@
+/*************************************************************************
+ * @file	jmSwitch.h
+ * @brief	Command Line Interface Module for reading switches
+ * 			Up to 8 switches can be defined on any digital mbed Pin.
+ *          Provide debounce and edge detection
+ * @version	1.0
+ * @date	Feb 2, 2011
+
+   Command Line Interface 
+   Format: command name (arg info)min..max values [optional argument]
+      swRead (Switch id)0..3  Return Message: GPPS0 id pin debounce state
+      swInit (Switch id)0..7 (Pin number)0..432 (debounce interval)1..255
+	          Initialize a Limit Switch Process and return Message: GPPS0 id pin debounce state
+	  GPPS0	 Return 8 Message: GPPS0 id pin debounce state
+
+   Module Events
+        On closing of switch, Return Message: GPPS0 id pin debounce state
+        On Opening of switch, Return Message: GPPS0 id pin debounce state
+*/
+
+#ifndef jmSwitchDef
+   #define jmSwitchDef 1
+   #include "stdint.h"
+   #include "LPC17xx.h"
+
+   #define switchQty 8 // max switch qty
+
+    // Module Data Structure
+	 extern   struct StructSwitch{ 
+	       uint16_t pin;
+	       uint8_t debounce;   
+		   uint8_t state; 
+	       uint8_t eggTimer;  
+	       uint32_t bitValue;
+	       LPC_GPIO_TypeDef *port;
+	    }sSwitch[switchQty]; 
+#endif
+
+// Module Prototypes
+void SwitchEdgeDetect(void);
+void cli_SwitchInit(void);
+void cli_SwitchRead(void);
+void cli_GPPS0();
+void rGPPS0(unsigned int id);
+void SwitchModuleReset(void);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmSwitch.h"
+
+*/
+
+// CLIG-INIT
+/*
+   SwitchModuleReset();   
+*/
+
+// CLIG-TIMER
+/*
+   // Module jmSwitch
+   for(i=0;i<switchQty;i++)if(sSwitch[i].eggTimer>0)sSwitch[i].eggTimer--;
+*/
+
+// CLIG-CMD
+/*
+swRead cli_SwitchRead();
+swInit cli_SwitchInit();
+GPPS0 cli_GPPS0();
+*/
+
+// CLIG-SM
+/*
+     SwitchEdgeDetect();
+*/
+
+//-------------------------- END CLIG PLUGS --------------------
diff -r 000000000000 -r 9112e09912db main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Feb 12 16:50:25 2011 +0000
@@ -0,0 +1,96 @@
+/*************************************************************************
+ * @file         main.cpp
+ *                  
+ * @version      1.0
+ * @date         Feb 12, 2011
+*/
+
+#include "mbed.h"
+
+// Basic includes
+#include "jmInterpreter.h"
+#include "jmRingBuffer.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "LPC17xx.h"
+
+
+LPC_GPIO_TypeDef *jmGPIO[5] ={LPC_GPIO0,LPC_GPIO1,LPC_GPIO2,LPC_GPIO3,LPC_GPIO4};
+
+// CLIG-INCLUDE
+#include "jmLPC17xx_gpio.h"
+#include "jmMotor.h"
+#include "jmPulse.h"
+#include "jmStepper.h"
+#include "jmStepperAxis.h"
+#include "jmSwitch.h"
+
+
+// Initializations
+void Inits(){
+   InitCommandLineRingBuffer();
+   InitMessages();
+   cli_version();
+
+   // CLIG-INIT
+   MotorInit();
+   PulseInit();
+   StepperInit();
+   StepperAxisInit();
+   SwitchModuleReset();   
+
+}
+
+// EggTimer tickers for modules
+void eggTimers(){
+   int i;
+   // CLIG-TIMER
+   // Module jmMotor
+   for(i=0;i<motorQty;i++)if(sMotor[i].eggTimer>0)sMotor[i].eggTimer--;
+   // Module jmPulse
+   for(i=0;i<pulseQty;i++)if(sPulse[i].eggTimer>0)sPulse[i].eggTimer--;
+   // Module jmStepper
+   for(i=0;i<stepperQty;i++)if(sStepper[i].eggTimer>0)sStepper[i].eggTimer--;
+   // Module jmSwitch
+   for(i=0;i<switchQty;i++)if(sSwitch[i].eggTimer>0)sSwitch[i].eggTimer--;
+
+}
+
+int main() {
+   unsigned char c;
+   Serial pc(USBTX, USBRX);          // communication medium
+   pc.baud(115200);                  // 115200 bauds, 8bits, 1 stop, no control flow
+   Ticker tick;                      // enable system ticks
+   tick.attach_us(&eggTimers,1000);  // enable and select granularity for egg timers
+   Inits();                          // initialization
+
+   while(true){
+     if( pc.readable()){             // something to read ?
+        c= pc.getc();                // read one char   
+
+        if(Echo) printf("%c",c);     // echo it ?
+
+        switch(c){                   // process it
+
+          case  8 : DelChar(pLine);  // remove last one
+                    break;
+          case 10 : Insert(c,pLine); // end of line
+                         Interpret();// process line 
+                    break;
+          default : Insert(c,pLine); // insert char in command line buffer
+        }
+     } // if
+
+     // CLIG-SM
+     MotorSM();
+     PulseSM();
+     StepperSM();
+     StepperAxisSM();
+     SwitchEdgeDetect();
+
+
+   }// while
+}// main
+
+
+
diff -r 000000000000 -r 9112e09912db main.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,18 @@ +/************************************************************************* + * @file main.h + * @version 1.0 + * @date Feb 12, 2011 + */ + +#include "LPC17xx.h" + +// registers +extern LPC_GPIO_TypeDef *jmGPIO[5]; + +// Prototypes +void Inits(void); + +// CLIG-CMD +/* +init Inits(); +*/
diff -r 000000000000 -r 9112e09912db mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sat Feb 12 16:50:25 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912