X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.cpp;h=47584f44bb8b145496a0b6d9a52c118f4c68fcd9;hb=58c56db5f740d9d3c56ff64f4062b108076c63c3;hp=07a2215c4cfb4386940acdf185530cbefd9204e5;hpb=77f1712e7f8913af3ce33efc0e1e4ebbe0e5f93a;p=r2c2.git diff --git a/source/libr2c2/arducontrol.cpp b/source/libr2c2/arducontrol.cpp index 07a2215..47584f4 100644 --- a/source/libr2c2/arducontrol.cpp +++ b/source/libr2c2/arducontrol.cpp @@ -84,6 +84,14 @@ unsigned ArduControl::get_protocol_speed_steps(const string &proto_name) const return protocol_info[map_protocol(proto_name)].max_speed; } +const Driver::DetectedLocomotive *ArduControl::enumerate_detected_locos(unsigned i) const +{ + if(i>=mfx_info.size()) + return 0; + + return &mfx_info[i]; +} + unsigned ArduControl::add_loco(unsigned addr, const string &proto_name, const VehicleType &) { if(!addr) @@ -274,6 +282,23 @@ void ArduControl::tick() if(power.commit(tag.serial)) signal_power.emit(power.current); } + else if(tag.command==NEW_LOCO) + { + 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; + signal_locomotive_detected.emit(*i); + } + } } else if(tag.type==Tag::LOCOMOTIVE) { @@ -770,6 +795,13 @@ bool ArduControl::MfxSearchTask::get_work(PendingCommand &cmd) if(control.debug>=1) IO::print("Assigning MFX address %d to decoder %08X\n", next_address, bits); + MfxInfo info; + info.protocol = "MFX"; + info.address = next_address; + info.name = format("%08X", bits); + info.id = bits; + push_info(info); + cmd.command[0] = MFX_ASSIGN_ADDRESS; cmd.command[1] = next_address>>8; cmd.command[2] = next_address; @@ -777,6 +809,10 @@ bool ArduControl::MfxSearchTask::get_work(PendingCommand &cmd) cmd.command[3+i] = bits>>(24-i*8); cmd.length = 7; + cmd.tag.type = Tag::GENERAL; + cmd.tag.command = NEW_LOCO; + cmd.tag.id = bits; + size = 0; bits = 0; ++next_address; @@ -827,6 +863,22 @@ void ArduControl::MfxSearchTask::process_reply(const char *reply, unsigned lengt } } +void ArduControl::MfxSearchTask::push_info(const MfxInfo &info) +{ + MutexLock lock(mutex); + queue.push_back(info); +} + +bool ArduControl::MfxSearchTask::pop_info(MfxInfo &info) +{ + MutexLock lock(mutex); + if(queue.empty()) + return false; + info = queue.back(); + queue.pop_back(); + return true; +} + ArduControl::ControlThread::ControlThread(ArduControl &c): control(c),