blob: 41458ce1a549304e49584f4098e72352585d694e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 - 2013, 2018 ACIN, fortiss GmbH, 2019 TU Wien/ACIN
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alois Zoitl, Monika Wenger
* - initial implementation and rework communication infrastructure
* Martin Melik Merkumians - adds NOW and NOW_MONOTONIC functions
*******************************************************************************/
#include "iec61131_functions.h"
#include "forte_architecture_time.h"
template<> const CIEC_BOOL NOT<CIEC_BOOL>(const CIEC_BOOL& pa_roIN){
return CIEC_BOOL(!pa_roIN);
}
#ifdef FORTE_USE_REAL_DATATYPE
TForteInt32 TRUNC(const CIEC_REAL& pa_roIN){
return static_cast<TForteInt32>(pa_roIN);
}
#endif
#ifdef FORTE_USE_LREAL_DATATYPE
TForteInt64 TRUNC(const CIEC_LREAL& pa_roIN){
return static_cast<TForteInt64>(pa_roIN);
}
#endif
#ifdef FORTE_USE_64BIT_DATATYPES
const CIEC_TIME_OF_DAY ADD_TOD_TIME(const CIEC_TIME_OF_DAY& pa_roIN1, const CIEC_TIME& pa_roIN2){
return static_cast<TForteUInt64>(pa_roIN1 + pa_roIN2.getInMilliSeconds());
}
const CIEC_DATE_AND_TIME ADD_DT_TIME(const CIEC_DATE_AND_TIME& pa_roIN1, const CIEC_TIME& pa_roIN2){
return static_cast<TForteUInt64>(pa_roIN1 + pa_roIN2.getInMilliSeconds());
}
const CIEC_TIME_OF_DAY SUB_TOD_TIME(const CIEC_TIME_OF_DAY& pa_roIN1, const CIEC_TIME& pa_roIN2){
return static_cast<TForteUInt64>(pa_roIN1 - pa_roIN2.getInMilliSeconds());
}
const CIEC_DATE_AND_TIME SUB_DT_TIME(const CIEC_DATE_AND_TIME& pa_roIN1, const CIEC_TIME& pa_roIN2){
return static_cast<TForteUInt64>(pa_roIN1 - pa_roIN2.getInMilliSeconds());
}
const CIEC_TIME SUB_DT_DT(const CIEC_DATE_AND_TIME& pa_roIN1, const CIEC_DATE_AND_TIME& pa_roIN2){
CIEC_TIME temp;
temp.setFromMilliSeconds(pa_roIN1 - pa_roIN2);
return temp;
}
const CIEC_TIME SUB_TOD_TOD(const CIEC_TIME_OF_DAY &pa_roIN1, const CIEC_TIME_OF_DAY &pa_roIN2){
CIEC_TIME temp;
temp.setFromMilliSeconds(pa_roIN1 - pa_roIN2);
return temp;
}
const CIEC_TIME SUB_DATE_DATE(const CIEC_DATE &pa_roIN1, const CIEC_DATE &pa_roIN2){
CIEC_TIME temp;
temp.setFromMilliSeconds(pa_roIN1 - pa_roIN2);
return temp;
}
const CIEC_DATE_AND_TIME CONCAT_DATE_TOD(const CIEC_DATE& pa_roIN1, const CIEC_TIME_OF_DAY& pa_roIN2){
CIEC_DATE_AND_TIME retVal;
struct tm *pstTime = pa_roIN1.getTimeStruct();
time_t t = static_cast<time_t>( pa_roIN2 / 1000ULL);
pstTime->tm_hour = (int) (t / 3600);
pstTime->tm_min = (int) ((t % 3600) / 60);
pstTime->tm_sec = (int) (t % 60);
retVal.setDateAndTime(*pstTime, pa_roIN2.getMilliSeconds());
return retVal;
}
CIEC_ANY_INT FIND(const CIEC_ANY_STRING& pa_rsIn1, const CIEC_ANY_STRING& pa_rsIn2){
const char* pc_Find = strstr(pa_rsIn1.getValue(), pa_rsIn2.getValue());
CIEC_ANY_INT temp;
if (0 != pc_Find){
temp.setSignedValue(pc_Find - pa_rsIn1.getValue() + 1);
}
return temp;
}
const CIEC_TIME NOW_MONOTONIC() {
CIEC_TIME now;
now.setFromNanoSeconds(getNanoSecondsMonotonic());
return now;
}
const CIEC_DATE_AND_TIME NOW() {
return CIEC_DATE_AND_TIME(forte_time() * 1000ULL);
}
#endif