X-Git-Url: http://git.tdb.fi/?p=r2c2.git;a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.cpp;h=2361d8540d561ccff6477836b36fc41ebba114dc;hp=e29614f6646a5c5fd3068d819c7e89c071a0c154;hb=d5d8ee8;hpb=59b3cebecfd8f1462c95bab447be70dfb5f38e92 diff --git a/source/libr2c2/arducontrol.cpp b/source/libr2c2/arducontrol.cpp index e29614f..2361d85 100644 --- a/source/libr2c2/arducontrol.cpp +++ b/source/libr2c2/arducontrol.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include #include "arducontrol.h" @@ -18,12 +21,21 @@ ArduControl::ProtocolInfo ArduControl::protocol_info[2] = ArduControl::ArduControl(const string &dev): serial(dev), debug(1), + state_file("arducontrol.state"), power(false), active_accessory(0), s88(*this), mfx_search(*this), thread(*this) { + if(FS::exists(state_file)) + DataFile::load(*this, state_file.str()); + + unsigned max_address = 0; + for(MfxInfoArray::const_iterator i=mfx_info.begin(); i!=mfx_info.end(); ++i) + max_address = max(max_address, i->address); + mfx_search.set_next_address(max_address+1); + PendingCommand cmd; cmd.command[0] = READ_POWER_STATE; cmd.length = 1; @@ -107,6 +119,20 @@ unsigned ArduControl::add_loco(unsigned addr, const string &proto_name, const Ve return loco.id; } +ArduControl::MfxInfoArray::iterator ArduControl::add_mfx_info(const MfxInfo &info) +{ + MfxInfoArray::iterator i; + for(i=mfx_info.begin(); (i!=mfx_info.end() && i->id!=info.id); ++i) ; + if(i==mfx_info.end()) + { + mfx_info.push_back(info); + i = --mfx_info.end(); + } + else + *i = info; + return i; +} + void ArduControl::remove_loco(unsigned id) { Locomotive &loco = get_item(locomotives, id); @@ -288,15 +314,8 @@ void ArduControl::tick() MfxInfo info; if(mfx_search.pop_info(info)) { - MfxInfoArray::iterator i; - for(i=mfx_info.begin(); (i!=mfx_info.end() && i->id!=info.id); ++i) ; - if(i==mfx_info.end()) - { - mfx_info.push_back(info); - i = --mfx_info.end(); - } - else - *i = info; + MfxInfoArray::iterator i = add_mfx_info(info); + save_state(); signal_locomotive_detected.emit(*i); } } @@ -408,6 +427,23 @@ void ArduControl::flush() { } +void ArduControl::save_state() const +{ + FS::RedirectedPath tmp_file(state_file); + IO::BufferedFile out(tmp_file.str(), IO::M_WRITE); + DataFile::Writer writer(out); + + writer.write((DataFile::Statement("mfx_announce_serial"), mfx_announce.get_serial())); + for(MfxInfoArray::const_iterator i=mfx_info.begin(); i!=mfx_info.end(); ++i) + { + DataFile::Statement st("mfx_locomotive"); + st.append(i->id); + st.sub.push_back((DataFile::Statement("address"), i->address)); + st.sub.push_back((DataFile::Statement("name"), i->name)); + writer.write(st); + } +} + ArduControl::Tag::Tag(): type(NONE), @@ -852,6 +888,11 @@ void ArduControl::MfxSearchTask::process_reply(const char *reply, unsigned lengt } } +void ArduControl::MfxSearchTask::set_next_address(unsigned a) +{ + next_address = a; +} + bool ArduControl::MfxSearchTask::pop_info(MfxInfo &info) { return queue.pop(info); @@ -1047,4 +1088,34 @@ unsigned ArduControl::ControlThread::process_reply(const char *reply, unsigned r return 0; } + +ArduControl::Loader::Loader(ArduControl &c): + DataFile::ObjectLoader(c) +{ + add("mfx_announce_serial", &Loader::mfx_announce_serial); + add("mfx_locomotive", &Loader::mfx_locomotive); +} + +void ArduControl::Loader::mfx_announce_serial(unsigned s) +{ + obj.mfx_announce.set_serial(s); +} + +void ArduControl::Loader::mfx_locomotive(unsigned id) +{ + MfxInfo info; + info.id = id; + info.protocol = "MFX"; + load_sub(info); + obj.add_mfx_info(info); +} + + +ArduControl::MfxInfo::Loader::Loader(MfxInfo &i): + DataFile::ObjectLoader(i) +{ + add("address", static_cast(&MfxInfo::address)); + add("name", static_cast(&MfxInfo::name)); +} + } // namespace R2C2