X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Fintellibox.cpp;h=ec72a32734af9d38f33fa26235988ca62fccfa89;hb=66a30fdf63df6ae092fb3d335c30a37e4e6ef40d;hp=09e4792e36a0d5837ef12b14a48f7ce9fd04fbac;hpb=8b828fc32fd210b6e335ac6614d269aa892d4d57;p=r2c2.git diff --git a/source/libr2c2/intellibox.cpp b/source/libr2c2/intellibox.cpp index 09e4792..ec72a32 100644 --- a/source/libr2c2/intellibox.cpp +++ b/source/libr2c2/intellibox.cpp @@ -1,6 +1,4 @@ -#include -#include -#include +#include #include #include #include @@ -13,8 +11,8 @@ using namespace Msp; namespace R2C2 { -Intellibox::Intellibox(const string &dev): - serial(dev), +Intellibox::Intellibox(const Options &opts): + serial(opts.get(string(), "ttyUSB0")), power(false), halted(false), update_sensors(false), @@ -42,7 +40,7 @@ Intellibox::Intellibox(const string &dev): } if(!ok) - throw Exception("IB not detected"); + throw runtime_error("IB not detected"); if(p50) serial.write("xZzA1\r", 6); @@ -93,7 +91,7 @@ unsigned Intellibox::get_protocol_speed_steps(const string &proto_name) const return 0; } -void Intellibox::add_loco(unsigned addr, const string &proto_name, const VehicleType &type) +unsigned Intellibox::add_loco(unsigned addr, const string &proto_name, const VehicleType &type) { Protocol proto = map_protocol(proto_name); @@ -112,6 +110,13 @@ void Intellibox::add_loco(unsigned addr, const string &proto_name, const Vehicle data[1] = (addr>>8)&0xFF; command(CMD_LOK_STATUS, addr, data, 2); } + + return addr; +} + +void Intellibox::remove_loco(unsigned addr) +{ + locos.erase(addr); } void Intellibox::set_loco_speed(unsigned addr, unsigned speed) @@ -192,12 +197,23 @@ void Intellibox::set_loco_function(unsigned addr, unsigned func, bool state) signal_loco_function.emit(addr, func, state); } -void Intellibox::add_turnout(unsigned addr, const TrackType &type) +unsigned Intellibox::add_turnout(unsigned addr, const TrackType &type) +{ + return add_turnout(addr, type.get_state_bits(), false); +} + +void Intellibox::remove_turnout(unsigned addr) +{ + turnouts.erase(addr); +} + +unsigned Intellibox::add_turnout(unsigned addr, unsigned bits, bool signal) { if(!turnouts.count(addr)) { Turnout &turnout = turnouts[addr]; - turnout.bits = type.get_state_bits(); + turnout.bits = bits; + turnout.signal = signal; unsigned char data[2]; data[0] = addr&0xFF; @@ -213,6 +229,16 @@ void Intellibox::add_turnout(unsigned addr, const TrackType &type) command(CMD_TURNOUT_STATUS, addr+i, data, 2); } } + + return addr; +} + +void Intellibox::turnout_state_changed(unsigned addr, const Turnout &turnout) const +{ + if(turnout.signal) + signal_signal.emit(addr, turnout.state); + else + signal_turnout.emit(addr, turnout.state); } void Intellibox::set_turnout(unsigned addr, unsigned state) @@ -223,7 +249,7 @@ void Intellibox::set_turnout(unsigned addr, unsigned state) { turnout.state = state; turnout.pending = state; - signal_turnout.emit(addr, state); + turnout_state_changed(addr, turnout); return; } @@ -245,13 +271,41 @@ unsigned Intellibox::get_turnout(unsigned addr) const return 0; } -void Intellibox::add_sensor(unsigned addr) +unsigned Intellibox::add_signal(unsigned addr, const SignalType &) +{ + return add_turnout(addr, 1, true); +} + +void Intellibox::remove_signal(unsigned addr) +{ + remove_turnout(addr); +} + +void Intellibox::set_signal(unsigned addr, unsigned state) +{ + set_turnout(addr, state); +} + +unsigned Intellibox::get_signal(unsigned addr) const +{ + return get_turnout(addr); +} + +unsigned Intellibox::add_sensor(unsigned addr) { if(!sensors.count(addr)) { sensors[addr]; update_sensors = true; } + + return addr; +} + +void Intellibox::remove_sensor(unsigned addr) +{ + sensors.erase(addr); + update_sensors = true; } bool Intellibox::get_sensor(unsigned addr) const @@ -262,6 +316,11 @@ bool Intellibox::get_sensor(unsigned addr) const return false; } +float Intellibox::get_telemetry_value(const string &name) const +{ + throw key_error(name); +} + void Intellibox::tick() { const Time::TimeStamp t = Time::now(); @@ -354,7 +413,7 @@ Intellibox::Protocol Intellibox::map_protocol(const string &name) const else if(name=="MM-27") return MM_27; else - throw InvalidParameterValue("Unknown protocol"); + throw invalid_argument("Intellibox::map_protocol"); } void Intellibox::command(Command cmd) @@ -472,7 +531,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) unsigned bit = !(data[1]&0x80); turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr,turnout); } } else if(cmd==CMD_EVENT_SENSOR) @@ -498,7 +557,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) if(!sensor.state) { sensor.state = state; - signal_sensor(addr, state); + signal_sensor.emit(addr, state); } } else if(sensor.state) @@ -541,7 +600,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) if(turnout.active) { if(turnout.state==turnout.pending) - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr, turnout); turnout.off_timeout = t+500*Time::msec; } } @@ -573,7 +632,7 @@ void Intellibox::process_reply(const Time::TimeStamp &t) { turnout.state = (turnout.state&~mask) | (bit*mask); turnout.pending = turnout.state; - signal_turnout.emit(addr, turnout.state); + turnout_state_changed(addr, turnout); } turnout.synced = true; @@ -711,10 +770,12 @@ void Intellibox::error(Command cmd, Error err) Intellibox::Locomotive::Locomotive(): + protocol(NONE), ext_func(false), speed(0), reverse(false), - funcs(0) + funcs(0), + pending_half_step(0) { } @@ -723,7 +784,8 @@ Intellibox::Turnout::Turnout(): state(0), active(false), synced(false), - pending(0) + pending(0), + signal(false) { }