Jean Mercier
/
jmBridge
2 bit Bridge Driver
Revision 0:bfa30f27fe9d, committed 2011-02-19
- Comitter:
- jm
- Date:
- Sat Feb 19 01:30:54 2011 +0000
- Commit message:
- jmBridge Module
Changed in this revision
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