#include "trafficmanager.h"
#include "train.h"
+#include <iostream>
+using namespace std;
+
namespace Marklin {
Train::Train(TrafficManager &tm, Locomotive &l):
trfc_mgr.get_control().signal_sensor_event.connect(sigc::mem_fun(this, &Train::sensor_event));
}
+void Train::set_name(const string &n)
+{
+ name=n;
+
+ signal_name_changed.emit(name);
+}
+
void Train::set_speed(unsigned speed)
{
target_speed=speed;
void Train::sensor_event(unsigned addr, bool state)
{
+ if(!loco.get_speed())
+ return;
+
if(state)
{
BlockRefSeq::iterator i;
for(i=rsv_blocks.begin(); i!=rsv_blocks.end(); ++i)
if(i->block->get_sensor_id() && i->block->get_sensor_id()!=addr)
break;
- cur_blocks.splice(cur_blocks.begin(), rsv_blocks, rsv_blocks.begin(), i);
+ cur_blocks.splice(cur_blocks.end(), rsv_blocks, rsv_blocks.begin(), i);
+
+ cout<<"Train advanced, "<<cur_blocks.size()<<" cur_blocks, "<<rsv_blocks.size()<<" rsv_blocks\n";
reserve_more();
if(rsv_blocks.empty())
}
else
{
+ cout<<"Finding blocks to free\n";
BlockRefSeq::iterator i;
for(i=cur_blocks.begin(); i!=cur_blocks.end(); ++i)
if(i->block->get_sensor_id()==addr)
break;
if(i!=cur_blocks.end())
{
+ cout<<"found\n";
++i;
for(BlockRefSeq::iterator j=cur_blocks.begin(); j!=i; ++j)
j->block->reserve(0);
cur_blocks.erase(cur_blocks.begin(), i);
+ cout<<cur_blocks.size()<<" cur_blocks\n";
}
reserve_more();
while(size<5)
{
const Block::Endpoint *exit=last->block->traverse(last->entry);
- if(exit->link->reserve(this))
+ if(exit && exit->link->reserve(this))
{
rsv_blocks.push_back(BlockRef(exit->link, exit->link->get_endpoint_by_link(last->block)));
last=&rsv_blocks.back();