ladsidfs

Dependencies:   BMP280 LGLCDv2

Fork of 0NicksCoursework_copywithserialtime by Liam Grazier

Components/components.cpp

Committer:
liam_grazier
Date:
2018-01-09
Revision:
8:582ac4c5a524
Child:
9:e27b3f34de24

File content as of revision 8:582ac4c5a524:

#include "mbed.h"
#include "components.hpp"
#include "lglcd.h"
#include "time.h"
#include "stdio.h"
#define RED_DONE 1
#define YELLOW_DONE 2
//Digital outputs
DigitalIn onBoardSwitch(USER_BUTTON);
DigitalOut onBoardLED(LED1);
DigitalOut redLED(PE_15);
DigitalOut yellowLED(PB_10);
DigitalOut greenLED(PB_11);
SDBlockDevice sd(PB_5, D12, D13, D10);// miso, sclk, cs 
Mutex Lock1;
Mutex Lock2;
Mutex Remove;
//Inputs
time_t rawtime;
struct tm * timeinfo;
int year, month ,day, hour, minute, second;
char input = 0; 
char jtime[32];
char jdate[32];
char jdate1[32];
DigitalIn  SW1(PE_12);
DigitalIn  SW2(PE_14);
//Serial pc(USBTX, USBRX);
AnalogIn adcIn(PA_0);
//Environmental Sensor driver
#ifdef BME
BME280 sensor(D14, D15);
#else
BMP280 sensor(D14, D15);
#endif
lglcd mylcd(D7,D6,D5,D4,D3,D2);

//POWER ON SELF TEST
void post() 
{
    //posttest 
}
void runanalysis(void){
    while(1){     
Lock1.lock();
double temp = sensor.getTemperature();
double pressure = sensor.getPressure();
double lightin = adcIn;
char TEM[6];
char PRE[5];  
char LIGHT[6];
//printf("REFRESH SENSORS\n\r");
sprintf(TEM,"%.2f", temp);
sprintf(PRE,"%.2f", pressure);
sprintf(LIGHT,"%.2f", lightin);
mylcd.setline(1,1);
mylcd.write("L:");
if(lightin > 0.7 && lightin < 0.9)
{
mylcd.setline(1,4);
 mylcd.write("|||||||||MAX");    
}
else if(lightin > 0.55 && lightin < 0.69)
{
mylcd.setline(1,4);
 mylcd.write("|||||||     ");
}
else if(lightin > 0.5 && lightin < 0.54)
{
mylcd.setline(1,4);
 mylcd.write("|||||       ");
}
else if(lightin > 0.4 && lightin < 0.54)
{
mylcd.setline(1,4);
 mylcd.write("|||         ");
}
else if(lightin > 0.3 && lightin < 0.39)
{
mylcd.setline(1,4);
 mylcd.write("||          ");
} 
else if(lightin > 0.06 && lightin < 0.29)
{
mylcd.setline(1,4);
 mylcd.write("LOW LIGHT    ");
} 
else if(lightin < 0.05)
{
mylcd.setline(1,4);
mylcd.write("             ");
mylcd.setline(1,4);
mylcd.write("disconnected");
}
mylcd.setline(2,1);
mylcd.write("P:");
mylcd.write(PRE);
mylcd.setline(2,10);
mylcd.write("T:");
mylcd.write(TEM);
wait(0.01);
Lock1.unlock();
Thread::signal_wait(SIG_READY);
}
}
void sdwrite(void)
{
    while(1)
    {
        Lock2.lock();
double P = sensor.getPressure();
double L = adcIn;
double t = sensor.getTemperature();
char tem[6];
char pre[5];  
char light[6];
char com[1];
strcpy(com, ",");
sprintf(pre,"%.2f", P);
sprintf(tem,"%.2f",t);
printf(tem);
sprintf(light,"%.2f\n\r", L);
time_t seconds = time(NULL);
strftime(jdate1, 32, "%F", localtime(&seconds));
strftime(jdate, 32, "%F\n\r", localtime(&seconds));
strftime(jtime, 32, "%X\n\r", localtime(&seconds));
FATFileSystem fs("sd", &sd);
char filename[32];
char suffix[4];
char prefix[4];
strcpy(prefix,"/sd/");
strcpy(suffix,".txt");
Lock1.lock();
sprintf(filename,"%s%s%s",prefix,jdate1,suffix);
Lock1.unlock();
FILE* fp = fopen(filename,"a");
    if (fp == NULL) {
        errorCode(FATAL);
        printf("SD FAIL\n\r");
        mylcd.clear();
        mylcd.setline(1,0);
        mylcd.write("SD FAIL");
    }
    if (fp != NULL){
    //printf("SD Success\n\r");
  //  fprintf(fp,"%s\n\r", "*C,  mbar,   light level 0-1 scale");
    fprintf(fp,"%s",jdate);//date
    fprintf(fp,"%s",com);
    fprintf(fp,"%s",jtime);//time
    fprintf(fp,"%s",com);
    fprintf(fp,"%s",pre);
    fprintf(fp,"%s",com);
    fprintf(fp,"%s",tem);
    fprintf(fp,"%s",com);
    fprintf(fp,"%s\n\r",light);
    wait(0.01);
    }
      fclose(fp);      
      Lock2.unlock(); 
      Thread::signal_wait(SIG_READY2);   

}
}
void sdrun(void)
{
if ( sd.init() != 0) {
printf("Init failed\n\r");
mylcd.clear();
mylcd.setline(1,1);
mylcd.write("CANNOT INIT SD");        
errorCode(FATAL);
}
if( sd.init() == 0){
printf("Init Success \n\r");
mylcd.clear();
mylcd.setline(1,1);
mylcd.write("SD GOOD MAN");
wait(0.5); //flash the SD error / good code! 
}
}
void sdcheck(void){
if ( sd.init() != 0) {
printf("Init failed \n\r");
mylcd.clear();
mylcd.setline(1,1);
mylcd.write("CANNOT INIT SD\n\r");        
errorCode(FATAL);
}
if( sd.init() == 0){
//printf("SD Good\n\r");
}
}
void sdremove(void)
{
    while(1){
    Thread::signal_wait(SIG_REMOVE); 
    mylcd.clear();  
    Remove.lock();
                sd.deinit();
                mylcd.clear();
                Lock1.lock();
                mylcd.setline(2,0);
                greenLED = 1;
                mylcd.write("R");
                Lock1.unlock();
                printf("SD REMOVED\n\r");
                errorCode(FATAL);
    Remove.unlock();
}
}
void lcdstart(void){
    mylcd.clear();
    mylcd.setline(1,1);
    mylcd.write("INIT. SYSTEM");
    mylcd.setline(2,1);
    mylcd.write("ELEC351");
    }
void errorCode(ELEC350_ERROR_CODE err)
{
    switch (err) {
      case OK:
        greenLED = 1;
        wait(1.0);
        greenLED = 0;
        return;                
      case FATAL:
        while(1) {
            redLED = 1;
            wait(0.1);
            redLED = 0;
            wait(0.1);                
        }
    }
}

///dougs code

void DispTime(void)
{
    time_t Count = time(NULL);                      //Read the RTC Time
    printf("Current Time - %s\n\r", ctime(&Count)); //Print the current time
}

void setuptime(void)
{

    /*Initialising the time for our program to easy edit*/
    time ( &rawtime );
    timeinfo = localtime ( &rawtime );
    
    /*Setting the time to the deadline time*/
    /*Same as button Code*/
    //Set the initialisation time to: Tuesday 9th January 2018, 16:00:00.
    //set_time(1515513600);
    //Initialisation of the times.
    time ( &rawtime );
    timeinfo = localtime ( &rawtime ); 
    //Displays the initialisation time
    DispTime();
    /*End the initialisation */
   
}

    void runtime(void){
    while(1) //When added to the main code this will be changed to a while "SETDATE"
    {  
            /*promts the user to input which edit they would like*/
            printf ("What part do you want to edit? Time(T)/All(A).\n\r"); 
            fflush(stdout); 
            scanf ("%s",&input);
            /*Switch case input*/
            switch(input)
            {
            case 'T':
                //Sequential Entering, Hour, Minute, Second respectively
                printf ("Enter hour:(00-23) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&hour);

                printf ("Enter minute:(00-59) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&minute);

                printf ("Enter second:(00-59) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&second);
                
            break;
        
            /*Case A ----- All values Update sequence*/
            case 'A':
                printf ("Enter year:(0-9999) \n\r"); fflush(stdout); scanf ("%d",&year);
                printf ("Enter month:(01-12) \n\r"); fflush(stdout); scanf ("%d",&month);      
                printf ("Enter day:(01-31) \n\r"); fflush(stdout); scanf ("%d",&day);
                printf ("Enter hour:(00-23)\n\r"); fflush(stdout); scanf ("%d",&hour);
                printf ("Enter minute:(00-59) \n\r"); fflush(stdout); scanf ("%d",&minute);
                printf ("Enter second:(00-59) \n\r"); fflush(stdout); scanf ("%d",&second);
            break;
        
            /*default to reset ----- Month Update sequence*/
            default:
                printf  ("Invalid\n\r");
                set_time(1515513600);
        }  
        /*Updating all the timings after the user has input all the data*/
        /*Put here as once the user has finished editing it does a batch update*/
            timeinfo->tm_year = year - 1900;
            timeinfo->tm_mon = month - 1;
            timeinfo->tm_mday = day;
            timeinfo->tm_hour = hour;
            timeinfo->tm_min = minute;
            timeinfo->tm_sec = second;
            time_t CurrTime = mktime(timeinfo); //Convert the to UNIX time
            set_time(CurrTime);                 //Sets time using the UNIX time
            DispTime();  
            return;                       //Display the new time
        }
    }

void rundate(void){
    while(1) //When added to the main code this will be changed to a while "SETDATE"
    {
    
            /*promts the user to input which edit they would like*/
            printf ("What part do you want to edit? Date(D)/All(A).\n\r"); 
            fflush(stdout); 
            scanf ("%s",&input);
            /*Switch case input*/
            switch(input)
            {
            /*Case D ----- Date Update sequence*/  
            case 'D': 
                //Sequential Entering, Day, Month, Year respectively 
                printf ("Enter day:(01-31) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&day); 
                printf ("Enter month:(01-12) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&month);
                printf ("Enter year:(1970-9999) \n\r"); 
                fflush(stdout); 
                scanf ("%d",&year);                       
            break;    
            /*Case A ----- All values Update sequence*/
            case 'A':
                printf ("Enter year:(0-9999) \n\r"); fflush(stdout); scanf ("%d",&year);
                printf ("Enter month:(01-12) \n\r"); fflush(stdout); scanf ("%d",&month);      
                printf ("Enter day:(01-31) \n\r"); fflush(stdout); scanf ("%d",&day);
                printf ("Enter hour:(00-23)\n\r"); fflush(stdout); scanf ("%d",&hour);
                printf ("Enter minute:(00-59) \n\r"); fflush(stdout); scanf ("%d",&minute);
                printf ("Enter second:(00-59) \n\r"); fflush(stdout); scanf ("%d",&second);
            break;
            /*default to reset ----- Month Update sequence*/
            default:
                printf  ("Invalid\n\r");
                set_time(1515513600);
        }  
        /*Updating all the timings after the user has input all the data*/
        /*Put here as once the user has finished editing it does a batch update*/
            timeinfo->tm_year = year - 1900;
            timeinfo->tm_mon = month - 1;
            timeinfo->tm_mday = day;
            timeinfo->tm_hour = hour;
            timeinfo->tm_min = minute;
            timeinfo->tm_sec = second;
            time_t CurrTime = mktime(timeinfo); //Convert the to UNIX time
            set_time(CurrTime);                 //Sets time using the UNIX time
            DispTime();  
            return;                       //Display the new time
        }
    }