namespace R2C2 {
-CentralStation::CentralStation(const string &host):
+CentralStation::CentralStation(const Options &opts):
socket(Net::INET),
pending_commands(0),
power(false),
accessories_synced(false),
sensors_synced(false)
{
- RefPtr<Net::SockAddr> addr = Net::resolve(host+":15471");
+ RefPtr<Net::SockAddr> addr = Net::resolve(opts.get<string>(string())+":15471");
socket.connect(*addr);
IO::print("Connected to central station at %s\n", addr->str());
}
}
-void CentralStation::add_loco(unsigned addr, const string &proto_name, const VehicleType &type)
+unsigned CentralStation::add_loco(unsigned addr, const string &proto_name, const VehicleType &type)
{
Protocol proto = map_protocol(proto_name);
}
else
command(format("request(%d, view, control, force)", id));
+
+ return addr;
+}
+
+void CentralStation::remove_loco(unsigned addr)
+{
+ unsigned id = map_address(locos, loco_addr, addr);
+ if(id)
+ command(format("release(%d, view, control)", id));
}
void CentralStation::set_loco_speed(unsigned addr, unsigned speed)
command(format("set(%d, func[%d, %d])", id, func, state));
}
-void CentralStation::add_turnout(unsigned addr, const TrackType &type)
+unsigned CentralStation::add_turnout(unsigned addr, const TrackType &type)
{
unsigned straight = type.get_paths();
bool left = false;
const vector<TrackPart> &parts = type.get_parts();
for(vector<TrackPart>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
{
- TrackPoint start = i->get_point(0);
- TrackPoint end = i->get_point(i->get_length());
- if(end.dir>start.dir+0.01 || end.dir<start.dir-0.01)
+ OrientedPoint start = i->get_point(0);
+ OrientedPoint end = i->get_point(i->get_length());
+ if(abs(end.rotation-start.rotation).radians()<0.01)
{
- (end.dir>start.dir ? left : right) = true;
+ (end.rotation>start.rotation ? left : right) = true;
straight &= ~(1<<i->get_path());
}
- else if(start.dir<-0.01 || start.dir>0.01)
+ else if(abs(start.rotation).radians()>0.01)
cross = true;
}
MagnetAccessory &turnout = add_accessory(addr, MagnetAccessory::TURNOUT, symbol);
turnout.bits = type.get_state_bits();
+
+ return addr;
+}
+
+void CentralStation::remove_turnout(unsigned addr)
+{
+ remove_accessory(addr);
}
void CentralStation::set_turnout(unsigned addr, unsigned state)
return get_accessory_state(addr, MagnetAccessory::TURNOUT);
}
-void CentralStation::add_signal(unsigned addr, const SignalType &)
+unsigned CentralStation::add_signal(unsigned addr, const SignalType &)
{
add_accessory(addr, MagnetAccessory::SIGNAL, MagnetAccessory::SEMAPHORE_HOME);
+ return addr;
+}
+
+void CentralStation::remove_signal(unsigned addr)
+{
+ remove_accessory(addr);
}
void CentralStation::set_signal(unsigned addr, unsigned state)
}
}
+void CentralStation::remove_accessory(unsigned addr)
+{
+ unsigned id = map_address(accessories, accessory_addr, addr);
+ if(id)
+ command(format("release(%d, view, control)", id));
+}
+
void CentralStation::set_accessory_state(unsigned addr, MagnetAccessory::Type type, unsigned state)
{
unsigned id = map_address(accessories, accessory_addr, addr);
signal_signal.emit(accessory.address, accessory.state);
}
-void CentralStation::add_sensor(unsigned addr)
+unsigned CentralStation::add_sensor(unsigned addr)
{
sensors.insert(SensorMap::value_type(addr, Sensor()));
if(addr>s88.size()*16)
command("create(26, add[0])");
}
+
+ return addr;
+}
+
+void CentralStation::remove_sensor(unsigned)
+{
}
bool CentralStation::get_sensor(unsigned addr) const