Changeset 10940
- Timestamp:
- 06/08/11 20:20:03 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/fadctrl.cc
r10882 r10940 101 101 for (unsigned int ch=0; ch<FAD::kNumChannelsPerChip; ch++) 102 102 Out() << " " << setw(4) << fChannelHeader[c*FAD::kNumChannelsPerChip+ch].fStartCell; 103 Out() << endl;104 103 } 105 104 … … 306 305 void PostCmd(std::vector<uint16_t> cmd) 307 306 { 307 #ifdef DEBUG_TX 308 308 ostringstream msg; 309 309 msg << "Sending command:" << hex; … … 311 311 msg << " (+ " << cmd.size()-1 << " bytes data)"; 312 312 Message(msg); 313 313 #endif 314 314 transform(cmd.begin(), cmd.end(), cmd.begin(), htons); 315 315 … … 319 319 void PostCmd(uint16_t cmd) 320 320 { 321 #ifdef DEBUG_TX 321 322 ostringstream msg; 322 323 msg << "Sending command:" << hex; 323 324 msg << " 0x" << setw(4) << setfill('0') << cmd; 324 325 Message(msg); 325 326 #endif 326 327 cmd = htons(cmd); 327 328 PostMessage(&cmd, sizeof(uint16_t)); … … 330 331 void PostCmd(uint16_t cmd, uint16_t data) 331 332 { 333 #ifdef DEBUG_TX 332 334 ostringstream msg; 333 335 msg << "Sending command:" << hex; … … 335 337 msg << " 0x" << setw(4) << setfill('0') << data; 336 338 Message(msg); 337 339 #endif 338 340 const uint16_t d[2] = { htons(cmd), htons(data) }; 339 341 PostMessage(d, sizeof(d)); … … 505 507 506 508 // ------------------------------------------------------------------------ 507 /*508 509 #include "DimDescriptionService.h" 509 510 class ConnectionDimFAD : public ConnectionFAD511 {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) const521 {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 Z559 };560 */561 // ------------------------------------------------------------------------562 563 510 #include "EventBuilderWrapper.h" 564 511 … … 569 516 { 570 517 private: 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; 574 520 575 521 BoardList fBoards; … … 593 539 { 594 540 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 595 i->second .second->Cmd(command);541 i->second->Cmd(command); 596 542 597 543 return T::GetCurrentState(); … … 604 550 605 551 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()); 607 553 608 554 return T::GetCurrentState(); … … 641 587 642 588 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]); 644 590 645 591 return T::GetCurrentState(); … … 659 605 660 606 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]); 662 608 663 609 return T::GetCurrentState(); … … 675 621 676 622 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]); 678 624 679 625 return T::GetCurrentState(); … … 684 630 for (int nn=0; nn<n; nn++) 685 631 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 686 i->second .second->Cmd(FAD::kCmdSingleTrigger);632 i->second->Cmd(FAD::kCmdSingleTrigger); 687 633 688 634 return T::GetCurrentState(); … … 705 651 706 652 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); 708 654 709 655 return T::GetCurrentState(); … … 716 662 717 663 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 718 i->second .second->CmdPhaseShift(evt.GetShort());664 i->second->CmdPhaseShift(evt.GetShort()); 719 665 720 666 return T::GetCurrentState(); … … 735 681 736 682 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 737 i->second .second->CmdSetTriggerRate(evt.GetUInt());683 i->second->CmdSetTriggerRate(evt.GetUInt()); 738 684 739 685 return T::GetCurrentState(); … … 756 702 757 703 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 758 i->second .second->CmdSetRunNumber(num);704 i->second->CmdSetRunNumber(num); 759 705 760 706 return T::GetCurrentState(); … … 779 725 780 726 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 781 i->second .second->SetVerbose(evt.GetBool());727 i->second->SetVerbose(evt.GetBool()); 782 728 783 729 return T::GetCurrentState(); … … 790 736 791 737 for (BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++) 792 i->second .second->SetHexOutput(evt.GetBool());738 i->second->SetHexOutput(evt.GetBool()); 793 739 794 740 return T::GetCurrentState(); … … 801 747 802 748 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(); 818 752 } 819 753 … … 822 756 const string addr = Tools::Trim(evt.GetText()); 823 757 758 const tcp::endpoint endpoint = GetEndpoint(addr); 759 if (endpoint==tcp::endpoint()) 760 return T::GetCurrentState(); 761 824 762 for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++) 825 763 { 826 if (i-> second.first==addr)764 if (i->first==endpoint) 827 765 { 828 766 T::Warn("Address "+addr+" already known.... ignored."); … … 831 769 } 832 770 833 AddEndpoint( addr);771 AddEndpoint(endpoint); 834 772 835 773 return T::GetCurrentState(); … … 843 781 const int16_t slot = evt.GetShort(); 844 782 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); 851 793 852 794 return T::GetCurrentState(); … … 855 797 int ListSlots() 856 798 { 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 859 804 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; 863 808 864 809 if (c->IsConnecting()) … … 872 817 } 873 818 874 switch (fStatus2[i ->first])819 switch (fStatus2[i]) 875 820 { 876 821 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; 879 824 } 880 825 … … 892 837 } 893 838 894 void EnableSlot( BoardList::iteratori, 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()) 897 842 return; 898 843 899 ConnectionFAD* &ptr = i->second.second; 844 ConnectionFAD* &ptr = fBoards[i].second; 845 if (!ptr) 846 return; 900 847 901 848 if (!enable) … … 903 850 else 904 851 { 905 ptr->SetEndpoint(i->second.first); 852 ostringstream str; 853 str << fBoards[i].first; 854 ptr->SetEndpoint(str.str()); 906 855 ptr->StartConnect(); 907 856 } … … 910 859 void EnableAll(bool enable=true) 911 860 { 912 for ( BoardList::iterator i=fBoards.begin(); i!=fBoards.end(); i++)861 for (int i=0; i<40; i++) 913 862 EnableSlot(i, enable); 914 863 } 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 }*/935 864 936 865 int Disconnect() … … 941 870 } 942 871 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 943 885 int Connect() 944 886 { 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; 949 891 950 892 Start(addr); … … 952 894 953 895 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; 1005 900 1006 901 int Execute() … … 1020 915 uint16_t nconnected2 = 0; 1021 916 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 { 1030 924 // ----- Command socket ----- 1031 if ( c.IsConnecting())925 if (fBoards[idx].first!=tcp::endpoint()) 1032 926 { 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++; 1035 940 } 1036 if (c.IsConnected())1037 {1038 stat1[i->first] = 2;1039 nconnected1++;1040 }1041 941 1042 942 // ----- 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)) 1046 946 nconnecting2++; 1047 947 1048 if (IsConnected( cnt))948 if (IsConnected(idx)) 1049 949 nconnected2++; 1050 950 } … … 1056 956 fStatus1 = stat1; 1057 957 fStatus2 = stat2; 1058 UpdateConnectionStatus( );958 UpdateConnectionStatus(stat1, stat2); 1059 959 } 1060 960 … … 1064 964 // event builder: 1065 965 1066 if (nconnected1==fBoards.size() && nconnected2==fBoards.size()) 966 // FIXME: Evaluate event builder status 967 if (nconnected1==cnt && nconnected2==cnt && cnt>0) 1067 968 return FAD::kConnected; 1068 969 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) 1079 988 { 1080 989 T::Warn("Not more than 40 slots allowed."); 1081 990 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++;1091 991 } 1092 992 … … 1098 998 1099 999 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 } 1100 1020 1101 1021 public: 1102 1022 StateMachineFAD(ostream &out=cout) : 1103 1023 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", "") 1105 1026 { 1106 1027 // ba::io_service::work is a kind of keep_alive for the loop. … … 1226 1147 (""); 1227 1148 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 1228 1157 T::AddEvent("TEST", "S:1") 1229 1158 (boost::bind(&StateMachineFAD::Test, this, _1)) … … 1246 1175 { 1247 1176 for (BoardList::const_iterator i=fBoards.begin(); i!=fBoards.end(); i++) 1248 delete i->second .second;1177 delete i->second; 1249 1178 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; 1250 1206 } 1251 1207 … … 1259 1215 1260 1216 // 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 1265 1226 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 1271 1229 Connect(); 1272 1230 return true; … … 1284 1242 const string base = conf.Get<string>("base-addr"); 1285 1243 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()) 1292 1246 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;1309 1247 1310 1248 const ba::ip::address_v4::bytes_type ip = endpoint.address().to_v4().to_bytes(); … … 1316 1254 } 1317 1255 1318 for (int crate=0; crate< 2; crate++)1256 for (int crate=0; crate<4; crate++) 1319 1257 for (int board=0; board<10; board++) 1320 1258 { 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())); 1330 1264 } 1331 1265 } … … 1335 1269 const vector<string> addrs = conf.Get<vector<string>>("addr"); 1336 1270 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 } 1338 1278 } 1339 1279 … … 1446 1386 po::options_description connect("FAD connection options"); 1447 1387 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", 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>(), "") 1452 1392 ; 1453 1393
Note:
See TracChangeset
for help on using the changeset viewer.