summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glcdgraphics/imagefile.h2
-rw-r--r--glcdskin/parser.c1
-rw-r--r--glcdskin/skin.c2
-rw-r--r--glcdskin/skin.h7
-rw-r--r--glcdskin/variable.c69
-rw-r--r--glcdskin/variable.h16
6 files changed, 93 insertions, 4 deletions
diff --git a/glcdgraphics/imagefile.h b/glcdgraphics/imagefile.h
index 2cc1eba..959d31e 100644
--- a/glcdgraphics/imagefile.h
+++ b/glcdgraphics/imagefile.h
@@ -31,7 +31,7 @@ public:
virtual bool Load(cImage & image, const std::string & fileName);
virtual bool Save(cImage & image, const std::string & fileName);
- virtual bool SupportsScaling(void) { return true; }
+ //virtual bool SupportsScaling(void) { return true; }
virtual bool LoadScaled(cImage & image, const std::string & fileName, uint16_t & scalew, uint16_t & scaleh);
};
diff --git a/glcdskin/parser.c b/glcdskin/parser.c
index ca90829..a9cc3de 100644
--- a/glcdskin/parser.c
+++ b/glcdskin/parser.c
@@ -247,6 +247,7 @@ bool StartElem(const std::string & name, std::map<std::string,std::string> & att
{
variable = new cSkinVariable(skin);
ATTRIB_MAN_STRING("id", variable->mId);
+ ATTRIB_OPT_FUNC("evaluate", variable->ParseEvalMode);
ATTRIB_MAN_FUNC("value", variable->ParseValue);
if (context[context.size() - 1] == "condblock") {
if (attrs.find("condition") != attrs.end()) {
diff --git a/glcdskin/skin.c b/glcdskin/skin.c
index c4e8e4b..122b162 100644
--- a/glcdskin/skin.c
+++ b/glcdskin/skin.c
@@ -21,6 +21,8 @@ cSkin::cSkin(cSkinConfig & Config, const std::string & Name)
name(Name)
{
mImageCache = new cImageCache(this, 100);
+ tsEvalTick = 0;
+ tsEvalSwitch = 0;
}
cSkin::~cSkin(void)
diff --git a/glcdskin/skin.h b/glcdskin/skin.h
index a095ebb..048c193 100644
--- a/glcdskin/skin.h
+++ b/glcdskin/skin.h
@@ -43,6 +43,8 @@ private:
cSkinDisplays displays;
cSkinVariables mVariables;
cImageCache * mImageCache;
+ uint64_t tsEvalTick;
+ uint64_t tsEvalSwitch;
public:
cSkin(cSkinConfig & Config, const std::string & Name);
@@ -66,6 +68,11 @@ public:
cColor GetBackgroundColor(void) { return config.GetDriver()->GetBackgroundColor(); }
cColor GetForegroundColor(void) { return config.GetDriver()->GetForegroundColor(); }
+
+ void SetTSEvalTick(uint64_t ts) { tsEvalTick = ts; }
+ void SetTSEvalSwitch(uint64_t ts) { tsEvalSwitch = ts; }
+ const uint64_t GetTSEvalTick(void) { return tsEvalTick; }
+ const uint64_t GetTSEvalSwitch(void) { return tsEvalSwitch; }
};
} // end of namespace
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)
{
}
diff --git a/glcdskin/variable.h b/glcdskin/variable.h
index fdeebbc..8c6ef6f 100644
--- a/glcdskin/variable.h
+++ b/glcdskin/variable.h
@@ -23,6 +23,16 @@
namespace GLCD
{
+enum eEvalMode
+{
+ tevmAlways,
+ tevmTick,
+ tevmSwitch,
+ tevmOnce,
+ tevmInterval
+};
+
+
class cSkin;
class cSkinVariable
@@ -38,17 +48,21 @@ private:
cSkinFunction * mFunction;
cSkinDisplay mDummyDisplay;
cSkinObject mDummyObject;
+ eEvalMode mEvalMode;
+ int mEvalInterval;
+ uint64_t mTimestamp;
public:
cSkinVariable(cSkin * Parent);
+ bool ParseEvalMode(const std::string & Text);
bool ParseValue(const std::string & Text);
bool ParseCondition(const std::string & Text);
cSkin * Skin(void) const { return mSkin; }
const std::string & Id(void) const { return mId; }
// const cType & Value(void) const { return mValue; }
- const cType & Value(void) { if (mFunction != NULL) { mValue = mFunction->Evaluate(); } return mValue; } ;
+ const cType & Value(void);
cSkinFunction * Condition(void) const { return mCondition; }
};