00001
00006
00007
00008 #include "SCA_ExpressionController.h"
00009 #include "SCA_ISensor.h"
00010 #include "SCA_LogicManager.h"
00011 #include "BoolValue.h"
00012 #include "InputParser.h"
00013
00014 #include "MT_Transform.h"
00015
00016
00017
00018
00019
00020 void SCA_ExpressionController::Trigger(SCA_LogicManager* logicmgr)
00021 {
00022
00023 bool expressionresult = false;
00024
00025 CParser parser;
00026 parser.SetContext(this->AddRef());
00027 CExpression* expr = parser.ProcessText(m_exprText);
00028 if (expr)
00029 {
00030 CValue* value = expr->Calculate();
00031 if (value)
00032 {
00033 if (value->IsError())
00034 {
00035 printf(value->GetText());
00036 } else
00037 {
00038 float num = value->GetNumber();
00039 expressionresult = !MT_fuzzyZero(num);
00040 }
00041 value->Release();
00042
00043 }
00044 expr->Release();
00045 }
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 CValue* newevent = new CBoolValue(expressionresult);
00063
00064 for (vector<SCA_IActuator*>::const_iterator i=m_linkedactuators.begin();
00065 !(i==m_linkedactuators.end());i++)
00066 {
00067 SCA_IActuator* actua = *i;
00068 logicmgr->AddActiveActuator(actua,newevent);
00069 }
00070
00071
00072
00073 newevent->Release();
00074
00075 }
00076
00077
00078 CValue* SCA_ExpressionController::FindIdentifier(const CCString& identifiername)
00079 {
00080
00081 CValue* identifierval = NULL;
00082
00083 for (vector<SCA_ISensor*>::const_iterator is=m_linkedsensors.begin();
00084 !(is==m_linkedsensors.end());is++)
00085 {
00086 SCA_ISensor* sensor = *is;
00087 if (sensor->GetName() == identifiername)
00088 {
00089 identifierval = new CBoolValue(sensor->IsPositiveTrigger());
00090
00091 }
00092
00093
00094
00095
00096
00097
00098 }
00099
00100 if (identifierval)
00101 return identifierval;
00102
00103 return GetParent()->FindIdentifier(identifiername);
00104
00105 }