Ignore:
Timestamp:
06/10/11 16:15:47 (13 years ago)
Author:
tbretz
Message:
Replaces vector<Connection> by map<uint8_t, Connection> to allow empty slots for an efficient sending to all boards.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/fadctrl.cc

    r10978 r10986  
    523523private:
    524524    typedef pair<tcp::endpoint, ConnectionFAD*> Connection;
    525     typedef vector<Connection>            BoardList;
     525    typedef map<uint8_t, Connection>            BoardList;
    526526
    527527    BoardList fBoards;
     
    545545    {
    546546        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    547             i->second->Cmd(command);
     547            i->second.second->Cmd(command);
    548548
    549549        return T::GetCurrentState();
     
    556556
    557557        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    558             i->second->Cmd(command, evt.GetBool());
     558            i->second.second->Cmd(command, evt.GetBool());
    559559
    560560        return T::GetCurrentState();
     
    593593
    594594        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    595             i->second->CmdSetRegister(dat[0], dat[1]);
     595            i->second.second->CmdSetRegister(dat[0], dat[1]);
    596596
    597597        return T::GetCurrentState();
     
    611611
    612612        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    613             i->second->CmdSetRoi(dat[0], dat[1]);
     613            i->second.second->CmdSetRoi(dat[0], dat[1]);
    614614
    615615        return T::GetCurrentState();
     
    627627
    628628        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    629             i->second->CmdSetDacValue(dat[0], dat[1]);
     629            i->second.second->CmdSetDacValue(dat[0], dat[1]);
    630630
    631631        return T::GetCurrentState();
     
    636636        for (int nn=0; nn<n; nn++)
    637637            for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    638                 i->second->Cmd(FAD::kCmdSingleTrigger);
     638                i->second.second->Cmd(FAD::kCmdSingleTrigger);
    639639
    640640        return T::GetCurrentState();
     
    657657
    658658        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    659             i->second->Cmd(FAD::kCmdRun, start);
     659            i->second.second->Cmd(FAD::kCmdRun, start);
    660660
    661661        return T::GetCurrentState();
     
    668668
    669669        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    670             i->second->CmdPhaseShift(evt.GetShort());
     670            i->second.second->CmdPhaseShift(evt.GetShort());
    671671
    672672        return T::GetCurrentState();
     
    687687
    688688        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    689             i->second->CmdSetTriggerRate(evt.GetUInt());
     689            i->second.second->CmdSetTriggerRate(evt.GetUInt());
    690690
    691691        return T::GetCurrentState();
     
    708708
    709709        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    710             i->second->CmdSetRunNumber(num);
     710            i->second.second->CmdSetRunNumber(num);
    711711
    712712        return T::GetCurrentState();
     
    731731
    732732        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    733             i->second->SetVerbose(evt.GetBool());
     733            i->second.second->SetVerbose(evt.GetBool());
    734734
    735735        return T::GetCurrentState();
     
    742742
    743743        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    744             i->second->SetHexOutput(evt.GetBool());
     744            i->second.second->SetHexOutput(evt.GetBool());
    745745
    746746        return T::GetCurrentState();
     
    753753
    754754       for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    755             i->second->SetDataOutput(evt.GetBool());
     755            i->second.second->SetDataOutput(evt.GetBool());
    756756
    757757        return T::GetCurrentState();
     
    768768        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    769769        {
    770             if (i->first==endpoint)
     770            if (i->second.first==endpoint)
    771771            {
    772772               T::Warn("Address "+addr+" already known.... ignored.");
     
    787787        const int16_t slot = evt.GetShort();
    788788
    789         if (fBoards[slot].first==tcp::endpoint())
     789        const BoardList::iterator it = fBoards.find(slot);
     790
     791        if (it==fBoards.end())
    790792        {
    791793            ostringstream str;
     
    795797        }
    796798
    797         delete fBoards[slot].second;
    798         fBoards[slot] = make_pair(tcp::endpoint(), (ConnectionFAD*)NULL);
     799        delete it->second.second;
     800        fBoards.erase(it);
    799801
    800802        return T::GetCurrentState();
     
    803805    int ListSlots()
    804806    {
    805         for (int i=0; i<40; i++)
    806         {
    807             if (fBoards[i].first==tcp::endpoint())
    808                 continue;
     807        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
     808        {
     809            const int        &idx  = i->first;
     810            const Connection &slot = i->second;
    809811
    810812            ostringstream str;
    811             str << "Slot " << setw(2) << i << ": " << fBoards[i].first;
    812 
    813             const ConnectionFAD *c = fBoards[i].second;
     813            str << "Slot " << setw(2) << idx << ": " << slot.first;
     814
     815            const ConnectionFAD *c = slot.second;
    814816
    815817            if (c->IsConnecting())
     
    823825            }
    824826
    825             switch (fStatus2[i])
     827            switch (fStatus2[idx])
    826828            {
    827829            case 0:  str << "1-7:not connected)"; break;
    828830            case 7:  str << "1-7:connected)";     break;
    829             default: str << "1-7:connecting [" << fStatus2[i] << "])"; break;
     831            default: str << "1-7:connecting [" << fStatus2[idx] << "])"; break;
    830832            }
    831833
     
    843845    }
    844846
    845     void EnableSlot(int i, bool enable=true)
    846     {
    847         if (fBoards[i].first==tcp::endpoint())
    848             return;
    849 
    850         ConnectionFAD* &ptr = fBoards[i].second;
     847    void EnableSlot(Connection &c, bool enable=true)
     848    {
     849        ConnectionFAD *ptr = c.second;
    851850        if (!ptr)
    852851            return;
     
    857856        {
    858857            ostringstream str;
    859             str << fBoards[i].first;
     858            str << c.first;
    860859            ptr->SetEndpoint(str.str());
    861860            ptr->StartConnect();
     
    865864    void EnableAll(bool enable=true)
    866865    {
    867         for (int i=0; i<40; i++)
    868             EnableSlot(i, enable);
     866        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
     867            EnableSlot(i->second, enable);
    869868    }
    870869
     
    893892        vector<tcp::endpoint> addr(40);
    894893
    895         for (int i=0; i<40; i++)
    896             addr[i] = fBoards[i].first;
     894        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
     895            addr[i->first] = i->second.first;
    897896
    898897        Start(addr);
     
    929928        {
    930929            // ----- Command socket -----
    931             if (fBoards[idx].first!=tcp::endpoint())
     930            const BoardList::const_iterator &slot = fBoards.find(idx);
     931            if (slot!=fBoards.end())
    932932            {
    933                 const ConnectionFAD *c = fBoards[idx].second;
     933                const ConnectionFAD *c = slot->second.second;
    934934                if (c->IsConnecting())
    935935                {
     
    986986        while (i<40)
    987987        {
    988             if (fBoards[i].first==tcp::endpoint())
     988            if (fBoards.find(i)==fBoards.end())
    989989                break;
    990990            i++;
     
    10281028    StateMachineFAD(ostream &out=cout) :
    10291029        T(out, "FAD_CONTROL"), EventBuilderWrapper(static_cast<MessageImp&>(*this)), ba::io_service::work(static_cast<ba::io_service&>(*this)),
    1030         fBoards(40), fStatus1(40), fStatus2(40),
     1030        fStatus1(40), fStatus2(40),
    10311031        fDimConnection("FAD_CONTROL/CONNECTIONS", "C:41", "")
    10321032    {
     
    11811181    {
    11821182        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1183             delete i->second;
     1183            delete i->second.second;
    11841184        fBoards.clear();
    11851185    }
Note: See TracChangeset for help on using the changeset viewer.