Jean Mercier
/
jmAll
Command all jmCLIG modules from serial port
jmRingBuffer.c
- Committer:
- jm
- Date:
- 2011-02-12
- Revision:
- 0:9112e09912db
File content as of revision 0:9112e09912db:
/************************************************************************* * @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; }