summaryrefslogtreecommitdiff
path: root/glcdskin/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'glcdskin/variable.c')
-rw-r--r--glcdskin/variable.c82
1 files changed, 75 insertions, 7 deletions
diff --git a/glcdskin/variable.c b/glcdskin/variable.c
index b07773a..b300afc 100644
--- a/glcdskin/variable.c
+++ b/glcdskin/variable.c
@@ -11,23 +11,63 @@ cSkinVariable::cSkinVariable(cSkin * Parent)
: mSkin(Parent),
mValue(0),
mCondition(NULL),
+ mFunction(NULL),
mDummyDisplay(mSkin),
- mDummyObject(&mDummyDisplay)
+ mDummyObject(&mDummyDisplay),
+ mEvalMode(tevmTick),
+ mEvalInterval(0),
+ mTimestamp(0)
{
}
+bool cSkinVariable::ParseEvalMode(const std::string & Text)
+{
+
+ if (Text == "always") {
+ mEvalMode = tevmAlways;
+ } else if (Text == "tick") {
+ mEvalMode = tevmTick;
+ } else if (Text == "switch") {
+ mEvalMode = tevmSwitch;
+ } else if (Text == "once") {
+ mEvalMode = tevmOnce;
+ } else if (Text.length() > 9 && Text.substr(0,9) == "interval:") {
+ char * e;
+ const char * t = Text.substr(9).c_str();
+ long l = strtol(t, &e, 10);
+ if ( ! (e == t || *e != '\0') && (l >= 100))
+ {
+ mEvalInterval = (int) l;
+ mEvalMode = tevmInterval;
+ return true;
+ }
+ return false;
+ } else {
+ return false;
+ }
+ return true;
+}
+
+
bool cSkinVariable::ParseValue(const std::string & Text)
{
- if (isalpha(Text[0]) || Text[0] == '#')
+ if (isalpha(Text[0]) || Text[0] == '#' || Text[0] == '{')
{
- cSkinFunction * func = new cSkinFunction(&mDummyObject);
- if (func->Parse(Text))
+ //delete mFunction;
+ mFunction = new cSkinFunction(&mDummyObject);
+ if (mFunction->Parse(Text))
{
- mValue = func->Evaluate();
- delete func;
+ if (mEvalMode == tevmOnce) {
+ mValue = mFunction->Evaluate();
+ delete mFunction;
+ mFunction = NULL;
+ }
+ //mValue = func->Evaluate();
+ //delete func;
return true;
}
- delete func;
+ delete mFunction;
+ mFunction = NULL;
}
else if (Text[0] == '\'')
{
@@ -57,6 +97,34 @@ bool cSkinVariable::ParseCondition(const std::string & Text)
return false;
}
+
+const cType & cSkinVariable::Value(void)
+{
+ if ( mTimestamp > 0 &&
+ ( ( mEvalMode == tevmTick && mTimestamp >= mSkin->GetTSEvalTick() ) ||
+ ( mEvalMode == tevmSwitch && mTimestamp >= mSkin->GetTSEvalSwitch() ) ||
+ ( mEvalMode == tevmInterval && (mTimestamp + (uint64_t)mEvalInterval) > mSkin->Config().Now())
+ )
+ )
+ {
+ return mValue;
+ }
+
+ if (mFunction != NULL) {
+ mValue = mFunction->Evaluate();
+ // should've been solved in ParseValue already, just to be sure ...
+ if (mEvalMode == tevmOnce) {
+ delete mFunction;
+ mFunction = NULL;
+ }
+ }
+ if (mEvalMode == tevmTick || mEvalMode == tevmSwitch || mEvalMode == tevmInterval) {
+ mTimestamp = mSkin->Config().Now();
+ }
+ return mValue;
+}
+
+
cSkinVariables::cSkinVariables(void)
{
}