summaryrefslogtreecommitdiff
path: root/glcdskin/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'glcdskin/variable.c')
-rw-r--r--glcdskin/variable.c69
1 files changed, 67 insertions, 2 deletions
diff --git a/glcdskin/variable.c b/glcdskin/variable.c
index 7fe0149..b300afc 100644
--- a/glcdskin/variable.c
+++ b/glcdskin/variable.c
@@ -13,18 +13,55 @@ cSkinVariable::cSkinVariable(cSkin * Parent)
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] == '#' || Text[0] == '{')
{
- delete mFunction;
+ //delete mFunction;
mFunction = new cSkinFunction(&mDummyObject);
if (mFunction->Parse(Text))
{
+ if (mEvalMode == tevmOnce) {
+ mValue = mFunction->Evaluate();
+ delete mFunction;
+ mFunction = NULL;
+ }
//mValue = func->Evaluate();
//delete func;
return true;
@@ -60,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)
{
}