PICO I2C FW

Dependencies:   USBDevice

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");