For coursework of group 3 in SOFT564Z
Dependencies: Motordriver ros_lib_kinetic
Diff: dateTime.cpp
- Revision:
- 5:207e0cd8b9de
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dateTime.cpp Mon Dec 02 13:13:15 2019 +0000 @@ -0,0 +1,323 @@ +/*------------------------------------------------------------------------------ +Creator : Ben Gordon +Date : 08/01/2019 +Module : ELEC351 +Note : Code Ripped from coursework of Group A for ELEC351 +------------------------------------------------------------------------------*/ +#include "dateTime.hpp" +#include "Debug.hpp" + +struct tm _addTime_struct; +struct tm _setTime_struct; + +struct tm _updateTime_struct; + +DigitalOut _green(PB_11); +DigitalOut _yellow(PB_10); +DigitalOut _red(PE_15); + +char dateTimeStr[20]; +char dateStr[11]; +char timeStr[9]; + +extern EventQueue TerminalQueue; +extern Terminal PC; + +////---------------------------SET DATE AND TIME----------------------------//// +BYTE setTime(S_BYTE hours, S_BYTE minutes, S_BYTE seconds) +{ + //Get currently set time + _setTime_struct = getRawTime(); + + //Setting Time + _setTime_struct.tm_hour = hours; + _setTime_struct.tm_min = minutes; + _setTime_struct.tm_sec = seconds; + + return updateSystemTime(); +} + +//Setting the date and time +BYTE setDate(S_BYTE days, S_BYTE months, INT_32 years) +{ + //Get currently set time + _setTime_struct = getRawTime(); + + //Setting Date + _setTime_struct.tm_mday = days; + _setTime_struct.tm_mon = months -1; + _setTime_struct.tm_year = years -1900; + + return updateSystemTime(); +} +////------------------------------------------------------------------------//// +//////////////////////////////////////////////////////////////////////////////// +////---------------------------ADD DATE AND TIME----------------------------//// +void overFlow(INT_32 *base, INT_32 lower, INT_32 upper) +{ + if(*base < lower) + { + *base = upper; + } + else if (*base > upper) + { + *base = lower; + } +} + +void addDay(S_BYTE days) +{ + struct tm _newTime_struct = _addTime_struct; + + _newTime_struct.tm_mday = _newTime_struct.tm_mday + days; + + overFlow(&_newTime_struct.tm_mday,1,31); + + BYTE error = checkStruct(_newTime_struct); + + if(!(error > 1)) + { + _addTime_struct = _newTime_struct; + } +} + +void addMonth(S_BYTE months) +{ + struct tm _newTime_struct = _addTime_struct; + + _newTime_struct.tm_mon = _newTime_struct.tm_mon + months; + + overFlow(&_newTime_struct.tm_mon,1-1,12-1); + + BYTE error = checkStruct(_newTime_struct); + if(!(error > 1)) + { + _addTime_struct = _newTime_struct; + } +} + +void addYear(INT_32 years) +{ + struct tm _newTime_struct = _addTime_struct; //Define a structure for the new calculated + + _newTime_struct.tm_year = _newTime_struct.tm_year + years; //Update new time + + overFlow(&_newTime_struct.tm_year,1970-1900,2106-1900); + + BYTE error = checkStruct(_newTime_struct); //Check for errors + + if(!(error > 1)) //If no errors are found, update the time structure + { + _addTime_struct = _newTime_struct; + } +} + +void addHour(S_BYTE hours) +{ + struct tm _newTime_struct = _addTime_struct; + + _newTime_struct.tm_hour = _newTime_struct.tm_hour + hours; + + overFlow(&_newTime_struct.tm_hour,0,23); + + BYTE error = checkStruct(_newTime_struct); + if(!((error > 1)||(_newTime_struct.tm_hour < 0)||(_newTime_struct.tm_hour > 23))) + { + _addTime_struct = _newTime_struct; + } +} + +void addMin(S_BYTE minutes) +{ + struct tm _newTime_struct = _addTime_struct; + + _newTime_struct.tm_min = _newTime_struct.tm_min + minutes; + + overFlow(&_newTime_struct.tm_min,0,59); + + BYTE error = checkStruct(_newTime_struct); + if(!((error > 1)||(_newTime_struct.tm_min < 0)||(_newTime_struct.tm_min > 59))) + { + _addTime_struct = _newTime_struct; + } +} + +void addSec(S_BYTE seconds) +{ + struct tm _newTime_struct = _addTime_struct; + + _newTime_struct.tm_sec = _newTime_struct.tm_sec + seconds; + + overFlow(&_newTime_struct.tm_sec,0,59); + + BYTE error = checkStruct(_newTime_struct); + if(!((error > 1)||(_newTime_struct.tm_sec < 0)||(_newTime_struct.tm_sec > 59))) + { + _addTime_struct = _newTime_struct; + } +} + +BYTE checkStruct(struct tm check) +{ + //Initialise LEDs [for debugging] + _green = 0; + _yellow = 0; + _red = 0; + + //Check new set time is within range of valid dates (1970 - 2106) + if((check.tm_year < 1970-1900)||(check.tm_year > 2106-1900)) + { + _red = 1; + Error msgs; + msgs.ErrorCode = warning; + msgs.ErrorMSGS = "Year outside of valid range [1970 - 2106]"; + TerminalQueue.call(&PC, &Terminal::ERROR_MSGS, msgs); + return 2; //ERROR_2 Year outside of valid range [1970 - 2106] + } + + //Update structure with correct dates (e.g. 32/10 would become 1/11) + struct tm _newTime_struct = check; + time_t _newTime_time = mktime(&_newTime_struct); + _newTime_struct = *localtime(&_newTime_time); + + //Check structure has remained same (if not, invalid input has been entered (eg 32nd day or 61s minute) + if((check.tm_year != _newTime_struct.tm_year)|| + (check.tm_mon != _newTime_struct.tm_mon )|| + (check.tm_mday != _newTime_struct.tm_mday)|| + (check.tm_hour != _newTime_struct.tm_hour)|| + (check.tm_min != _newTime_struct.tm_min )|| + (check.tm_sec != _newTime_struct.tm_sec )) + { + _yellow = 1; + if(_newTime_struct.tm_year < (1970-1900)) + { + Error msgs; + msgs.ErrorCode = warning; + msgs.ErrorMSGS = "Date exceeds maximum range [06/02/2106 06:28:14]"; + TerminalQueue.call(&PC, &Terminal::ERROR_MSGS, msgs); + _red = 1; + return 3; //ERROR_03 Date exceeds maximum range [06/02/2106 06:28:14] + } + Error msgs; + msgs.ErrorCode = warning; + msgs.ErrorMSGS = "Index exceeds max value [e.g Date = 32/31 or Hour = 26/24]"; + TerminalQueue.call(&PC, &Terminal::ERROR_MSGS, msgs); + return 1; //ERROR_01 Index exceeds max value [e.g Date = 32/31 or Hour = 26/24] + } + _green = 1; + return 0; //ERROR_00 No errors +} +////------------------------------------------------------------------------//// +//////////////////////////////////////////////////////////////////////////////// + +BYTE updateSystemTime() +{ + //Checking DateTime remains in valid format + BYTE error = checkStruct(_setTime_struct); + + //If no errors are returned, then set the DateTime to set values. + if(!error){ + set_time(mktime(&_setTime_struct)); + } + + //Return error to be used for terminal display + return error; +} + +BYTE confirmDate() +{ + BYTE error; + error = checkStruct(_addTime_struct); + char* temp; + sprintf(temp,"error->%d",error); + + if(!error) + { + //errorReport("No Error"); + mktime(&_addTime_struct); + updateSystemTime(); + } + else + { + //errorReport("Error"); + while(error) + { + _addTime_struct.tm_mday = _addTime_struct.tm_mday - 1; + error = checkStruct(_addTime_struct); + } + mktime(&_addTime_struct); + return 1; + } + return 0; +} + +char* getSetDate() +{ + return printDate(_addTime_struct); +} + +char* getSetTime() +{ + return printTime(_addTime_struct); +} + +char* startEditDate() +{ + _addTime_struct = getRawTime(); + return getSetDate(); +} + +char* startEditTime() +{ + _addTime_struct = getRawTime(); + return getSetTime(); +} + +void endEdit() +{ + set_time(mktime(&_addTime_struct)); +} + +char* getSystemDateTime() +{ + struct tm _current_time = getRawTime(); + sprintf(dateTimeStr,"%s %s",printDate(_current_time),printTime(_current_time)); + return dateTimeStr; +} + +////------------------------------------------------------------------------//// + + +struct tm getRawTime() +{ + time_t rawTime; + time(&rawTime); + return *localtime(&rawTime); +} + +//time_t range 0 - 0xFFFFFFFFFFFE [01/01/1970 00:00:00 - 06/02/2106 06:28:14] + +char* printDate(struct tm _time_struct) +{ + sprintf(dateStr,"%02d/%02d/%4d", + getDay(_time_struct), + getMonth(_time_struct), + getYear(_time_struct)); + return dateStr; +} + +char* printTime(struct tm _time_struct) +{ + sprintf(timeStr,"%02d:%02d:%02d", + getHour(_time_struct), + getMin(_time_struct), + getSec(_time_struct)); + return timeStr; +} + +signed INT_32 getYear(struct tm _time_struct) {return _time_struct.tm_year + 1900;} +BYTE getMonth(struct tm _time_struct) {return _time_struct.tm_mon + 1; } +BYTE getDay(struct tm _time_struct) {return _time_struct.tm_mday; } +BYTE getHour(struct tm _time_struct) {return _time_struct.tm_hour; } +BYTE getMin(struct tm _time_struct) {return _time_struct.tm_min; } +BYTE getSec(struct tm _time_struct) {return _time_struct.tm_sec; }