scott kelleher / Outdoor_UPAS_sharp_octet

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_powerfunction by scott kelleher

Revision:
57:1695e252298d
Parent:
56:49387b72460e
Child:
58:3233c10a668c
--- a/main.cpp	Fri May 20 15:36:07 2016 +0000
+++ b/main.cpp	Fri May 20 18:27:55 2016 +0000
@@ -1,20 +1,9 @@
 #include "mbed.h"
 #include "SDFileSystem.h"
 #include "Adafruit_ADS1015.h"
-#include "MCP40D17.h"
-#include "STC3100.h"
-#include "LSM303.h"
 #include "BME280.h"
-#include "SI1145.h"
-#include "NCP5623BMUTBG.h"
 #include "CronoDot.h"
-#include "EEPROM.h"
-#include "Calibration.h"
-#include "MAX_M8.h" 
-//#include "DRV8830.h"
-#include "Tb_SD_Reader.h"
-#include <vector>
-#include <string>
+
 
 //Edit for fork
 /////////////////////////////////////////////
@@ -22,89 +11,32 @@
 /////////////////////////////////////////////
 I2C                 i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
 Serial              pc(USBTX, USBRX);
-DigitalOut          pumps(PA_9, 0);//(D8, 0);
-DigitalOut          pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS 
-DigitalIn           nINT(PA_15); //Connected but currently unused is a digital ouput pin from LTC2950 battery charger. http://cds.linear.com/docs/en/datasheet/295012fd.pdf
-MCP40D17            DigPot(&i2c);
 BME280              bmesensor(PB_9, PB_8);//(D14, D15);
-NCP5623BMUTBG       RGB_LED(PB_9, PB_8);//(D14, D15);
 CronoDot            RTC_UPAS(PB_9, PB_8);//(D14, D15);
-EEPROM              E2PROM(PB_9, PB_8);//(D14, D15);
-Calibration         calibrations(1);     //Default serial/calibration if there are no values for the selected option
-
-
-/////////////////////////////////////////////
-//RN4677 BT/BLE Module
-/////////////////////////////////////////////
-Serial microChannel(PB_10, PB_11); // tx, rx
-DigitalOut          bleRTS(PB_14, 0);
-DigitalOut          bleCTS(PB_13, 0);
-DigitalOut          BT_IRST(PC_8, 0);
-DigitalOut          BT_SW(PA_12, 0);
 
 
 /////////////////////////////////////////////
 //Analog to Digital Converter
 /////////////////////////////////////////////
 Adafruit_ADS1115    ads(&i2c);
+//Adafruit_ADS1115    ads2(&i2c, 0x49);
 //DigitalIn           ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
 
-/////////////////////////////////////////////
-//Battery Monitoring
-/////////////////////////////////////////////
-STC3100             gasG(PB_9, PB_8);//(D14, D15);  // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf
-InterruptIn           bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
-InterruptIn           bcs2(PA_8); //Batt charging if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
 
-/////////////////////////////////////////////
-//Accelerometer and Magnometer
-/////////////////////////////////////////////
-LSM303              movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf
-//DigitalIn           ACC_INT1(PC_7); //Connected but currently unused. (LSM303)
-//DigitalIn           ACC_INT2(PC_6); //Connected but currently unused. (LSM303)
-//DigitalIn           ACC_DRDY(PC_11); //Connected but currently unused. (LSM303)
-
-/////////////////////////////////////////////
-//UV and Visible Light Sensor
-/////////////////////////////////////////////
-SI1145              lightsensor(PB_9, PB_8);//(D14, D15);
-//DigitalIn           UV_INT(PD_2); //Connected but currently unused nor configured (interupt). (SI1145) https://www.silabs.com/Support%20Documents/TechnicalDocs/Si1145-46-47.pdf
-
-/////////////////////////////////////////////
-//GPS
-/////////////////////////////////////////////
-DigitalOut      gpsEN(PB_15, 0);
-Max_M8 gps(PB_9, PB_8,(0x84));   
-
-/*
-/////////////////////////////////////////////
-//Hbridge Valve Control
-/////////////////////////////////////////////
-DRV8830    schoolF1(PB_9, PB_8, 0xC4); //Work/School Filter A HB1
-DRV8830    homeF2(PB_9, PB_8, 0xCA); //Home Filter B HB2
-DRV8830    transitF3(PB_9, PB_8, 0xCC); //Transit Filter C HB3
-DRV8830    blankF4(PB_9, PB_8, 0xCE); //Blank Filter D HB4
-DigitalIn  hb1_school(PA_6);
-DigitalIn  hb2_home(PA_7);
-DigitalIn  hb3_transit(PA_5);
-DigitalIn  hb4_blank(PA_4);
-*/
 
 /////////////////////////////////////////////
 //SD Card
 /////////////////////////////////////////////
-char filename[] = "/sd/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
-Tb_SD_Reader sdReader;
-DigitalIn     sdCD(PA_11, PullUp);
+char filename[] = "/sd/SHARP_LOG00.txt";
+SDFileSystem sd(D11, D12, D13, D10, "sd"); // (MOSI, MISO, SCK, SEL)
+//DigitalIn     sdCD(PA_11, PullUp);
 
 
 /////////////////////////////////////////////
 //Callbacks
 /////////////////////////////////////////////
-Ticker          stop;     //This is the stop callback object
 Ticker          logg;     //This is the logging callback object
-Ticker          flowCtl;  //This is the control loop callback object
+
 
 /////////////////////////////////////////////
 //Varible Definitions
@@ -129,458 +61,33 @@
 float press;
 float temp;
 float rh;
-
-int uv;
-int vis;
-int ir;
-
-float compass;
-float accel_x;
-float accel_y;
-float accel_z;
-float accel_comp;
-float angle_x;
-float angle_y;
-float angle_z;
-float mag_x;
-float mag_y;
-float mag_z;
+float atmoRho; //g/L
+int   logInerval = 5;//seconds
 
-int vInReading;
-int vInReadingLast;
-int vBlowerReading;
-int omronDiff;
-float omronVolt; //V
-int omronReading;
-float atmoRho; //g/L
-
-int amps;
-int bVolt;
-int bFuel;
-//bool pumpOn;
-float massflow; //g/min
-float volflow; //L/min
-float volflowSet = 1.0; //L/min
-int   logInerval = 5;//seconds
-double secondsD = 0;
-double lastsecondD = 0;
-float massflowSet;
-float deltaVflow = 0.0;
-float deltaMflow = 0.0;
-float gainFlow;
-float sampledVol; //L, total sampled volume
-
-int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00
-int digital_pot_set;
-int digital_pot_change;
-int digitalpotMax = 127;
-int digitalpotMin = 10;
+DigitalOut          sharp1LED(D7, 1);
+DigitalOut          sharp2LED(D6, 1);
+DigitalOut          sharp3LED(D5, 1);
+DigitalOut          sharp4LED(D4, 1);
 
-//int dutyUp;
-//int dutyDown;
-int dutycycleSecOn;
-int dutyCycleI;
-
-bool    gpsFix;
-uint8_t gpssatellites = 0;
-double  gpsspeed = 0.0;
-double  gpscourse = 0.0;
-double  gpslatitude = 0.0;
-double  gpslongitude = 0.0;
-float   gpsaltitude = 0.0;
-long    gpsTime;
-long    gpsDate;
-
-float home_lat  = 40.00000;    //40.580508;
-float home_lon  = -105.000000; //-105.081823;
-float home_lat2  = 40.00000;    //40.580508;
-float home_lon2  = -105.000000; //-105.081823;
-float work_lat  = 40.100000;   //40.594062; //40.569136;
-float work_lon  = -105.100000; //-105.075683; //-105.081966;
-int location = 0;
+int samplingTime = 280;
+int deltaTime = 40;
+int sharp1, sharp2, sharp3, sharp4;
+float sharpVolt1, sharpVolt2, sharpVolt3, sharpVolt4; //V
 
-float homeDistance = 99999;
-float home2Distance = 99999;
-float workDistance = 99999;
-
-//*************************************************//
-
-void sendData(); 
-void Read_File();
-int file_copy(const char *src, const char *dst);
-//void Read_File(char[]);
 
-void pc_recv(){
-    while(pc.readable()){
-        pc.getc();
-    }
-}
 
-static uint8_t rx_buf[20];
-static uint8_t rx_len=0;
-static int haltBLE = 1;
-static int transmissionValue = 0;
-uint8_t writeData[20] = {0,};
-static uint8_t dataLength = 0;
-static int runReady = 0;
-static uint8_t startAndEndTime[12] = {0,};
-static uint8_t fileTransferLock = 0;
-static uint8_t transmissionStopLock = 1;
 
 //////////////////////////////////////////////////////////////
-//BLE Functions
+//SD Logging Function
 //////////////////////////////////////////////////////////////
-
-void uartMicro(){
-    
-    if(runReady!=1){
-        haltBLE = 2;
-        while(microChannel.readable()){
-            rx_buf[rx_len++] = microChannel.getc();
-            
-            //Code block to verify what is being transmitted.  To function correctly, all data must terminate with \0 or \n
-            if(transmissionValue==0){
-                
-                if     (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
-                else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
-                else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
-                else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
-    
-                else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
-                else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate
-                else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number
-                else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable
-                else if(rx_buf[0] == 0x0A)transmissionValue = 10; //GPS Coordinates
-                else if(rx_buf[0] == 0x0B)transmissionValue = 11; //GPS Coordinates (Second Set)
-                else if(rx_buf[0] == 0x0C)transmissionValue = 12; //Cartridge ID
-                else if(rx_buf[0] == 0x0D)transmissionValue = 13; //Duty Cycle
-                else if (rx_buf[0] == 0x0F)transmissionValue = 15; //BT TRANSFER TEST
-                //else if(rx_buf[0] == 0x30)RGB_LED.set_led(1,0,0);
-                else                      transmissionValue = 100; //Not useful data
-            }
-            
-            if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff || transmissionValue==15){
-                if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
-                    transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10 || transmissionValue ==11 || transmissionValue ==12) &&  rx_buf[rx_len-1] != 0xff)
-                {}else{
-                    if(transmissionValue == 4 ) sendData();
-                    if(transmissionValue == 15){
-                         if(fileTransferLock==0){
-                             fileTransferLock=1;
-                             //Read_File(fileTest);
-                             Read_File();
-                             fileTransferLock=0;
-                             RGB_LED.set_led(1,1,1);
-                         }
-                    }
-                    if((transmissionValue == 10 && dataLength<17)||(transmissionValue == 11 && dataLength<9))transmissionStopLock=0;
-                    else transmissionStopLock=1; 
-                    if(transmissionValue == 8){
-                         runReady = 1;
-                         microChannel.attach(NULL,microChannel.RxIrq);
-                    }
-                    if(transmissionStopLock==1){
-                        haltBLE = 1;
-                        transmissionValue = 0;
-                        dataLength = 0;
-                    }
-                }
-            }
-        }
-       
-        if(haltBLE!=1){
-            
-            if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
-            
-            if(transmissionValue ==100){
-                pc.putc(rx_buf[0]); 
-            
-            }else if(transmissionValue ==1){ //process and store RTC values
-                
-                //if(dataLength==6)RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
-                if(dataLength==6){
-                        RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
-                        ///////////////////////
-                        //sets ST RTC
-                        //////////////////////
-                        STtime.tm_sec = writeData[0];    // 0-59
-                        STtime.tm_min = writeData[1];    // 0-59
-                        STtime.tm_hour = writeData[2];   // 0-23
-                        STtime.tm_mday = writeData[3];   // 1-31
-                        STtime.tm_mon = writeData[4]-1;     // 0-11
-                        STtime.tm_year = 100+writeData[5];  // year since 1900 (116 = 2016)
-                        time_t STseconds = mktime(&STtime);
-                        set_time(STseconds); // Set RTC time 
-                    }
-    
-            }
-            else if(transmissionValue ==2){ //process and store sample start/end 
-                if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
-                
-            }else if(transmissionValue ==3){ //process and store sample name
-                if(dataLength ==15)E2PROM.write(0x00001,writeData,15);  
-    
-            }else if(transmissionValue ==5){ //process and store Log Interval
-                 if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
-            
-            }else if(transmissionValue ==6){ //process and store Flow Rate
-                if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
-                
-            }else if(transmissionValue ==7){ //process and store Serial Number
-                if(dataLength ==2)E2PROM.write(0x00034,writeData,2);
-            }else if (transmissionValue == 10){
-                if(dataLength == 16)E2PROM.write(0x00050,writeData,16);
-            }else if (transmissionValue == 11){
-                if(dataLength == 8)E2PROM.write(0x00060,writeData,8);
-            }else if (transmissionValue == 12){
-                if(dataLength == 3)E2PROM.write(0x00070,writeData,3);
-            }else if (transmissionValue == 13){
-                if(dataLength == 3)E2PROM.write(0x00076,writeData,3);
-            }
-        
-            dataLength++;        
-        }
-
-        rx_len = 0;
-    }else{
-        while(microChannel.readable())
-         uint8_t extract = microChannel.getc();
-    }  
-    
-    
-}
-
-void sendData(){
-    
-    //First byte is designator for the App
-    uint8_t sampleTimePassValues[13] = {0x01,0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10};
-    uint8_t subjectLabelOriginal[16] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x0F};
-    uint8_t dataLogOriginal[2] = {0x03,0x0A,};
-    uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F};
-    uint8_t serialBytes[3] = {0x07,0x00,0x00};
-    uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
-    uint8_t latLongHome2[9] = {0x0B,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
-    uint8_t cartridgeIDOriginal[4] = {0x0C,0x48,0x48,0x48};
-    uint8_t dutyCycleOriginal[4] = {0x0D,0x31,0x30,0x30};
-    //uint8_t transfer_fileName[62] = {0x0E, 0x4d, 0x53, 0x30, 0x30, 0x30, 0x30, 0x4c, 0x4f, 0x47, 0x5f, 0x30, 0x30, 0x2d, 0x30, 0x30, 0x2d, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x3d, 0x30, 0x30, 0x3d, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x74, 0x78, 0x74};
-    // Latitude School EEPROM = 0x50-0x53
-    // Longitude School EEPROM = 0x54-0x57
-    // Latitude Home EEPROM = 0x58-0x5B
-    // Longitude Home EEPROM = 0x5C-0x5F
-    uint8_t NEW_EEPROM_CHECK[1] = {0,}; //THIS IS USED TO ENSURE COOPERATION WITH MOBILE APPS
-    uint8_t TERMINATE_BYTE[1] = {0xff,}; //used for compatibility with android app
-    
-    //NEW EEPROM Check bit = 0x75
-    E2PROM.read(0x00075,NEW_EEPROM_CHECK,1);
-    
-    if(NEW_EEPROM_CHECK[0] == 0x0C){ //increment when you add a new parameter to pass to app
-        E2PROM.read(0x00015, sampleTimePassValues+1, 12);
-        E2PROM.read(0x00001, subjectLabelOriginal+1,15);
-        E2PROM.read(0x00014,dataLogOriginal+1,1);
-        E2PROM.read(0x00010,flowRateOriginal+1,4);
-        E2PROM.read(0x00034,serialBytes+1,2);
-        E2PROM.read(0x00050,latLongSchoolOriginal+1,16);
-        E2PROM.read(0x00060,latLongHome2+1,8);
-        E2PROM.read(0x00070,cartridgeIDOriginal+1,3);
-        E2PROM.read(0x00076,dutyCycleOriginal+1,3);
-
-    }else{
-        NEW_EEPROM_CHECK[0] = 0x0C; //increment as well
-        E2PROM.write(0x00075,NEW_EEPROM_CHECK,1);
-        E2PROM.write(0x00015, sampleTimePassValues+1, 12);
-        E2PROM.write(0x00001, subjectLabelOriginal+1,15);
-        E2PROM.write(0x00014,dataLogOriginal+1,1);
-        E2PROM.write(0x00010,flowRateOriginal+1,4);
-        E2PROM.write(0x00034,serialBytes+1,2);
-        E2PROM.write(0x00050,latLongSchoolOriginal+1,16);
-        E2PROM.write(0x00060,latLongHome2+1,8);
-        E2PROM.write(0x00070,cartridgeIDOriginal+1,3);
-        E2PROM.write(0x00076,dutyCycleOriginal+1,3);
-    }
-
-    
-    for(int i=0; i<13; i++){
-         microChannel.putc(sampleTimePassValues[i]);        
-    }  
-    wait(.15);
-        
-    for(int i=0; i<16; i++){
-        microChannel.putc(subjectLabelOriginal[i]);        
-    }  
-    wait(.15);
-    
-    for(int i=0; i<2; i++){
-        microChannel.putc(dataLogOriginal[i]);        
-    }  
-    wait(.15);
-    
-    for(int i=0; i<5; i++){
-        microChannel.putc(flowRateOriginal[i]);        
-    }
-    wait(.15);
-    
-    for(int i=0;i<17;i++){
-        microChannel.putc(latLongSchoolOriginal[i]);
-    } 
-    wait(.15);
-    
-    for(int i=0;i<9;i++){
-        microChannel.putc(latLongHome2[i]);
-    } 
-    wait(.15);
-    for(int i=0;i<4;i++){
-        microChannel.putc(cartridgeIDOriginal[i]);
-    } 
-    wait(.15);
-    for(int i=0;i<4;i++){
-        microChannel.putc(dutyCycleOriginal[i]);
-    } 
-    wait(.15);
-    microChannel.putc(TERMINATE_BYTE[0]);
-
-    
-}
-void Read_File(){
-//void Read_File(char filename[]){
-    
-    char transfer_fileName[] = "MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-    char transfer_fileNamedir[] = "/sd/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-    //char transfer_fileNamedirCopy[] = "/sd/c/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-    
-
-    vector<string> filenames; //filenames are stored in a vector string
-    DIR *dp;
-    struct dirent *dirp;
-    dp = opendir("/sd");
-    //read all directory and file names in current directory into filename vector
-
-    while((dirp = readdir(dp)) != NULL) {
-        
-         if (strcmp(dirp->d_name, ".txt") )
-        {
-            filenames.push_back(string(dirp->d_name));
-        } else {}
-    }
-    closedir(dp);
-    vector<string>::iterator it;
-
-    
-   
-    for(it=filenames.begin(); it < filenames.end(); it++) {
-       // string str ((*it).c_str());
-       
-        if((*it).substr((*it).length()-3) == "txt"){
-            //if(((it - filenames.begin())+1) == 1){
-                pc.printf("%d: %s\r\n", ((it - filenames.begin())+1), (*it).c_str());
-                sprintf(transfer_fileName, "%s", (*it).c_str());
-                sprintf(transfer_fileNamedir, "/sd/%s", (*it).c_str());
-                //sprintf(transfer_fileNamedirCopy, "/sd/c/%s", (*it).c_str());
-                //pc.printf("%s", transfer_fileNamedirCopy);
-                FILE *fp = fopen(transfer_fileNamedir, "r");
-                if(fp == NULL) {
-                    pc.printf("Could not open file, check disk.\r\n");
-                    //while(1) {};
-                } else {
-                    pc.printf("file opened\r\n");
-                }
-                unsigned char c;
-                uint8_t sendMe[1] = {254};
-                RGB_LED.set_led(0,1,0);
-                //pc.printf("%s\r\n",fp.c_str());
-                microChannel.putc(sendMe[0]);
-                for(int i=0;i<60;i++){
-                    microChannel.putc(transfer_fileName[i]);
-                } 
-                while (c != 255){                       // while not end of file or forever
-                    c=fgetc(fp);                         // get a character/byte from the file
-                    //printf("%c",c); // and show it in hex format
-                    microChannel.putc(c);
-                    //wait(0.005);
-                }
-                //RGB_LED.set_led(1,0,0);
-                printf("\r\n");
-                fclose(fp); 
-    
-                //int status = file_copy(transfer_fileNamedir, transfer_fileNamedirCopy);
-                remove(transfer_fileNamedir);
-                //break;                              // close the file
-        }else{
-            //pc.printf("%d: %s\r\n", ((it - filenames.begin())+1), (*it).c_str());
-            }
-        
-    }
-    
-   
-
-};
-
-int file_copy(const char *src, const char *dst)
+void log_data()
 {
-    int retval = 0;
-    int ch;
- 
-    FILE *fpsrc = fopen(src, "r");   // src file
-    FILE *fpdst = fopen(dst, "w");   // dest file
-    
-    while (1) {                  // Copy src to dest
-        ch = fgetc(fpsrc);       // until src EOF read.
-        if (ch == EOF) break;
-        fputc(ch, fpdst);
-    }
-    fclose(fpsrc);
-    fclose(fpdst);
-  
-    fpdst = fopen(dst, "r");     // Reopen dest to insure
-    if (fpdst == NULL) {          // that it was created.
-        retval = -1;           // Return error.
-    } else {
-        fclose(fpdst);
-        retval = 0;              // Return success.
-    }
-    return retval;
-};
-
-//////////////////////////////////////////////////////////////
-// GPS: Calculate distance from target location
-//////////////////////////////////////////////////////////////
-double GPSdistanceCalc (float tlat, float tlon)
-{
-    
-float tlatrad, flatrad;
-float sdlong,  cdlong;
-float sflat, cflat;
-float stlat, ctlat;
-float delta, denom;
-
-    double distance;
-    delta = (gpslongitude-tlon)*0.0174532925;
-    sdlong = sin(delta);
-    cdlong = cos(delta);
-    flatrad = (gpslatitude)*0.0174532925;
-    tlatrad = (tlat)*0.0174532925;
-    sflat = sin(flatrad);
-    cflat = cos(flatrad);
-    stlat = sin(tlatrad);
-    ctlat = cos(tlatrad);
-    delta = (cflat * stlat) - (sflat * ctlat * cdlong);
-    delta = pow(delta,2);
-    delta += pow(ctlat * sdlong,2);
-    delta = sqrt(delta);
-    denom = (sflat * stlat) + (cflat * ctlat * cdlong);
-    delta = atan2(delta, denom);
-    distance = delta * 6372795;
-    return distance;
-}
-
-//////////////////////////////////////////////////////////////
-//Time Comparison Function
-//////////////////////////////////////////////////////////////
-bool timecompare(uint8_t t_sec, uint8_t t_minutes, uint8_t t_hour, uint8_t t_date, uint8_t t_month, uint8_t t_year)
-{
-    
-     time_t seconds = time(NULL);
-    //strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
-    
+    //Get RTC time(s)
+    ///////////////////////////
+    RTC_UPAS.get_time(); 
+    time_t seconds = time(NULL);
+    strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
+/*
     strftime(yrstr, 4, "%y", localtime(&seconds));
     stYr = atoi(yrstr);
     
@@ -598,234 +105,49 @@
     
     strftime(secstr, 4, "%S", localtime(&seconds));
     stSec = atoi(secstr);
-    
-    if(t_year != stYr){
-        return t_year < stYr;
-    } 
-    if(t_month != stMo){
-        return t_month < stMo;
-    }
-    if(t_date != stDay){
-        return t_date < stDay;
-    }
-    if(t_hour != stHr){
-        return t_hour < stHr;
-    }
-    if(t_minutes != stMin){
-        return t_minutes < stMin;
-    }
-    return t_sec < stSec;
-
-}
-
-
-//////////////////////////////////////////////////////////////
-//Shutdown Function
-//////////////////////////////////////////////////////////////
-void check_stop()   // this checks if it's time to stop and shutdown
-{
-   
-    if(timecompare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
-        pbKill = 0; // this is were we shut everything down
-        //pc.printf("If you're reading this something has gone very wrong.");
-    }
- 
-}
-
-//////////////////////////////////////////////////////////////
-//SD Logging Function
-//////////////////////////////////////////////////////////////
-void log_data()
-{
-    //Get RTC time(s)
-    ///////////////////////////
-    RTC_UPAS.get_time(); 
-    time_t seconds = time(NULL);
-    strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
-
-    strftime(yrstr, 4, "%y", localtime(&seconds));
-    stYr = atoi(yrstr);
-    
-    strftime(mostr, 4, "%m", localtime(&seconds));
-    stMo = atoi(mostr);
-    
-    strftime(daystr, 4, "%d", localtime(&seconds));
-    stDay = atoi(daystr);
-    
-    strftime(hrstr, 4, "%H", localtime(&seconds));
-    stHr = atoi(hrstr);
-    
-    strftime(minstr, 4, "%M", localtime(&seconds));
-    stMin = atoi(minstr);
-    
-    strftime(secstr, 4, "%S", localtime(&seconds));
-    stSec = atoi(secstr);
-
+*/
     //pc.printf("%s,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d\r\n", timestr,yrstr,stYr,mostr,stMo,daystr,stDay,hrstr,stHr,minstr,stMin,secstr,stSec);
     
-    /////////////////////////////
-    ///Dutycycle
-    ////////////////////////////
-    if(stSec >= dutycycleSecOn && pumps == 1){
-        pumps = 0;
-        }
-    else if(stSec < dutycycleSecOn && pumps == 0) {
-        pumps = 1;
-        }
     
     //Get Sensor Data except GPS
     ////////////////////////////
     press = bmesensor.getPressure();
     temp = bmesensor.getTemperature()-5.0;
     rh = bmesensor.getHumidity();
-    uv =  lightsensor.getUV();
-    movementsensor.getACCEL();
-    movementsensor.getCOMPASS();
-    compass = movementsensor.getCOMPASS_HEADING();
-    accel_x = movementsensor.AccelData.x;
-    accel_y = movementsensor.AccelData.y;
-    accel_z = movementsensor.AccelData.z;
-    accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
-    mag_x = movementsensor.MagData.x;
-    mag_y = movementsensor.MagData.y;
-    mag_z = movementsensor.MagData.z;
-    vInReadingLast = vInReading;
-    vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
-    amps = gasG.getAmps();
-    bVolt = gasG.getVolts(); 
-    bFuel = gasG.getCharge();
+    atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
     
-    //Check for fully charged battery
-    if(bVolt > 1750 && amps > 8191) {
-               RGB_LED.set_led(0,0,0);
-               //RGB_LED.set_led(0,1,0);
-    //Check for battery with ~2 hours left of runtime at 2lpm to remind user to plug in sampler            
-    }else if(amps > 8191 && bVolt < 1500) {
-        if(ledOn) {
-            RGB_LED.set_led(0,0,0);
-            ledOn = 0;
-        }else {
-            RGB_LED.set_led(1,0,0);
-            ledOn = 1;
-        }
-    //No LED on when not low battery and not fully charged    
-    }else{
-        RGB_LED.set_led(0,0,0);
-    }
-    
+    sharp1LED = 0;
+    sharp2LED = 0;
+    sharp3LED = 0;
+    sharp4LED = 0;
     
-    // Get GPS Data
-    //////////////////////////////
-    //if(gpsEN ==1){  
-    
-        gpsFix = gps.read(1);
-        gpsspeed = gps.speed;
-        //gpscourse = gps.course;
-        gpssatellites =  gps.satellites;
-        gpslatitude = gps.lat;
-        gpslongitude = gps.lon;
-        gpsaltitude = gps.altitude;
-        gpsTime = (long)gps.utc;
-        gpsDate = (long)gps.date;
-    //}
-    
-    //Check for 3.3V rail cut out and turn off pumps in this event
-    if(vInReading > 5950 && amps > 8191) {
-        pumps = 0;
-        wait(1);
-    //Turn pumps back on once the sampler is plugged in and charging after pumps shutoff and 3.3V rail drops out
-    } else if(pumps == 0 && amps < 8191) {
-        //pumps = 1;            
-    }
-          
-   
+    wait_ms(samplingTime);
     
-    if(pumps == 1){     
-        omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
-        omronVolt = (omronReading*4.096)/(32768*1);
-        
-        if(omronVolt<=calibrations.omronVMin) {
-                massflow = calibrations.omronMFMin;
-        } else if(omronVolt>=calibrations.omronVMax) {
-                massflow = calibrations.omronMFMax;
-        } else {
-                massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
-        }
-        
-        atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-        volflow = massflow/atmoRho;
-        sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
-        deltaVflow = volflow-volflowSet;
-        massflowSet = volflowSet*atmoRho;
-        deltaMflow = massflow-massflowSet;    
-            
-        vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
-        omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
-        /*
-        omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
-        omronVolt = (omronReading*4.096)/(32768*1);
-        vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
-        omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
-    
-        if(omronVolt<=calibrations.omronVMin) {
-            massflow = calibrations.omronMFMin;
-        } else if(omronVolt>=calibrations.omronVMax) {
-            massflow = calibrations.omronMFMax;
-        } else {
-            massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
-        }
+    sharp1 = ads.readADC_SingleEnded(0, 0xC383); // read channel 1
+    sharpVolt1 = (sharp1*4.096)/(32768*1);
+    sharp2 = ads.readADC_SingleEnded(1, 0xD383); // read channel 1
+    sharpVolt2 = (sharp2*4.096)/(32768*1);
+    sharp3 = ads.readADC_SingleEnded(2, 0xE383); // read channel 1
+    sharpVolt3 = (sharp3*4.096)/(32768*1);
+    sharp4 = ads.readADC_SingleEnded(3, 0xF383); // read channel 1
+    sharpVolt4 = (sharp4*4.096)/(32768*1);
     
-        atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-        volflow = massflow/atmoRho;
-        sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
-        deltaVflow = volflow-volflowSet;
-        massflowSet = volflowSet*atmoRho;
-        deltaMflow = massflow-massflowSet;
-        
-        if(abs(deltaMflow)>.025) {
-            digital_pot_change = (int)(gainFlow*deltaMflow);
-    
+    wait_ms(deltaTime);
     
-            if(abs(digital_pot_change)>=10) {
-                digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow));
-                //RGB_LED.set_led(1,0,0);
-            } else {
-                digital_pot_set = (digital_pot_set+ digital_pot_change);
-                //RGB_LED.set_led(1,1,0);
-            }
-            
-            if(digital_pot_set>=digitalpotMax) {
-                 digital_pot_set = digitalpotMax;
-                 //RGB_LED.set_led(1,0,0);
-            } else if(digital_pot_set<=digitalpotMin) {
-                 digital_pot_set = digitalpotMin;
-                 //RGB_LED.set_led(1,0,0);
-            }
-    
-            DigPot.writeRegister(digital_pot_set);
-                
-        } else {
-            //RGB_LED.set_led(0,1,0);
-        }
-        */
-
-    }
+    sharp1LED = 1;
+    sharp2LED = 1;
+    sharp3LED = 1;
+    sharp4LED = 1;
     
 
    
     FILE *fp = fopen(filename, "a");
     fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC_UPAS.year, RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds);
     fprintf(fp, "%s,", timestr);
-    fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
-    fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp);
-    fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
-    fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,amps);
-    fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow);
-    fprintf(fp, "%f,%f,%06d,%06d,", gpslatitude, gpslongitude, gpsDate, gpsTime); 
-    //fprintf(fp, "%f,%d,%f,%f,%d,", gpsspeed, gpssatellites, gpscourse, gpsaltitude, gpsFix);
-    fprintf(fp, "%f,%d,%f,%d,", gpsspeed, gpssatellites, gpsaltitude, gpsFix);
-    fprintf(fp, "%d,%d\r\n", dutyCycleI, pumps == 1); // test and add in speed, etc that Josh added in to match the adafruit GPS
-    fclose(fp);
+    fprintf(fp, "%2.2f,%4.2f,%2.1f,%1.3f,", temp,press,rh,atmoRho);
+    fprintf(fp, "%d,%f,%d,%f," ,sharp1,sharpVolt1, sharp2, sharpVolt2);
+    fprintf(fp, "%d,%f,%d,%f\r\n" ,sharp3,sharpVolt3, sharp4, sharpVolt4);
+        fclose(fp);
     free(fp);
     
 
@@ -835,270 +157,36 @@
 
 }
 
-//////////////////////////////////////////////////////////////
-//Flow Control Function
-//////////////////////////////////////////////////////////////
-void flowControl()
-{
-    if(pumps == 1){
-        //RGB_LED.set_led(1,1,1);
-        omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
-        omronVolt = (omronReading*4.096)/(32768*1);
-    
-        if(omronVolt<=calibrations.omronVMin) {
-            massflow = calibrations.omronMFMin;
-        } else if(omronVolt>=calibrations.omronVMax) {
-            massflow = calibrations.omronMFMax;
-        } else {
-            massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
-        }
-    
-        atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-        volflow = massflow/atmoRho;
-        //sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
-        deltaVflow = volflow-volflowSet;
-        massflowSet = volflowSet*atmoRho;
-        deltaMflow = massflow-massflowSet;
-        
-        if(abs(deltaMflow)>.025) {
-            digital_pot_change = (int)(gainFlow*deltaMflow);
-    
-    
-            if(abs(digital_pot_change)>=10) {
-                digital_pot_set = (int)(digital_pot_set+ (int)((2/volflowSet)*deltaMflow));
-                //RGB_LED.set_led(1,0,0);
-            } else {
-                digital_pot_set = (digital_pot_set+ digital_pot_change);
-                //RGB_LED.set_led(1,1,0);
-            }
-            
-            if(digital_pot_set>=digitalpotMax) {
-                 digital_pot_set = digitalpotMax;
-                 //RGB_LED.set_led(1,0,0);
-            } else if(digital_pot_set<=digitalpotMin) {
-                 digital_pot_set = digitalpotMin;
-                 //RGB_LED.set_led(1,0,0);
-            }
-    
-            DigPot.writeRegister(digital_pot_set);
-                
-        } else {
-            //RGB_LED.set_led(0,1,0);
-        }
-    }        
 
-}
 //////////////////////////////////////////////////////////////
 //Main Function
 //////////////////////////////////////////////////////////////
 int main(){
     
   
-    RGB_LED.set_led(0,0,1);
-    
-
- /*  
-    while(1){
-    if(sdCD == 0){
-       RGB_LED.set_led(0,1,0);
-    }else{
-        RGB_LED.set_led(1,0,0);
-    }
-    
-    wait(10); 
-    }
-
-*/    
-      
-
-    gpsEN = 1;
-    wait(1);
-    BT_SW = 1;
-    wait(1);
-    BT_IRST = 1;
-    wait(1);
-    
-
+ 
     pc.baud(115200);  // set what you want here depending on your terminal program speed
     pc.printf("\f\n\r-------------Startup-------------\n\r");
     wait(0.5);
     
-   
-   
-   uint8_t serialNumberAndType[6] = {0x50,0x53,}; //ex) PS0018 // 0x50,0x53 <- ASCII 80 + 83 (PS) //0x4d,0x53 <- ASCII  77 + 83 (MS) 
-   E2PROM.read(0x00034,serialNumberAndType+2,2);
-   
-    int tempSerialNum = ((serialNumberAndType[2]-48)*10 + serialNumberAndType[3]-48);
-    if(tempSerialNum < 18){
-        serialNumberAndType[0] = 0x4D;
-    }
-    
-    int serialNumDigits[4];
-    serialNumDigits[0] = tempSerialNum / 1000 % 10;
-    serialNumDigits[1] = tempSerialNum / 100 % 10;
-    serialNumDigits[2] = tempSerialNum / 10 % 10;
-    serialNumDigits[3] = tempSerialNum  % 10;
-    
-    
-    serialNumberAndType[2] = serialNumDigits[0]+48;
-    serialNumberAndType[3] = serialNumDigits[1]+48;
-    serialNumberAndType[4] = serialNumDigits[2]+48;
-    serialNumberAndType[5] = serialNumDigits[3]+48;
-    
-    /*
-    serialNumberAndType[2] = serialNumDigits[0];
-    serialNumberAndType[3] = serialNumDigits[1];
-    serialNumberAndType[4] = serialNumDigits[2];
-    serialNumberAndType[5] = serialNumDigits[3];
-    */
-    
-   RGB_LED.set_led(0,1,0);
-    
-    pc.attach(pc_recv);
-    microChannel.attach(uartMicro,microChannel.RxIrq);
-    microChannel.baud(115200);  
-    microChannel.printf("$$$");
-    wait(0.5);
-    microChannel.printf("SN,");
-    for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
-    microChannel.printf("\r");
-    wait(0.5);
-    microChannel.printf("A\r");
-    wait(0.5);
-    microChannel.printf("---\r");
-    wait(0.5);
-    
-    RGB_LED.set_led(1,1,1);
-    
-    while(runReady!=1) {
-        wait(1);
-        pc.printf("Waiting for BLE instruction\r\n");
-    
-    }
-    
-    BT_SW = 0;
-    wait(1);
-    BT_IRST = 0;
-    wait(1);
-
 
-  
-    E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
-    RGB_LED.set_led(0,1,0);
-    
-    
-    //Pull MicroEnviornment Lat/Lons from EEPROM
-    // Latitude School EEPROM = 0x50-0x53
-    // Longitude School EEPROM = 0x54-0x57
-    // Latitude Home EEPROM = 0x58-0x5B
-    // Longitude Home EEPROM = 0x5C-0x5F
-    
-    uint8_t workLat[4] = {0,};
-    E2PROM.read(0x00050,workLat,4);
-    E2PROM.byteToFloat(workLat, &work_lat);
-    
-    uint8_t workLon[4] = {0,};
-    E2PROM.read(0x00054,workLon,4);
-    E2PROM.byteToFloat(workLon, &work_lon);
-    
-    uint8_t homeLat[4] = {0,};
-    E2PROM.read(0x00058,homeLat,4);
-    E2PROM.byteToFloat(homeLat, &home_lat);
-    
-    uint8_t homeLon[4] = {0,};
-    E2PROM.read(0x0005C,homeLon,4);
-    E2PROM.byteToFloat(homeLon, &home_lon);
-    
-    uint8_t homeLat2[4] = {0,};
-    E2PROM.read(0x00060,homeLat2,4);
-    E2PROM.byteToFloat(homeLat2, &home_lat2);
-    
-    uint8_t homeLon2[4] = {0,};
-    E2PROM.read(0x00064,homeLon2,4);
-    E2PROM.byteToFloat(homeLon2, &home_lon2);
-    
-    pc.printf("%f,%f\r\n %f,%f\r\n %f,%f\r\n", home_lat, home_lon, work_lat, work_lon, home_lat2, home_lon2);
-    
-   //Get the subject line information
-    uint8_t subjectLabelOriginal[15] = {0,};
-    E2PROM.read(0x00001, subjectLabelOriginal,15);
-    
-    //Get the cartridge ID information
-    uint8_t cartridgeID[3] = {0,};
-    E2PROM.read(0x00070, cartridgeID,3);
-    
-    //Get the dutycycle information
-    uint8_t dutycycleStr[3] = {0,};
-    E2PROM.read(0x00076, dutycycleStr,3);
-    dutyCycleI = ((dutycycleStr[0]-48)*100 + (dutycycleStr[1]-48)*10 + (dutycycleStr[2]-48));
-    float dutycycleF = ((float)dutyCycleI/100);
-    dutycycleSecOn = (int)(dutycycleF*60);
-    
-    //wait(1);
-    //pc.printf("%s,%d,%f,%d\r\n", dutycycleStr,dutyCycleI,dutycycleF,dutycycleSecOn);
-    
-    //Get the proper serial number
-    uint8_t serialBytes[2] = {0,};
-    E2PROM.read(0x00034,serialBytes,2);    
-    serial_num = (uint16_t)(((serialBytes[0]-48)*10 + serialBytes[1]-48));
-    
-    
-////////////////////////////////////////////////////////////////////
-    //Temporary fix for setting serial_num
-////////////////////////////////////////////////////////////////////
-    //uint8_t serialsubjectLabelOriginal[2] = {0,};
-    //E2PROM.read(0x00001, serialsubjectLabelOriginal,2);
-    //uint8_t newserialBytes[2] = {0,};
-    
-    if(subjectLabelOriginal[2] == 126){ 
-            E2PROM.write(0x00034,subjectLabelOriginal,2); 
-            serial_num = (uint16_t)(((subjectLabelOriginal[0]-48)*10 + subjectLabelOriginal[1]-48));
-    }
+     RTC_UPAS.set_time(0,0,0,1,1,1,16);//sets chronodot RTC
      
-    //----------------------------------------------
-    calibrations.initialize(serial_num);
-    pc.printf("%d\r\n", serial_num);
-    pc.printf("%f\r\n",calibrations.MF4);
-    //----------------------------------------------
-////////////////////////////////////////////////////////////////////
-    
-    
-    uint8_t logByte[1] = {0,};
-    E2PROM.read(0x00014,logByte,1);
-    logInerval = logByte[0];
-    
-    //Use the flow rate value stored in eeprom
-    uint8_t flowRateBytes[4] = {0,};
-    E2PROM.read(0x00010,flowRateBytes,4);
-    E2PROM.byteToFloat(flowRateBytes, &volflowSet);
- 
+    ///////////////////////
+    //sets ST RTC
+    //////////////////////
+    STtime.tm_sec = 0;    // 0-59
+    STtime.tm_min = 0;    // 0-59
+    STtime.tm_hour = 0;   // 0-23
+    STtime.tm_mday = 1;   // 1-31
+    STtime.tm_mon = 0;     // 0-11
+    STtime.tm_year = 116;  // year since 1900 (116 = 2016)
+    time_t STseconds = mktime(&STtime);
+    set_time(STseconds); // Set RTC time
 
- 
-  /*  
-    while(!gpsFix){
-       gpsFix = gps.read(1);
-        if(ledOn) {
-            RGB_LED.set_led(0,0,0);
-            ledOn = 0;
-        }else {
-            RGB_LED.set_led(1,0,0);
-            ledOn = 1;
-        }
-        wait(1);
-    }
-   */
-    
-
-    
-    while(!timecompare(startAndEndTime[0], startAndEndTime[1], startAndEndTime[2], startAndEndTime[3], startAndEndTime[4], startAndEndTime[5])) {  // this while waits for the start time by looping until the start time
-            wait(0.5);
-            
-    }
+                        
     RTC_UPAS.get_time(); 
     
-    gps.read(1);
-    gpsTime = (long)gps.utc;
-    gpsDate = (long)gps.date;
     
     time_t seconds = time(NULL);
     strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
@@ -1124,130 +212,21 @@
     
     
     
-    
-    if(tempSerialNum < 18){
-        sprintf(filename, "/sd/MS%03dLOG_%02d%02d%02d_%02d%02d%02d_%06d_%06d_%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c_%c%c%c.txt",serial_num,stYr,stMo,stDay,stHr,stMin,stSec,gpsDate,gpsTime,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
-    
-    }
-    else{
-        sprintf(filename, "/sd/PS%03dLOG_%02d%02d%02d_%02d%02d%02d_%06d_%06d_%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c_%c%c%c.txt",serial_num,stYr,stMo,stDay,stHr,stMin,stSec,gpsDate,gpsTime,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
-        
-    }
-    //sprintf(filename, "/sd/UPAS_TboardtestLog_%s_%c%c%c%c%c%c%c%c.txt", timestr,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]);
-    //sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr);
-    FILE *fp = fopen(filename, "w");
-    fclose(fp);
-    
-    RGB_LED.set_led(1,0,1);
-    
-    if(volflowSet<=1.0) {
-        gainFlow = 100;
-    } else if(volflowSet>=2.0) {
-        gainFlow = 25;
-    } else {
-        gainFlow = 25;
-    }
+  // sprintf(filename,"/sd/SHARP_LOG00.txt");
+      
+      for (uint8_t i = 0; i < 100; i++) {
+        filename[13] = i/10 + '0';
+        filename[14] = i%10 + '0';
+        FILE *fp = fopen(filename, "r");
+        if (fp == NULL) {
+        // only open a new file if it doesn't exist
+        FILE *fp = fopen(filename, "w");
+        fclose(fp);
+        break;  // leave the loop!
+        } 
+       }
     
-    press = bmesensor.getPressure();
-    temp = bmesensor.getTemperature();
-    rh = bmesensor.getHumidity();
-
-    atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-    massflowSet = volflowSet*atmoRho;
-
-    DigPot.writeRegister(digital_pot_setpoint);
-    wait(1);
-    pumps = 1;
-    //pumpOn = 1;
-
-
-    if(volflowSet<=1.0) {
-        gainFlow = 100;
-    } else if(volflowSet>=2.0) {
-        gainFlow = 25;
-    } else {
-        gainFlow = 25;
-    }
-
-    RGB_LED.set_led(1,0,0);
-    press = bmesensor.getPressure();
-    temp = bmesensor.getTemperature();
-    rh = bmesensor.getHumidity();
-
-    atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-    massflowSet = volflowSet*atmoRho;
-    
-    //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
-    digital_pot_setpoint = (int)floor(calibrations.DP4*pow(massflowSet,4)+calibrations.DP3*pow(massflowSet,3)+calibrations.DP2*pow(massflowSet,2)+calibrations.DP1*massflowSet+calibrations.DP0); //min = 0x7F, max = 0x00
-
-    if(digital_pot_setpoint>=digitalpotMax) {
-        digital_pot_setpoint = digitalpotMax;
-    } else if(digital_pot_setpoint<=digitalpotMin) {
-        digital_pot_setpoint = digitalpotMin;
-    }
 
-    pc.printf("%d\r\n", digital_pot_setpoint);
-    DigPot.writeRegister(digital_pot_setpoint);
-    wait(1);
-    pumps = 1;
-  
-
-
-    omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
-    omronVolt = (omronReading*4.096)/(32768*1);
-    if(omronVolt<=calibrations.omronVMin) {
-        massflow = calibrations.omronMFMin;
-    } else if(omronVolt>=calibrations.omronVMax) {
-        massflow = calibrations.omronMFMax;
-    } else {
-        massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
-    }
-    deltaMflow = massflow-massflowSet;
-    digital_pot_set = digital_pot_setpoint;
-    wait(5);
-
-    //---------------------------------------------------------------------------------------------//
-    //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
-
-    while(abs(deltaMflow)>.025) {
-
-        omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
-        omronVolt = (omronReading*4.096)/(32768*1);
-        pc.printf("%d,%f\r\n", omronReading, omronVolt);
-        //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
-        if(omronVolt<=calibrations.omronVMin) {
-            massflow = calibrations.omronMFMin;
-        } else if(omronVolt>=calibrations.omronVMax) {
-            massflow = calibrations.omronMFMax;
-        } else {
-            massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
-        }
-
-        atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
-        volflow = massflow/atmoRho;
-        pc.printf("%f\r\n", volflow);
-        massflowSet = volflowSet*atmoRho;
-        deltaMflow = massflow-massflowSet;
-
-        digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
-        if(digital_pot_set>=digitalpotMax) {
-            digital_pot_set = digitalpotMax;
-        } else if(digital_pot_set<=digitalpotMin) {
-            digital_pot_set = digitalpotMin;
-        }
-
-        wait(2);
-        DigPot.writeRegister(digital_pot_set);
-        pc.printf("%d,\r\n", digital_pot_set);
-        wait(1);
-
-
-    }
-    //pumps = 0;
-    sampledVol = 0.0;
-    RGB_LED.set_led(0,1,0);
-    wait(1);
-    RGB_LED.set_led(0,0,0);
 
         while(fmod((double)stSec,10)!=0) {
            //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD)); 
@@ -1257,10 +236,8 @@
             wait_ms(100);
         }
         
-    logg.attach(&log_data, logInerval);
-    stop.attach(&check_stop, 9);    // check if we should shut down every 9 number seconds, starting after the start.
-    flowCtl.attach(&flowControl, 3);
-
+    logg.attach(&log_data, 10);
+