TX and RX FIFO. RX FIFO was tested. TX FIFO not fully tested.
Dependents: STM32F030R8_SOMO-14D
MessageQueue.cpp@0:35d1a2c4fb6d, 2015-03-13 (annotated)
- Committer:
- issaiass
- Date:
- Fri Mar 13 01:11:54 2015 +0000
- Revision:
- 0:35d1a2c4fb6d
TX and RX bufer.; ; The buffers are not fully tested, just only the receive buffer.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
issaiass | 0:35d1a2c4fb6d | 1 | /* |
issaiass | 0:35d1a2c4fb6d | 2 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 3 | * CERES CONTROLS |
issaiass | 0:35d1a2c4fb6d | 4 | * PANAMA, REPULIC OF PANAMA |
issaiass | 0:35d1a2c4fb6d | 5 | * |
issaiass | 0:35d1a2c4fb6d | 6 | * File : MessageQueue.cpp |
issaiass | 0:35d1a2c4fb6d | 7 | * Programmer(s) : Rangel Alvarado |
issaiass | 0:35d1a2c4fb6d | 8 | * Language : ANSI-C |
issaiass | 0:35d1a2c4fb6d | 9 | * Description : Function prototypes of serial Tx and Rx, buffer and utils. |
issaiass | 0:35d1a2c4fb6d | 10 | * |
issaiass | 0:35d1a2c4fb6d | 11 | * Note : Dependancies of mbed libraries... |
issaiass | 0:35d1a2c4fb6d | 12 | * - Serial |
issaiass | 0:35d1a2c4fb6d | 13 | * RX Buffer fully developed |
issaiass | 0:35d1a2c4fb6d | 14 | * TX Buffer is not fully implemented, can't change IRQ from |
issaiass | 0:35d1a2c4fb6d | 15 | * TX Empty to other interrupt without be hardware specific. |
issaiass | 0:35d1a2c4fb6d | 16 | * ---------------------------------------------------------------------------- |
issaiass | 0:35d1a2c4fb6d | 17 | * HISTORY |
issaiass | 0:35d1a2c4fb6d | 18 | * DD MM AA |
issaiass | 0:35d1a2c4fb6d | 19 | * 09 03 15 Created. |
issaiass | 0:35d1a2c4fb6d | 20 | * 09 03 15 Modified. |
issaiass | 0:35d1a2c4fb6d | 21 | * 12 03 15 Import to mbed platform. |
issaiass | 0:35d1a2c4fb6d | 22 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 23 | */ |
issaiass | 0:35d1a2c4fb6d | 24 | |
issaiass | 0:35d1a2c4fb6d | 25 | /* |
issaiass | 0:35d1a2c4fb6d | 26 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 27 | * INCLUDE FILES |
issaiass | 0:35d1a2c4fb6d | 28 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 29 | */ |
issaiass | 0:35d1a2c4fb6d | 30 | |
issaiass | 0:35d1a2c4fb6d | 31 | #include "includes.h" /* General Include file */ |
issaiass | 0:35d1a2c4fb6d | 32 | Serial ser(MSG_TX_PIN, MSG_RX_PIN); /* Serial Port configuration */ |
issaiass | 0:35d1a2c4fb6d | 33 | |
issaiass | 0:35d1a2c4fb6d | 34 | |
issaiass | 0:35d1a2c4fb6d | 35 | /* |
issaiass | 0:35d1a2c4fb6d | 36 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 37 | * DATA TYPES |
issaiass | 0:35d1a2c4fb6d | 38 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 39 | */ |
issaiass | 0:35d1a2c4fb6d | 40 | |
issaiass | 0:35d1a2c4fb6d | 41 | MSG_BUF MsgFifo; /* Call a buffer */ |
issaiass | 0:35d1a2c4fb6d | 42 | |
issaiass | 0:35d1a2c4fb6d | 43 | |
issaiass | 0:35d1a2c4fb6d | 44 | /* |
issaiass | 0:35d1a2c4fb6d | 45 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 46 | * |
issaiass | 0:35d1a2c4fb6d | 47 | * CONFIGURE RECEIVER INTERRUPT |
issaiass | 0:35d1a2c4fb6d | 48 | * |
issaiass | 0:35d1a2c4fb6d | 49 | * Description : Configure a function to attach an interrupt for the receiver |
issaiass | 0:35d1a2c4fb6d | 50 | * Arguments : msgfunc pointer to the function to call |
issaiass | 0:35d1a2c4fb6d | 51 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 52 | * Notes : Character arrived interrupt |
issaiass | 0:35d1a2c4fb6d | 53 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 54 | */ |
issaiass | 0:35d1a2c4fb6d | 55 | |
issaiass | 0:35d1a2c4fb6d | 56 | void MsgRxISRCfg(void (*msgfunc)(void)) { |
issaiass | 0:35d1a2c4fb6d | 57 | ser.attach(msgfunc, Serial::RxIrq); /* Attach a function to RX ISR */ |
issaiass | 0:35d1a2c4fb6d | 58 | } |
issaiass | 0:35d1a2c4fb6d | 59 | |
issaiass | 0:35d1a2c4fb6d | 60 | |
issaiass | 0:35d1a2c4fb6d | 61 | /* |
issaiass | 0:35d1a2c4fb6d | 62 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 63 | * |
issaiass | 0:35d1a2c4fb6d | 64 | * CONFIGURE TRANSMITTER INTERRUPT |
issaiass | 0:35d1a2c4fb6d | 65 | * |
issaiass | 0:35d1a2c4fb6d | 66 | * Description : Configure a function to attach an interrupt for transmitter |
issaiass | 0:35d1a2c4fb6d | 67 | * Arguments : msgfunc pointer to the function to call |
issaiass | 0:35d1a2c4fb6d | 68 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 69 | * Notes : TX Empty Interrupt only |
issaiass | 0:35d1a2c4fb6d | 70 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 71 | */ |
issaiass | 0:35d1a2c4fb6d | 72 | |
issaiass | 0:35d1a2c4fb6d | 73 | void MsgTxISRCfg(void (*msgfunc)(void)) { |
issaiass | 0:35d1a2c4fb6d | 74 | ser.attach(msgfunc, Serial::TxIrq); /* Attach a function to TX ISR */ |
issaiass | 0:35d1a2c4fb6d | 75 | } |
issaiass | 0:35d1a2c4fb6d | 76 | |
issaiass | 0:35d1a2c4fb6d | 77 | |
issaiass | 0:35d1a2c4fb6d | 78 | /* |
issaiass | 0:35d1a2c4fb6d | 79 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 80 | * |
issaiass | 0:35d1a2c4fb6d | 81 | * GENERATE CHECKSUM FROM THE BUFFER |
issaiass | 0:35d1a2c4fb6d | 82 | * |
issaiass | 0:35d1a2c4fb6d | 83 | * Description : Get an array and calculate the CRC8 |
issaiass | 0:35d1a2c4fb6d | 84 | * Arguments : pdata pointer to the data to analyze |
issaiass | 0:35d1a2c4fb6d | 85 | * size the lenght of the array to calculate the checksum |
issaiass | 0:35d1a2c4fb6d | 86 | * Return : A byte that represents the checksum of the array |
issaiass | 0:35d1a2c4fb6d | 87 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 88 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 89 | */ |
issaiass | 0:35d1a2c4fb6d | 90 | |
issaiass | 0:35d1a2c4fb6d | 91 | INT8U MsgChkSum(INT8U *pdata, INT8U size) { |
issaiass | 0:35d1a2c4fb6d | 92 | INT8U i; /* Iterator */ |
issaiass | 0:35d1a2c4fb6d | 93 | INT8U crc; /* CRC calculator */ |
issaiass | 0:35d1a2c4fb6d | 94 | |
issaiass | 0:35d1a2c4fb6d | 95 | |
issaiass | 0:35d1a2c4fb6d | 96 | crc = 0; /* Initialize CRC result */ |
issaiass | 0:35d1a2c4fb6d | 97 | for (i = 0; i < size; i++) /* Iterate from the first to last */ |
issaiass | 0:35d1a2c4fb6d | 98 | crc += *pdata++; /* Sum the last and next byte */ |
issaiass | 0:35d1a2c4fb6d | 99 | crc ^= 0xFF; /* XOR the value */ |
issaiass | 0:35d1a2c4fb6d | 100 | return (crc); /* return the CRC result */ |
issaiass | 0:35d1a2c4fb6d | 101 | } |
issaiass | 0:35d1a2c4fb6d | 102 | |
issaiass | 0:35d1a2c4fb6d | 103 | |
issaiass | 0:35d1a2c4fb6d | 104 | /* |
issaiass | 0:35d1a2c4fb6d | 105 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 106 | * |
issaiass | 0:35d1a2c4fb6d | 107 | * INITIALIZE THE TRANSMISSION AND RECEIVER BUFFER |
issaiass | 0:35d1a2c4fb6d | 108 | * |
issaiass | 0:35d1a2c4fb6d | 109 | * Description : Default values for the TX and RX Buffer |
issaiass | 0:35d1a2c4fb6d | 110 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 111 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 112 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 113 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 114 | */ |
issaiass | 0:35d1a2c4fb6d | 115 | |
issaiass | 0:35d1a2c4fb6d | 116 | void MsgBufInit(void) { |
issaiass | 0:35d1a2c4fb6d | 117 | MsgFifo.MsgRxBufHd = 0; /* Buffer RX head at position 0 */ |
issaiass | 0:35d1a2c4fb6d | 118 | MsgFifo.MsgRxBufTl = 0; /* Buffer RX tail at position 0 */ |
issaiass | 0:35d1a2c4fb6d | 119 | MsgFifo.MsgRxBufCtr = 0; /* Buffer RX counter at 0 */ |
issaiass | 0:35d1a2c4fb6d | 120 | MsgFifo.MsgTxBufHd = 0; /* Buffer TX head at position 0 */ |
issaiass | 0:35d1a2c4fb6d | 121 | MsgFifo.MsgTxBufTl = 0; /* Buffer TX tail at position 0 */ |
issaiass | 0:35d1a2c4fb6d | 122 | MsgFifo.MsgTxBufCtr = 0; /* Buffer TX counter at 0 */ |
issaiass | 0:35d1a2c4fb6d | 123 | } |
issaiass | 0:35d1a2c4fb6d | 124 | |
issaiass | 0:35d1a2c4fb6d | 125 | |
issaiass | 0:35d1a2c4fb6d | 126 | /* |
issaiass | 0:35d1a2c4fb6d | 127 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 128 | * |
issaiass | 0:35d1a2c4fb6d | 129 | * RECEIVE A BYTE FROM THE SERIAL PORT |
issaiass | 0:35d1a2c4fb6d | 130 | * |
issaiass | 0:35d1a2c4fb6d | 131 | * Description : Read a byte |
issaiass | 0:35d1a2c4fb6d | 132 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 133 | * Return : The received byte from the serial port |
issaiass | 0:35d1a2c4fb6d | 134 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 135 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 136 | */ |
issaiass | 0:35d1a2c4fb6d | 137 | |
issaiass | 0:35d1a2c4fb6d | 138 | INT8U MsgGet(void) { |
issaiass | 0:35d1a2c4fb6d | 139 | return(ser.getc()); /* Return the byte from serial */ |
issaiass | 0:35d1a2c4fb6d | 140 | } |
issaiass | 0:35d1a2c4fb6d | 141 | |
issaiass | 0:35d1a2c4fb6d | 142 | |
issaiass | 0:35d1a2c4fb6d | 143 | /* |
issaiass | 0:35d1a2c4fb6d | 144 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 145 | * |
issaiass | 0:35d1a2c4fb6d | 146 | * GET A BYTE FROM THE RECEIVER BUFFER |
issaiass | 0:35d1a2c4fb6d | 147 | * |
issaiass | 0:35d1a2c4fb6d | 148 | * Description : Get a byte from the buffer |
issaiass | 0:35d1a2c4fb6d | 149 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 150 | * Return : Returns a byte from the receiver buffer |
issaiass | 0:35d1a2c4fb6d | 151 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 152 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 153 | */ |
issaiass | 0:35d1a2c4fb6d | 154 | |
issaiass | 0:35d1a2c4fb6d | 155 | INT8U MsgGetChar(void) { |
issaiass | 0:35d1a2c4fb6d | 156 | INT8U temp; /* Temporal for byte return */ |
issaiass | 0:35d1a2c4fb6d | 157 | |
issaiass | 0:35d1a2c4fb6d | 158 | |
issaiass | 0:35d1a2c4fb6d | 159 | temp = 0; /* Initialize return data */ |
issaiass | 0:35d1a2c4fb6d | 160 | OS_ENTER_CRITICAL(); /* Disable Global Interrupts */ |
issaiass | 0:35d1a2c4fb6d | 161 | if (MsgFifo.MsgRxBufCtr > 0) { /* If there is something on FIFO */ |
issaiass | 0:35d1a2c4fb6d | 162 | MsgFifo.MsgRxBufCtr--; /* Substract quantity on RX FIFO */ |
issaiass | 0:35d1a2c4fb6d | 163 | temp = MsgFifo.MsgRxBuf[MsgFifo.MsgRxBufTl++]; /* Get from RX Buffer */ |
issaiass | 0:35d1a2c4fb6d | 164 | if (MsgFifo.MsgRxBufTl == MSG_RX_MAX_CHAR) /* If RX FIFO is Full */ |
issaiass | 0:35d1a2c4fb6d | 165 | MsgFifo.MsgRxBufTl = 0; /* No characters to extract */ |
issaiass | 0:35d1a2c4fb6d | 166 | } |
issaiass | 0:35d1a2c4fb6d | 167 | OS_EXIT_CRITICAL(); /* Enable Global Interrupts */ |
issaiass | 0:35d1a2c4fb6d | 168 | return (temp); /* Return the data */ |
issaiass | 0:35d1a2c4fb6d | 169 | } |
issaiass | 0:35d1a2c4fb6d | 170 | |
issaiass | 0:35d1a2c4fb6d | 171 | |
issaiass | 0:35d1a2c4fb6d | 172 | /* |
issaiass | 0:35d1a2c4fb6d | 173 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 174 | * |
issaiass | 0:35d1a2c4fb6d | 175 | * INSERT A BYTE ON THE RX BUFFER |
issaiass | 0:35d1a2c4fb6d | 176 | * |
issaiass | 0:35d1a2c4fb6d | 177 | * Description : Insert a byte in the RX buffer |
issaiass | 0:35d1a2c4fb6d | 178 | * Arguments : data a byte that holds the character to insert |
issaiass | 0:35d1a2c4fb6d | 179 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 180 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 181 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 182 | */ |
issaiass | 0:35d1a2c4fb6d | 183 | |
issaiass | 0:35d1a2c4fb6d | 184 | void MsgPutRxChar(INT8U data) { |
issaiass | 0:35d1a2c4fb6d | 185 | if (MsgFifo.MsgRxBufCtr < MSG_RX_MAX_CHAR) { /* If is still space on FIFO */ |
issaiass | 0:35d1a2c4fb6d | 186 | MsgFifo.MsgRxBufCtr++; /* Increase the size by one */ |
issaiass | 0:35d1a2c4fb6d | 187 | MsgFifo.MsgRxBuf[MsgFifo.MsgRxBufHd++] = data; /* Insert the byte */ |
issaiass | 0:35d1a2c4fb6d | 188 | if (MsgFifo.MsgRxBufHd == MSG_RX_MAX_CHAR) /* If FIFO is Full */ |
issaiass | 0:35d1a2c4fb6d | 189 | MsgFifo.MsgRxBufHd = 0; /* Insertion FIFO restored to 0 */ |
issaiass | 0:35d1a2c4fb6d | 190 | } |
issaiass | 0:35d1a2c4fb6d | 191 | } |
issaiass | 0:35d1a2c4fb6d | 192 | |
issaiass | 0:35d1a2c4fb6d | 193 | |
issaiass | 0:35d1a2c4fb6d | 194 | /* |
issaiass | 0:35d1a2c4fb6d | 195 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 196 | * |
issaiass | 0:35d1a2c4fb6d | 197 | * CHECK IF RECEIVER BUFFER EMPTY |
issaiass | 0:35d1a2c4fb6d | 198 | * |
issaiass | 0:35d1a2c4fb6d | 199 | * Description : Check if is still space on the RX FIFO |
issaiass | 0:35d1a2c4fb6d | 200 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 201 | * Return : TRUE if FIFO is empty |
issaiass | 0:35d1a2c4fb6d | 202 | * FALSE if FIFO is not empty |
issaiass | 0:35d1a2c4fb6d | 203 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 204 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 205 | */ |
issaiass | 0:35d1a2c4fb6d | 206 | |
issaiass | 0:35d1a2c4fb6d | 207 | BOOLEAN MsgRxBufEmpty(void) { |
issaiass | 0:35d1a2c4fb6d | 208 | INT8U status; /* a status byte flag */ |
issaiass | 0:35d1a2c4fb6d | 209 | |
issaiass | 0:35d1a2c4fb6d | 210 | |
issaiass | 0:35d1a2c4fb6d | 211 | status = FALSE; /* Initialy false */ |
issaiass | 0:35d1a2c4fb6d | 212 | if (MsgFifo.MsgRxBufCtr == 0) /* If isn't a byte on the buffer */ |
issaiass | 0:35d1a2c4fb6d | 213 | status = TRUE; /* TRUE, flag that is empty */ |
issaiass | 0:35d1a2c4fb6d | 214 | return (status); /* return current state of FIFO */ |
issaiass | 0:35d1a2c4fb6d | 215 | } |
issaiass | 0:35d1a2c4fb6d | 216 | |
issaiass | 0:35d1a2c4fb6d | 217 | |
issaiass | 0:35d1a2c4fb6d | 218 | /* |
issaiass | 0:35d1a2c4fb6d | 219 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 220 | * |
issaiass | 0:35d1a2c4fb6d | 221 | * GET A LINE FROM THE INPUT DATA BUFFER |
issaiass | 0:35d1a2c4fb6d | 222 | * |
issaiass | 0:35d1a2c4fb6d | 223 | * Description : Read bytes up to encounter the <CR> character |
issaiass | 0:35d1a2c4fb6d | 224 | * Arguments : pdata pointer that holds the data to read |
issaiass | 0:35d1a2c4fb6d | 225 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 226 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 227 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 228 | */ |
issaiass | 0:35d1a2c4fb6d | 229 | |
issaiass | 0:35d1a2c4fb6d | 230 | void MsgGetLine(INT8U *pdata) { |
issaiass | 0:35d1a2c4fb6d | 231 | INT8U data; /* Character for data */ |
issaiass | 0:35d1a2c4fb6d | 232 | |
issaiass | 0:35d1a2c4fb6d | 233 | |
issaiass | 0:35d1a2c4fb6d | 234 | data = 0; /* Initialize the data */ |
issaiass | 0:35d1a2c4fb6d | 235 | do { |
issaiass | 0:35d1a2c4fb6d | 236 | data = MsgGetChar(); /* Get one byte */ |
issaiass | 0:35d1a2c4fb6d | 237 | if (data != '\r' && data) /* Analys if is <CR> */ |
issaiass | 0:35d1a2c4fb6d | 238 | *pdata++ = data; /* Move to the array or pointer */ |
issaiass | 0:35d1a2c4fb6d | 239 | } while (data); /* Repeato until is something */ |
issaiass | 0:35d1a2c4fb6d | 240 | } |
issaiass | 0:35d1a2c4fb6d | 241 | |
issaiass | 0:35d1a2c4fb6d | 242 | |
issaiass | 0:35d1a2c4fb6d | 243 | /* |
issaiass | 0:35d1a2c4fb6d | 244 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 245 | * |
issaiass | 0:35d1a2c4fb6d | 246 | * DISABLE THE RECEIVER INTERRUPT |
issaiass | 0:35d1a2c4fb6d | 247 | * |
issaiass | 0:35d1a2c4fb6d | 248 | * Description : Disables the receiver interrupt |
issaiass | 0:35d1a2c4fb6d | 249 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 250 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 251 | * Notes : Dependancy on MsgRxISRCfg() |
issaiass | 0:35d1a2c4fb6d | 252 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 253 | */ |
issaiass | 0:35d1a2c4fb6d | 254 | |
issaiass | 0:35d1a2c4fb6d | 255 | void MsgRxIntDis(void) { |
issaiass | 0:35d1a2c4fb6d | 256 | MsgRxISRCfg(NULL); /* NULL pointer to RX ISR */ |
issaiass | 0:35d1a2c4fb6d | 257 | } |
issaiass | 0:35d1a2c4fb6d | 258 | |
issaiass | 0:35d1a2c4fb6d | 259 | |
issaiass | 0:35d1a2c4fb6d | 260 | /* |
issaiass | 0:35d1a2c4fb6d | 261 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 262 | * |
issaiass | 0:35d1a2c4fb6d | 263 | * ENABLES THE RECEIVER INTERRUPT |
issaiass | 0:35d1a2c4fb6d | 264 | * |
issaiass | 0:35d1a2c4fb6d | 265 | * Description : Enables the receiver interrupt |
issaiass | 0:35d1a2c4fb6d | 266 | * Arguments : pfunc pointer to function (callback) to the ISR |
issaiass | 0:35d1a2c4fb6d | 267 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 268 | * Notes : Dependancy on MsgRxISRCfg() |
issaiass | 0:35d1a2c4fb6d | 269 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 270 | */ |
issaiass | 0:35d1a2c4fb6d | 271 | |
issaiass | 0:35d1a2c4fb6d | 272 | void MsgRxIntEn(void (*pfunc)(void)) { |
issaiass | 0:35d1a2c4fb6d | 273 | MsgRxISRCfg(pfunc); /* Pointer to the enabled func */ |
issaiass | 0:35d1a2c4fb6d | 274 | } |
issaiass | 0:35d1a2c4fb6d | 275 | |
issaiass | 0:35d1a2c4fb6d | 276 | |
issaiass | 0:35d1a2c4fb6d | 277 | /* |
issaiass | 0:35d1a2c4fb6d | 278 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 279 | * |
issaiass | 0:35d1a2c4fb6d | 280 | * CLEAN THE RX BUFFER |
issaiass | 0:35d1a2c4fb6d | 281 | * |
issaiass | 0:35d1a2c4fb6d | 282 | * Description : Return the RX buffer to the initial values |
issaiass | 0:35d1a2c4fb6d | 283 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 284 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 285 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 286 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 287 | */ |
issaiass | 0:35d1a2c4fb6d | 288 | |
issaiass | 0:35d1a2c4fb6d | 289 | void MsgRxBufFlush(void) { |
issaiass | 0:35d1a2c4fb6d | 290 | MsgFifo.MsgRxBufHd = 0; /* Return head to beginning */ |
issaiass | 0:35d1a2c4fb6d | 291 | MsgFifo.MsgRxBufTl = 0; /* Return tail to beginning */ |
issaiass | 0:35d1a2c4fb6d | 292 | MsgFifo.MsgRxBufCtr = 0; /* Return counter to beginning */ |
issaiass | 0:35d1a2c4fb6d | 293 | } |
issaiass | 0:35d1a2c4fb6d | 294 | |
issaiass | 0:35d1a2c4fb6d | 295 | |
issaiass | 0:35d1a2c4fb6d | 296 | /* |
issaiass | 0:35d1a2c4fb6d | 297 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 298 | * |
issaiass | 0:35d1a2c4fb6d | 299 | * PUT A BYTE OUT OF THE SERIAL PORT |
issaiass | 0:35d1a2c4fb6d | 300 | * |
issaiass | 0:35d1a2c4fb6d | 301 | * Description : Sends a byte through serial |
issaiass | 0:35d1a2c4fb6d | 302 | * Arguments : data the byte to send |
issaiass | 0:35d1a2c4fb6d | 303 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 304 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 305 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 306 | */ |
issaiass | 0:35d1a2c4fb6d | 307 | |
issaiass | 0:35d1a2c4fb6d | 308 | void MsgPut(INT8U data) { |
issaiass | 0:35d1a2c4fb6d | 309 | ser.putc(data); /* Send a byte */ |
issaiass | 0:35d1a2c4fb6d | 310 | } |
issaiass | 0:35d1a2c4fb6d | 311 | |
issaiass | 0:35d1a2c4fb6d | 312 | |
issaiass | 0:35d1a2c4fb6d | 313 | /* |
issaiass | 0:35d1a2c4fb6d | 314 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 315 | * |
issaiass | 0:35d1a2c4fb6d | 316 | * PUT A BYTE ON THE TRANSMITTER BUFFER |
issaiass | 0:35d1a2c4fb6d | 317 | * |
issaiass | 0:35d1a2c4fb6d | 318 | * Description : Sends a byte to the transmitter buffer |
issaiass | 0:35d1a2c4fb6d | 319 | * Arguments : data the byte to send to the FIFO |
issaiass | 0:35d1a2c4fb6d | 320 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 321 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 322 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 323 | */ |
issaiass | 0:35d1a2c4fb6d | 324 | |
issaiass | 0:35d1a2c4fb6d | 325 | void MsgPutChar(INT8U data) { |
issaiass | 0:35d1a2c4fb6d | 326 | if(!MsgTxBufFull()) { /* If the buffer is not full */ |
issaiass | 0:35d1a2c4fb6d | 327 | OS_ENTER_CRITICAL(); /* Disable global interrupts */ |
issaiass | 0:35d1a2c4fb6d | 328 | MsgFifo.MsgTxBufCtr++; /* Increase the FIFO counter */ |
issaiass | 0:35d1a2c4fb6d | 329 | MsgFifo.MsgTxBuf[MsgFifo.MsgTxBufHd++] = data; /* Insert the data */ |
issaiass | 0:35d1a2c4fb6d | 330 | if(MsgFifo.MsgTxBufHd == MSG_TX_MAX_CHAR) { /* If TX FIFO isn't full */ |
issaiass | 0:35d1a2c4fb6d | 331 | MsgFifo.MsgTxBufHd = 0; /* FIFO head is initialized */ |
issaiass | 0:35d1a2c4fb6d | 332 | } |
issaiass | 0:35d1a2c4fb6d | 333 | if (MsgFifo.MsgTxBufCtr == 1) { /* If is the first byte */ |
issaiass | 0:35d1a2c4fb6d | 334 | // MsgTxIntEn(); /* Enable transmitter interrupt */ |
issaiass | 0:35d1a2c4fb6d | 335 | } |
issaiass | 0:35d1a2c4fb6d | 336 | OS_EXIT_CRITICAL(); /* Enable global interrupts */ |
issaiass | 0:35d1a2c4fb6d | 337 | } |
issaiass | 0:35d1a2c4fb6d | 338 | } |
issaiass | 0:35d1a2c4fb6d | 339 | |
issaiass | 0:35d1a2c4fb6d | 340 | |
issaiass | 0:35d1a2c4fb6d | 341 | /* |
issaiass | 0:35d1a2c4fb6d | 342 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 343 | * |
issaiass | 0:35d1a2c4fb6d | 344 | * PUT A LINE THROUGH THE SERIAL PORT |
issaiass | 0:35d1a2c4fb6d | 345 | * |
issaiass | 0:35d1a2c4fb6d | 346 | * Description : Sends a line of characters to the serial port |
issaiass | 0:35d1a2c4fb6d | 347 | * Arguments : pdata the array or pointer holder of the data to send |
issaiass | 0:35d1a2c4fb6d | 348 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 349 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 350 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 351 | */ |
issaiass | 0:35d1a2c4fb6d | 352 | |
issaiass | 0:35d1a2c4fb6d | 353 | void MsgPutLine(INT8U *pdata) { |
issaiass | 0:35d1a2c4fb6d | 354 | INT8U data; /* Data to send */ |
issaiass | 0:35d1a2c4fb6d | 355 | |
issaiass | 0:35d1a2c4fb6d | 356 | |
issaiass | 0:35d1a2c4fb6d | 357 | data = 0; /* Initialize data */ |
issaiass | 0:35d1a2c4fb6d | 358 | while (*pdata != '\0') { /* Up to string end */ |
issaiass | 0:35d1a2c4fb6d | 359 | data = *pdata++; /* Get the data to send */ |
issaiass | 0:35d1a2c4fb6d | 360 | // MsgPutChar(data); |
issaiass | 0:35d1a2c4fb6d | 361 | MsgPut(data); /* Put the data out of the MCU */ |
issaiass | 0:35d1a2c4fb6d | 362 | } |
issaiass | 0:35d1a2c4fb6d | 363 | } |
issaiass | 0:35d1a2c4fb6d | 364 | |
issaiass | 0:35d1a2c4fb6d | 365 | |
issaiass | 0:35d1a2c4fb6d | 366 | /* |
issaiass | 0:35d1a2c4fb6d | 367 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 368 | * |
issaiass | 0:35d1a2c4fb6d | 369 | * CHECKS IF THE TRANSMITTER BUFFER IS FULL |
issaiass | 0:35d1a2c4fb6d | 370 | * |
issaiass | 0:35d1a2c4fb6d | 371 | * Description : Check the status of the transmitter buffer |
issaiass | 0:35d1a2c4fb6d | 372 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 373 | * Return : TRUE if transmitter buffer is full |
issaiass | 0:35d1a2c4fb6d | 374 | * FALSE if transmitter buffer is empty |
issaiass | 0:35d1a2c4fb6d | 375 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 376 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 377 | */ |
issaiass | 0:35d1a2c4fb6d | 378 | |
issaiass | 0:35d1a2c4fb6d | 379 | BOOLEAN MsgTxBufFull(void) { |
issaiass | 0:35d1a2c4fb6d | 380 | INT8U status; /* A status byte for the buffer */ |
issaiass | 0:35d1a2c4fb6d | 381 | |
issaiass | 0:35d1a2c4fb6d | 382 | |
issaiass | 0:35d1a2c4fb6d | 383 | status = FALSE; /* Initialize the status flag */ |
issaiass | 0:35d1a2c4fb6d | 384 | if(MsgFifo.MsgTxBufCtr >= MSG_TX_MAX_CHAR) {/* If the buffer is full */ |
issaiass | 0:35d1a2c4fb6d | 385 | status = TRUE; /* The buffer is full, flag it */ |
issaiass | 0:35d1a2c4fb6d | 386 | } |
issaiass | 0:35d1a2c4fb6d | 387 | return status; /* Return the current status */ |
issaiass | 0:35d1a2c4fb6d | 388 | } |
issaiass | 0:35d1a2c4fb6d | 389 | |
issaiass | 0:35d1a2c4fb6d | 390 | |
issaiass | 0:35d1a2c4fb6d | 391 | /* |
issaiass | 0:35d1a2c4fb6d | 392 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 393 | * |
issaiass | 0:35d1a2c4fb6d | 394 | * DISABLES TRANSMITTER INTERRUPTS |
issaiass | 0:35d1a2c4fb6d | 395 | * |
issaiass | 0:35d1a2c4fb6d | 396 | * Description : Disable the transmitter interrupt |
issaiass | 0:35d1a2c4fb6d | 397 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 398 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 399 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 400 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 401 | */ |
issaiass | 0:35d1a2c4fb6d | 402 | |
issaiass | 0:35d1a2c4fb6d | 403 | void MsgTxIntDis(void) { |
issaiass | 0:35d1a2c4fb6d | 404 | MsgTxISRCfg(NULL); /* Disable the TX interrupt */ |
issaiass | 0:35d1a2c4fb6d | 405 | } |
issaiass | 0:35d1a2c4fb6d | 406 | |
issaiass | 0:35d1a2c4fb6d | 407 | /* |
issaiass | 0:35d1a2c4fb6d | 408 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 409 | * |
issaiass | 0:35d1a2c4fb6d | 410 | * ENABLES TRANSMITTER INTERRUPTS |
issaiass | 0:35d1a2c4fb6d | 411 | * |
issaiass | 0:35d1a2c4fb6d | 412 | * Description : Enable the transmitter interrupt |
issaiass | 0:35d1a2c4fb6d | 413 | * Arguments : pfunc pointer to function (callback) to the ISR |
issaiass | 0:35d1a2c4fb6d | 414 | * Return : None |
issaiass | 0:35d1a2c4fb6d | 415 | * Notes : None |
issaiass | 0:35d1a2c4fb6d | 416 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 417 | */ |
issaiass | 0:35d1a2c4fb6d | 418 | |
issaiass | 0:35d1a2c4fb6d | 419 | void MsgTxIntEn(void (*pfunc)(void)) { |
issaiass | 0:35d1a2c4fb6d | 420 | MsgTxISRCfg(pfunc); /* Enables the TX interrupt */ |
issaiass | 0:35d1a2c4fb6d | 421 | } |
issaiass | 0:35d1a2c4fb6d | 422 | |
issaiass | 0:35d1a2c4fb6d | 423 | |
issaiass | 0:35d1a2c4fb6d | 424 | /* |
issaiass | 0:35d1a2c4fb6d | 425 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 426 | * |
issaiass | 0:35d1a2c4fb6d | 427 | * GET THE BYTES FROM THE BUFFER TO TRANSMIT |
issaiass | 0:35d1a2c4fb6d | 428 | * |
issaiass | 0:35d1a2c4fb6d | 429 | * Description : Get the byte from the TX buffer if exists |
issaiass | 0:35d1a2c4fb6d | 430 | * Arguments : None |
issaiass | 0:35d1a2c4fb6d | 431 | * Return : A byte from the buffer to transmitt |
issaiass | 0:35d1a2c4fb6d | 432 | * Notes : If there is no byte to transmit, a NULL (0) will be sent |
issaiass | 0:35d1a2c4fb6d | 433 | ******************************************************************************* |
issaiass | 0:35d1a2c4fb6d | 434 | */ |
issaiass | 0:35d1a2c4fb6d | 435 | |
issaiass | 0:35d1a2c4fb6d | 436 | INT8U MsgGetTxChar(void) { |
issaiass | 0:35d1a2c4fb6d | 437 | INT8U data; /* Data byte */ |
issaiass | 0:35d1a2c4fb6d | 438 | |
issaiass | 0:35d1a2c4fb6d | 439 | |
issaiass | 0:35d1a2c4fb6d | 440 | if(MsgFifo.MsgTxBufCtr > 0) { /* If there is something to send*/ |
issaiass | 0:35d1a2c4fb6d | 441 | MsgFifo.MsgTxBufCtr--; /* Decrease the byte counter */ |
issaiass | 0:35d1a2c4fb6d | 442 | data = MsgFifo.MsgTxBuf[MsgFifo.MsgTxBufTl++]; /* Get from the buffer */ |
issaiass | 0:35d1a2c4fb6d | 443 | if(MsgFifo.MsgTxBufTl == MSG_TX_MAX_CHAR) { /* If is the max char */ |
issaiass | 0:35d1a2c4fb6d | 444 | MsgFifo.MsgTxBufTl = 0; /* Return the buffer to initial */ |
issaiass | 0:35d1a2c4fb6d | 445 | } |
issaiass | 0:35d1a2c4fb6d | 446 | return data; /* Return the data */ |
issaiass | 0:35d1a2c4fb6d | 447 | } else { /* Otherwise */ |
issaiass | 0:35d1a2c4fb6d | 448 | return NULL; /* Return a NULL (0) character */ |
issaiass | 0:35d1a2c4fb6d | 449 | } |
issaiass | 0:35d1a2c4fb6d | 450 | } |