Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BME280 BMP280 TextLCD
main.cpp
- Committer:
- thomasmorris
- Date:
- 2018-01-08
- Revision:
- 42:ae1640bca2e1
- Parent:
- 41:859b5e1e3d9a
- Child:
- 43:fb9faec1dc72
- Child:
- 45:875f7e18a386
File content as of revision 42:ae1640bca2e1:
/*
ELEC 351 Group T
Team Members : Christopher Hills, Thomas Morris
Current Verision 19
Overiew: Working Tasks 1,2,3,5,6,7,8,9,10,11,12,13,14,15
Last Revision: Added Mail Box to serial
Todo:
Add functionality to SD card import chris's work on delete serial commnads
Commnet code
Check for race conditions
Move code around
Other fixes
*/
#include "SETUP.hpp"
#include "NETWORK.hpp"
#define Do_Read_Data 1
#define Dont_Read_Data 0
#define Do_Delete_Data 1
#define Dont_Delete_Data 0
Mutex Time_Lock_Main;
Mutex Data_Buffer_Lock;
int Write_Data(DATA Data_Store, int Write_Pointer)//Writes data passed in to the array at address Write Pointer
{
Data_Buffer_Lock.lock();//Appling lock for critial section
Data_Buffer[Write_Pointer] = Data_Store;
if(Write_Pointer < mailsize - 1)//Checks if write pointer will be greater than mail size
{
Write_Pointer = Write_Pointer + 1;//Increment write pointer
}
else
{
Write_Pointer = 0;//Else set it to 0 thus a FIFO system
}
Data_Buffer_Lock.unlock();//Releasing lock for critial section
return Write_Pointer;//New address of Write pointer
}
DATA Read_Data(int Read_Pointer)
{
Data_Buffer_Lock.lock();//Appling lock for critial section
DATA Temp_Data = Data_Buffer[Read_Pointer];
Data_Buffer_Lock.unlock();//Releasing lock for critial section
return Temp_Data;
}
void Delete_Data(int Delete_Pointer)
{
Data_Buffer_Lock.lock();//Appling lock for critial section
Data_Buffer[Delete_Pointer].set_all_zero();
Data_Buffer_Lock.unlock();//Releasing lock for critial section
}
void SD_Card()//Writes data to the SD card
{
while(1)
{
Thread::wait(Sample_Rate*1000); //Waits until a new is taken before checking again
if(Write_Pointer == mailsize - 1)
{
if(Log_Value==1){cout << "In SD_Card Thread" << endl;}
//Open to WRITE
FILE* fp = fopen("/sd/test.csv","a");
if(Log_Value==1){cout << "File Opened" << endl;}
for(int SD_Card_Data_Pointer = 0; SD_Card_Data_Pointer != mailsize; SD_Card_Data_Pointer++)
{
time_t Time = Data_Buffer[SD_Card_Data_Pointer].get_time();
tm* Time_Pointer = localtime(&Time);
int temp_day = Time_Pointer->tm_mday;
int temp_month = (Time_Pointer->tm_mon+1);//Set to current month
int temp_year = (Time_Pointer->tm_year+1900);//Set to current year
int temp_hours = Time_Pointer->tm_hour;
int temp_minute = Time_Pointer->tm_min;
float temp_temperature = Data_Buffer[SD_Card_Data_Pointer].get_temperature();
float temp_pressure = Data_Buffer[SD_Card_Data_Pointer].get_pressure();
float temp_light = Data_Buffer[SD_Card_Data_Pointer].get_light();
fprintf(fp, "Date: %d/%d/%d,",temp_day,temp_month,temp_year);//Date
fprintf(fp, "Time: %d:%d,",temp_hours,temp_minute);//Time
fprintf(fp, "Temperature: %1.1f,",temp_temperature);//Temperature
fprintf(fp, "Pressure: %1.1f,",temp_pressure);//Pressure
fprintf(fp, "Light: %5.3f,",temp_light);//Light
fprintf(fp, "End of Data \n");//End of data
}
if(Log_Value==1){cout << "Dumped data to SD Card" <<endl;}
//Close File
fclose(fp);
}
}
}
void Network()
{
while(1)
{
Thread::wait(NetworkWait);//Waits Network Wait amount of time
if(Log_Value==1){cout << "In Network Thread" << endl;} //Log this
time_t Time = Data_Active.get_time();
tm* Time_Pointer = localtime(&Time);
int temp_day = Time_Pointer->tm_mday;
int temp_month = (Time_Pointer->tm_mon+1);//Set to current month
int temp_year = (Time_Pointer->tm_year+1900);//Set to current year
int temp_hours = Time_Pointer->tm_hour;
int temp_minute = Time_Pointer->tm_min;
float temp_temperature = Data_Active.get_temperature();
float temp_pressure = Data_Active.get_pressure();
float temp_light = Data_Active.get_light();
Networking(temp_day,temp_month,temp_year,temp_hours,temp_minute,temp_temperature,temp_pressure,temp_light);//Pass in networking data and time values
}
}
void LCD_Write_Year()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Year Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Years = 1900 + Time_Pointer->tm_year;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Year Time lock released"<<endl;}
stringstream ss;
ss << Years;
string Year_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Year");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Year_String);
}
void LCD_Write_Month()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Month Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Months = 1 + Time_Pointer->tm_mon;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Month Time lock released"<<endl;}
stringstream ss;
ss << Months;
string Month_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Month");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Month_String);
}
void LCD_Write_Day()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Day Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Days = Time_Pointer->tm_mday;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Day Time lock released"<<endl;}
stringstream ss;
ss << Days;
string Day_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Day");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Day_String);
}
void LCD_Write_Hour()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Hour Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Hours = Time_Pointer->tm_hour;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Hour Time lock released"<<endl;}
stringstream ss;
ss << Hours;
string Hour_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Hour");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Hour_String);
}
void LCD_Write_Minute()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Minute Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Minutes = Time_Pointer->tm_min;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Minute Time lock released"<<endl;}
stringstream ss;
ss << Minutes;
string Minute_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Minute");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Minute_String);
}
void LCD_Write_Seconds()
{
Time_Lock_Main.lock();//Appling lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Seconds Time lock taken"<<endl;}
time_t Time = time(NULL);
tm* Time_Pointer = localtime(&Time);
int Seconds = Time_Pointer->tm_sec;
Time_Lock_Main.unlock();//Releasing lock for critial section
if(Log_Value == 1){cout<<"In LCD_Write_Seconds Time lock released"<<endl;}
stringstream ss;
ss << Seconds;
string Second_String = ss.str();
LCD.DDRAM_Address(0x00);
LCD.Write_String("Set Second");
LCD.DDRAM_Address(0x40);
LCD.Write_String(Second_String);
}
void LCD_Output()
{
while(1)
{
Thread::wait(10);//Small wait
if(mode == 0)//Default mode
{
if(Log_Value == 1){cout << "In mode 0 " << endl;}//Log this
Thread::wait(Default_Mode_Toggle_Time);//Wait for this amount of time
if(Log_Value == 1){cout<<"Writing Data to LCD"<<endl;}
sprintf (LCD_buffer, "%1.1f %1.1f %1.1f",Data_Active.get_temperature(),Data_Active.get_pressure(),Data_Active.get_light());//Used for converting to a sting
LCD.DDRAM_Address(0x00);
LCD.Write_String("Temp Pres li");
LCD.DDRAM_Address(0x40);
LCD.Write_String(LCD_buffer);//Print out current data values to the LCD
Thread::wait(Default_Mode_Toggle_Time); //Wait for this amount of time
if(Log_Value == 1){cout<<"Writing Time and Date to LCD"<<endl;}
Time_Lock_Main.lock();//lock Time_lock for critial section
time_t Time = Data_Active.get_time();
tm* Time_Pointer = localtime(&Time);
LCD.Display_Clear();
sprintf (LCD_buffer, "%d:%d %d,%d",Time_Pointer->tm_hour,Time_Pointer->tm_min,(Time_Pointer->tm_mon+1),(Time_Pointer->tm_year+1900));//Used for converting to a sting
Time_Lock_Main.unlock();//unlock Time_lock for critial section
LCD.DDRAM_Address(0x00);
LCD.Write_String("Current Time:");
LCD.DDRAM_Address(0x40);
LCD.Write_String(LCD_buffer);//Print the current time to the LCD
if(Log_Value == 1){cout<<"Checking Switches for next mode"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 1;
}
}
else if(mode == 1)//Choose either date setting or time setting
{
if(Log_Value == 1){cout << "In Mode 1" << endl;}
LCD.Display_Clear();
while(1)
{
LCD.DDRAM_Address(0x00);
LCD.Write_String("Date Time");
LCD.DDRAM_Address(0x40);
LCD.Write_String("< >");
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 to go to Date setting"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
mode = 2;//Date Setting
break;
}
if(Log_Value == 1){cout<<"Checking SW2 to go to Time setting"<<endl;}
if(SW2.read() == 1 & SW1.read() == 0)
{
mode = 5;//Time Setting
break;
}
}
}
else if(mode == 2)//Set the Year
{
if(Log_Value == 1){cout << "In Mode 2" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Year();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go to Month setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 3;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Year"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Year();
}
if(Log_Value == 1){cout<<"Checking SW2 to subtract Year"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Year();
}
LCD_Write_Year();
}
}
else if(mode == 3)//Set the Month
{
if(Log_Value == 1){cout << "In Mode 3" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Month();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go to Day setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 4;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Month"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Month();
}
if(Log_Value == 1){cout<<"Checking SW2 to subtract Month"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Month();
}
}
}
else if(mode == 4)//Set the Day
{
if(Log_Value == 1){cout << "In Mode 4" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Day();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go Default setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 0;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Day"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Day();
}
if(Log_Value == 1){cout<<"Checking SW2 to subtract Day"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Day();
}
}
}
else if(mode == 5)//Set the Hour
{
if(Log_Value == 1){cout << "In Mode 5" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Hour();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go Minute setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 6;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Hour"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Hour();
}
if(Log_Value == 1){cout<<"Checking SW2 to subtract Hour"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Hour();
}
}
}
else if(mode == 6)//Set the Minute
{
if(Log_Value == 1){cout << "In Mode 6" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Minute();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go Seconds setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 7;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Minute"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Minute();
}
if(Log_Value == 1){cout<<"Checking SW2 to subtract Minute"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Minute();
}
}
}
else if(mode == 7)//Set the Seconds
{
if(Log_Value == 1){cout << "In Mode 7" << endl;}
LCD.Display_Clear();
while(1)
{
LCD_Write_Seconds();
Thread::wait(1000);
if(Log_Value == 1){cout<<"Checking SW1 and SW2 to go Default setting"<<endl;}
if(SW1.read() & SW2.read() == 1)
{
mode = 0;
break;
}
if(Log_Value == 1){cout<<"Checking SW1 to add Second"<<endl;}
if(SW1.read() == 1 & SW2.read() == 0)
{
Add_Second();
}
if(Log_Value == 1){cout<<"Checking SW1 to subtract Second"<<endl;}
else if(SW2.read() == 1 & SW1.read() == 0)
{
Subtract_Second();
}
}
}
else
{
if(Log_Value == 1){cout<<"Mode Error occured mode now set to 0"<<endl;}
mode = 0;
}
}
}
void Serial_Commands()//Used for getting input from the user to determine the opperations to perform
{
char input[100];
while(1) {
if(Log_Value == 1){cout<<"In Serial_Commands"<<endl;}
for (int x = 0; x < 100; x++){input[x] = ' ';};
cout << "Please type in a command" << endl;//Log this
cin.getline(input,sizeof(input),'\r');
//READ ALL FIX THIS
if(input[0] == 'R' & input[1] == 'E' & input[2] == 'A' & input[3] == 'D' & input[4] == ' ' & input[5] == 'A' & input[6] == 'L' & input[7] == 'L')
{
if(Log_Value == 1){cout<<"READ ALL Confirmed"<<endl;}
Data_Buffer_Lock.lock();//Lock data buffer due to critical section
int Start_Address_Read_All = Write_Pointer;
Data_Buffer_Lock.unlock();//unLock data buffer due to critical section
for(int x_Read_All = (Start_Address_Read_All - mailsize); x_Read_All != Start_Address_Read_All; x_Read_All = x_Read_All )
{
if(x_Read_All < 0){x_Read_All = x_Read_All + mailsize;}
else {x_Read_All = x_Read_All;}
DATA Serial_Read_Data = Read_Data(x_Read_All);
time_t Time = Serial_Read_Data.get_time();
tm* Time_Pointer = localtime(&Time);
strftime(scom_time_buffer, 32, "%I:%M %p\t", Time_Pointer); //Format time as a string
pc.printf("Date = %d %d %d\t", Time_Pointer->tm_mday, (Time_Pointer->tm_mon+1),(Time_Pointer->tm_year+1900));
pc.printf("Time = %s", scom_time_buffer); //Print the string formatted time
pc.printf("Temperature = %f\t", Serial_Read_Data.get_temperature()); //Print Temperature
pc.printf("Pressure = %f\t", Serial_Read_Data.get_pressure()); //Print Pressure
pc.printf("Light = %f\n\r", Serial_Read_Data.get_light()); //Print Light
if(x_Read_All == mailsize - 1){x_Read_All = 0;}
else {x_Read_All = x_Read_All + 1;}
}
}
//DELETE ALL FIX THIS - Might need to disable sampling during the delete
else if(input[0] == 'D' & input[1] == 'E' & input[2] == 'L' & input[3] == 'E' & input[4] == 'T' & input[5] == 'E' & input[6] == ' ' & input[7] == 'A' & input[8] == 'L' & input[9] == 'L' & input[10] == ' ')
{
if(Log_Value == 1){cout<<"DELETE ALL Confirmed"<<endl;}
Data_Buffer_Lock.lock();
int Start_Address = Write_Pointer;
Data_Buffer_Lock.unlock();
for(int x_Delete_All = (Start_Address - mailsize); x_Delete_All != Start_Address; x_Delete_All = x_Delete_All)
{
if(x_Delete_All < 0){x_Delete_All = x_Delete_All + mailsize;}
else {x_Delete_All = x_Delete_All;}
Delete_Data(x_Delete_All);
if(x_Delete_All == mailsize - 1){x_Delete_All = 0;}
else {x_Delete_All = x_Delete_All + 1;}
}
}
//READ
else if(input[0] == 'R' & input[1] == 'E' & input[2] == 'A' & input[3] == 'D' & input[4] == ' ')
{
int NumberOfChars = 0; int ArrayAddress = 0; string ReadNumber; int NumberToRead;
while(input[ArrayAddress] != '\0'){NumberOfChars++; ArrayAddress++;}
for(int x=5; x < NumberOfChars; x++){ReadNumber += input[x];}
stringstream Number(ReadNumber);
Number >> NumberToRead;
if(Log_Value == 1){cout<<"Getting Data"<<endl;}
Data_Buffer_Lock.lock();//Lock data buffer due to critical section
int Start_Address = Write_Pointer;
Data_Buffer_Lock.unlock();//unLock data buffer due to critical section
for(int x = (Start_Address - NumberToRead); x != Start_Address; x = x )
{
if(x < 0){x = x + mailsize;}
else {x = x;}
DATA Serial_Read_Data = Read_Data(x);
time_t Time = Serial_Read_Data.get_time();
tm* Time_Pointer = localtime(&Time);
strftime(scom_time_buffer, 32, "%I:%M %p\t", Time_Pointer); //Format time as a string
pc.printf("Date = %d %d %d\t", Time_Pointer->tm_mday, (Time_Pointer->tm_mon+1),(Time_Pointer->tm_year+1900));
pc.printf("Time = %s", scom_time_buffer); //Print the string formatted time
pc.printf("Temperature = %f\t", Serial_Read_Data.get_temperature()); //Print Temperature
pc.printf("Pressure = %f\t", Serial_Read_Data.get_pressure()); //Print Pressure
pc.printf("Light = %f\n\r", Serial_Read_Data.get_light()); //Print Light
if(x == mailsize - 1){x = 0;}
else {x = x + 1;}
Green_led.Toggle();
}
//Serial_Comms_Data_Get();
if(Log_Value == 1){cout << "Read " << NumberToRead << " samples" << endl;}
}
//DELETE look into this mgiht need to turn off sampling
else if(input[0] == 'D' & input[1] == 'E' & input[2] == 'L' & input[3] == 'E' & input[4] == 'T' & input[5] == 'E' & input[6] == ' ')
{
int NumberOfChars = 0; int ArrayAddress = 0; string DeleteNumber; int NumberToDelete;
while(input[ArrayAddress] != '\0'){NumberOfChars++; ArrayAddress++;}
for(int x=7; x < NumberOfChars; x++){DeleteNumber += input[x];}
stringstream Number(DeleteNumber);
Number >> NumberToDelete;
if(Log_Value == 1){cout << "Deleted " << NumberToDelete << " samples" << endl;}
Data_Buffer_Lock.lock();
int Start_Address = Write_Pointer;
Data_Buffer_Lock.unlock();
for(int x_Delete = (Start_Address - NumberToDelete); x_Delete != Start_Address; x_Delete = x_Delete )
{
if(x_Delete < 0){x_Delete = x_Delete + mailsize;}
else {x_Delete = x_Delete;}
Delete_Data(x_Delete);
if(x_Delete == mailsize - 1){x_Delete = 0;}
else {x_Delete = x_Delete + 1;}
}
//Serial_Comms_Data_Get();
if(Log_Value == 1){cout << "Deleted " << NumberToDelete << " samples" << endl;}
}
//STATE
else if(input[0] == 'S' & input[1] == 'T' & input[2] == 'A' & input[3] == 'T' & input[4] == 'E' & input[5] == ' ')
{
int NumberOfChars = 0; int ArrayAddress = 0; string StateNumber; int NumberToState;
while(input[ArrayAddress] != '\0'){NumberOfChars++; ArrayAddress++;}
for(int x=6; x < NumberOfChars; x++){StateNumber += input[x];}
stringstream Number(StateNumber);
Number >> NumberToState;
if(NumberToState==0){Sampling_Timer.detach(); Console_Output_Timer.detach();}//Stop Sampling
if(NumberToState==1){Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);}//Start Sampling
}
//SETDATE
else if(input[0] == 'S' & input[1] == 'E' & input[2] == 'T' & input[3] == 'D' & input[4] == 'A' & input[5] == 'T' & input[6] == 'E' & input[7] == ' ' & input[10] == ' ' & input[13] == ' ')
{
//int NumberOfChars = 0; int ArrayAddress = 0;
string DayNumber, MonthNumber, YearNumber;
int NumberToDay, NumberToMonth, NumberToYear;
for(int x=8; x < 10; x++){DayNumber += input[x];}
stringstream Number_1(DayNumber);
Number_1 >> NumberToDay;
for(int x=11; x < 13; x++){MonthNumber += input[x];}
stringstream Number_2(MonthNumber);
Number_2 >> NumberToMonth;
for(int x=14; x < 18; x++){YearNumber += input[x];}
stringstream Number_3(YearNumber);
Number_3 >> NumberToYear;
set_new_date(NumberToDay,NumberToMonth,NumberToYear);
}
//SETTIME
else if(input[0] == 'S' & input[1] == 'E' & input[2] == 'T' & input[3] == 'T' & input[4] == 'I' & input[5] == 'M' & input[6] == 'E' & input[7] == ' ' & input[10] == ' ' & input[13] == ' ')
{
//int NumberOfChars = 0; int ArrayAddress = 0;
string HourNumber, MinuteNumber, SecondNumber;
int NumberToHour, NumberToMinute, NumberToSecond;
for(int x=8; x < 10; x++){HourNumber += input[x];}
stringstream Number_1(HourNumber);
Number_1 >> NumberToHour;
for(int x=11; x < 13; x++){MinuteNumber += input[x];}
stringstream Number_2(MinuteNumber);
Number_2 >> NumberToMinute;
for(int x=14; x < 16; x++){SecondNumber += input[x];}
stringstream Number_3(SecondNumber);
Number_3 >> NumberToSecond;
set_new_time(NumberToHour,NumberToMinute,NumberToSecond);
}
//SETT
else if(input[0] == 'S' & input[1] == 'E' & input[2] == 'T' & input[3] == 'T' & input[4] == ' ')
{
int NumberOfChars = 0; int ArrayAddress = 0; string SettNumber; int NumberToSett;
while(input[ArrayAddress] != '\0'){NumberOfChars++; ArrayAddress++;}
for(int x=5; x < NumberOfChars; x++){SettNumber += input[x];}
stringstream Number(SettNumber);
Number >> NumberToSett;
if(NumberToSett >= 1){Sample_Rate = NumberToSett;}
Sampling_Timer.detach();
Console_Output_Timer.detach();
Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);
}
//LOGGING
else if(input[0] == 'L' & input[1] == 'O' & input[2] == 'G' & input[3] == 'G' & input[4] == 'I' & input[5] == 'N' & input[6] == 'G' & input[7] == ' ')
{
int NumberOfChars = 0; int ArrayAddress = 0; string LoggingNumber; int NumberToLogging;
while(input[ArrayAddress] != '\0'){NumberOfChars++; ArrayAddress++;}
for(int x=8; x < NumberOfChars; x++){LoggingNumber += input[x];}
stringstream Number(LoggingNumber);
Number >> NumberToLogging;
cout << "Successfully entered logging" << endl;
cout << NumberToLogging << endl;
Log_Value = NumberToLogging;
}
//HELP
else if(input[0] == 'H' & input[1] == 'E' & input[2] == 'L' & input[3] == 'P')// Use this to display all of the availble commands
{
HELP();//Run HELP Command
}
//STOP
else if(input[0] == 'S' & input[1] == 'T' & input[2] == 'O' & input[3] == 'P')
{
Console_Output_Timer.detach(); //Stops Sampling
}
else
{
cout << "Please enter an acceptable command" << endl;
}
}
}
void Serial_Comms_Data_Get()
{
if(Log_Value == 1){cout<<"Getting Data"<<endl;}
time_t Time = Data_Active.get_time();
tm* Time_Pointer = localtime(&Time);
strftime(scom_time_buffer, 32, "%I:%M %p\t", Time_Pointer); //Format time as a string
pc.printf("Date = %d %d %d\t", Time_Pointer->tm_mday, (Time_Pointer->tm_mon+1),(Time_Pointer->tm_year+1900));
pc.printf("Time = %s", scom_time_buffer); //Print the string formatted time
pc.printf("Temperature = %f\t", Data_Active.get_temperature()); //Print Temperature
pc.printf("Pressure = %f\t", Data_Active.get_pressure()); //Print Pressure
pc.printf("Light = %f\n\r", Data_Active.get_light()); //Print Light
Green_led.Toggle();
}
void Sampling_ISR(){t1.signal_set(SamplingTime);}
void Sample()//Samples the hardware and prints the result to the LCD
{
while(1)
{
Thread::signal_wait(SamplingTime); //Set the time between samples
if(Log_Value == 1){cout<<"Sample Time"<<endl;}
Data_Active.set_temperature(sensor.getTemperature()); //Read Temperature
Data_Active.set_pressure(sensor.getPressure()); //Read Pressure
Data_Active.set_light(adcIn.read()); //Read Light
Time_Lock_Main.lock();
time_t buffer_time = time(NULL);
Time_Lock_Main.unlock();
Data_Active.set_time(buffer_time);
Red_led.Toggle();
Write_Pointer = Write_Data(Data_Active,Write_Pointer);
t1.signal_set(NotSamplingTime);
if(Log_Value == 1){cout<<"New Sample avaliable"<<endl;}
t2.signal_set(SD_Data_Ready);
}
}
int main()
{
set_time(1515352584); //Set RTC time to December 10 2017
pc.baud(9600); //Sets the Serial Comms Baud Rate
LCD.Initialise();
LCD.DDRAM_Address(0x00);
post(); //Power on Self Test
//Initialise the SD card (this needs to move)
if ( sd.init() != 0) {
printf("Init failed \n");
LCD.Display_Clear();
LCD.Write_String("CANNOT INIT SD"); //Change me
errorCode(FATAL);
}
//Create a filing system for SD Card
FATFileSystem fs("sd", &sd);
//Open to WRITE
FILE* fp = fopen("/sd/test.csv","a");//test.csv is created in the SD Card
if (fp == NULL) {
error("Could not open file for write\n");
LCD.Display_Clear();
LCD.Write_String("CANNOT OPEN FILE");
errorCode(FATAL);
}
//Close File
fclose(fp);
int network_temp;
network_temp = Network_Init();
if(network_temp == 1)//Sets up the network and checks if the network cable is not pluged in
{
error("Could not access network");
LCD.Display_Clear();
LCD.Write_String("Could not access network");
errorCode(NETWORK_FATAL);
}
//Last message before sampling begins
LCD.Display_Clear();
LCD.Write_String("READY PLAYER");
LCD.DDRAM_Address(0x40);
LCD.Write_String(" One ");
LCD.DDRAM_Address(0x00);
Sample_Rate = TimerInterval;
//Run interrupt
Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);
t1.start(Sample);
t2.start(SD_Card);
t3.start(LCD_Output);
t4.start(Network);
t5.start(Serial_Commands);
//Main thread ID
idMain = osThreadGetId(); //CMSIS RTOS call
//Thread ID
id1 = t1.gettid();
id2 = t2.gettid();
id3 = t3.gettid();
id4 = t4.gettid();
id5 = t5.gettid();
while(true) {
if(onBoardSwitch == 1)
{
fclose(fp);//Close File
sd.deinit();//Close down
LCD.Display_Clear();
LCD.DDRAM_Address(0x00);
LCD.Write_String("SD Card");
LCD.DDRAM_Address(0x40);
LCD.Write_String("Unmounted");
LCD.DDRAM_Address(0x00);
cout << "SD Card Unmounted" << endl;
}
greenLED = 1;
wait(0.5);
greenLED = 0;
wait(0.1);
}
}//End of Main