00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "wiring_private.h"
00020
00021 #ifndef __WASPCONSTANTS_H__
00022 #include "WaspConstants.h"
00023 #endif
00024
00025
00026
00027
00028
00029
00030 #define RX_BUFFER_SIZE_0 512
00031 #define RX_BUFFER_SIZE_1 128
00032 #define UART_LIMIT 134217728
00033
00034 unsigned char rx_buffer0[RX_BUFFER_SIZE_0];
00035 unsigned char rx_buffer1[RX_BUFFER_SIZE_1];
00036 int rx_buffer_head0 = 0;
00037 int rx_buffer_tail0 = 0;
00038 int rx_buffer_head1 = 0;
00039 int rx_buffer_tail1 = 0;
00040
00041
00042 void beginSerial(long baud, uint8_t portNum)
00043 {
00044 if (portNum == 0) {
00045 setIPF_(IPUSART0);
00046 UBRR0H = ((F_CPU / 16 + baud / 2) / baud - 1) >> 8;
00047 UBRR0L = ((F_CPU / 16 + baud / 2) / baud - 1);
00048
00049
00050 sbi(UCSR0B, RXEN0);
00051 sbi(UCSR0B, TXEN0);
00052
00053
00054 sbi(UCSR0B, RXCIE0);
00055
00056
00057 } else {
00058 setIPF_(IPUSART1);
00059 UBRR1H = ((F_CPU / 16 + baud / 2) / baud - 1) >> 8;
00060 UBRR1L = ((F_CPU / 16 + baud / 2) / baud - 1);
00061
00062
00063 sbi(UCSR1B, RXEN1);
00064 sbi(UCSR1B, TXEN1);
00065
00066
00067 sbi(UCSR1B, RXCIE1);
00068 }
00069
00070 }
00071
00072
00073 void closeSerial(uint8_t portNum)
00074 {
00075 if (portNum == 0) {
00076
00077
00078
00079 resetIPF_(IPUSART0);
00080 cbi(UCSR0B, RXEN0);
00081 cbi(UCSR0B, TXEN0);
00082 } else {
00083
00084
00085
00086 resetIPF_(IPUSART1);
00087 cbi(UCSR1B, RXEN1);
00088 cbi(UCSR1B, TXEN1);
00089 }
00090 }
00091
00092 void serialWrite(unsigned char c, uint8_t portNum)
00093 {
00094 if (portNum == 0) {
00095 while (!(UCSR0A & (1 << UDRE0)))
00096 ;
00097
00098 UDR0 = c;
00099 } else {
00100 while (!(UCSR1A & (1 << UDRE1)))
00101 ;
00102
00103 UDR1 = c;
00104 }
00105 }
00106
00107 int serialAvailable(uint8_t portNum)
00108 {
00109 if (portNum == 0)
00110 return (RX_BUFFER_SIZE_0 + rx_buffer_head0 - rx_buffer_tail0) % RX_BUFFER_SIZE_0;
00111 else
00112 return (RX_BUFFER_SIZE_1 + rx_buffer_head1 - rx_buffer_tail1) % RX_BUFFER_SIZE_1;
00113 }
00114
00115 int serialRead(uint8_t portNum)
00116 {
00117 if (portNum == 0) {
00118
00119 if (rx_buffer_head0 == rx_buffer_tail0) {
00120 return -1;
00121 } else {
00122 unsigned char c = rx_buffer0[rx_buffer_tail0];
00123 rx_buffer_tail0 = (rx_buffer_tail0 + 1) % RX_BUFFER_SIZE_0;
00124 return c;
00125 }
00126 }
00127 else {
00128
00129 if (rx_buffer_head1 == rx_buffer_tail1) {
00130 return -1;
00131 } else {
00132 unsigned char c = rx_buffer1[rx_buffer_tail1];
00133 rx_buffer_tail1 = (rx_buffer_tail1 + 1) % RX_BUFFER_SIZE_1;
00134 return c;
00135 }
00136 }
00137 }
00138
00139 void serialFlush(uint8_t portNum)
00140 {
00141
00142
00143
00144
00145
00146 if (portNum == 0){
00147 rx_buffer_tail0=0;
00148 rx_buffer_head0 = rx_buffer_tail0;
00149 }
00150 else{
00151 rx_buffer_tail1=0;
00152 rx_buffer_head1 = rx_buffer_tail1;
00153 }
00154 }
00155
00156 SIGNAL(USART0_RX_vect)
00157 {
00158 unsigned char c = UDR0;
00159
00160 int i = (rx_buffer_head0 + 1) % RX_BUFFER_SIZE_0;
00161
00162
00163
00164
00165
00166 if (i != rx_buffer_tail0) {
00167 rx_buffer0[rx_buffer_head0] = c;
00168 rx_buffer_head0 = i;
00169 if(rx_buffer_head0==UART_LIMIT)
00170 {
00171 rx_buffer_head0=0;
00172 rx_buffer_tail0=0;
00173 }
00174 }
00175 }
00176
00177 SIGNAL(USART1_RX_vect)
00178 {
00179 unsigned char c = UDR1;
00180
00181 int i = (rx_buffer_head1 + 1) % RX_BUFFER_SIZE_1;
00182
00183
00184
00185
00186
00187 if (i != rx_buffer_tail1) {
00188 rx_buffer1[rx_buffer_head1] = c;
00189 rx_buffer_head1 = i;
00190 if(rx_buffer_head1==UART_LIMIT)
00191 {
00192 rx_buffer_head1=0;
00193 rx_buffer_tail1=0;
00194 }
00195 }
00196 }
00197
00198 void printMode(int mode, uint8_t portNum)
00199 {
00200
00201 }
00202
00203 void printByte(unsigned char c, uint8_t portNum)
00204 {
00205 serialWrite(c, portNum);
00206 }
00207
00208 void printNewline(uint8_t portNum)
00209 {
00210 printByte('\n', portNum);
00211 }
00212
00213 void printString(const char *s, uint8_t portNum)
00214 {
00215 while (*s)
00216 printByte(*s++, portNum);
00217 }
00218
00219 void printIntegerInBase(unsigned long n, unsigned long base, uint8_t portNum)
00220 {
00221 unsigned char buf[8 * sizeof(long)];
00222 unsigned long i = 0;
00223
00224 if (n == 0) {
00225 printByte('0', portNum);
00226 return;
00227 }
00228
00229 while (n > 0) {
00230 buf[i++] = n % base;
00231 n /= base;
00232 }
00233
00234 for (; i > 0; i--)
00235 printByte(buf[i - 1] < 10 ?
00236 '0' + buf[i - 1] :
00237 'A' + buf[i - 1] - 10, portNum);
00238 }
00239
00240 void printInteger(long n, uint8_t portNum)
00241 {
00242 if (n < 0) {
00243 printByte('-', portNum);
00244 n = -n;
00245 }
00246
00247 printIntegerInBase(n, 10, portNum);
00248 }
00249
00250 void printHex(unsigned long n, uint8_t portNum)
00251 {
00252 printIntegerInBase(n, 16, portNum);
00253 }
00254
00255 void printOctal(unsigned long n, uint8_t portNum)
00256 {
00257 printIntegerInBase(n, 8, portNum);
00258 }
00259
00260 void printBinary(unsigned long n, uint8_t portNum)
00261 {
00262 printIntegerInBase(n, 2, portNum);
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279