PICO I2C FW
Dependencies: USBDevice
Diff: main.cpp
- Revision:
- 11:94a7379c0db8
- Parent:
- 10:148da21c297e
- Child:
- 12:aa9fff0aec91
--- a/main.cpp Mon Jul 02 16:00:52 2018 +0000 +++ b/main.cpp Tue Jul 03 15:59:51 2018 +0000 @@ -2,6 +2,7 @@ #include "SDFileSystem.h" #include "max32630fthr.h" #include "USBSerial.h" +#include <ctype.h> #define I2C_ADDRESS 0x30 // DS2484 I2C address @@ -85,6 +86,7 @@ //SD card insertion detection pin DigitalIn SDDetect(P2_2, PullUp); +InterruptIn SDInsert(P2_2); // Virtual serial port over USB @@ -101,6 +103,7 @@ bool log_flag = false; bool led_toggle_flag = false; bool button_flag = false; +bool sd_insert_flag = false; bool error_flag; int error_ticks; @@ -173,6 +176,11 @@ button_flag = true; } +void sd_insert() //sd_insert pressed isr +{ + sd_insert_flag = true; +} + /* void take_data_flag_callback(){ // set data sample time flag @@ -836,6 +844,7 @@ // Read contents from file char c = fgetc(fp); + while (!feof(fp)) { pc.printf("%c", c); @@ -879,6 +888,123 @@ return true; } +int getline(char **lineptr, int *n, FILE *stream) { + char *bufptr = NULL; + char *p = bufptr; + size_t size; + int c; + + if (lineptr == NULL) { + return -1; + } + if (stream == NULL) { + return -1; + } + if (n == NULL) { + return -1; + } + bufptr = *lineptr; + size = *n; + + c = fgetc(stream); + if (c == EOF) { + return -1; + } + if (bufptr == NULL) { + bufptr = (char *)malloc(128); + if (bufptr == NULL) { + return -1; + } + size = 128; + } + p = bufptr; + while(c != EOF) { + if ((p - bufptr) > (size - 1)) { + size = size + 128; + bufptr = (char *)realloc(bufptr, size); + if (bufptr == NULL) { + return -1; + } + } + *p++ = c; + if (c == '\n') { + break; + } + c = fgetc(stream); + } + + *p++ = '\0'; + *lineptr = bufptr; + *n = size; + + return p - bufptr - 1; +} + +//returns true if settings file exists and is in the proper format +bool apply_settings_file(bool (&logged_devices)[MAX_DEVICES], int& interval) +{ + //int log_interval = 10; + //bool devices[MAX_DEVICES]; + + char * line = NULL; + int len = 0; + int line_number = 0; + + + FILE *fp = fopen("/sd/settings.txt", "r"); + if (fp != NULL) + { + + //initialize devices to all false; + for(int i = 0; i < MAX_DEVICES; i++) + { + logged_devices[i] = false; + } + + + // Read contents from file + while ((getline(&line, &len, fp)) != -1) + { + line_number++; + + char i = 0; + char c = line[i]; + while(c != '\0') + { + int number; + int n; + sscanf((line+i), "%d%n", &number, &n); + if(isdigit(c)) + { + if(line_number == 1) + { + interval = number; + } + else if(line_number == 2) + { + logged_devices[number] = true; + } + if(n > 1) + i = i + (n - 1); + } + i++; + c = line[i]; + } + } + + fclose(fp); + } + else + { + return false; + } + + return true; + +} + + + //****************************************************************************** // main() @@ -901,6 +1027,11 @@ double T[MAX_DEVICES]; bool device_logged[MAX_DEVICES]; + //initialize device_logged to all false; + for(int i = 0; i < MAX_DEVICES; i++) + { + device_logged[i] = false; + } // i/o variables char rx_buff[128]; // comport input buffer @@ -916,6 +1047,8 @@ int log_interval = PERIOD; int time_to_sample; + apply_settings_file(device_logged, log_interval); + //************* init ticker timer callbacks **************** timer_1.attach(&LED_blink_callback,1.0); //start ticker, once per sec. @@ -968,11 +1101,20 @@ rx_index = 0; //character buffer index for input from PC button.fall(&btn_pressed); + SDInsert.fall(&sd_insert); + + sd.disk_initialize(); //initialize sd card //db.printf("start Main loop\r\n"); //db.printf("tf[%d]\r\n",tick_flag); while(1) { // start main loop, take data if logging, check for input, repeat + if(sd_insert_flag == true) + { + sd.disk_initialize(); + sd_insert_flag = false; + } + if(button_flag == true) { if(log_flag == false){ //start logging @@ -985,6 +1127,8 @@ } else { + apply_settings_file(device_logged, log_interval); + FILE *fp = fopen(log_file, "a"); if (fp != NULL) { @@ -992,7 +1136,8 @@ for(j=0;j<device_count;j++) { - fprintf(fp,", Device %d Temperature (C)",j); + if(device_logged[j]) + fprintf(fp,", Device %d Temperature (C)",j); } fprintf(fp,"\r\n"); @@ -1057,6 +1202,13 @@ pc.printf("]\r\n"); } break; + case 'c': + case 'C': + if(!SDDetect) + pc.printf("y\r\n"); + else + pc.printf("n\r\n"); + break; case 'd': case 'D': if(n==1) // if no device number is given @@ -1077,10 +1229,24 @@ break; case 'f': case 'F': //f is for "flash" for microSD - if(!SDDetect) + /*if(!SDDetect) pc.printf("y\r\n"); else - pc.printf("n\r\n"); + pc.printf("n\r\n");*/ + apply_settings_file(device_logged, log_interval); + pc.printf("Interval: %d\r\n", log_interval); + bool no_devices = true; + for(i = 0; i < MAX_DEVICES; i ++) + { + if(device_logged[i]) + { + pc.printf("Device %d is being logged.\r\n", i); + no_devices = false; + } + + } + if(no_devices) + pc.printf("No devices being logged.\r\n", i); break; case 'g': case 'G': @@ -1301,7 +1467,11 @@ fprintf(fp, "%d",time_count); for(j=0;j<device_count;j++) { - fprintf(fp,", %7.3f",T[j]); + if(device_logged[j]) + { + fprintf(fp,", %.3f",T[j]); + } + } fprintf(fp,"\r\n");