added spectrometer timeout

Dependencies:   SDFileSystem mbed

Fork of All_Combined_Real2 by Colin Maxfield

Committer:
jphbergeson
Date:
Tue Mar 22 17:08:13 2016 +0000
Revision:
4:70411c8dadcc
Parent:
3:c611fff05072
Child:
5:6532c5a5f576
Publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jphbergeson 0:26713d1db198 1 #include "mbed.h"
jphbergeson 0:26713d1db198 2 #include "nmea.h"
jphbergeson 0:26713d1db198 3 #include "SDFileSystem.h"
jphbergeson 1:5fa445bd14a6 4 #include "SPI.h"
jphbergeson 3:c611fff05072 5 #include "temp_sensor.h"
jphbergeson 0:26713d1db198 6
jphbergeson 1:5fa445bd14a6 7 #define NUM_PIXELS 2048
jphbergeson 0:26713d1db198 8 #define BUF_SIZE 1024
jphbergeson 2:146625d6992d 9
jphbergeson 2:146625d6992d 10 // TODO make a new file (name=timestamp) each time we start recording data
jphbergeson 1:5fa445bd14a6 11 #define OUTPUT_FILE "/sd/data.csv"
jphbergeson 0:26713d1db198 12
jphbergeson 1:5fa445bd14a6 13 // pinout for spectrometer
jphbergeson 1:5fa445bd14a6 14
jphbergeson 1:5fa445bd14a6 15 // Mosi (#8) -> PTD2
jphbergeson 1:5fa445bd14a6 16 // Miso (#7) -> PTD3
jphbergeson 1:5fa445bd14a6 17 // Sclk (#9) -> PTD1
jphbergeson 1:5fa445bd14a6 18
jphbergeson 1:5fa445bd14a6 19 // Pixel_rdy (#6) -> PTA1
jphbergeson 1:5fa445bd14a6 20 // Fifo_cs (#3) -> PTB23
jphbergeson 1:5fa445bd14a6 21 // Trigger (#13) -> PTA2
jphbergeson 2:146625d6992d 22
jphbergeson 4:70411c8dadcc 23 // spi_cs (#10) -> PTC2
jphbergeson 4:70411c8dadcc 24
jphbergeson 1:5fa445bd14a6 25 SPI spi(PTD2, PTD3, PTD1); // mosi, miso, sclk
jphbergeson 1:5fa445bd14a6 26
jphbergeson 4:70411c8dadcc 27 DigitalOut spi_cs(PTC2);
jphbergeson 4:70411c8dadcc 28
jphbergeson 1:5fa445bd14a6 29 DigitalIn pixel_rdy(PTA1);
jphbergeson 1:5fa445bd14a6 30 DigitalOut fifo_cs(PTB23);
jphbergeson 1:5fa445bd14a6 31 DigitalOut trigger(PTA2);
jphbergeson 1:5fa445bd14a6 32
jphbergeson 1:5fa445bd14a6 33 // Blinking red LED
jphbergeson 0:26713d1db198 34 DigitalOut led(LED_RED);
jphbergeson 0:26713d1db198 35
jphbergeson 1:5fa445bd14a6 36 // GPS connection (through arduino)
jphbergeson 0:26713d1db198 37 Serial duino(PTC4, PTC3);
jphbergeson 1:5fa445bd14a6 38
jphbergeson 1:5fa445bd14a6 39 // USB serial to PC
jphbergeson 0:26713d1db198 40 Serial pc(USBTX, USBRX);
jphbergeson 0:26713d1db198 41
jphbergeson 0:26713d1db198 42 /**************************************************
jphbergeson 0:26713d1db198 43 ** SD FILE SYSTEM **
jphbergeson 0:26713d1db198 44 **************************************************/
jphbergeson 0:26713d1db198 45 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
jphbergeson 0:26713d1db198 46 FILE *fpData;
jphbergeson 0:26713d1db198 47
jphbergeson 2:146625d6992d 48 void read_pixels()
jphbergeson 2:146625d6992d 49 {
jphbergeson 1:5fa445bd14a6 50 int data[NUM_PIXELS];
jphbergeson 1:5fa445bd14a6 51 for (int i = 0; i < NUM_PIXELS; i++) {
jphbergeson 2:146625d6992d 52
jphbergeson 1:5fa445bd14a6 53 while (!pixel_rdy);
jphbergeson 2:146625d6992d 54
jphbergeson 1:5fa445bd14a6 55 fifo_cs = 0;
jphbergeson 1:5fa445bd14a6 56 data[i] = spi.write(0x00); // write a dummy byte just to read the data
jphbergeson 1:5fa445bd14a6 57 fifo_cs = 1;
jphbergeson 2:146625d6992d 58
jphbergeson 1:5fa445bd14a6 59 }
jphbergeson 2:146625d6992d 60
jphbergeson 1:5fa445bd14a6 61 // write to file and pc
jphbergeson 1:5fa445bd14a6 62 fpData = fopen(OUTPUT_FILE, "a");
jphbergeson 2:146625d6992d 63 for (int i = 0; i < NUM_PIXELS; i++) {
jphbergeson 1:5fa445bd14a6 64 pc.printf(",%d", data[i]);
jphbergeson 1:5fa445bd14a6 65 fprintf(fpData, ",%d", data[i]);
jphbergeson 1:5fa445bd14a6 66 }
jphbergeson 1:5fa445bd14a6 67 pc.printf("\r\n");
jphbergeson 1:5fa445bd14a6 68 fprintf(fpData, "\r\n");
jphbergeson 1:5fa445bd14a6 69 fclose(fpData);
jphbergeson 1:5fa445bd14a6 70 }
jphbergeson 1:5fa445bd14a6 71
jphbergeson 2:146625d6992d 72 void gps_read() {
jphbergeson 2:146625d6992d 73 char buffer[BUF_SIZE];
jphbergeson 2:146625d6992d 74
jphbergeson 2:146625d6992d 75 get_nmea(&duino, buffer, BUF_SIZE);
jphbergeson 2:146625d6992d 76
jphbergeson 2:146625d6992d 77 struct NMEA_data nmea = parse_line(buffer);
jphbergeson 2:146625d6992d 78
jphbergeson 2:146625d6992d 79 // determine whether there's a lock
jphbergeson 2:146625d6992d 80 char lock_str[BUF_SIZE];
jphbergeson 2:146625d6992d 81 if ( nmea.lock_flag == 'A' )
jphbergeson 2:146625d6992d 82 sprintf(lock_str, "Has lock");
jphbergeson 2:146625d6992d 83 else
jphbergeson 2:146625d6992d 84 sprintf(lock_str, "No lock");
jphbergeson 2:146625d6992d 85
jphbergeson 2:146625d6992d 86 // assemble data into summary string
jphbergeson 2:146625d6992d 87 char status_str[BUF_SIZE];
jphbergeson 2:146625d6992d 88 sprintf(status_str, "%02d:%02d:%02d,%d/%d/%d,%dd %lf' %c %dd %lf' %c,%s",
jphbergeson 2:146625d6992d 89 nmea.hours, nmea.minutes, nmea.seconds,
jphbergeson 2:146625d6992d 90 nmea.month, nmea.day, nmea.year,
jphbergeson 2:146625d6992d 91 nmea.latitude, nmea.latitude_minutes, nmea.latitude_direction,
jphbergeson 2:146625d6992d 92 nmea.longitude, nmea.longitude_minutes, nmea.longitude_direction, lock_str);
jphbergeson 2:146625d6992d 93
jphbergeson 2:146625d6992d 94 // print to pc, sd card
jphbergeson 2:146625d6992d 95 pc.printf("%s", status_str);
jphbergeson 2:146625d6992d 96
jphbergeson 2:146625d6992d 97 fpData = fopen(OUTPUT_FILE, "a");
jphbergeson 2:146625d6992d 98 fprintf(fpData, "%s", status_str);
jphbergeson 2:146625d6992d 99 fclose(fpData);
jphbergeson 2:146625d6992d 100 }
jphbergeson 2:146625d6992d 101
jphbergeson 0:26713d1db198 102 int main()
jphbergeson 0:26713d1db198 103 {
jphbergeson 0:26713d1db198 104 pc.baud(115200); // make sure to set computer TERA Term or whatever to 115200 baud!!!
jphbergeson 0:26713d1db198 105 duino.baud(9600);
jphbergeson 0:26713d1db198 106 pc.printf("Initializing ...\r\n");
jphbergeson 2:146625d6992d 107
jphbergeson 1:5fa445bd14a6 108 fifo_cs = 1;
jphbergeson 1:5fa445bd14a6 109 trigger = 0;
jphbergeson 1:5fa445bd14a6 110 wait(0.5f);
jphbergeson 3:c611fff05072 111
jphbergeson 3:c611fff05072 112 init_temp_sensor(); // TODO: stop execution & send error message if can't init temp sensor (or other things)
jphbergeson 2:146625d6992d 113
jphbergeson 2:146625d6992d 114
jphbergeson 0:26713d1db198 115 while (true) {
jphbergeson 2:146625d6992d 116
jphbergeson 0:26713d1db198 117 led = !led;
jphbergeson 2:146625d6992d 118
jphbergeson 2:146625d6992d 119 gps_read();
jphbergeson 3:c611fff05072 120
jphbergeson 3:c611fff05072 121 check_temp();
jphbergeson 3:c611fff05072 122 // Display result
jphbergeson 3:c611fff05072 123 pc.printf(",%s", TempCelsiusDisplay);
jphbergeson 3:c611fff05072 124 fpData = fopen(OUTPUT_FILE, "a");
jphbergeson 3:c611fff05072 125 fprintf(fpData, ",%s", TempCelsiusDisplay);
jphbergeson 3:c611fff05072 126 fclose(fpData);
jphbergeson 2:146625d6992d 127
jphbergeson 1:5fa445bd14a6 128 // Trigger an acquisition from spectrometer
jphbergeson 1:5fa445bd14a6 129 trigger = 1;
jphbergeson 1:5fa445bd14a6 130 wait_ms(1);
jphbergeson 1:5fa445bd14a6 131 trigger = 0;
jphbergeson 1:5fa445bd14a6 132 read_pixels();
jphbergeson 2:146625d6992d 133
jphbergeson 0:26713d1db198 134 wait(0.5f);
jphbergeson 0:26713d1db198 135 }
jphbergeson 0:26713d1db198 136 }