2 bit Bridge Driver

Files at this revision

API Documentation at this revision

Comitter:
jm
Date:
Sat Feb 19 01:30:54 2011 +0000
Commit message:
jmBridge Module

Changed in this revision

ActiveLevel.h Show annotated file Show diff for this revision Revisions of this file
jmBridge.c Show annotated file Show diff for this revision Revisions of this file
jmBridge.h Show annotated file Show diff for this revision Revisions of this file
jmCommands.c Show annotated file Show diff for this revision Revisions of this file
jmCommands.h Show annotated file Show diff for this revision Revisions of this file
jmInterpreter.c Show annotated file Show diff for this revision Revisions of this file
jmInterpreter.h Show annotated file Show diff for this revision Revisions of this file
jmMessages.c Show annotated file Show diff for this revision Revisions of this file
jmMessages.h Show annotated file Show diff for this revision Revisions of this file
jmRingBuffer.c Show annotated file Show diff for this revision Revisions of this file
jmRingBuffer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r bfa30f27fe9d ActiveLevel.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ActiveLevel.h	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,23 @@
+/* ActiveLevel.h 
+
+*/
+
+#ifndef ActiveLevel_
+  #define ActiveLevel_
+
+  // Set, Clear Toggle
+	#ifndef ActiveLevelLow
+	  #define Active(BitVal,value) (value = value | BitVal)
+	  #define Inactive(BitVal,value)  (value = value & ~ BitVal)
+	#else 
+	  #define Inactive(BitVal,value) (value = value | BitVal)
+	  #define Active(BitVal,value)  (value = value & ~ BitVal)
+	#endif
+
+	 #define Toggle(BitVal,value)  (value = value ^ BitVal)
+
+     #define High(BitVal,value) ((value & BitVal)!=0)
+	 #define Low(BitVal,value) ((value & BitVal)==0)
+
+#endif
+
diff -r 000000000000 -r bfa30f27fe9d jmBridge.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmBridge.c	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,256 @@
+/*************************************************************************
+ * @file    jmBridge.c                 
+ * @version    1.0
+ * @date    Feb 18, 2011
+ */
+
+#include "jmBridge.h"
+#include "jmRingBuffer.h"
+#include "LPC17xx.h"
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "stdio.h"
+
+#define ActiveLevelLow
+#include "ActiveLevel.h"
+
+#ifndef nonStop
+  #define nonStop 65535  // for continuous mode operation
+#endif
+
+#define bdNotInit 0
+#define bdRunningCW 1
+#define bdRunningCCW 2
+#define bdStopped 3
+
+// Module Data Structure
+struct StructBridge sBridge[bridgeQty]; // static creation
+
+/** Module Data Structure Initialization
+ * @brief   All State Machines non initialized
+ * @param[in]    none
+ * @returns none
+ */
+void BridgeInit(void){
+   int i;
+   for(i=0;i<bridgeQty;i++){
+     sBridge[i].active = bdNotInit;
+   }
+}
+
+/** Bridge DC control (1 or up to 4)
+ * @brief bridgeDC Command Line Interface.
+ * Format: command name (arg info)min..max values 
+ * bridgeDC (Bridge IDs ORed)1..15 (tOn Value)0..255 (tOff Value)0..255
+ * @param[in] Extracted from command line (Bridge IDs ORed)1..15 (tOn Value)0..255 (tOff Value)0..255 
+ * @returns Message: bridgeDC ids tOn tOff
+ */
+void cli_BridgeDC(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<bridgeQty;i++){              // check each motor
+                  if(id & 1<<i){                 // motor included ?     
+                      if(sBridge[i].active){         // motor initialized ?
+                           sBridge[i].tOn=(uint8_t)tOn;
+                           sBridge[i].tOff=(uint8_t)tOff;
+                         
+                         if(tOn==0){             // 0% ?
+                             sBridge[i].cycles=0;    
+                            // Inactive output according to active level selection
+                            Inactive(sBridge[i].driveBitValue,sBridge[i].drivePort->FIOPIN);
+                          }
+    
+                          if(tOff==0){              // 100% ?            
+                            // Active output according to active level selection
+                            Active(sBridge[i].driveBitValue,sBridge[i].drivePort->FIOPIN);
+                          }
+    
+                          if(tOn!=0 && tOff!=0){   // PWM ?
+                             // change motor tOn and tOff values
+                             sBridge[i].cycles=nonStop;
+                          }
+                          // report to gui
+                          rGPPBD(i);
+                      }    
+                  }             
+              }
+          }
+      }
+
+      if(Feedback)printf("BridgeDC ID %d tOn %d tOff %d\n",id,tOn, tOff);
+      return;
+   }
+   if(Help)printf("bridgeDC (Bridge 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 bridges control concurrently.
+ * @param none
+ * @returns Message at end of cycles: GPPBD id pinA pinB tOn tOff status
+ */ 
+void BridgeSM(void){
+  int i;
+   for(i=0;i<bridgeQty;i++){ // for each SM define by pins
+     // SM active ?
+     if(!sBridge[i].active) continue;
+   
+     if(sBridge[i].cycles!=0){  // Cycles to DO ?
+       switch(sBridge[i].state){       
+
+         // pulse is low
+         case  0: if(sBridge[i].eggTimer==0){             // time to change ?  
+                      // Active output according to active level selection
+                     Active(sBridge[i].driveBitValue,sBridge[i].drivePort->FIOPIN);     
+                     sBridge[i].eggTimer=sBridge[i].tOn;   // load timer with tOn   
+                     sBridge[i].state=1;                  // next state 
+                  }
+                  break;
+
+         // pulse is High
+         case  1: if(sBridge[i].eggTimer==0){                    // time to change ?
+                      // Inactive output according to active level selection
+                     Inactive(sBridge[i].driveBitValue,sBridge[i].drivePort->FIOPIN);  
+                     sBridge[i].eggTimer=sBridge[i].tOff;  // load timer with tOff  
+                     if(sBridge[i].cycles != nonStop){    // continuous mode ?
+                        if(--sBridge[i].cycles == 0)      // decrease qty if not continuous mode
+                           rGPPBD(i);   // Message: GPPBD id pinA pinB tOn tOff status
+                     }
+                     sBridge[i].state=0;                  // state 0
+                  }
+                  break;
+         }//switch
+       }//if
+  }//for
+}//BridgeSM
+
+
+/** @brief Bridge Command Line Interface
+ * Command Line Interface to control Bridge on mbed pins DIP5 to 30.
+ * Format: command name (arg info)min..max values 
+ * Command Line Format: bridge (Bridge ID)0..3 (pinA Pin)0..432 (pinB Pin)0..432 (pinA)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]
+ * @param[in]    Extracted from command line ((Bridge ID)0..3 (pinA Pin)0..432 (pinB Pin)0..432 (pinA)0..1 (tOn)1..255 (tOff)1..255 (Cycles)[1..65535]
+ * @returns    Message: GPPBD id pinA pinB tOn tOff status
+ */
+void cli_Bridge(void){
+   unsigned int id,pinA,pinB, dir, tOn,tOff,cycles;
+
+   if(ExtractUInteger(pLine,&id,0,bridgeQty-1)){        // extract motor id
+      if(ExtractUInteger(pLine,&pinA,0,432)){           // extract pinA    pin
+         if(ExtractUInteger(pLine,&pinB,0,432)){        // extract pinB 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;
+
+                       sBridge[id].active = 1;    
+                       sBridge[id].direction = dir;
+                       sBridge[id].tOn = (uint8_t)tOn;
+                       sBridge[id].tOff = (uint8_t)tOff;
+                       sBridge[id].cycles = (uint16_t)cycles;
+                       sBridge[id].state = 0;
+                       sBridge[id].eggTimer = 0;
+                       sBridge[id].pinA = pinA;
+                       sBridge[id].pinB = pinB;
+    
+                      // the bridge driver that uses this software needs to switch
+                      // dir and drive pins when you reverse direction                      
+                      if(dir)
+                      {    // direction on pinA and drive on pinB
+                        sBridge[id].dirBitValue = 1<<(pinA%100);
+                        sBridge[id].dirPort = jmGPIO[pinA/100];
+                        sBridge[id].driveBitValue = 1<<(pinB%100);;
+                        sBridge[id].drivePort = jmGPIO[pinB/100];
+                      }
+                      else
+                      {    // direction on pinB and drive on pinA
+                        sBridge[id].dirBitValue = 1<<(pinB%100);
+                        sBridge[id].dirPort = jmGPIO[pinB/100];
+                        sBridge[id].driveBitValue = 1<<(pinA%100);;
+                        sBridge[id].drivePort = jmGPIO[pinA/100];
+                      }
+                                  
+                       // PinA, PinB  directions to outputs
+                       sBridge[id].dirPort->FIODIR |= sBridge[id].dirBitValue;
+                       sBridge[id].drivePort->FIODIR |= sBridge[id].driveBitValue;
+
+                       
+                      // Assert direction pin
+                      Inactive(sBridge[id].dirBitValue,sBridge[id].dirPort->FIOPIN);
+    
+                      // 100%
+                      if(tOff==0){
+                         Active(sBridge[id].driveBitValue,sBridge[id].drivePort->FIOPIN); 
+                         // SM off
+                         sBridge[id].cycles = 0;
+                      }
+    
+                      // 0%
+                      if(tOn==0){
+                         Inactive(sBridge[id].driveBitValue,sBridge[id].drivePort->FIOPIN); 
+                         // SM off
+                         sBridge[id].cycles = 0;
+                      }
+                      
+                      rGPPBD(id);   // Message: GPPBD id pinA pinB tOn tOff status
+        
+                      if(Feedback)printf("Bridge %d pinA %d pinB %d Dir %d tOn %d tOff %d Cycles %d\n",id,
+                                         pinA, pinB, dir,tOn,tOff,cycles); 
+                       return;
+                }
+             }
+          }
+       }
+       }
+    // Ignore pending command line
+       NextCommand(nl,pLine);
+    return;
+   }
+
+   if(Help)printf("Bridge (Bridge ID)0..%d (pinA Pin)0..432 (pinB Pin)0..432 (Direction)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]\n",bridgeQty-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: GPPBD id pinA pinB tOn tOff status
+ */
+void cli_GPPBD(void)
+{    unsigned int id;
+   if(ExtractUInteger(pLine,&id,0,bridgeQty-1)){  // extract id
+       rGPPBD(id);   // Message: GPPBD id pinA pinB tOn tOff status
+       return;
+    }
+
+    if(Help)printf("GPPST (Bridge id)0..%d\n",bridgeQty-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: GPPBD id pinA pinB tOn tOff status
+ */
+void rGPPBD(unsigned int id ){
+    int status;
+    if( sBridge[id].active )
+    {   if(sBridge[id].cycles == 0)status = bdStopped;
+        else 
+        {
+         if( sBridge[id].direction) status = bdRunningCW;
+         else status = bdRunningCCW;
+        }
+    }
+    else  status = bdNotInit;                     
+    printf("GPPBD %d %d %d %d %d %d\n",id,sBridge[id].pinA,sBridge[id].pinB,sBridge[id].tOn,sBridge[id].tOff,status);
+}
diff -r 000000000000 -r bfa30f27fe9d jmBridge.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmBridge.h	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,86 @@
+/*************************************************************************
+ * @file	jmBridge.h
+ * @brief	Bridge control on mbed DIP5 to 30.
+ *          Up to 4Bridges can be controlled at the same time.
+ *             
+ * @version	1.0
+ * @date	Feb 18, 2011
+ */
+
+/*
+   * Module Command Line Interface 
+     Format: command name (arg info)min..max values [optional argument]
+   
+     bridge (Bridge ID)0..3 (PinA)0..432 (PinB)0..432 (Direction)0..1 (tOn)0..255 (tOff)0..255 (Cycles)[1..65535]
+
+   * Module Events
+         On terminating cycles, send Message: GPPBR id PinA PinB 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 Bridgedef
+  #define Bridgedef 1
+
+  #define bridgeQty 4 // max number of Bridge
+  
+  #include "LPC17xx.h"
+
+  // Module Data Structure
+  extern struct StructBridge{
+     uint8_t active; 
+     uint8_t direction; 
+     uint8_t tOff;       
+     uint8_t tOn;
+     uint8_t state;
+     uint16_t pinA;
+     uint16_t pinB;
+     uint16_t eggTimer;
+     uint16_t cycles;
+     uint32_t dirBitValue;
+     LPC_GPIO_TypeDef * dirPort;
+     uint32_t driveBitValue;
+     LPC_GPIO_TypeDef * drivePort;
+  }sBridge[bridgeQty];
+
+#endif
+
+// Module Prototypes
+void cli_Bridge(void);
+void BridgeInit(void);
+void BridgeSM(void);
+void cli_BridgeDC(void);
+void cli_GPPBD(void);
+void rGPPBD(unsigned int id);
+
+//-------------------------- CLIG PLUGS --------------------
+// CLIG-INCLUDE
+/*
+#include "jmBridge.h"
+*/
+
+// CLIG-CMD
+/*
+bridge cli_Bridge();
+GPPBD cli_GPPBD();
+bridgeDC cli_BridgeDC();
+*/
+
+// CLIG-INIT
+/*
+   BridgeInit();
+*/
+
+// CLIG-TIMER
+/*
+   // Module jmBridge
+   for(i=0;i<bridgeQty;i++)if(sBridge[i].eggTimer>0)sBridge[i].eggTimer--;
+*/
+
+// CLIG-SM
+/*
+     BridgeSM();
+*/
+
diff -r 000000000000 -r bfa30f27fe9d jmCommands.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmCommands.c	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,72 @@
+/** @file  jmCommands.c
+ *  Auto Generated by jmCLIG
+ *  Friday, February 18, 2011  8:21 PM
+ *  @version  2011.01.05
+ */
+
+#include "main.h"
+#include "jmCommands.h"
+#include "jmMessages.h"
+#include "jmRingBuffer.h"
+#include "jmBridge.h"
+
+const char jmCLIG[] = {"\njmCLIG Version  2011.01.05 \nInstance Friday, February 18, 2011  8:21 PM\n"};
+
+// Command Name Table
+const char cmdNames[]=
+   {
+      'b','r','i','d','g','e',0,
+      'G','P','P','B','D',0,
+      'b','r','i','d','g','e','D','C',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,
+      'i','n','i','t',0,
+      0
+   };
+
+//  Section Definitions
+#define bridge 0
+#define GPPBD 1
+#define bridgeDC 2
+#define list 3
+#define ver 4
+#define help 5
+#define feedback 6
+#define echo 7
+#define init 8
+
+
+/***********************************************************************
+ * @brief	Command steering
+ * Command Associated with Command Number is Executed
+ * @param[in]	cmdNum Command Number
+ * @return		none
+ **********************************************************************/
+void Action(int cmdNum){
+   switch(cmdNum){
+     case bridge   : cli_Bridge();
+             break;
+     case GPPBD   : cli_GPPBD();
+             break;
+     case bridgeDC   : cli_BridgeDC();
+             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 init   : Inits();
+             break;
+     default : UnknownCommand();
+               NextCommand(nl,pLine);
+   }
+}
+
diff -r 000000000000 -r bfa30f27fe9d jmCommands.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmCommands.h	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,18 @@
+/** @file  jmCommands.h
+*  Auto Generated by jmCLIG
+*  @version  Friday, February 18, 2011  8:21 PM
+*/
+
+#ifndef jmCommandsdef
+   #define jmCommandsdef 1
+
+   #define nbCommands 9
+
+   // Strings
+   extern const char jmCLIG[74];
+   extern const char cmdNames[56];
+
+#endif
+
+// Prototypes
+void Action(int);
diff -r 000000000000 -r bfa30f27fe9d jmInterpreter.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmInterpreter.c	Sat Feb 19 01:30:54 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 bfa30f27fe9d jmInterpreter.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmInterpreter.h	Sat Feb 19 01:30:54 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 bfa30f27fe9d jmMessages.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmMessages.c	Sat Feb 19 01:30:54 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 bfa30f27fe9d jmMessages.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmMessages.h	Sat Feb 19 01:30:54 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 bfa30f27fe9d jmRingBuffer.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmRingBuffer.c	Sat Feb 19 01:30:54 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 bfa30f27fe9d jmRingBuffer.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jmRingBuffer.h	Sat Feb 19 01:30:54 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 bfa30f27fe9d main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,77 @@
+/*************************************************************************
+ * @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 "jmBridge.h"
+
+
+// Initializations
+void Inits(){
+   InitCommandLineRingBuffer();
+   InitMessages();
+   cli_version();
+
+   // CLIG-INIT
+   BridgeInit();
+
+}
+
+// EggTimer tickers for modules
+void eggTimers(){
+   int i;
+   // CLIG-TIMER
+   // Module jmBridge
+   for(i=0;i<bridgeQty;i++)if(sBridge[i].eggTimer>0)sBridge[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
+     BridgeSM();
+
+
+   }// while
+}// main
+
+
+
diff -r 000000000000 -r bfa30f27fe9d main.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.h	Sat Feb 19 01:30:54 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 bfa30f27fe9d mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Feb 19 01:30:54 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912