Get accesss to GPIO Registers from serial port

Dependencies:   mbed

Committer:
jm
Date:
Sat Feb 12 16:36:31 2011 +0000
Revision:
0:35df659aaddf
General IO Command Line Interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jm 0:35df659aaddf 1 /*************************************************************************
jm 0:35df659aaddf 2 * @file jmRingBuffer.c
jm 0:35df659aaddf 3 * @brief Command Line Rx Ring Buffer
jm 0:35df659aaddf 4 *
jm 0:35df659aaddf 5 * @date December 27,2010
jm 0:35df659aaddf 6 */
jm 0:35df659aaddf 7
jm 0:35df659aaddf 8
jm 0:35df659aaddf 9 #include "jmRingBuffer.h"
jm 0:35df659aaddf 10 #include "stdio.h"
jm 0:35df659aaddf 11
jm 0:35df659aaddf 12 struct RingBuffer Line, *pLine;
jm 0:35df659aaddf 13
jm 0:35df659aaddf 14 /** @brief Command line ring buffer initialization.
jm 0:35df659aaddf 15 * @param none
jm 0:35df659aaddf 16 * @returns none
jm 0:35df659aaddf 17 */
jm 0:35df659aaddf 18 void InitCommandLineRingBuffer(void){
jm 0:35df659aaddf 19 pLine = &Line;
jm 0:35df659aaddf 20 FlushRingBuffer(pLine);
jm 0:35df659aaddf 21 }
jm 0:35df659aaddf 22
jm 0:35df659aaddf 23 /** @brief Move ring head pointer foward.
jm 0:35df659aaddf 24 * @param *p pointer to ring buffer
jm 0:35df659aaddf 25 * @returns none
jm 0:35df659aaddf 26 */
jm 0:35df659aaddf 27 void NextHead(struct RingBuffer *p)
jm 0:35df659aaddf 28 { p->head++;
jm 0:35df659aaddf 29 if(p->head >= DimRingBuffer)
jm 0:35df659aaddf 30 p->head=0;
jm 0:35df659aaddf 31 }
jm 0:35df659aaddf 32
jm 0:35df659aaddf 33 /** @brief Move ring tail pointer foward.
jm 0:35df659aaddf 34 * @param pointer to ring buffer
jm 0:35df659aaddf 35 * @returns none
jm 0:35df659aaddf 36 */
jm 0:35df659aaddf 37 void NextTail(struct RingBuffer *p)
jm 0:35df659aaddf 38 { p->tail++;
jm 0:35df659aaddf 39 if(p->tail >= DimRingBuffer)
jm 0:35df659aaddf 40 p->tail=0;
jm 0:35df659aaddf 41 }
jm 0:35df659aaddf 42
jm 0:35df659aaddf 43 /** @brief Check if buffer full.
jm 0:35df659aaddf 44 * @param *p pointer to ring buffer
jm 0:35df659aaddf 45 * @returns true if full, false otherwise
jm 0:35df659aaddf 46 */
jm 0:35df659aaddf 47 bool Full(struct RingBuffer *p)
jm 0:35df659aaddf 48 { if(p->qty >= DimRingBuffer)
jm 0:35df659aaddf 49 return true;
jm 0:35df659aaddf 50 else
jm 0:35df659aaddf 51 return false;
jm 0:35df659aaddf 52 }
jm 0:35df659aaddf 53
jm 0:35df659aaddf 54 /** @brief Insert a char in buffer.
jm 0:35df659aaddf 55 * @param c unsigned char to be inserted
jm 0:35df659aaddf 56 * @param *p pointer to ring buffer
jm 0:35df659aaddf 57 * @returns none
jm 0:35df659aaddf 58 */
jm 0:35df659aaddf 59 void Insert(unsigned char c, struct RingBuffer *p)
jm 0:35df659aaddf 60 { if(Full(p))
jm 0:35df659aaddf 61 NextHead(p);
jm 0:35df659aaddf 62 else
jm 0:35df659aaddf 63 p->qty++;
jm 0:35df659aaddf 64
jm 0:35df659aaddf 65 p->Buffer[p->tail]=c;
jm 0:35df659aaddf 66 NextTail(p);
jm 0:35df659aaddf 67 }
jm 0:35df659aaddf 68
jm 0:35df659aaddf 69 /** @brief Check if ring buffer not empty.
jm 0:35df659aaddf 70 * @param *p pointer to ring buffer
jm 0:35df659aaddf 71 * @returns true if full, false otherwise
jm 0:35df659aaddf 72 */
jm 0:35df659aaddf 73 bool NotEmpty(struct RingBuffer *p)
jm 0:35df659aaddf 74 { if(p->qty == 0)
jm 0:35df659aaddf 75 return false ;
jm 0:35df659aaddf 76 else
jm 0:35df659aaddf 77 return true;
jm 0:35df659aaddf 78 }
jm 0:35df659aaddf 79
jm 0:35df659aaddf 80 /** @brief Extract a char from ring buffer.
jm 0:35df659aaddf 81 * @param *p pointer to ring buffer
jm 0:35df659aaddf 82 * @returns unsigned char
jm 0:35df659aaddf 83 */
jm 0:35df659aaddf 84 unsigned char Extract(struct RingBuffer *p)
jm 0:35df659aaddf 85 { unsigned char c;
jm 0:35df659aaddf 86 c = p->Buffer[p->head];
jm 0:35df659aaddf 87 if(NotEmpty(p))
jm 0:35df659aaddf 88 { NextHead(p);
jm 0:35df659aaddf 89 p->qty--;
jm 0:35df659aaddf 90 }
jm 0:35df659aaddf 91 return c;
jm 0:35df659aaddf 92 }
jm 0:35df659aaddf 93
jm 0:35df659aaddf 94 /** @brief Flush ring buffer.
jm 0:35df659aaddf 95 * @param *p pointer to ring buffer
jm 0:35df659aaddf 96 * @returns none
jm 0:35df659aaddf 97 */
jm 0:35df659aaddf 98 void FlushRingBuffer(struct RingBuffer *p)
jm 0:35df659aaddf 99 { int i;
jm 0:35df659aaddf 100 p->head = 0;
jm 0:35df659aaddf 101 p->tail = 0;
jm 0:35df659aaddf 102 p->qty = 0;
jm 0:35df659aaddf 103 for(i=0;i<DimRingBuffer;i++)p->Buffer[i]=0;
jm 0:35df659aaddf 104 }
jm 0:35df659aaddf 105
jm 0:35df659aaddf 106 /** @brief Delete last char from ring buffer.
jm 0:35df659aaddf 107 * @param *p pointer to ring buffer
jm 0:35df659aaddf 108 * @returns none
jm 0:35df659aaddf 109 */
jm 0:35df659aaddf 110 void DelChar(struct RingBuffer *p)
jm 0:35df659aaddf 111 { if(p->qty != 0){
jm 0:35df659aaddf 112 if(p->tail==0)p->tail=DimRingBuffer;
jm 0:35df659aaddf 113 else p->tail--;
jm 0:35df659aaddf 114 p->qty--;
jm 0:35df659aaddf 115 }
jm 0:35df659aaddf 116 }
jm 0:35df659aaddf 117
jm 0:35df659aaddf 118 /** @brief Remove a command line from ring buffer.
jm 0:35df659aaddf 119 * @param c end command identifier unsigned char
jm 0:35df659aaddf 120 * @param *p pointer to ring buffer
jm 0:35df659aaddf 121 * @returns none
jm 0:35df659aaddf 122 */
jm 0:35df659aaddf 123 void NextCommand(unsigned char c, struct RingBuffer *p){
jm 0:35df659aaddf 124 // remove all char till end identifier is found
jm 0:35df659aaddf 125 while(NotEmpty(p) && p->Buffer[p->head] != c)
jm 0:35df659aaddf 126 { NextHead(p);
jm 0:35df659aaddf 127 p->qty--;
jm 0:35df659aaddf 128 }
jm 0:35df659aaddf 129
jm 0:35df659aaddf 130 // remove end identifier
jm 0:35df659aaddf 131 if(NotEmpty(p)&& p->Buffer[p->head] == c)
jm 0:35df659aaddf 132 { NextHead(p);
jm 0:35df659aaddf 133 p->qty--;
jm 0:35df659aaddf 134 }
jm 0:35df659aaddf 135 }
jm 0:35df659aaddf 136
jm 0:35df659aaddf 137 /** @brief View ring buffer content.
jm 0:35df659aaddf 138 * Print ring buffer content
jm 0:35df659aaddf 139 * @param *p pointer to ring buffer
jm 0:35df659aaddf 140 * @returns none
jm 0:35df659aaddf 141 */
jm 0:35df659aaddf 142 void ViewRingBuffer(struct RingBuffer *p){
jm 0:35df659aaddf 143 int i,j;
jm 0:35df659aaddf 144
jm 0:35df659aaddf 145 printf("\nRingBuffer Qty: %d \nContent: ",p->qty);
jm 0:35df659aaddf 146
jm 0:35df659aaddf 147 for(j=0,i=p->head;j<p->qty;j++){
jm 0:35df659aaddf 148 printf("%c",p->Buffer[i]);
jm 0:35df659aaddf 149 if(i++>DimRingBuffer)i=0;
jm 0:35df659aaddf 150 }
jm 0:35df659aaddf 151 printf("\n");
jm 0:35df659aaddf 152 }
jm 0:35df659aaddf 153
jm 0:35df659aaddf 154 /** @brief Extract a word from ring buffer.
jm 0:35df659aaddf 155 * The extracted word is put in the array pointed by word
jm 0:35df659aaddf 156 * @param p pointer to a ring buffer
jm 0:35df659aaddf 157 * @param word pointer to array of char
jm 0:35df659aaddf 158 * @returns true if a word is extracted otherwise returns false
jm 0:35df659aaddf 159 */
jm 0:35df659aaddf 160 bool ExtractWord(struct RingBuffer *p, char * word){
jm 0:35df659aaddf 161 unsigned char c;
jm 0:35df659aaddf 162 int i,j;
jm 0:35df659aaddf 163 j=0;
jm 0:35df659aaddf 164
jm 0:35df659aaddf 165 if(NotEmpty(p)){
jm 0:35df659aaddf 166 for(i=0;i<WordMaxSize-1;i++){
jm 0:35df659aaddf 167 // extract a char from Rx ring buffer
jm 0:35df659aaddf 168 c=Extract(p);
jm 0:35df659aaddf 169
jm 0:35df659aaddf 170 // remove leading blanks
jm 0:35df659aaddf 171 if(c==' ' && j==0)continue;
jm 0:35df659aaddf 172
jm 0:35df659aaddf 173 // end of word or end of command line
jm 0:35df659aaddf 174 if(c==' ' || c==nl)break;
jm 0:35df659aaddf 175
jm 0:35df659aaddf 176 // build the Word
jm 0:35df659aaddf 177 word[j++]=c;
jm 0:35df659aaddf 178 }
jm 0:35df659aaddf 179 // 0 string termination
jm 0:35df659aaddf 180 word[j]=0;
jm 0:35df659aaddf 181 if(j>0)return true;
jm 0:35df659aaddf 182 }
jm 0:35df659aaddf 183 return false;
jm 0:35df659aaddf 184 }
jm 0:35df659aaddf 185
jm 0:35df659aaddf 186 /** @brief Extract an unsigned int from ring buffer.
jm 0:35df659aaddf 187 * Convert a word from buffer into an integer between min and max values
jm 0:35df659aaddf 188 * Value converted should be between min and max values.
jm 0:35df659aaddf 189 * Value should be decimal or hexadecimal (beginning by 0x or 0X)
jm 0:35df659aaddf 190 * @param p pointer to ring buffer
jm 0:35df659aaddf 191 * @param result pointer to unsigned int
jm 0:35df659aaddf 192 * @param min minimum limit
jm 0:35df659aaddf 193 * @param max maximum limit
jm 0:35df659aaddf 194 * @returns true if value is converted beetween limits, including limits.
jm 0:35df659aaddf 195 */
jm 0:35df659aaddf 196 bool ExtractUInteger(struct RingBuffer *p, unsigned int *result, unsigned int min, unsigned int max){
jm 0:35df659aaddf 197 unsigned int i ;
jm 0:35df659aaddf 198 char word[WordMaxSize-1];
jm 0:35df659aaddf 199
jm 0:35df659aaddf 200 if(ExtractWord(p,word)){ // Extract string value
jm 0:35df659aaddf 201 if(word[0]=='0' && (word[1]=='x' || word[1]=='X')) {
jm 0:35df659aaddf 202 sscanf(word,"%x",&i); // convert hexadecimal input
jm 0:35df659aaddf 203 }
jm 0:35df659aaddf 204 else
jm 0:35df659aaddf 205 sscanf(word,"%d",&i); // convert decimal input
jm 0:35df659aaddf 206
jm 0:35df659aaddf 207 if(i>=min && i<=max){
jm 0:35df659aaddf 208 *result = i;
jm 0:35df659aaddf 209 return true;
jm 0:35df659aaddf 210 }
jm 0:35df659aaddf 211 }
jm 0:35df659aaddf 212 *result = 0;
jm 0:35df659aaddf 213 return false;
jm 0:35df659aaddf 214 }