record adc values and send them to another uprocessor

Dependencies:   BufferedSerial SDFileSystem mbed

Fork of SDFileSystem_HelloWorld by mbed official

Committer:
patmcna
Date:
Thu Jun 16 21:17:30 2016 +0000
Revision:
4:0e2980186bed
Organized into header files to keep main clean

Who changed what in which revision?

UserRevisionLine numberNew contents of line
patmcna 4:0e2980186bed 1 #include "mbed.h"
patmcna 4:0e2980186bed 2
patmcna 4:0e2980186bed 3
patmcna 4:0e2980186bed 4
patmcna 4:0e2980186bed 5
patmcna 4:0e2980186bed 6
patmcna 4:0e2980186bed 7
patmcna 4:0e2980186bed 8 /************************************************************************
patmcna 4:0e2980186bed 9 * Copy tx line buffer to large tx buffer for tx interrupt routine *
patmcna 4:0e2980186bed 10 ************************************************************************/
patmcna 4:0e2980186bed 11 void send_line()
patmcna 4:0e2980186bed 12 {
patmcna 4:0e2980186bed 13 int i = 0;
patmcna 4:0e2980186bed 14 char temp_char;
patmcna 4:0e2980186bed 15 bool empty;
patmcna 4:0e2980186bed 16
patmcna 4:0e2980186bed 17 __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn);// Start Critical Section - don't interrupt while changing global buffer variables
patmcna 4:0e2980186bed 18
patmcna 4:0e2980186bed 19 empty = (tx_in == tx_out);
patmcna 4:0e2980186bed 20
patmcna 4:0e2980186bed 21 while ((i==0) || (tx_line[i-1] != '\n'))
patmcna 4:0e2980186bed 22 {
patmcna 4:0e2980186bed 23
patmcna 4:0e2980186bed 24 if (((tx_in + 1) % buffer_size) == tx_out) // Wait if buffer full
patmcna 4:0e2980186bed 25 {
patmcna 4:0e2980186bed 26 __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn);// End Critical Section - need to let interrupt routine empty buffer by sending
patmcna 4:0e2980186bed 27 while (((tx_in + 1) % buffer_size) == tx_out)
patmcna 4:0e2980186bed 28 {
patmcna 4:0e2980186bed 29 }
patmcna 4:0e2980186bed 30
patmcna 4:0e2980186bed 31 __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables
patmcna 4:0e2980186bed 32 }
patmcna 4:0e2980186bed 33
patmcna 4:0e2980186bed 34 tx_buffer[tx_in] = tx_line[i];
patmcna 4:0e2980186bed 35 // if (tx_buffer[tx_in] == '\r'){pc.printf("returnline");}
patmcna 4:0e2980186bed 36 i++;
patmcna 4:0e2980186bed 37 tx_in = (tx_in + 1) % buffer_size;
patmcna 4:0e2980186bed 38 }
patmcna 4:0e2980186bed 39
patmcna 4:0e2980186bed 40 if (uart1.writeable() && (empty))
patmcna 4:0e2980186bed 41 {
patmcna 4:0e2980186bed 42 temp_char = tx_buffer[tx_out];
patmcna 4:0e2980186bed 43 tx_out = (tx_out + 1) % buffer_size;
patmcna 4:0e2980186bed 44
patmcna 4:0e2980186bed 45
patmcna 4:0e2980186bed 46 uart1.putc(temp_char); // Send first character to start tx interrupts, if stopped
patmcna 4:0e2980186bed 47
patmcna 4:0e2980186bed 48 // pc.printf("send command. Value: %c\r\n", temp_char);
patmcna 4:0e2980186bed 49 }
patmcna 4:0e2980186bed 50
patmcna 4:0e2980186bed 51 __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section
patmcna 4:0e2980186bed 52 return;
patmcna 4:0e2980186bed 53 }
patmcna 4:0e2980186bed 54
patmcna 4:0e2980186bed 55
patmcna 4:0e2980186bed 56
patmcna 4:0e2980186bed 57 /************************************************************************
patmcna 4:0e2980186bed 58 * Read a line from the large rx buffer from rx interrupt routine *
patmcna 4:0e2980186bed 59 ************************************************************************/
patmcna 4:0e2980186bed 60 void read_line()
patmcna 4:0e2980186bed 61 {
patmcna 4:0e2980186bed 62 int i = 0;
patmcna 4:0e2980186bed 63
patmcna 4:0e2980186bed 64 __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables
patmcna 4:0e2980186bed 65 while ((i==0) || (rx_line[i-1] != '\r')) // Loop reading rx buffer characters until end of line character
patmcna 4:0e2980186bed 66 {
patmcna 4:0e2980186bed 67 if (rx_in == rx_out) // Wait if buffer empty
patmcna 4:0e2980186bed 68 {
patmcna 4:0e2980186bed 69 __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section - need to allow rx interrupt to get new characters for buffer
patmcna 4:0e2980186bed 70
patmcna 4:0e2980186bed 71 while (rx_in == rx_out)
patmcna 4:0e2980186bed 72 {
patmcna 4:0e2980186bed 73 }
patmcna 4:0e2980186bed 74 __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables
patmcna 4:0e2980186bed 75 }
patmcna 4:0e2980186bed 76
patmcna 4:0e2980186bed 77 rx_line[i] = rx_buffer[rx_out];
patmcna 4:0e2980186bed 78
patmcna 4:0e2980186bed 79 i++;
patmcna 4:0e2980186bed 80 rx_out = (rx_out + 1) % buffer_size;
patmcna 4:0e2980186bed 81 }
patmcna 4:0e2980186bed 82
patmcna 4:0e2980186bed 83 __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section
patmcna 4:0e2980186bed 84
patmcna 4:0e2980186bed 85 strcat(squibCLT_array3,rx_line);
patmcna 4:0e2980186bed 86
patmcna 4:0e2980186bed 87 rx_line[i-1] = 0;
patmcna 4:0e2980186bed 88
patmcna 4:0e2980186bed 89 return;
patmcna 4:0e2980186bed 90 }
patmcna 4:0e2980186bed 91
patmcna 4:0e2980186bed 92
patmcna 4:0e2980186bed 93
patmcna 4:0e2980186bed 94 /************************************************************************
patmcna 4:0e2980186bed 95 * Interupt Routine to read in data from serial port *
patmcna 4:0e2980186bed 96 ************************************************************************/
patmcna 4:0e2980186bed 97 void Rx_interrupt()
patmcna 4:0e2980186bed 98 {
patmcna 4:0e2980186bed 99
patmcna 4:0e2980186bed 100 while ((uart2.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) // Loop just in case more than one character is in UART's receive FIFO buffer
patmcna 4:0e2980186bed 101 // Stop if buffer full
patmcna 4:0e2980186bed 102 {
patmcna 4:0e2980186bed 103 rx_buffer[rx_in] = uart2.getc();
patmcna 4:0e2980186bed 104 // pc.putc(rx_buffer[rx_in]); // Uncomment to Echo to USB serial to watch data flow
patmcna 4:0e2980186bed 105 rx_in = (rx_in + 1) % buffer_size;
patmcna 4:0e2980186bed 106
patmcna 4:0e2980186bed 107 }
patmcna 4:0e2980186bed 108
patmcna 4:0e2980186bed 109 rxInterruptCount++;
patmcna 4:0e2980186bed 110 return;
patmcna 4:0e2980186bed 111 }
patmcna 4:0e2980186bed 112
patmcna 4:0e2980186bed 113
patmcna 4:0e2980186bed 114
patmcna 4:0e2980186bed 115 /************************************************************************
patmcna 4:0e2980186bed 116 * Interupt Routine to write out data to serial port *
patmcna 4:0e2980186bed 117 ************************************************************************/
patmcna 4:0e2980186bed 118 void Tx_interrupt()
patmcna 4:0e2980186bed 119 {
patmcna 4:0e2980186bed 120 while ((uart1.writeable()) && (tx_in != tx_out)) // Loop to fill more than one character in UART's transmit FIFO buffer // Stop if buffer empty
patmcna 4:0e2980186bed 121 {
patmcna 4:0e2980186bed 122
patmcna 4:0e2980186bed 123 uart1.putc(tx_buffer[tx_out]);
patmcna 4:0e2980186bed 124 tx_out = (tx_out + 1) % buffer_size;
patmcna 4:0e2980186bed 125 }
patmcna 4:0e2980186bed 126
patmcna 4:0e2980186bed 127 return;
patmcna 4:0e2980186bed 128 }
patmcna 4:0e2980186bed 129
patmcna 4:0e2980186bed 130
patmcna 4:0e2980186bed 131
patmcna 4:0e2980186bed 132
patmcna 4:0e2980186bed 133 /************************************************************************
patmcna 4:0e2980186bed 134 * copies sd card array to serial buffer and sends it over buffer
patmcna 4:0e2980186bed 135 *
patmcna 4:0e2980186bed 136 ************************************************************************/
patmcna 4:0e2980186bed 137 void sendSdCardDataOverSerial()
patmcna 4:0e2980186bed 138 {
patmcna 4:0e2980186bed 139 Timer timer;
patmcna 4:0e2980186bed 140 int begin, end;
patmcna 4:0e2980186bed 141
patmcna 4:0e2980186bed 142 pc.printf("Sending over serial...");
patmcna 4:0e2980186bed 143
patmcna 4:0e2980186bed 144 timer.start();
patmcna 4:0e2980186bed 145 begin = timer.read_us();
patmcna 4:0e2980186bed 146
patmcna 4:0e2980186bed 147 for (int i = 0; i < arrayCount; i++)
patmcna 4:0e2980186bed 148 {
patmcna 4:0e2980186bed 149 sprintf(tx_line, "%.6f\r\n]", squibCLT_array2[i]);
patmcna 4:0e2980186bed 150 send_line();
patmcna 4:0e2980186bed 151 }
patmcna 4:0e2980186bed 152
patmcna 4:0e2980186bed 153 end = timer.read_us();
patmcna 4:0e2980186bed 154
patmcna 4:0e2980186bed 155 pc.printf("Done.\r\n");
patmcna 4:0e2980186bed 156
patmcna 4:0e2980186bed 157 pc.printf("Transmit took %d microseconds to complete.\r\n", end - begin);
patmcna 4:0e2980186bed 158 }
patmcna 4:0e2980186bed 159
patmcna 4:0e2980186bed 160
patmcna 4:0e2980186bed 161
patmcna 4:0e2980186bed 162 /************************************************************************
patmcna 4:0e2980186bed 163 * handles receiving data and storing it back into local memory
patmcna 4:0e2980186bed 164 *
patmcna 4:0e2980186bed 165 ************************************************************************/
patmcna 4:0e2980186bed 166 void receiveSdCardDataOverSerial()
patmcna 4:0e2980186bed 167 {
patmcna 4:0e2980186bed 168 Timer timer;
patmcna 4:0e2980186bed 169 int begin, end;
patmcna 4:0e2980186bed 170
patmcna 4:0e2980186bed 171 pc.printf("Receiving over serial...");
patmcna 4:0e2980186bed 172
patmcna 4:0e2980186bed 173 timer.start();
patmcna 4:0e2980186bed 174 begin = timer.read_us();
patmcna 4:0e2980186bed 175
patmcna 4:0e2980186bed 176 for (int i = 0; i < arrayCount; i++)
patmcna 4:0e2980186bed 177 {
patmcna 4:0e2980186bed 178 // for some reason you have to use this function to read in everything being sent instead of relying on the interrupt service exclusively
patmcna 4:0e2980186bed 179 read_line();
patmcna 4:0e2980186bed 180 //sprintf(squib_test, "%s", rx_line);
patmcna 4:0e2980186bed 181 }
patmcna 4:0e2980186bed 182 end = timer.read_us();
patmcna 4:0e2980186bed 183
patmcna 4:0e2980186bed 184 pc.printf("Done.\r\n");
patmcna 4:0e2980186bed 185
patmcna 4:0e2980186bed 186 pc.printf("Receive took %d microseconds to complete.\r\n", end - begin);
patmcna 4:0e2980186bed 187 }
patmcna 4:0e2980186bed 188