|
From: <j-...@us...> - 2012-07-10 15:37:53
|
Revision: 916
http://openautomation.svn.sourceforge.net/openautomation/?rev=916&view=rev
Author: j-n-k
Date: 2012-07-10 15:37:42 +0000 (Tue, 10 Jul 2012)
Log Message:
-----------
Updated knxdmxd
Modified Paths:
--------------
tools/knxdmxd/Makefile.am
tools/knxdmxd/knxdmxd
tools/knxdmxd/src/cue.cc
tools/knxdmxd/src/cue.h
tools/knxdmxd/src/dmxsender.cc
tools/knxdmxd/src/dmxsender.h
tools/knxdmxd/src/fixture.cc
tools/knxdmxd/src/fixture.h
tools/knxdmxd/src/knxdmxd.cc
tools/knxdmxd/src/knxdmxd.h
tools/knxdmxd/src/trigger.cc
tools/knxdmxd/src/trigger.h
Modified: tools/knxdmxd/Makefile.am
===================================================================
--- tools/knxdmxd/Makefile.am 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/Makefile.am 2012-07-10 15:37:42 UTC (rev 916)
@@ -1,2 +1,11 @@
-AUTOMAKE_OPTIONS = foreign
-SUBDIRS = src
\ No newline at end of file
+# what flags you want to pass to the C compiler & linker
+#CPPFLAGS = --pedantic -Wall -std=c99 -O2
+#LDFLAGS =
+
+knxdmxd_CXXFLAGS = $(OLA_CFLAGS) $(AM_CXXFLAGS)
+knxdmxd_LDADD = $(OLA_LIBS)
+
+# this lists the binaries to produce, the (non-PHONY, binary) targets in
+# the previous manual Makefile
+bin_PROGRAMS = knxdmxd
+knxdmxd_SOURCES = knxdmxd.cc log.cc fixture.cc cue.cc dmxsender.cc trigger.cc
Modified: tools/knxdmxd/knxdmxd
===================================================================
(Binary files differ)
Modified: tools/knxdmxd/src/cue.cc
===================================================================
--- tools/knxdmxd/src/cue.cc 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/cue.cc 2012-07-10 15:37:42 UTC (rev 916)
@@ -13,6 +13,8 @@
Cue::Cue(const std::string name, const bool isLink) {
_name=name;
+ lock_.locker = name; // default is cue-name
+ lock_.prio = 0;
fadeIn_ = 0.0;
fadeOut_ = 0.0;
waittime_ = -1; // never step automatically
@@ -40,37 +42,52 @@
void Cue::Go() {
if ((delay_>0) && (!delay_on_)) {
- DMXSender::GetOLAClient().GetSelectServer()->RegisterSingleTimeout(
+ DMX::GetOLAClient().GetSelectServer()->RegisterSingleTimeout(
(int) delay_*1000, ola::NewSingleCallback(this, &Cue::Go));
delay_on_ = true;
+ std::clog << "Called cue " << _name << " (delaying)" << std::endl;
} else {
for(std::list<cue_channel_t>::iterator it = _channel_data.begin(); it != _channel_data.end(); ++it) {
+ if (!it->fixture->Lock(lock_)) { // Test if we can lock
+ std::clog << _name << ": locking failed " << it->fixture->GetName() << std::endl;
+ continue; // no, we can't
+ }
int deltaVal = it->fixture->GetCurrentValue(it->name) - it->value;
- float ft = (deltaVal>0) ? (deltaVal/(fadeOut_*1.e3/DMX_INTERVAL)) : (-deltaVal/(fadeIn_*1.e3/DMX_INTERVAL));
+ float ft = (deltaVal>0) ? ((deltaVal+1)/(fadeOut_*1.e3/(DMX_INTERVAL+1))) : ((-deltaVal+1)/(fadeIn_*1.e3/(DMX_INTERVAL+1)));
it->fixture->Update(it->name, it->value, ft);
}
delay_on_ = false;
+ std::clog << "Called cue " << _name << std::endl;
}
- std::clog << "Called cue " << _name << std::endl;
+
}
Cuelist::Cuelist(const std::string name) {
_name=name;
+
+ lock_.locker = name; // default is cuelist-name
+ lock_.prio = 0;
current_cue_=-1;
+
was_direct_ = false;
cue_halted_ = true;
+ release_on_halt_ = true;
+
+ max_cue_ = 0;
+
std::clog << "Creating Cuelist '" << name << "'" << std::endl;
}
void Cuelist::AddCue(knxdmxd::Cue& cue) {
- _cue_data.push_back(cue);
- int cue_num = _cue_data.size()-1;
+ cue_data_.push_back(cue);
+ int cue_num = max_cue_;
if (!cue.isLink()) {
- _cue_names.insert(std::pair<std::string, int>(cue.GetName(), cue_num));
- std::clog << "Cuelist " << _name << ": added cue " << cue.GetName() << " as #" << _cue_data.size()-1 << std::endl;
+ cue_names_.insert(std::pair<std::string, int>(cue.GetName(), cue_num));
+ std::clog << "Cuelist " << _name << ": added cue " << cue.GetName() << " as #" << cue_num << std::endl;
} else {
- std::clog << "Cuelist " << _name << ": added link to cue '" << cue.GetName() << "' as #" << _cue_data.size()-1 << std::endl;
+ std::clog << "Cuelist " << _name << ": added link to cue '" << cue.GetName() << "' as #" << cue_num << std::endl;
}
+ max_cue_++;
}
void Cuelist::NextCue(const int direct) {
@@ -79,53 +96,50 @@
return;
}
- if (direct != -1) {
- if (direct>(_cue_data.size()-1)) { // called cue too large
- std::clog << kLogInfo << "Tried direct call to cue " << direct << " in cuelist " << _name << ": too large" << std::endl;
- return;
- }
- current_cue_ = direct - 1;
- if (!cue_halted_) // only if cuelist was running
+ switch (direct) {
+ default: // direct call
+ if (direct>=max_cue_) { // called cue too large
+ std::clog << kLogInfo << "Tried direct call to cue " << direct << " in cuelist " << _name << ": too large" << std::endl;
+ return;
+ }
+ current_cue_ = direct - 1;
+ if (!cue_halted_) // only if cuelist was running
+ was_direct_ = true;
+ break;
+ case -1: // normal call
+ break;
+ case -2: // next on running cuelist
was_direct_ = true;
+ break;
+
}
- if (_cue_data.size()>(current_cue_+1)) {
+ if (max_cue_>(current_cue_+1)) {
+ if (current_cue_>=0)
+ cue_data_.at(current_cue_).Release();
current_cue_++;
- knxdmxd::Cue cue = _cue_data.at(current_cue_);
+ knxdmxd::Cue cue = cue_data_.at(current_cue_);
if (cue.isLink()) {
- current_cue_ = _cue_names.find(cue.GetName())->second;
+ current_cue_ = cue_names_.find(cue.GetName())->second;
}
- _cue_data.at(current_cue_).Go();
+ cue_data_.at(current_cue_).Go();
float waittime;
int nextCuenum = current_cue_+1;
- if (_cue_data.size()>nextCuenum) { // last cue stops automatically
- knxdmxd::Cue nextCue = _cue_data.at(nextCuenum);
+ if (max_cue_>nextCuenum) { // last cue stops automatically
+ knxdmxd::Cue nextCue = cue_data_.at(nextCuenum);
if (nextCue.isLink()) {
- nextCuenum = _cue_names.find(nextCue.GetName())->second;
- nextCue = _cue_data.at(nextCuenum);
+ nextCuenum = cue_names_.find(nextCue.GetName())->second;
+ nextCue = cue_data_.at(nextCuenum);
}
waittime = nextCue.GetWaitTime();
if ((waittime>=0) && (!cue_halted_)) {
- DMXSender::GetOLAClient().GetSelectServer()->RegisterSingleTimeout(
+ DMX::GetOLAClient().GetSelectServer()->RegisterSingleTimeout(
(int) waittime*1000, ola::NewSingleCallback(this, &Cuelist::NextCue, -1));
}
}
}
}
- void Cuelist::Go() {
- cue_halted_=false;
- NextCue(-1);
- }
-
- void Cuelist::Halt() {
- cue_halted_=true;
- }
-
- void Cuelist::Direct(const int value) {
- NextCue(value);
- }
-
}
Modified: tools/knxdmxd/src/cue.h
===================================================================
--- tools/knxdmxd/src/cue.h 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/cue.h 2012-07-10 15:37:42 UTC (rev 916)
@@ -29,6 +29,7 @@
float fadeIn_, fadeOut_;
float waittime_, delay_;
bool is_link_, delay_on_;
+ fixture_lock_t lock_;
public:
Cue() {};
@@ -38,20 +39,29 @@
void SetFading(const float fadeIn, const float fadeOut);
void SetWaittime(const float waittime) { waittime_ = waittime; };
void SetDelay(const float delay) { delay_ = delay; };
+ void SetLock(const fixture_lock_t lock) { lock_ = lock; };
+ void Go();
+ void Release() {
+ for(std::list<cue_channel_t>::iterator it = _channel_data.begin(); it != _channel_data.end(); ++it) {
+ it->fixture->Release(lock_);
+ }
+ };
+
const std::string GetName() { return _name; };
const float GetWaitTime() { return waittime_; };
const float GetDelayTime() { return delay_; };
- virtual void Go();
bool isLink() { return is_link_; };
};
class Cuelist : public TriggerHandler {
- int current_cue_;
+ int current_cue_, max_cue_;
bool cue_halted_, was_direct_;
- std::vector<knxdmxd::Cue> _cue_data;
- std::map<std::string, int> _cue_names;
+ bool release_on_halt_;
+ fixture_lock_t lock_;
+ std::vector<knxdmxd::Cue> cue_data_;
+ std::map<std::string, int> cue_names_;
void NextCue(const int direct);
@@ -60,9 +70,23 @@
Cuelist(const std::string name);
void AddCue(knxdmxd::Cue& cue);
- void Go();
- void Halt();
- void Direct(const int value);
+ void Go() {
+ if (cue_halted_) {
+ cue_halted_ = false;
+ NextCue(-1);
+ } else {
+ NextCue(-2);
+ }
+
+ };
+ void Halt() {
+ cue_halted_ = true;
+ if (release_on_halt_) {
+ Release();
+ }
+ };
+ void Direct(const int value) { NextCue(value); };
+ void Release() { cue_data_.at(current_cue_).Release(); };
};
}
Modified: tools/knxdmxd/src/dmxsender.cc
===================================================================
--- tools/knxdmxd/src/dmxsender.cc 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/dmxsender.cc 2012-07-10 15:37:42 UTC (rev 916)
@@ -21,6 +21,7 @@
int DMXSender::Start() {
SendDMX();
+ fixture_list_.StartRefresh();
m_client.GetSelectServer()->Run();
sender_running_ = true;
return 0;
@@ -29,6 +30,7 @@
void DMXSender::SendDMX() {
for(std::map<int, ola::DmxBuffer>::const_iterator i = output.begin(); i != output.end(); ++i) {
int universe = i->first;
+ //std::clog << "C1/2 " << (int) i->second.Get(0) << " " << (int) i->second.Get(1) << " " << (int) i->second.Get(2) << std::endl;
if (!m_client.GetClient()->SendDmx(universe, i->second)) { // send all universes
m_client.GetSelectServer()->Terminate();
std::clog << kLogWarning << "OLA: failed to send universe "<< universe << std::endl;
Modified: tools/knxdmxd/src/dmxsender.h
===================================================================
--- tools/knxdmxd/src/dmxsender.h 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/dmxsender.h 2012-07-10 15:37:42 UTC (rev 916)
@@ -36,9 +36,8 @@
void AddFixture(pFixture fixture) { fixture_list_.Add(fixture); };
pFixture GetFixture(const std::string& name) { return fixture_list_.Get(name); };
- static ola::OlaCallbackClientWrapper& GetOLAClient() { return m_client; };
- void Process(const Trigger& trigger) { fixture_list_.Process(trigger); };
+// void Process(const Trigger& trigger) { fixture_list_.Process(trigger); };
};
Modified: tools/knxdmxd/src/fixture.cc
===================================================================
--- tools/knxdmxd/src/fixture.cc 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/fixture.cc 2012-07-10 15:37:42 UTC (rev 916)
@@ -35,36 +35,37 @@
unsigned ch = channel_names_[channel];
channel_data_[ch].value=val;
channel_data_[ch].fadeStep=fadeStep;
- RegisterRefresh();
+ refresh_ = true;
}
void Fixture::Refresh() {
- bool needs_refresh = false;
- for(std::vector<knxdmxd::fixture_channel_t>::iterator it=channel_data_.begin(); it!=channel_data_.end(); ++it) {
- int oldValue = GetDMXChannel(it->DMX);
- int newValue = it->value;
- if (oldValue<newValue) {
- it->floatValue += it->fadeStep;
- if (it->floatValue>newValue) {
- it->floatValue = newValue;
- } else {
- needs_refresh = true;
+ if (refresh_) {
+ bool refresh = false;
+ for(std::vector<knxdmxd::fixture_channel_t>::iterator it=channel_data_.begin(); it!=channel_data_.end(); ++it) {
+ int oldValue = GetDMXChannel(it->DMX);
+ int newValue = it->value;
+ if (oldValue<newValue) {
+ it->floatValue += it->fadeStep;
+ if (it->floatValue>newValue) {
+ it->floatValue = newValue;
+ } else {
+ refresh = true;
+ }
+ SetDMXChannel(it->DMX, (int) it->floatValue);
}
- SetDMXChannel(it->DMX, (int) it->floatValue);
- }
- if (oldValue>newValue) {
- it->floatValue -= it->fadeStep;
- if (it->floatValue<newValue) {
- it->floatValue = newValue;
- } else {
- needs_refresh = true;
+ if (oldValue>newValue) {
+ it->floatValue -= it->fadeStep;
+ if (it->floatValue<newValue) {
+ it->floatValue = newValue;
+ } else {
+ refresh = true;
+ }
+ SetDMXChannel(it->DMX, (int) it->floatValue);
}
- SetDMXChannel(it->DMX, (int) it->floatValue);
}
+ refresh_ = refresh;
}
- if (needs_refresh) { // we need another refresh
- RegisterRefresh();
- }
+ RegisterRefresh();
}
bool Fixture::RegisterRefresh() {
@@ -78,17 +79,20 @@
}
void Fixture::Process(const Trigger& trigger) {
+ std::clog << "fprocess" << std::endl;
for (std::vector<knxdmxd::fixture_channel_t>::iterator it=channel_data_.begin(); it!=channel_data_.end(); ++it) {
if (it->KNX == trigger.GetKNX()) {
it->value = trigger.GetValue();
it->fadeStep = _fadeStep;
+ refresh_ = true;
+ std::clog << "Updated " << it->DMX << " to " << it->value << "rate: " << it->fadeStep << std::endl;
}
}
if (fadeTimeKNX_ == trigger.GetKNX()) {
SetFadeTime(trigger.GetValue());
}
}
-
+
void DMX::SetDMXChannel(int channel, int value) {
int dmxuniverse = (int) (channel / 512), dmxchannel = channel % 512;
output[dmxuniverse].SetChannel(dmxchannel, value);
@@ -98,8 +102,7 @@
int dmxuniverse = (int) (channel / 512), dmxchannel = channel % 512;
return output[dmxuniverse].Get(dmxchannel);
}
-
-
+
int DMX::Address(const std::string addr) {
int universe, channel;
sscanf( (char*)addr.c_str(), "%d.%d", &universe, &channel);
@@ -110,13 +113,11 @@
return (universe << 9) + channel;
}
-
- void FixtureList::Process(const Trigger& trigger) {
+ void FixtureList::StartRefresh() {
for(std::map<std::string, knxdmxd::pFixture>::iterator it=fixture_list_.begin(); it!=fixture_list_.end(); ++it) {
- it->second->Process(trigger);
+ it->second->RegisterRefresh();
}
}
-
// initalize static variables of DMX class
ola::OlaCallbackClientWrapper DMX::m_client;
std::map<int, ola::DmxBuffer> DMX::output;
Modified: tools/knxdmxd/src/fixture.h
===================================================================
--- tools/knxdmxd/src/fixture.h 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/fixture.h 2012-07-10 15:37:42 UTC (rev 916)
@@ -27,6 +27,7 @@
int GetDMXChannel(int channel);
static int Address(const std::string s);
+ static ola::OlaCallbackClientWrapper& GetOLAClient() { return m_client; };
};
@@ -35,7 +36,12 @@
float fadeStep, floatValue;
} fixture_channel_t;
- class Fixture : private DMX {
+ typedef struct {
+ std::string locker;
+ int prio;
+ } fixture_lock_t;
+
+ class Fixture : private DMX, public TriggerHandler {
std::string name_;
std::vector<fixture_channel_t> channel_data_;
std::map<std::string, unsigned> channel_names_;
@@ -43,6 +49,9 @@
float _fadeTime; // is set by knx or config
float _fadeStep; // calculated from _fadeTime
int fadeTimeKNX_;
+ fixture_lock_t lock_;
+
+ bool refresh_;
public:
Fixture() {};
@@ -53,16 +62,36 @@
void PatchFadeTime(const int KNX) { fadeTimeKNX_ = KNX; };
void Update(const std::string& channel, const int val, const float fadeStep);
void Process(const Trigger& trigger);
+
+ void Wait();
void Refresh();
bool RegisterRefresh();
int GetCurrentValue(const std::string& channel);
std::string& GetName() { return name_; };
- void Lock(const std::string& cuelist, int lockpriority);
- int isLocked();
- void Release();
-
+ // locking
+ bool Lock(const fixture_lock_t& lock) {
+ if ((lock_.locker == lock.locker) || (lock_.locker == "") || (lock_.prio<=lock.prio)) {
+ std::clog << "Locking " << lock.locker << " @ " << lock.prio << std::endl;
+ lock_ = lock;
+ return true;
+ } else {
+ std::clog << "Refused " << lock.locker << " @ " << lock.prio << std::endl;
+ return false;
+ }
+ };
+ bool Release(const fixture_lock_t& lock) {
+ if (lock_.locker == lock.locker) {
+ lock_.locker = "";
+ lock_.prio=0;
+ return true;
+ } else {
+ return false;
+ }
+ };
+ fixture_lock_t GetLock() { return lock_; };
+
};
typedef Fixture* pFixture;
@@ -74,7 +103,8 @@
FixtureList() {};
void Add(pFixture fixture) { fixture_list_.insert(std::pair<std::string, knxdmxd::pFixture> (fixture->GetName(), fixture)); };
- void Process(const Trigger& trigger);
+ void StartRefresh();
+// void Process(const Trigger& trigger);
pFixture Get(const std::string& name) { return fixture_list_[name]; };
};
Modified: tools/knxdmxd/src/knxdmxd.cc
===================================================================
--- tools/knxdmxd/src/knxdmxd.cc 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/knxdmxd.cc 2012-07-10 15:37:42 UTC (rev 916)
@@ -57,17 +57,15 @@
#define BUFLEN 1024
#define POLLING_INTERVAL 10
-
template<class T>
std::string t_to_string(T i) {
- std::stringstream ss;
- ss << i;
- return ss.str();
+ std::stringstream ss;
+ ss << i;
+ return ss.str();
}
void daemonShutdown();
-std::string eibd_url = "local:/tmp/eib";
std::string conf_file = "knxdmxd.conf";
int pidFilehandle;
std::string pidfilename = "/var/run/knxdmxd.pid";
@@ -76,165 +74,139 @@
namespace knxdmxd {
- eibaddr_t KNXHandler::Address(const std::string addr) {
- int a, b, c;
- char *s = (char *)addr.c_str();
-
- if (sscanf (s, "%d/%d/%d", &a, &b, &c) == 3)
- return ((a & 0x01f) << 11) | ((b & 0x07) << 8) | ((c & 0xff));
- if (sscanf (s, "%d/%d", &a, &b) == 2)
- return ((a & 0x01f) << 11) | ((b & 0x7FF));
- if (sscanf (s, "%x", &a) == 1)
- return a & 0xffff;
- std::clog << kLogWarning << "invalid group address format " << addr << std::endl;
- return 0;
- }
+ eibaddr_t KNXHandler::Address(const std::string addr) {
+ int a, b, c;
+ char *s = (char *) addr.c_str();
- void KNXHandler::knxhandler() {
- std::clog << "KNX thread started" << std::endl;
- int len;
- EIBConnection *con;
- eibaddr_t dest;
- eibaddr_t src;
- unsigned char buf[255], val;
-
- while (1) { //retry infinite
- con = EIBSocketURL ((char *)eibd_url.c_str());
- if (!con) {
- std::clog << kLogWarning << "eibd: Open failed" << std::endl;
- sleep(RETRY_TIME);
- continue;
- }
+ if (sscanf(s, "%d/%d/%d", &a, &b, &c) == 3)
+ return ((a & 0x01f) << 11) | ((b & 0x07) << 8) | ((c & 0xff));
+ if (sscanf(s, "%d/%d", &a, &b) == 2)
+ return ((a & 0x01f) << 11) | ((b & 0x7FF));
+ if (sscanf(s, "%x", &a) == 1) return a & 0xffff;
+ std::clog << kLogWarning << "invalid group address format " << addr
+ << std::endl;
+ return 0;
+ }
- if (EIBOpen_GroupSocket (con, 0) == -1) {
- std::clog << kLogWarning << "eibd: Connect failed" << std::endl;
- sleep(RETRY_TIME);
- continue;
- }
+ void KNXHandler::knxhandler() {
+ std::clog << "KNX thread started" << std::endl;
+ int len;
+ EIBConnection *con;
+ eibaddr_t dest;
+ eibaddr_t src;
+ unsigned char buf[255], val;
- while (1) {
- len = EIBGetGroup_Src (con, sizeof (buf), buf, &src, &dest);
- if (len == -1) {
- std::clog << kLogWarning << "eibd: Read failed" << std::endl;
- sleep(RETRY_TIME);
- break;
- }
-
- if (len < 2) {
- std::clog << kLogWarning << "eibd: Invalid Packet" << std::endl;
- break;
- }
-
- if (buf[0] & 0x3 || (buf[1] & 0xC0) == 0xC0) {
- std::clog << kLogWarning << "eibd: Unknown APDU from "<< src << " to " << dest << std::endl;
- break;
- } else {
- switch (buf[1] & 0xC0) {
- case 0x00:
- // sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
- break;
- case 0x40:
- //FIXME: response dunno
- break;
- case 0x80:
- if (buf[1] & 0xC0) {
- val = (len==2) ? buf[1] & 0x3F : buf[2];
- knxdmxd::Trigger trigger(knxdmxd::kTriggerAll, dest, val);
- sender.Process(trigger);
- triggerList.Process(trigger);
- }
- break;
- }
- }
- }
-
- std::clog << kLogWarning << "eibd: Closed connection" << std::endl; //break in read-loop
- EIBClose (con);
- }
-
- }
+ while (1) { //retry infinite
+ con = EIBSocketURL((char *) eibd_url_.c_str());
+ if (!con) {
+ std::clog << kLogWarning << "eibd: Open failed" << std::endl;
+ sleep(RETRY_TIME);
+ continue;
+ }
- void *KNXHandler::Run() {
- ola::thread::MutexLocker locker(&m_mutex);
- knxhandler();
- return NULL;
- }
+ if (EIBOpen_GroupSocket(con, 0) == -1) {
+ std::clog << kLogWarning << "eibd: Connect failed" << std::endl;
+ sleep(RETRY_TIME);
+ continue;
+ }
-class OLAThread : public ola::thread::Thread {
- public:
- OLAThread()
- : Thread(),
- m_mutex() {
+ while (1) {
+ len = EIBGetGroup_Src(con, sizeof(buf), buf, &src, &dest);
+ if (len == -1) {
+ std::clog << kLogWarning << "eibd: Read failed" << std::endl;
+ sleep(RETRY_TIME);
+ break;
+ }
+
+ if (len < 2) {
+ std::clog << kLogWarning << "eibd: Invalid Packet" << std::endl;
+ break;
+ }
+
+ if ((buf[0] & 0x3) || (buf[1] & 0xC0) == 0xC0) {
+ std::clog << kLogWarning << "eibd: Unknown APDU from " << src
+ << " to " << dest << std::endl;
+ break;
+ } else {
+ switch (buf[1] & 0xC0) {
+ case 0x00:
+ // sendKNXresponse (dest,zone+(controller*ZONES_PER_CONTROLLER),func);
+ break;
+ case 0x40:
+ //FIXME: response dunno
+ break;
+ case 0x80:
+ if (buf[1] & 0xC0) {
+ val = (len == 2) ? buf[1] & 0x3F : buf[2];
+ knxdmxd::Trigger trigger(knxdmxd::kTriggerAll, dest, val);
+ triggerList.Process(trigger);
+ }
+ break;
+ }
+ }
+ }
+
+ std::clog << kLogWarning << "eibd: Closed connection" << std::endl; //break in read-loop
+ EIBClose(con);
}
- ~OLAThread() {}
- void olahandler() { // thread for OLA connection
- std::clog << kLogDebug << "OLA thread started" << std::endl;
+ }
- ola::InitLogging(ola::OLA_LOG_WARN, ola::OLA_LOG_STDERR);
+ void OLAThread::olahandler() { // thread for OLA connection
+ std::clog << kLogDebug << "OLA thread started" << std::endl;
- while (1) { // retry forever
- if (!sender.Init()) {
- std::clog << kLogWarning << "OLA: Client setup failed" << std::endl;
- sleep(RETRY_TIME);
- continue;
- }
-
- sender.Start(); // Start the sender
+ ola::InitLogging(ola::OLA_LOG_WARN, ola::OLA_LOG_STDERR);
- while (1) { // loop forever, should be used for monitoring the client
- if (!sender.Running())
- break;
- usleep(20000);
- }
+ while (1) { // retry forever
+ if (!sender.Init()) {
+ std::clog << kLogWarning << "OLA: Client setup failed" << std::endl;
+ sleep(RETRY_TIME);
+ continue;
}
- }
- void *Run() {
- ola::thread::MutexLocker locker(&m_mutex);
- olahandler();
- return NULL;
+ sender.Start(); // Start the sender
+
+ while (1) { // loop forever, should be used for monitoring the client
+ if (!sender.Running()) break;
+ usleep(20000);
+ }
}
-
- private:
- ola::thread::Mutex m_mutex;
-};
-
-
+ }
}
void daemonShutdown() {
- //FIXME: clean exit pthread_exit(NULL); pthread_cancel(..);
- std::clog << kLogInfo << DAEMON_NAME << " daemon exiting" << std::endl;
- fprintf(stderr, "%s daemon exiting", DAEMON_NAME);
- sender.Terminate();
- close(pidFilehandle);
- unlink((char *)pidfilename.c_str());
- exit(EXIT_SUCCESS);
+ //FIXME: clean exit pthread_exit(NULL); pthread_cancel(..);
+ std::clog << kLogInfo << DAEMON_NAME << " daemon exiting" << std::endl;
+ fprintf(stderr, "%s daemon exiting", DAEMON_NAME);
+ sender.Terminate();
+ close(pidFilehandle);
+ unlink((char *) pidfilename.c_str());
+ exit(EXIT_SUCCESS);
}
void signal_handler(int sig) {
- switch(sig) {
- case SIGHUP:
- std::clog << kLogWarning << "Received SIGHUP signal." << std::endl;
- break;
- case SIGTERM:
- std::clog << kLogWarning << "Received SIGTERM signal." << std::endl;
- daemonShutdown();
- break;
- case SIGINT:
- std::clog << kLogWarning << "Received SIGINT signal." << std::endl;
- daemonShutdown();
- break;
- default:
- std::clog << kLogWarning << "Unhandled signal (" << sig << ") " << strsignal(sig) << std::endl;
- break;
- }
+ switch (sig) {
+ case SIGHUP:
+ std::clog << kLogWarning << "Received SIGHUP signal." << std::endl;
+ break;
+ case SIGTERM:
+ std::clog << kLogWarning << "Received SIGTERM signal." << std::endl;
+ daemonShutdown();
+ break;
+ case SIGINT:
+ std::clog << kLogWarning << "Received SIGINT signal." << std::endl;
+ daemonShutdown();
+ break;
+ default:
+ std::clog << kLogWarning << "Unhandled signal (" << sig << ") "
+ << strsignal(sig) << std::endl;
+ break;
+ }
}
+knxdmxd::Trigger *json_get_trigger(struct json_object *trigger,
+ const int type) {
-knxdmxd::Trigger *json_get_trigger(struct json_object *trigger, const int type) {
-
if (!trigger) {
return NULL;
}
@@ -252,72 +224,79 @@
return new knxdmxd::Trigger(type, knx, val);
}
-knxdmxd::Cue *json_get_cue(struct json_object *cue, const int cuenum, const int type) {
+knxdmxd::Cue *json_get_cue(struct json_object *cue, const int cuenum,
+ const int type) {
// check link first
- struct json_object *link = json_object_object_get(cue, "link");
+ struct json_object *link = json_object_object_get(cue, "link");
if (link) { // is link
- knxdmxd::Cue *new_cue = new knxdmxd::Cue(json_object_get_string(link), true);
+ knxdmxd::Cue *new_cue = new knxdmxd::Cue(json_object_get_string(link),
+ true);
return new_cue;
}
struct json_object *name = json_object_object_get(cue, "name");
- std::string c_name = (name) ? json_object_get_string(name) : "_c_"+t_to_string(cuenum);
+ std::string c_name =
+ (name) ? json_object_get_string(name) : "_c_" + t_to_string(cuenum);
knxdmxd::Cue *new_cue = new knxdmxd::Cue(c_name);
-
+
// get channels
struct json_object *channels = json_object_object_get(cue, "channels");
if (!channels) {
- std::clog << kLogInfo << "Skipping cue '" << c_name << "' (no channels defined)" << std::endl;
+ std::clog << kLogInfo << "Skipping cue '" << c_name
+ << "' (no channels defined)" << std::endl;
delete new_cue;
return new_cue;
}
-
- for (int j=0; j<json_object_array_length(channels); j++) { // read all
+
+ for (int j = 0; j < json_object_array_length(channels); j++) { // read all
// get channel
struct json_object *channel = json_object_array_get_idx(channels, j);
- struct json_object *fixt = json_object_object_get(channel, "fixture");
- struct json_object *chan = json_object_object_get(channel, "channel");
- struct json_object *value = json_object_object_get(channel, "value");
+ struct json_object *fixt = json_object_object_get(channel, "fixture");
+ struct json_object *chan = json_object_object_get(channel, "channel");
+ struct json_object *value = json_object_object_get(channel, "value");
if ((!fixt) || (!chan) || (!value)) {
- std::clog << kLogInfo << "Skipping errorneous channel def " << j << " in cue '" << c_name << "'" << std::endl;
+ std::clog << kLogInfo << "Skipping errorneous channel def " << j
+ << " in cue '" << c_name << "'" << std::endl;
continue;
- }
-
+ }
+
knxdmxd::cue_channel_t channeldata;
channeldata.fixture = sender.GetFixture(json_object_get_string(fixt));
channeldata.name = json_object_get_string(chan);
channeldata.value = json_object_get_int(value);
-
+
// add
new_cue->AddChannel(channeldata);
}
// fading
-
+
struct json_object *fading = json_object_object_get(cue, "fading");
if (fading) {
- struct json_object *fading_time = json_object_object_get(fading, "time");
+ struct json_object *fading_time = json_object_object_get(fading, "time");
if (!fading_time) {
- struct json_object *fading_time_in = json_object_object_get(fading, "in");
- struct json_object *fading_time_out = json_object_object_get(fading, "out");
-
+ struct json_object *fading_time_in = json_object_object_get(fading, "in");
+ struct json_object *fading_time_out = json_object_object_get(fading,
+ "out");
+
if ((!fading_time_in) || (!fading_time_out)) {
- std::clog << kLogInfo << "Skipping errorneous fading def in cue '" << c_name << "'" << std::endl;
+ std::clog << kLogInfo << "Skipping errorneous fading def in cue '"
+ << c_name << "'" << std::endl;
} else {
- new_cue->SetFading(json_object_get_double(fading_time_in),
- json_object_get_double(fading_time_out));
+ new_cue->SetFading(json_object_get_double(fading_time_in),
+ json_object_get_double(fading_time_out));
}
} else {
- new_cue->SetFading(json_object_get_double(fading_time),
- json_object_get_double(fading_time));
+ new_cue->SetFading(json_object_get_double(fading_time),
+ json_object_get_double(fading_time));
}
- }
+ }
// waittime
-
+
struct json_object *waittime = json_object_object_get(cue, "waittime");
if (waittime) {
new_cue->SetWaittime(json_object_get_double(waittime));
@@ -328,21 +307,22 @@
new_cue->SetDelay(json_object_get_double(delay));
}
- if (type==knxdmxd::kScene) {
+ if (type == knxdmxd::kScene) {
struct json_object *triggers = json_object_object_get(cue, "trigger");
if (!triggers) {
- std::clog << kLogInfo << "Skipping cue '" << c_name << "' (trigger required in scene definition)" << std::endl;
+ std::clog << kLogInfo << "Skipping cue '" << c_name
+ << "' (trigger required in scene definition)" << std::endl;
delete new_cue;
return new_cue;
}
-
+
struct json_object *go = json_object_object_get(triggers, "go");
knxdmxd::Trigger *go_trigger = json_get_trigger(go, knxdmxd::kTriggerGo);
if (go_trigger) {
triggerList.Add(*go_trigger, new_cue);
}
- }
-
+ }
+
return new_cue;
}
@@ -350,59 +330,70 @@
struct json_object *config;
- config = json_object_from_file((char *)conf_file.c_str());
-
+ config = json_object_from_file((char *) conf_file.c_str());
+
/*
* fixtures
- */
-
+ */
+
struct json_object *fixtures = json_object_object_get(config, "fixtures");
int fixturenum = json_object_array_length(fixtures);
std::clog << "Trying to import " << fixturenum << " fixture(s)" << std::endl;
- for (int i=0; i<fixturenum; i++) { // read all
+ for (int i = 0; i < fixturenum; i++) { // read all
// get fixture
struct json_object *fixture = json_object_array_get_idx(fixtures, i);
// get name & create
struct json_object *name = json_object_object_get(fixture, "name");
- std::string fname = (name) ? json_object_get_string(name) : "_f_"+t_to_string(i);
+ std::string fname =
+ (name) ? json_object_get_string(name) : "_f_" + t_to_string(i);
knxdmxd::Fixture* f = new knxdmxd::Fixture(fname);
-
+
// get channels & patch them
struct json_object *channels = json_object_object_get(fixture, "channels");
if (!channels) {
- std::clog << kLogInfo << "Skipping fixture '" << fname << "' (no channels defined)" << std::endl;
+ std::clog << kLogInfo << "Skipping fixture '" << fname
+ << "' (no channels defined)" << std::endl;
continue;
}
-
- for (int j=0; j<json_object_array_length(channels); j++) { // read all
+
+ for (int j = 0; j < json_object_array_length(channels); j++) { // read all
// get channel
struct json_object *channel = json_object_array_get_idx(channels, j);
-
+
// channel name, default is _c_<num>
- struct json_object *name = json_object_object_get(channel, "name");
- std::string cname = (name) ? json_object_get_string(name) : "_c_"+t_to_string(j);
+ struct json_object *name = json_object_object_get(channel, "name");
+ std::string cname =
+ (name) ? json_object_get_string(name) : "_c_" + t_to_string(j);
// dmx is required
struct json_object *dmx = json_object_object_get(channel, "dmx");
if (!dmx) {
- std::clog << kLogInfo << "Skipping channel '" << cname << "' in fixture '" << fname << "' (missing dmx)" << std::endl;
+ std::clog << kLogInfo << "Skipping channel '" << cname
+ << "' in fixture '" << fname << "' (missing dmx)" << std::endl;
continue;
}
std::string cdmx(json_object_get_string(dmx));
-
+
// knx is optional
struct json_object *knx = json_object_object_get(channel, "knx"); // knx is optional
- std::string cknx = (knx) ? json_object_get_string(knx) : "";
-
- // patch
- f->AddChannel(cname, cdmx, cknx);
+ if (knx) { // if we have knx, add to triggerlist
+ f->AddChannel(cname, cdmx, json_object_get_string(knx));
+ knxdmxd::Trigger* trigger = new knxdmxd::Trigger(
+ knxdmxd::kTriggerProcess,
+ knxdmxd::KNXHandler::Address(json_object_get_string(knx)), -1);
+ triggerList.Add(*trigger, f);
+ } else {
+ f->AddChannel(cname, cdmx, "");
+ }
}
-
+
// get fading
struct json_object *fading = json_object_object_get(fixture, "fading");
- float ftime = (fading) ? json_object_get_double(json_object_object_get(fading, "time")) : 0;
+ float ftime =
+ (fading) ?
+ json_object_get_double(json_object_object_get(fading, "time")) : 0;
f->SetFadeTime(ftime);
sender.AddFixture(f);
@@ -410,176 +401,194 @@
/*
* scenes
- */
-
+ */
+
struct json_object *scenes = json_object_object_get(config, "scenes");
int scenenum = json_object_array_length(scenes);
std::clog << "Trying to import " << scenenum << " scene(s)" << std::endl;
-
- for (int i=0; i<scenenum; i++) { // read all
+
+ for (int i = 0; i < scenenum; i++) { // read all
struct json_object *scene = json_object_array_get_idx(scenes, i);
// get name & create
struct json_object *name = json_object_object_get(scene, "name");
- std::string sname = (name) ? json_object_get_string(name) : "_s_"+t_to_string(i);
-
+ std::string sname =
+ (name) ? json_object_get_string(name) : "_s_" + t_to_string(i);
+
knxdmxd::Cue *s = json_get_cue(scene, i, knxdmxd::kScene);
}
-
- /*
+
+ /*
* cuelists
- */
-
+ */
+
struct json_object *cuelists = json_object_object_get(config, "cuelists");
int cuelistnum = json_object_array_length(cuelists);
std::clog << "Trying to import " << cuelistnum << " cuelist(s)" << std::endl;
-
- for (int i=0; i<cuelistnum; i++) { // read all
+
+ for (int i = 0; i < cuelistnum; i++) { // read all
struct json_object *cuelist = json_object_array_get_idx(cuelists, i);
// get name & create
struct json_object *name = json_object_object_get(cuelist, "name");
- std::string cname = (name) ? json_object_get_string(name) : "_c_"+t_to_string(i);
+ std::string cname =
+ (name) ? json_object_get_string(name) : "_c_" + t_to_string(i);
knxdmxd::Cuelist *c = new knxdmxd::Cuelist(cname);
+ struct json_object *lprio = json_object_object_get(cuelist, "priority");
+ int prio = (lprio) ? json_object_get_int(lprio) : 0;
+
// get cues
struct json_object *cues = json_object_object_get(cuelist, "cues");
- for (int i=0; i<json_object_array_length(cues); i++) { // read all
- struct json_object *cue = json_object_array_get_idx(cues, i);
- c->AddCue(*json_get_cue(cue, i, knxdmxd::kCue));
+ for (int i = 0; i < json_object_array_length(cues); i++) { // read all
+ knxdmxd::Cue* cue = json_get_cue(json_object_array_get_idx(cues, i), i,
+ knxdmxd::kCue);
+
+ knxdmxd::fixture_lock_t lock = { cname, prio };
+ cue->SetLock(lock);
+ c->AddCue(*cue);
}
-
+
// trigger is required
struct json_object *triggers = json_object_object_get(cuelist, "trigger");
if (!triggers) {
- std::clog << kLogInfo << "Skipping cuelist '" << name << "' (trigger required in cuelist definition)" << std::endl;
+ std::clog << kLogInfo << "Skipping cuelist '" << name
+ << "' (trigger required in cuelist definition)" << std::endl;
continue;
}
knxdmxd::Trigger *trigger;
- trigger = json_get_trigger(json_object_object_get(triggers, "go"), knxdmxd::kTriggerGo);
+ trigger = json_get_trigger(json_object_object_get(triggers, "go"),
+ knxdmxd::kTriggerGo);
if (trigger) {
triggerList.Add(*trigger, c);
}
- trigger = json_get_trigger(json_object_object_get(triggers, "halt"), knxdmxd::kTriggerHalt);
+ trigger = json_get_trigger(json_object_object_get(triggers, "halt"),
+ knxdmxd::kTriggerHalt);
if (trigger) {
triggerList.Add(*trigger, c);
}
- trigger = json_get_trigger(json_object_object_get(triggers, "direct"), knxdmxd::kTriggerDirect);
+ trigger = json_get_trigger(json_object_object_get(triggers, "direct"),
+ knxdmxd::kTriggerDirect);
if (trigger) {
triggerList.Add(*trigger, c);
}
}
-
+
return;
}
-
int main(int argc, char **argv) {
- int daemonize = 0;
- int c;
- char pidstr[255];
-
- while ((c = getopt (argc, argv, "dp:u:c:")) != -1)
- switch (c) {
- case 'd':
- daemonize = 1;
- break;
- case 'p':
- pidfilename.assign(optarg);
- break;
- case 'u':
- eibd_url.assign(optarg);
- break;
- case 'c':
- conf_file.assign(optarg);
- break;
- case '?':
- //FIXME: check arguments better, print_usage
- fprintf (stderr, "Unknown option `-%c'.\nUsage: %s %s", optopt, argv[0], USAGESTRING);
- return 1;
- default:
- abort ();
- }
+ int daemonize = 0;
+ int c;
+ char pidstr[255];
- //FIXME: clean shutdown in sub-thread with signals?
- signal(SIGHUP, signal_handler);
- signal(SIGTERM, signal_handler);
- signal(SIGINT, signal_handler);
- signal(SIGQUIT, signal_handler);
+ knxdmxd::KNXHandler knx;
+ knxdmxd::OLAThread ola;
- if (!daemonize) {
- setlogmask(LOG_UPTO(LOG_DEBUG));
- std::clog.rdbuf(new Log(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER));
- std::clog << "startup with debug; pidfile: " << pidfilename << ", eibd: " << eibd_url << std::endl;
- } else {
- setlogmask(LOG_UPTO(LOG_DEBUG));
- std::clog.rdbuf(new Log(DAEMON_NAME, LOG_CONS, LOG_USER));
- }
+ while ((c = getopt(argc, argv, "dp:u:c:")) != -1)
+ switch (c) {
+ case 'd':
+ daemonize = 1;
+ break;
+ case 'p':
+ pidfilename.assign(optarg);
+ break;
+ case 'u':
+ knx.SetEIBDURL(optarg);
+ break;
+ case 'c':
+ conf_file.assign(optarg);
+ break;
+ case '?':
+ //FIXME: check arguments better, print_usage
+ fprintf(stderr, "Unknown option `-%c'.\nUsage: %s %s", optopt, argv[0],
+ USAGESTRING);
+ return 1;
+ default:
+ abort();
+ }
- std::clog << kLogInfo << "using config-file " << conf_file << std::endl;
-
- pid_t pid, sid;
-
- if (daemonize) {
- std::clog << kLogInfo << "starting daemon" << std::endl;
-
- pid = fork();
- if (pid < 0) {
- exit(EXIT_FAILURE);
- }
- if (pid > 0) {
- exit(EXIT_SUCCESS);
- }
- umask(0);
- sid = setsid();
- if (sid < 0) {
- exit(EXIT_FAILURE);
- }
- if ((chdir("/")) < 0) {
- exit(EXIT_FAILURE);
- }
- close(STDIN_FILENO);
- close(STDOUT_FILENO);
- close(STDERR_FILENO);
+ //FIXME: clean shutdown in sub-thread with signals?
+ signal(SIGHUP, signal_handler);
+ signal(SIGTERM, signal_handler);
+ signal(SIGINT, signal_handler);
+ signal(SIGQUIT, signal_handler);
+
+ if (!daemonize) {
+ setlogmask(LOG_UPTO(LOG_DEBUG));
+ std::clog.rdbuf(
+ new Log(DAEMON_NAME, LOG_CONS | LOG_NDELAY | LOG_PERROR | LOG_PID,
+ LOG_USER));
+ std::clog << "startup with debug; pidfile: " << pidfilename << ", eibd: "
+ << knx.GetEIBDURL() << std::endl;
+ } else {
+ setlogmask(LOG_UPTO(LOG_DEBUG));
+ std::clog.rdbuf(new Log(DAEMON_NAME, LOG_CONS, LOG_USER));
+ }
+ std::clog << kLogDebug << DAEMON_NAME << " compiled on " << __DATE__ << " " << __TIME__ << " with GCC " << __VERSION__ << std::endl;
+ std::clog << kLogInfo << "using config-file " << conf_file << std::endl;
+
+ pid_t pid, sid;
+
+ if (daemonize) {
+ std::clog << kLogInfo << "starting daemon" << std::endl;
+
+ pid = fork();
+ if (pid < 0) {
+ exit(EXIT_FAILURE);
}
+ if (pid > 0) {
+ exit(EXIT_SUCCESS);
+ }
+ umask(0);
+ sid = setsid();
+ if (sid < 0) {
+ exit(EXIT_FAILURE);
+ }
+ if ((chdir("/")) < 0) {
+ exit(EXIT_FAILURE);
+ }
+ close(STDIN_FILENO);
+ close(STDOUT_FILENO);
+ close(STDERR_FILENO);
+ }
- //FIXME: output errors to stderr, change order
- pidFilehandle = open((char *)pidfilename.c_str(), O_RDWR|O_CREAT, 0600);
- if (pidFilehandle == -1 )
- {
+ //FIXME: output errors to stderr, change order
+ pidFilehandle = open((char *) pidfilename.c_str(), O_RDWR | O_CREAT, 0600);
+ if (pidFilehandle == -1) {
- std::clog << kLogInfo << "Could not open pidfile " << pidfilename << ", exiting" << std::endl;
- fprintf(stderr, "Could not open pidfile %s, exiting", (char *)pidfilename.c_str());
- exit(EXIT_FAILURE);
- }
- if (lockf(pidFilehandle,F_TLOCK,0) == -1)
- {
- std::clog << kLogInfo << "Could not lock pidfile " << pidfilename << ", exiting" << std::endl;
- fprintf(stderr, "Could not lock pidfile %s, exiting", (char *)pidfilename.c_str());
- exit(EXIT_FAILURE);
- }
- sprintf(pidstr,"%d\n",getpid());
- c = write(pidFilehandle, pidstr, strlen(pidstr));
+ std::clog << kLogInfo << "Could not open pidfile " << pidfilename
+ << ", exiting" << std::endl;
+ fprintf(stderr, "Could not open pidfile %s, exiting",
+ (char *) pidfilename.c_str());
+ exit(EXIT_FAILURE);
+ }
+ if (lockf(pidFilehandle, F_TLOCK, 0) == -1) {
+ std::clog << kLogInfo << "Could not lock pidfile " << pidfilename
+ << ", exiting" << std::endl;
+ fprintf(stderr, "Could not lock pidfile %s, exiting",
+ (char *) pidfilename.c_str());
+ exit(EXIT_FAILURE);
+ }
+ sprintf(pidstr, "%d\n", getpid());
+ c = write(pidFilehandle, pidstr, strlen(pidstr));
- load_config();
+ load_config();
- knxdmxd::KNXHandler knx;
- knxdmxd::OLAThread ola;
+ knx.Start();
+ ola.Start();
- knx.Start();
- ola.Start();
-
- while (1) {
+ while (1) {
// std::clog << DAEMON_NAME << " daemon running" << std::endl;
- sleep(POLLING_INTERVAL*1000);
- }
- std::clog << kLogInfo << DAEMON_NAME << " daemon exiting" << std::endl;
- // TODO: Free any allocated resources before exiting - we never get here though -> signal handler
- exit(EXIT_SUCCESS);
+ sleep(POLLING_INTERVAL * 1000);
+ }
+ std::clog << kLogInfo << DAEMON_NAME << " daemon exiting" << std::endl;
+ // TODO: Free any allocated resources before exiting - we never get here though -> signal handler
+ exit(EXIT_SUCCESS);
}
Modified: tools/knxdmxd/src/knxdmxd.h
===================================================================
--- tools/knxdmxd/src/knxdmxd.h 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/knxdmxd.h 2012-07-10 15:37:42 UTC (rev 916)
@@ -4,7 +4,7 @@
* (c) by JNK 2012
*
*
-*/
+ */
#ifndef KNXDMXD_H
#define KNXDMXD_H
@@ -18,31 +18,65 @@
#include <ola/DmxBuffer.h>
#include <ola/thread/Thread.h>
-#define DMX_INTERVAL 25 // in ms
-
+#define DMX_INTERVAL 50 // in ms
namespace knxdmxd {
const int kFixture = 1;
const int kScene = 2;
const int kCue = 4;
const int kCuelist = 8;
-
+
class DMXSender;
-
- class KNXHandler : public ola::thread::Thread {
+
+ class KNXHandler: public ola::thread::Thread {
public:
- KNXHandler() : Thread(), m_mutex() { }
- ~KNXHandler() {}
+ KNXHandler() :
+ Thread(), m_mutex() {
+ eibd_url_= "local:/tmp/eib";
+ }
+ ~KNXHandler() {
+ }
static eibaddr_t Address(const std::string addr);
void knxhandler();
- void *Run();
+ void SetEIBDURL(std::string EIBD_URL) {
+ eibd_url_ = EIBD_URL;
+ }
+ const std::string& GetEIBDURL() {
+ return eibd_url_;
+ }
+ void *Run() {
+ ola::thread::MutexLocker locker(&m_mutex);
+ knxhandler();
+ return NULL;
+ }
+
private:
ola::thread::Mutex m_mutex;
+ std::string eibd_url_;
};
-
+
+ class OLAThread: public ola::thread::Thread {
+ public:
+ OLAThread() :
+ Thread(), m_mutex() {
+ }
+ ~OLAThread() {
+ }
+
+ void olahandler();
+
+ void *Run() {
+ ola::thread::MutexLocker locker(&m_mutex);
+ olahandler();
+ return NULL;
+ }
+
+ private:
+ ola::thread::Mutex m_mutex;
+ };
+
}
#endif
-
Modified: tools/knxdmxd/src/trigger.cc
===================================================================
--- tools/knxdmxd/src/trigger.cc 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/trigger.cc 2012-07-10 15:37:42 UTC (rev 916)
@@ -51,6 +51,9 @@
case kTriggerDirect:
_handlers[i]->Direct(trigger.GetValue());
break;
+ case kTriggerProcess:
+ _handlers[i]->Process(trigger);
+ break;
default: ;
}
}
Modified: tools/knxdmxd/src/trigger.h
===================================================================
--- tools/knxdmxd/src/trigger.h 2012-07-09 06:26:16 UTC (rev 915)
+++ tools/knxdmxd/src/trigger.h 2012-07-10 15:37:42 UTC (rev 916)
@@ -15,9 +15,13 @@
namespace knxdmxd {
const int kTriggerAll = 0;
+
const int kTriggerGo = 1;
const int kTriggerHalt = 2;
const int kTriggerDirect = 4;
+ const int kTriggerRelease = 8;
+
+ const int kTriggerProcess = 256;
class Trigger {
int _knx;
@@ -44,13 +48,14 @@
virtual void Halt() {};
virtual void Refresh() {};
virtual void Direct(const int val) {};
+ virtual void Release() {};
+ virtual void Process(const Trigger& trigger) {};
friend std::ostream& operator<<(std::ostream &stream, const TriggerHandler& handler);
};
typedef TriggerHandler* pTriggerHandler;
-
class TriggerList {
std::vector<Trigger> _triggers;
std::vector<pTriggerHandler> _handlers;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|