
aaa
Fork of 0NicksCoursework-lg by
Diff: Components/components.cpp
- Revision:
- 8:582ac4c5a524
- Child:
- 9:e27b3f34de24
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Components/components.cpp Tue Jan 09 05:43:43 2018 +0000 @@ -0,0 +1,371 @@ +#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 + } + } \ No newline at end of file