X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fcontrol.cpp;h=6c6ceb37da500e789d9a295ad68b1d0a53feb68f;hb=7839b7c3d782abb5c98a24d51cae109407068c02;hp=d371777fc5ca15d58478c001649732d038d33737;hpb=6c61179fe09af2f5366d50f10aadbf5f83438087;p=r2c2.git diff --git a/source/libmarklin/control.cpp b/source/libmarklin/control.cpp index d371777..6c6ceb3 100644 --- a/source/libmarklin/control.cpp +++ b/source/libmarklin/control.cpp @@ -1,12 +1,20 @@ +/* $Id$ + +This file is part of the MSP Märklin suite +Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + #include #include #include #include -#include +#include #include #include #include "command.h" #include "control.h" +#include "reply.h" using namespace std; using namespace Msp; @@ -15,45 +23,36 @@ namespace Marklin { Control::Control(): serial_fd(-1), - p50_enabled(false), power(true), poll_sensors(false), debug(false) { } +Control::~Control() +{ + for(map::iterator i=sensors.begin(); i!=sensors.end(); ++i) + delete i->second; + for(map::iterator i=turnouts.begin(); i!=turnouts.end(); ++i) + delete i->second; + for(map::iterator i=locomotives.begin(); i!=locomotives.end(); ++i) + delete i->second; + close(serial_fd); +} + void Control::set_power(bool p) { power=p; if(power) - command(string(1, CMD_POWER_ON)); + command(CMD_POWER_ON); else - command(string(1, CMD_POWER_OFF)); -} + command(CMD_POWER_OFF); -Turnout *Control::get_turnout(unsigned id) const -{ - TurnoutMap::const_iterator i=turnouts.find(id); - if(i!=turnouts.end()) - return i->second; - - return 0; + signal_power_event.emit(power); } -Locomotive *Control::get_locomotive(unsigned id) const +void Control::set_debug(bool d) { - for(LocomotiveSeq::const_iterator i=locomotives.begin(); i!=locomotives.end(); ++i) - if((*i)->get_address()==id) - return *i; - return 0; -} - -Sensor *Control::get_sensor(unsigned id) const -{ - SensorMap::const_iterator i=sensors.find(id); - if(i!=sensors.end()) - return i->second; - - return 0; + debug=d; } void Control::open(const string &dev) @@ -77,6 +76,7 @@ void Control::open(const string &dev) attr.c_cflag|=CSTOPB; bool ok=false; + bool p50=false; for(unsigned i=0; baud[i]; i+=2) { cfsetospeed(&attr, baud[i+1]); @@ -87,129 +87,140 @@ void Control::open(const string &dev) pollfd pfd={serial_fd, POLLIN, 0}; if(poll(&pfd, 1, 500)>0) { - cout<<"IB detected at "<get_address())==0) - turnouts.insert(TurnoutMap::value_type(t->get_address(), t)); + queue.push_back(Command(cmd, data, len)); + return queue.back(); } -void Control::add_locomotive(Locomotive *l) +void Control::add_turnout(Turnout &t) { - if(find(locomotives.begin(), locomotives.end(), l)==locomotives.end()) - locomotives.push_back(l); + turnouts[t.get_address()]=&t; } -void Control::add_sensor(Sensor *s) +Turnout &Control::get_turnout(unsigned id) const { - if(sensors.count(s->get_address())==0) - { - sensors.insert(SensorMap::value_type(s->get_address(), s)); - poll_sensors=true; - } + map::const_iterator i=turnouts.find(id); + if(i==turnouts.end()) + throw KeyError("Unknown turnout"); + + return *i->second; +} + +void Control::add_locomotive(Locomotive &l) +{ + locomotives[l.get_address()]=&l; +} + +Locomotive &Control::get_locomotive(unsigned id) const +{ + map::const_iterator i=locomotives.find(id); + if(i==locomotives.end()) + throw KeyError("Unknown locomotive"); + + return *i->second; +} + +void Control::add_sensor(Sensor &s) +{ + sensors[s.get_address()]=&s; + poll_sensors=true; +} + +Sensor &Control::get_sensor(unsigned id) const +{ + map::const_iterator i=sensors.find(id); + if(i==sensors.end()) + throw KeyError("Unknown sensor"); + + return *i->second; } void Control::tick() { const Time::TimeStamp t=Time::now(); + for(map::const_iterator i=sensors.begin(); i!=sensors.end(); ++i) + i->second->tick(); + + timer.tick(false); + if(t>next_event_query) { - next_event_query=t+300*Time::msec; - command(string(1, CMD_EVENT)).signal_done.connect(sigc::mem_fun(this, &Control::event_query_done)); + next_event_query=t+200*Time::msec; + command(CMD_EVENT).signal_done.connect(sigc::mem_fun(this, &Control::event_query_done)); } if(poll_sensors) { - unsigned max_addr=(--sensors.end())->second->get_address(); - string cmd(3, 0); - cmd[0]=CMD_SENSOR_PARAM_SET; - cmd[1]=0; - cmd[2]=(max_addr+7)/8; - command(cmd); - command(string(1, CMD_SENSOR_REPORT)); + unsigned max_addr=(--sensors.end())->first; + unsigned char data[2]; + data[0]=0; + data[1]=(max_addr+7)/8; + command(CMD_SENSOR_PARAM_SET, data, 2); + command(CMD_SENSOR_REPORT); poll_sensors=false; } - if(queue.size() && queue.front().get_sent()) + if(!queue.empty() && queue.front().get_sent()) { pollfd pfd={serial_fd, POLLIN, 0}; if(poll(&pfd, 1, 0)>0) { - string resp=read_reply((Cmd)(unsigned char)queue.front().get_command()[0]); + Reply reply=Reply::read(serial_fd, queue.front().get_command()); if(debug) - { - printf("read: "); - for(unsigned i=0; i>(7-j%8))&1; - cout<>(7-j%8))&1); cout<<'\n'; + + for(unsigned j=0; j<16; ++j) + signal_sensor_event.emit(module*16+j-15, (data[i+1+j/8]>>(7-j%8))&1); } }