Changeset 10940 for trunk/FACT++/src


Ignore:
Timestamp:
06/08/11 20:20:03 (13 years ago)
Author:
tbretz
Message:
Adapted to latest changes in EventBuilder; added some Dim services.
File:
1 edited

Legend:

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

    r10882 r10940  
    101101            for (unsigned int ch=0; ch<FAD::kNumChannelsPerChip; ch++)
    102102                Out() << " " << setw(4) << fChannelHeader[c*FAD::kNumChannelsPerChip+ch].fStartCell;
    103             Out() << endl;
    104103        }
    105104
     
    306305    void PostCmd(std::vector<uint16_t> cmd)
    307306    {
     307#ifdef DEBUG_TX
    308308        ostringstream msg;
    309309        msg << "Sending command:" << hex;
     
    311311        msg << " (+ " << cmd.size()-1 << " bytes data)";
    312312        Message(msg);
    313 
     313#endif
    314314        transform(cmd.begin(), cmd.end(), cmd.begin(), htons);
    315315
     
    319319    void PostCmd(uint16_t cmd)
    320320    {
     321#ifdef DEBUG_TX
    321322        ostringstream msg;
    322323        msg << "Sending command:" << hex;
    323324        msg << " 0x" << setw(4) << setfill('0') << cmd;
    324325        Message(msg);
    325 
     326#endif
    326327        cmd = htons(cmd);
    327328        PostMessage(&cmd, sizeof(uint16_t));
     
    330331    void PostCmd(uint16_t cmd, uint16_t data)
    331332    {
     333#ifdef DEBUG_TX
    332334        ostringstream msg;
    333335        msg << "Sending command:" << hex;
     
    335337        msg << " 0x" << setw(4) << setfill('0') << data;
    336338        Message(msg);
    337 
     339#endif
    338340        const uint16_t d[2] = { htons(cmd), htons(data) };
    339341        PostMessage(d, sizeof(d));
     
    505507
    506508// ------------------------------------------------------------------------
    507 /*
    508509#include "DimDescriptionService.h"
    509 
    510 class ConnectionDimFAD : public ConnectionFAD
    511 {
    512 private:
    513 
    514     DimDescribedService fDimPassport;
    515     DimDescribedService fDimTemperatures;
    516     DimDescribedService fDimSetup;
    517     DimDescribedService fDimEventHeader;
    518 
    519     template<class T>
    520         void Update(DimDescribedService &svc, const T &data) const
    521     {
    522         //cout << "Update: " << svc.getName() << " (" << sizeof(T) << ")" << endl;
    523         svc.setData(const_cast<T*>(&data), sizeof(T));
    524         svc.updateService();
    525     }
    526 
    527     void UpdateFirstHeader()
    528     {
    529         ConnectionFAD::UpdateFirstHeader();
    530 
    531         const FAD::DimPassport data(fEventHeader);
    532         Update(fDimPassport, data);
    533     }
    534 
    535     void UpdateEventHeader()
    536     {
    537         ConnectionFAD::UpdateEventHeader();
    538 
    539         const FAD::DimTemperatures data0(fEventHeader);
    540         const FAD::DimSetup        data1(fEventHeader);
    541         const FAD::DimEventHeader  data2(fEventHeader);
    542 
    543         Update(fDimTemperatures, data0);
    544         Update(fDimSetup,        data1);
    545         Update(fDimEventHeader,  data2);
    546     }
    547 
    548 public:
    549     ConnectionDimFAD(ba::io_service& ioservice, MessageImp &imp) :
    550         ConnectionFAD(ioservice, imp),
    551         fDimPassport    ("FAD_CONTROL/PASSPORT",     "I:1;S:2;X:1", ""),
    552         fDimTemperatures("FAD_CONTROL/TEMPERATURES", "I:1;F:4",     ""),
    553         fDimSetup       ("FAD_CONTROL/SETUP",        "I:2;S:12",    ""),
    554         fDimEventHeader ("FAD_CONTROL/EVENT_HEADER", "C",           "")
    555     {
    556     }
    557 
    558     // A B [C] [D] E [F] G H [I] J K [L] M N O P Q R [S] T U V W [X] Y Z
    559 };
    560 */
    561 // ------------------------------------------------------------------------
    562 
    563510#include "EventBuilderWrapper.h"
    564511
     
    569516{
    570517private:
    571     typedef pair<string, ConnectionFAD*>    Connection;
    572     typedef pair<const uint8_t, Connection> Board;
    573     typedef map<uint8_t, Connection>        BoardList;
     518    typedef pair<tcp::endpoint, ConnectionFAD*> Connection;
     519    typedef vector<Connection>            BoardList;
    574520
    575521    BoardList fBoards;
     
    593539    {
    594540        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    595             i->second.second->Cmd(command);
     541            i->second->Cmd(command);
    596542
    597543        return T::GetCurrentState();
     
    604550
    605551        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    606             i->second.second->Cmd(command, evt.GetBool());
     552            i->second->Cmd(command, evt.GetBool());
    607553
    608554        return T::GetCurrentState();
     
    641587
    642588        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    643             i->second.second->CmdSetRegister(dat[0], dat[1]);
     589            i->second->CmdSetRegister(dat[0], dat[1]);
    644590
    645591        return T::GetCurrentState();
     
    659605
    660606        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    661             i->second.second->CmdSetRoi(dat[0], dat[1]);
     607            i->second->CmdSetRoi(dat[0], dat[1]);
    662608
    663609        return T::GetCurrentState();
     
    675621
    676622        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    677             i->second.second->CmdSetDacValue(dat[0], dat[1]);
     623            i->second->CmdSetDacValue(dat[0], dat[1]);
    678624
    679625        return T::GetCurrentState();
     
    684630        for (int nn=0; nn<n; nn++)
    685631            for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    686                 i->second.second->Cmd(FAD::kCmdSingleTrigger);
     632                i->second->Cmd(FAD::kCmdSingleTrigger);
    687633
    688634        return T::GetCurrentState();
     
    705651
    706652        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    707             i->second.second->Cmd(FAD::kCmdRun, start);
     653            i->second->Cmd(FAD::kCmdRun, start);
    708654
    709655        return T::GetCurrentState();
     
    716662
    717663        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    718             i->second.second->CmdPhaseShift(evt.GetShort());
     664            i->second->CmdPhaseShift(evt.GetShort());
    719665
    720666        return T::GetCurrentState();
     
    735681
    736682        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    737             i->second.second->CmdSetTriggerRate(evt.GetUInt());
     683            i->second->CmdSetTriggerRate(evt.GetUInt());
    738684
    739685        return T::GetCurrentState();
     
    756702
    757703        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    758             i->second.second->CmdSetRunNumber(num);
     704            i->second->CmdSetRunNumber(num);
    759705
    760706        return T::GetCurrentState();
     
    779725
    780726        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    781             i->second.second->SetVerbose(evt.GetBool());
     727            i->second->SetVerbose(evt.GetBool());
    782728
    783729        return T::GetCurrentState();
     
    790736
    791737        for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    792             i->second.second->SetHexOutput(evt.GetBool());
     738            i->second->SetHexOutput(evt.GetBool());
    793739
    794740        return T::GetCurrentState();
     
    801747
    802748       for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    803             i->second.second->SetDataOutput(evt.GetBool());
    804 
    805         return T::GetCurrentState();
    806     }
    807 
    808     const BoardList::iterator GetSlot(int slot)
    809     {
    810         const BoardList::iterator i = fBoards.find(slot);
    811         if (i!=fBoards.end())
    812             return i;
    813 
    814         ostringstream str;
    815         str << "Slot " << slot << " not found.";
    816         T::Warn(str.str());
    817         return fBoards.end();
     749            i->second->SetDataOutput(evt.GetBool());
     750
     751        return T::GetCurrentState();
    818752    }
    819753
     
    822756        const string addr = Tools::Trim(evt.GetText());
    823757
     758        const tcp::endpoint endpoint = GetEndpoint(addr);
     759        if (endpoint==tcp::endpoint())
     760            return T::GetCurrentState();
     761
    824762        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    825763        {
    826             if (i->second.first==addr)
     764            if (i->first==endpoint)
    827765            {
    828766               T::Warn("Address "+addr+" already known.... ignored.");
     
    831769        }
    832770
    833         AddEndpoint(addr);
     771        AddEndpoint(endpoint);
    834772
    835773        return T::GetCurrentState();
     
    843781        const int16_t slot = evt.GetShort();
    844782
    845         const BoardList::iterator v = GetSlot(slot);
    846         if (v!=fBoards.end())
    847         {
    848             delete v->second.second;
    849             fBoards.erase(v);
    850         }
     783        if (fBoards[slot].first==tcp::endpoint())
     784        {
     785            ostringstream str;
     786            str << "Slot " << slot << " not found.";
     787            T::Warn(str.str());
     788            return T::GetCurrentState();
     789        }
     790
     791        delete fBoards[slot].second;
     792        fBoards[slot] = make_pair(tcp::endpoint(), (ConnectionFAD*)NULL);
    851793
    852794        return T::GetCurrentState();
     
    855797    int ListSlots()
    856798    {
    857         for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    858         {
     799        for (int i=0; i<40; i++)
     800        {
     801            if (fBoards[i].first==tcp::endpoint())
     802                continue;
     803
    859804            ostringstream str;
    860             str << "Slot " << setw(2) << (int)i->first << ": " << i->second.first;
    861 
    862             const ConnectionFAD *c = i->second.second;
     805            str << "Slot " << setw(2) << i << ": " << fBoards[i].first;
     806
     807            const ConnectionFAD *c = fBoards[i].second;
    863808
    864809            if (c->IsConnecting())
     
    872817            }
    873818
    874             switch (fStatus2[i->first])
     819            switch (fStatus2[i])
    875820            {
    876821            case 0:  str << "1-7:not connected)"; break;
    877             case 7:  str << "1-7:connected)";    break;
    878             default: str << "1-7:connecting [" << fStatus2[i->first] << "])";  break;
     822            case 7:  str << "1-7:connected)";     break;
     823            default: str << "1-7:connecting [" << fStatus2[i] << "])"; break;
    879824            }
    880825
     
    892837    }
    893838
    894     void EnableSlot(BoardList::iterator i, bool enable=true)
    895     {
    896         if (i==fBoards.end())
     839    void EnableSlot(int i, bool enable=true)
     840    {
     841        if (fBoards[i].first==tcp::endpoint())
    897842            return;
    898843
    899         ConnectionFAD* &ptr = i->second.second;
     844        ConnectionFAD* &ptr = fBoards[i].second;
     845        if (!ptr)
     846            return;
    900847
    901848        if (!enable)
     
    903850        else
    904851        {
    905             ptr->SetEndpoint(i->second.first);
     852            ostringstream str;
     853            str << fBoards[i].first;
     854            ptr->SetEndpoint(str.str());
    906855            ptr->StartConnect();
    907856        }
     
    910859    void EnableAll(bool enable=true)
    911860    {
    912         for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)
     861        for (int i=0; i<40; i++)
    913862            EnableSlot(i, enable);
    914863    }
    915 
    916     /*
    917     int Enable(const EventImp &evt)
    918     {
    919         if (!CheckEventSize(evt.GetSize(), "Enable", 3))
    920             return T::kSM_FatalError;
    921 
    922         const int16_t slot   = evt.GetShort();
    923         const bool    enable = evt.GetText()[2]>0;
    924 
    925         if (slot<0)
    926         {
    927             EnableAll(enable);
    928             return T::GetCurrentState();
    929         }
    930 
    931         EnableSlot(GetSlot(slot), enable);
    932 
    933         return T::GetCurrentState();
    934     }*/
    935864
    936865    int Disconnect()
     
    941870    }
    942871
     872    int ForceDisconnect()
     873    {
     874        Abort();
     875        EnableAll(false);
     876        return T::GetCurrentState();
     877    }
     878
     879    int CloseOpenFiles()
     880    {
     881        EventBuilderWrapper::CloseOpenFiles();
     882        return T::GetCurrentState();
     883    }
     884
    943885    int Connect()
    944886    {
    945         vector<string> addr;
    946 
    947         for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    948             addr.push_back(i->second.first);
     887        vector<tcp::endpoint> addr(40);
     888
     889        for (int i=0; i<40; i++)
     890            addr[i] = fBoards[i].first;
    949891
    950892        Start(addr);
     
    952894
    953895        return T::GetCurrentState();
    954    }
    955 
    956     /*
    957     int Reconnect(const EventImp &evt)
    958     {
    959         if (!CheckEventSize(evt.GetSize(), "Reconnect", 2))
    960             return T::kSM_FatalError;
    961 
    962         const int16_t slot = evt.GetShort();
    963 
    964         if (slot<0)
    965         {
    966             // Close all connections to supress the warning in SetEndpoint
    967             for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    968                 i->second.second->PostClose(false);
    969 
    970             // Now wait until all connection have been closed and
    971             // all pending handlers have been processed
    972             poll();
    973 
    974             // Now we can reopen the connection
    975             for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    976                 i->second.second->PostClose(true);
    977 
    978             return T::GetCurrentState();
    979         }
    980 
    981         const BoardList::const_iterator v = GetSlot(slot);
    982         if (v==fBoards.end())
    983             return T::GetCurrentState();
    984 
    985         // Close all connections to supress the warning in SetEndpoint
    986         v->second.second->PostClose(false);
    987 
    988         // Now wait until all connection have been closed and
    989         // all pending handlers have been processed
    990         poll();
    991 
    992         // Now we can reopen the connection
    993         v->second.second->PostClose(true);
    994 
    995         return T::GetCurrentState();
    996     }*/
    997 
    998     virtual void UpdateConnectionStatus()
    999     {
    1000         //cout << "Connection Status changed prop to Dim." << endl;
    1001     }
    1002 
    1003     vector<char> fStatus1;
    1004     vector<char> fStatus2;
     896    }
     897
     898    vector<uint8_t> fStatus1;
     899    vector<uint8_t> fStatus2;
    1005900
    1006901    int Execute()
     
    1020915        uint16_t nconnected2  = 0;
    1021916
    1022         vector<char> stat1(40);
    1023         vector<char> stat2(40);
    1024 
    1025         int cnt = 0;
    1026         for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1027         {
    1028             const ConnectionFAD &c = *i->second.second;
    1029 
     917        vector<uint8_t> stat1(40);
     918        vector<uint8_t> stat2(40);
     919
     920        int cnt = 0; // counter for enbled board
     921
     922        for (int idx=0; idx<40; idx++)
     923        {
    1030924            // ----- Command socket -----
    1031             if (c.IsConnecting())
     925            if (fBoards[idx].first!=tcp::endpoint())
    1032926            {
    1033                 stat1[i->first] = 1;
    1034                 nconnecting1++;
     927                const ConnectionFAD *c = fBoards[idx].second;
     928                if (c->IsConnecting())
     929                {
     930                    stat1[idx] = 1;
     931                    nconnecting1++;
     932                }
     933                if (c->IsConnected())
     934                {
     935                    stat1[idx] = 2;
     936                    nconnected1++;
     937                }
     938
     939                cnt++;
    1035940            }
    1036             if (c.IsConnected())
    1037             {
    1038                 stat1[i->first] = 2;
    1039                 nconnected1++;
    1040             }
    1041941
    1042942            // ----- Event builder -----
    1043             stat2[i->first] = GetNumConnected(cnt);
    1044 
    1045             if (!IsConnected(cnt) && !IsDisconnected(cnt))
     943            stat2[idx] = GetNumConnected(idx);
     944
     945            if (!IsConnected(idx) && !IsDisconnected(idx))
    1046946                nconnecting2++;
    1047947
    1048             if (IsConnected(cnt))
     948            if (IsConnected(idx))
    1049949                nconnected2++;
    1050950        }
     
    1056956            fStatus1 = stat1;
    1057957            fStatus2 = stat2;
    1058             UpdateConnectionStatus();
     958            UpdateConnectionStatus(stat1, stat2);
    1059959        }
    1060960
     
    1064964        // event builder:
    1065965
    1066         if (nconnected1==fBoards.size() && nconnected2==fBoards.size())
     966       // FIXME: Evaluate event builder status
     967         if (nconnected1==cnt && nconnected2==cnt && cnt>0)
    1067968            return FAD::kConnected;
    1068969
    1069         if (nconnected1==0 && nconnected2==0)
    1070             return IsThreadRunning() ? FAD::kDisconnected : FAD::kOffline;
    1071 
    1072         // FIXME: Evaluate event builder status
    1073         return FAD::kConnecting;
    1074     }
    1075 
    1076     void AddEndpoint(const string &addr)
    1077     {
    1078         if (fBoards.size()==40)
     970        if (nconnected1!=0 || nconnected2!=0)
     971            return FAD::kConnecting;
     972
     973        // nconnected1 == nconnected2 == 0
     974        return IsThreadRunning() ? FAD::kDisconnected : FAD::kOffline;
     975    }
     976
     977    void AddEndpoint(const tcp::endpoint &addr)
     978    {
     979        int i=0;
     980        while (i<40)
     981        {
     982            if (fBoards[i].first==tcp::endpoint())
     983                break;
     984            i++;
     985        }
     986
     987        if (i==40)
    1079988        {
    1080989            T::Warn("Not more than 40 slots allowed.");
    1081990            return;
    1082         }
    1083 
    1084         int i=0;
    1085         while (1)
    1086         {
    1087             const BoardList::const_iterator v = fBoards.find(i);
    1088             if (v==fBoards.end())
    1089                 break;
    1090             i++;
    1091991        }
    1092992
     
    1098998
    1099999
     1000    DimDescribedService fDimConnection;
     1001 /*
     1002    template<class T>
     1003        void Update(DimDescribedService &svc, const T &data) const
     1004    {
     1005        //cout << "Update: " << svc.getName() << " (" << sizeof(T) << ")" << endl;
     1006        svc.setData(const_cast<T*>(&data), sizeof(T));
     1007        svc.updateService();
     1008    }
     1009 */
     1010    void UpdateConnectionStatus(const vector<uint8_t> &stat1, const vector<uint8_t> &stat2)
     1011    {
     1012        vector<uint8_t> stat(40);
     1013
     1014        for (int i=0; i<40; i++)
     1015            stat[i] = stat1[i]+stat2[i];
     1016
     1017        fDimConnection.setData(stat.data(), 40);
     1018        fDimConnection.updateService();
     1019    }
    11001020
    11011021public:
    11021022    StateMachineFAD(ostream &out=cout) :
    11031023        T(out, "FAD_CONTROL"), EventBuilderWrapper(static_cast<MessageImp&>(*this)), ba::io_service::work(static_cast<ba::io_service&>(*this)),
    1104         fStatus1(40), fStatus2(40)
     1024        fBoards(40), fStatus1(40), fStatus2(40),
     1025        fDimConnection("FAD_CONTROL/CONNECTIONS", "C:41", "")
    11051026    {
    11061027        // ba::io_service::work is a kind of keep_alive for the loop.
     
    12261147            ("");
    12271148
     1149        T::AddEvent("FORCE_DISCONNECT", FAD::kDisconnected, FAD::kConnecting, FAD::kConnected)
     1150            (boost::bind(&StateMachineFAD::ForceDisconnect, this))
     1151            ("");
     1152
     1153        T::AddEvent("CLOSE_OPEN_FILES", FAD::kConnecting, FAD::kConnected)
     1154            (boost::bind(&StateMachineFAD::CloseOpenFiles, this))
     1155            ("");
     1156
    12281157        T::AddEvent("TEST", "S:1")
    12291158            (boost::bind(&StateMachineFAD::Test, this, _1))
     
    12461175    {
    12471176        for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++)
    1248             delete i->second.second;
     1177            delete i->second;
    12491178        fBoards.clear();
     1179    }
     1180
     1181    tcp::endpoint GetEndpoint(const string &base)
     1182    {
     1183        const size_t p0 = base.find_first_of(':');
     1184        const size_t p1 = base.find_last_of(':');
     1185
     1186        if (p0==string::npos || p0!=p1)
     1187        {
     1188           T::Out() << kRed << "GetEndpoint - Wrong format ('host:port' expected)" << endl;
     1189           return tcp::endpoint();
     1190        }
     1191
     1192        tcp::resolver resolver(get_io_service());
     1193
     1194        boost::system::error_code ec;
     1195
     1196        const tcp::resolver::query query(base.substr(0, p0), base.substr(p0+1));
     1197        const tcp::resolver::iterator iterator = resolver.resolve(query, ec);
     1198
     1199        if (ec)
     1200        {
     1201           T::Out() << kRed << "GetEndpoint - Couldn't resolve endpoint '" << base << "': " << ec.message();
     1202           return tcp::endpoint();
     1203        }
     1204
     1205        return *iterator;
    12501206    }
    12511207
     
    12591215
    12601216        // vvvvv for debugging vvvvv
    1261         if (conf.Has("debug-port"))
    1262         {
    1263             const int port = conf.Get<unsigned int>("debug-port");
    1264             const int num  = conf.Get<unsigned int>("debug-num");
     1217        if (conf.Has("debug-addr"))
     1218        {
     1219            const string addr = conf.Get<string>("debug-addr");
     1220            const int    num  = conf.Get<unsigned int>("debug-num");
     1221
     1222            const tcp::endpoint endpoint = GetEndpoint(addr);
     1223            if (endpoint==tcp::endpoint())
     1224                return false;
     1225
    12651226            for (int i=0; i<num; i++)
    1266             {
    1267                 ostringstream str;
    1268                 str << "localhost:" << port+8*i;
    1269                 AddEndpoint(str.str());
    1270             }
     1227                AddEndpoint(tcp::endpoint(endpoint.address(), endpoint.port()+8*i));
     1228
    12711229            Connect();
    12721230            return true;
     
    12841242            const string base = conf.Get<string>("base-addr");
    12851243
    1286             const size_t p0 = base.find_first_of(':');
    1287             const size_t p1 = base.find_last_of(':');
    1288 
    1289             if (p0==string::npos || p0!=p1)
    1290             {
    1291                 T::Out() << kRed << "SetConfiguration - Wrong format of argument --base-addr ('host:port' expected)" << endl;
     1244            const tcp::endpoint endpoint = GetEndpoint(base);
     1245            if (endpoint==tcp::endpoint())
    12921246                return false;
    1293             }
    1294 
    1295             tcp::resolver resolver(get_io_service());
    1296 
    1297             boost::system::error_code ec;
    1298 
    1299             const tcp::resolver::query query(base.substr(0, p0), base.substr(p0+1));
    1300             const tcp::resolver::iterator iterator = resolver.resolve(query, ec);
    1301 
    1302             if (ec)
    1303             {
    1304                T::Out() << " " << ec.message() << " (" << ec << ")";
    1305                return false;
    1306             }
    1307 
    1308             const tcp::endpoint endpoint = *iterator;
    13091247
    13101248            const ba::ip::address_v4::bytes_type ip = endpoint.address().to_v4().to_bytes();
     
    13161254            }
    13171255
    1318             for (int crate=0; crate<2; crate++)
     1256            for (int crate=0; crate<4; crate++)
    13191257                for (int board=0; board<10; board++)
    13201258                {
    1321                     //if (crate==0 && board==2)
    1322                     //    continue;
    1323 
    1324                     ostringstream str;
    1325                     str << (int)ip[0] << "." << (int)ip[1] << ".";
    1326                     str << (int)(ip[2]+crate) << "." << (int)(ip[3]+board) << ":";
    1327                     str << endpoint.port();
    1328 
    1329                     AddEndpoint(str.str());
     1259                    ba::ip::address_v4::bytes_type target = endpoint.address().to_v4().to_bytes();
     1260                    target[2] += crate;
     1261                    target[3] += board;
     1262
     1263                    AddEndpoint(tcp::endpoint(ba::ip::address_v4(target), endpoint.port()));
    13301264                }
    13311265        }
     
    13351269            const vector<string> addrs = conf.Get<vector<string>>("addr");
    13361270            for (vector<string>::const_iterator i=addrs.begin(); i<addrs.end(); i++)
    1337                 AddEndpoint(*i);
     1271            {
     1272                const tcp::endpoint endpoint = GetEndpoint(*i);
     1273                if (endpoint==tcp::endpoint())
     1274                    return false;
     1275
     1276                AddEndpoint(endpoint);
     1277            }
    13381278        }
    13391279
     
    14461386    po::options_description connect("FAD connection options");
    14471387    connect.add_options()
    1448         ("addr",       vars<string>(),     "Network address of FAD")
    1449         ("base-addr",  var<string>(),      "Base address of all FAD")
    1450         ("debug-num,n",  var<unsigned int>(40),  "Sets the number of fake boards to be connected locally")
    1451         ("debug-port,p", var<unsigned int>(),    "Sets <debug-num> addresses to 'localhost:<debug-port>' in steps of 8")
     1388        ("addr",        vars<string>(),     "Network address of FAD")
     1389        ("base-addr",   var<string>(),      "Base address of all FAD")
     1390        ("debug-num,n", var<unsigned int>(40),  "Sets the number of fake boards to be connected locally")
     1391        ("debug-addr",  var<string>(),    "")
    14521392        ;
    14531393
Note: See TracChangeset for help on using the changeset viewer.