Changeset 11192


Ignore:
Timestamp:
06/27/11 13:25:48 (13 years ago)
Author:
tbretz
Message:
Made the tcp::endpoint and the slot number a member of ConenctionFAD; notify the EventBuilderWrapper about updates of e.g. the header.
File:
1 edited

Legend:

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

    r11182 r11192  
    2525#include "tools.h"
    2626
     27#include "DimDescriptionService.h"
     28#include "EventBuilderWrapper.h"
     29
    2730namespace ba = boost::asio;
    2831namespace bs = boost::system;
     
    3639class ConnectionFAD : public Connection
    3740{
     41    uint16_t fSlot;
     42//    tcp::endpoint fEndpoint;
     43
    3844    vector<uint16_t> fBuffer;
    3945
     
    155161        }
    156162
     163        EventBuilderWrapper::This->debugStream(fSlot*7, fBuffer.data(), bytes_received);
     164
    157165        if (type==kReadHeader)
    158166        {
     
    183191            UpdateEventHeader();
    184192
     193            EventBuilderWrapper::This->debugHead(fSlot*40, fEventHeader);
     194
    185195            fBuffer.resize(fEventHeader.fPackageLength-sizeof(FAD::EventHeader)/2);
    186196            AsyncRead(ba::buffer(fBuffer), kReadData);
     
    225235            }
    226236
    227             uint16_t *data = reinterpret_cast<uint16_t*>(ptr);
    228 
    229             /*
    230             for (uint16_t *d=data; d<data+fChannelHeader[i].fRegionOfInterest; d++)
    231             {
    232                 const bool sign     = *d & 0x2000;
    233                 const bool overflow = *d & 0x1000;
    234 
    235                 if (sign)
    236                     *d |= 0xf000;   // no overflow, nagative
    237                 else
    238                     *d &= 0x07ff;   // no overlow,  positive
    239 
    240                 // max = [-2047;2048]
    241 
    242                 if (overflow)
    243                 {
    244                     if (sign)
    245                         *d = 0xF800;   // overflow, negative
    246                     else
    247                         *d = 0x0800;   // overflow, positive
    248                 }
    249             }
    250             */
    251 
     237            const uint16_t *data = reinterpret_cast<uint16_t*>(ptr);
    252238            UpdateData(data, fChannelHeader[i].fRegionOfInterest*2);
    253239            ptr += fChannelHeader[i].fRegionOfInterest*2;
     
    366352
    367353public:
    368     ConnectionFAD(ba::io_service& ioservice, MessageImp &imp) :
    369         Connection(ioservice, imp()),
     354    ConnectionFAD(ba::io_service& ioservice, MessageImp &imp, uint16_t slot) :
     355        Connection(ioservice, imp()), fSlot(slot),
    370356        fIsVerbose(false), fIsHexOutput(false), fIsDataOutput(false),
    371357        fBlockTransmission(false), fCounter(0)
     
    379365    }
    380366
     367//    void SetTcpEndpoint(const tcp::endpoint &ep) { fEndpoint = ep; }
     368//    const tcp::endpoint &GetTcpEndpoint() const { return fEndpoint; }
     369
    381370    void Cmd(FAD::Enable cmd, bool on=true)
    382371    {
     
    557546
    558547// ------------------------------------------------------------------------
    559 #include "DimDescriptionService.h"
    560 #include "EventBuilderWrapper.h"
    561 
    562 // ------------------------------------------------------------------------
    563548
    564549template <class T>
     
    566551{
    567552private:
    568     typedef pair<tcp::endpoint, ConnectionFAD*> Connection;
    569     typedef map<uint8_t, Connection>            BoardList;
     553    typedef map<uint8_t, ConnectionFAD*> BoardList;
    570554
    571555    BoardList fBoards;
     
    590574    {
    591575        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    592             i->second.second->Cmd(command);
     576            i->second->Cmd(command);
    593577
    594578        return T::GetCurrentState();
     
    607591
    608592        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    609             i->second.second->PostCmd(evt.GetUInt());
     593            i->second->PostCmd(evt.GetUInt());
    610594
    611595        return T::GetCurrentState();
     
    632616
    633617        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    634             i->second.second->PostCmd(ptr[0], ptr[1]);
     618            i->second->PostCmd(ptr[0], ptr[1]);
    635619
    636620        return T::GetCurrentState();
     
    643627
    644628        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    645             i->second.second->Cmd(command, evt.GetBool());
     629            i->second->Cmd(command, evt.GetBool());
    646630
    647631        return T::GetCurrentState();
     
    680664
    681665        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    682             i->second.second->CmdSetRegister(dat[0], dat[1]);
     666            i->second->CmdSetRegister(dat[0], dat[1]);
    683667
    684668        return T::GetCurrentState();
     
    693677
    694678        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    695             if (!i->second.second->CmdSetRoi(dat[0], dat[1]))
     679            if (!i->second->CmdSetRoi(dat[0], dat[1]))
    696680            {
    697681                ostringstream msg;
     
    716700
    717701        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    718             i->second.second->CmdSetDacValue(dat[0], dat[1]);
     702            i->second->CmdSetDacValue(dat[0], dat[1]);
    719703
    720704        return T::GetCurrentState();
     
    725709        for (int nn=0; nn<n; nn++)
    726710            for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    727                 i->second.second->Cmd(FAD::kCmdSingleTrigger);
     711                i->second->Cmd(FAD::kCmdSingleTrigger);
    728712
    729713        return T::GetCurrentState();
     
    746730
    747731        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    748             i->second.second->Cmd(FAD::kCmdRun, start);
     732            i->second->Cmd(FAD::kCmdRun, start);
    749733
    750734        return T::GetCurrentState();
     
    757741
    758742        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    759             i->second.second->CmdPhaseShift(evt.GetShort());
     743            i->second->CmdPhaseShift(evt.GetShort());
    760744
    761745        return T::GetCurrentState();
     
    776760
    777761        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    778             i->second.second->CmdSetTriggerRate(evt.GetUInt());
     762            i->second->CmdSetTriggerRate(evt.GetUInt());
    779763
    780764        return T::GetCurrentState();
     
    797781
    798782        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    799             i->second.second->CmdSetRunNumber(num);
     783            i->second->CmdSetRunNumber(num);
    800784
    801785        return T::GetCurrentState();
     
    840824
    841825        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    842             i->second.second->SetVerbose(evt.GetBool());
     826            i->second->SetVerbose(evt.GetBool());
    843827
    844828        return T::GetCurrentState();
     
    851835
    852836        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    853             i->second.second->SetHexOutput(evt.GetBool());
     837            i->second->SetHexOutput(evt.GetBool());
    854838
    855839        return T::GetCurrentState();
     
    862846
    863847        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    864             i->second.second->SetDataOutput(evt.GetBool());
     848            i->second->SetDataOutput(evt.GetBool());
    865849
    866850        return T::GetCurrentState();
     
    873857
    874858        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    875             i->second.second->SetDebugTx(evt.GetBool());
     859            i->second->SetDebugTx(evt.GetBool());
    876860
    877861        return T::GetCurrentState();
     
    901885        {
    902886            for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    903                 i->second.second->PrintEvent();
     887                i->second->PrintEvent();
    904888        }
    905889        else
     
    907891            const BoardList::iterator it=GetSlot(slot);
    908892            if (it!=fBoards.end())
    909                 it->second.second->PrintEvent();
     893                it->second->PrintEvent();
    910894        }
    911895
     
    922906        const BoardList::iterator it=GetSlot(slot);
    923907        if (it!=fBoards.end())
    924             it->second.second->SetBlockTransmission(evt.Get<uint8_t>(2));
     908            it->second->SetBlockTransmission(evt.Get<uint8_t>(2));
    925909
    926910        return T::GetCurrentState();
     
    939923            const BoardList::iterator it=GetSlot(i);
    940924            if (it!=fBoards.end())
    941                 it->second.second->SetBlockTransmission(block);
     925                it->second->SetBlockTransmission(block);
    942926        }
    943927
     
    1013997        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1014998        {
    1015             if (i->second.first==endpoint)
     999            if (i->second->GetEndpoint()==endpoint)
    10161000            {
    10171001               T::Warn("Address "+addr+" already known.... ignored.");
     
    10391023        ConnectSlot(slot, tcp::endpoint());
    10401024
    1041         delete it->second.second;
     1025        delete it->second;
    10421026        fBoards.erase(it);
    10431027
     
    10491033        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    10501034        {
    1051             const int        &idx = i->first;
    1052             const Connection &slot = i->second;
     1035            const int           &idx = i->first;
     1036            const ConnectionFAD *fad = i->second;
    10531037
    10541038            ostringstream str;
    1055             str << "Slot " << setw(2) << idx << ": " << slot.first;
    1056 
    1057             const ConnectionFAD *c = slot.second;
    1058 
    1059             if (c->IsConnecting())
     1039            str << "Slot " << setw(2) << idx << ": " << fad->GetEndpoint();
     1040
     1041            if (fad->IsConnecting())
    10601042                str << " (0:connecting, ";
    10611043            else
    10621044            {
    1063                 if (c->IsClosed())
     1045                if (fad->IsClosed())
    10641046                    str << " (0:disconnected, ";
    1065                 if (c->IsConnected())
     1047                if (fad->IsConnected())
    10661048                    str << " (0:connected, ";
    10671049            }
     
    10741056            }
    10751057
    1076             if (c->IsTransmissionBlocked())
     1058            if (fad->IsTransmissionBlocked())
    10771059                str << " [cmd_blocked]";
    10781060
     
    10931075    }
    10941076
    1095     void EnableConnection(Connection &c, bool enable=true)
    1096     {
    1097         ConnectionFAD *ptr = c.second;
    1098         if (!ptr)
    1099             return;
    1100 
     1077    void EnableConnection(ConnectionFAD *ptr, bool enable=true)
     1078    {
    11011079        if (!enable)
    11021080        {
     
    11051083        }
    11061084
    1107         ostringstream str;
    1108         str << c.first;
    1109 
    11101085        if (!ptr->IsDisconnected())
    11111086        {
     1087            ostringstream str;
     1088            str << ptr->GetEndpoint();
     1089
    11121090            T::Warn("Connection to "+str.str()+" already in progress.");
    11131091            return;
    11141092        }
    11151093
    1116         ptr->SetEndpoint(str.str());
    11171094        ptr->StartConnect();
    11181095    }
     
    11421119
    11431120        EnableConnection(it->second, enable);
    1144         ConnectSlot(it->first, enable ? it->second.first : tcp::endpoint());
     1121        ConnectSlot(it->first, enable ? it->second->GetEndpoint() : tcp::endpoint());
    11451122
    11461123        return T::GetCurrentState();
     
    11581135            return T::GetCurrentState();
    11591136
    1160         const bool enable = it->second.second->IsDisconnected() && fStatus2[slot]==0;
     1137        const bool enable = it->second->IsDisconnected() && fStatus2[slot]==0;
    11611138
    11621139        EnableConnection(it->second, enable);
    1163         ConnectSlot(it->first, enable ? it->second.first : tcp::endpoint());
     1140        ConnectSlot(it->first, enable ? it->second->GetEndpoint() : tcp::endpoint());
    11641141
    11651142        return T::GetCurrentState();
     
    11711148
    11721149        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1173             addr[i->first] = i->second.first;
     1150            addr[i->first] = i->second->GetEndpoint();
    11741151
    11751152        StartThread(addr);
     
    12191196        int cnt = 0; // counter for enabled board
    12201197
     1198        const bool runs = IsThreadRunning();
     1199
    12211200        for (int idx=0; idx<40; idx++)
    12221201        {
     
    12251204            if (slot!=fBoards.end())
    12261205            {
    1227                 const ConnectionFAD *c = slot->second.second;
     1206                const ConnectionFAD *c = slot->second;
    12281207                if (c->IsDisconnected())
    12291208                {
     
    12311210                    nclosed1++;
    12321211
    1233                     DisconnectSlot(idx);
     1212                    //DisconnectSlot(idx);
    12341213                }
    12351214                if (c->IsConnecting())
     
    12481227
    12491228            // ----- Event builder -----
     1229
     1230            if (!runs)
     1231                continue;
     1232
    12501233            stat2[idx] = GetNumConnected(idx);
    12511234
    1252             if (!IsConnected(idx) && !IsDisconnected(idx))
     1235            if (IsConnecting(idx))
    12531236                nconnecting2++;
    12541237
     
    12761259
    12771260        if (nconnecting1>0 || nconnecting2>0 || nconnected1!=nconnected2)
     1261        {
     1262            cout << nconnecting1 << " " << nconnecting2 << " " << nconnected1 << " " << nconnected2 << endl;
     1263
     1264            if (nconnecting2>0)
     1265                for (int i=0; i<40; i++)
     1266                    cout << i << ": " << GetNumConnected(i) << " " <<IsConnected(i) << " " << IsConnecting(i) << " " << IsDisconnected(i) << endl;
     1267
    12781268            return FAD::kConnecting;
     1269        }
    12791270
    12801271        // nconnected1 == nconnected2 == 0
     
    12981289        }
    12991290
    1300         fBoards[i] = make_pair(addr, new ConnectionFAD(*this, *this));
    1301         fBoards[i].second->SetVerbose(fIsVerbose);
    1302         fBoards[i].second->SetHexOutput(fIsHexOutput);
    1303         fBoards[i].second->SetDataOutput(fIsDataOutput);
    1304         fBoards[i].second->SetDebugTx(fDebugTx);
     1291        ConnectionFAD *fad = new ConnectionFAD(*this, *this, i);
     1292
     1293        fad->SetEndpoint(addr);
     1294        fad->SetVerbose(fIsVerbose);
     1295        fad->SetHexOutput(fIsHexOutput);
     1296        fad->SetDataOutput(fIsDataOutput);
     1297        fad->SetDebugTx(fDebugTx);
     1298
     1299        fBoards[i] = fad;
    13051300    }
    13061301
    13071302
    13081303    DimDescribedService fDimConnection;
    1309  /*
    1310     template<class T>
    1311         void Update(DimDescribedService &svc, const T &data) const
    1312     {
    1313         //cout << "Update: " << svc.getName() << " (" << sizeof(T) << ")" << endl;
    1314         svc.setData(const_cast<T*>(&data), sizeof(T));
    1315         svc.updateService();
    1316     }
    1317  */
     1304
    13181305    void UpdateConnectionStatus(const vector<uint8_t> &stat1, const vector<uint8_t> &stat2, bool thread)
    13191306    {
     
    15041491             "|enable[bool]:Whether the event builder should ignore data from this slot (yes) or allowed (no)");
    15051492
     1493        T::AddEvent("CLOSE_OPEN_FILES", FAD::kConnecting, FAD::kConnected)
     1494            (boost::bind(&StateMachineFAD::CloseOpenFiles, this))
     1495            ("Close all run files opened by the EventBuilder.");
     1496
     1497        T::AddEvent("TEST", "S:1")
     1498           (boost::bind(&StateMachineFAD::Test, this, _1))
     1499            ("");
     1500
     1501
     1502
    15061503        // Conenction commands
    15071504        T::AddEvent("START", FAD::kOffline)
     
    15291526            ("");
    15301527
    1531         T::AddEvent("CLOSE_OPEN_FILES", FAD::kConnecting, FAD::kConnected)
    1532             (boost::bind(&StateMachineFAD::CloseOpenFiles, this))
    1533             ("Close all run files opened by the EventBuilder.");
    1534 
    1535         T::AddEvent("TEST", "S:1")
    1536             (boost::bind(&StateMachineFAD::Test, this, _1))
    1537             ("");
    15381528
    15391529        T::AddEvent("ADD_ADDRESS", "C", FAD::kOffline)
     
    15531543    {
    15541544        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1555             delete i->second.second;
     1545            delete i->second;
    15561546        fBoards.clear();
    15571547    }
Note: See TracChangeset for help on using the changeset viewer.