Changeset 13910
- Timestamp:
- 05/26/12 14:18:15 (13 years ago)
- Location:
- trunk/FACT++/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/FACT++/src/HeadersFAD.h
r12998 r13910 55 55 }; 56 56 57 enum States 58 { 59 // State Machine states 60 kOffline = 1, // StateMachineImp::kSM_UserMode 61 kDisconnected, 62 kConnecting, 63 kConnected, 64 kConfiguring1, 65 kConfiguring2, 66 kConfigured, 67 kWritingData 68 }; 57 namespace State 58 { 59 enum States 60 { 61 // State Machine states 62 kOffline = 1, // StateMachineImp::kSM_UserMode 63 kDisconnected, 64 kConnecting, 65 kConnected, 66 kConfiguring1, 67 kConfiguring2, 68 kConfigured, 69 kWritingData 70 }; 71 } 69 72 70 73 enum FileFormat_t -
trunk/FACT++/src/HeadersFTM.h
r13760 r13910 32 32 // running: not locked: 0x2713 33 33 34 enum StateMachine 35 { 36 kDisconnected = 1, //= ConnectionFTM::kDisconnected, 37 kConnected, //= ConnectionFTM::kConnected, 38 kIdle, //= ConnectionFTM::kIdle, 39 kTriggerOn, //= ConnectionFTM::kTriggerOn, 40 kConfiguring1, 41 kConfiguring2, 42 kConfigured, 43 44 kConfigError1 = 0x101, 45 kConfigError2 = 0x102, 46 }; 34 namespace State 35 { 36 enum StateMachine 37 { 38 kDisconnected = 1, //= ConnectionFTM::kDisconnected, 39 kConnected, //= ConnectionFTM::kConnected, 40 kIdle, //= ConnectionFTM::kIdle, 41 kTriggerOn, //= ConnectionFTM::kTriggerOn, 42 kConfiguring1, 43 kConfiguring2, 44 kConfigured, 45 46 kConfigError1 = 0x101, 47 kConfigError2 = 0x102, 48 }; 49 } 47 50 48 51 /// Command codes for FTM communication -
trunk/FACT++/src/fadctrl.cc
r13900 r13910 1073 1073 fNightAsInt = InitRunNumber(); 1074 1074 if (fNightAsInt<0) 1075 return FAD:: kConnected;1075 return FAD::State::kConnected; 1076 1076 } 1077 1077 … … 1125 1125 fConfigTimer = Time(); 1126 1126 1127 return FAD:: kConfiguring1;1127 return FAD::State::kConfiguring1; 1128 1128 } 1129 1129 … … 1133 1133 fDimStartRun.Update(runs); 1134 1134 1135 return FAD:: kConnected;1135 return FAD::State::kConnected; 1136 1136 } 1137 1137 … … 1434 1434 if (nconnecting1==0 && nconnected1>0 && nconnected2==nconnected1) 1435 1435 { 1436 if (T::GetCurrentState()==FAD:: kConfiguring1)1436 if (T::GetCurrentState()==FAD::State::kConfiguring1) 1437 1437 { 1438 1438 // We need some delay so that the FAD is not busy anymore … … 1440 1440 // FIXME: Do we need this to be configurable? 1441 1441 if (Time()-fConfigTimer<boost::posix_time::milliseconds(3000)) 1442 return FAD:: kConfiguring1;1442 return FAD::State::kConfiguring1; 1443 1443 1444 1444 for (BoardList::iterator it=fBoards.begin(); it!=fBoards.end(); it++) 1445 1445 it->second->Cmd(FAD::kCmdSingleTrigger); 1446 1446 1447 return FAD:: kConfiguring2;1447 return FAD::State::kConfiguring2; 1448 1448 } 1449 1449 1450 1450 // If all boards are configured and we are configuring 1451 1451 // go on and start the FADs 1452 if (T::GetCurrentState()==FAD:: kConfiguring2)1452 if (T::GetCurrentState()==FAD::State::kConfiguring2) 1453 1453 { 1454 1454 // If not all boards have yet received the proper 1455 1455 // configuration 1456 1456 if (nconfigured!=nconnected1) 1457 return FAD:: kConfiguring2;1457 return FAD::State::kConfiguring2; 1458 1458 1459 1459 // FIXME: Distinguish between not all boards have received … … 1477 1477 // successfully enabled the trigger lines? 1478 1478 } 1479 return FAD:: kConfigured;1480 } 1481 1482 if (T::GetCurrentState()==FAD:: kConfigured)1479 return FAD::State::kConfigured; 1480 } 1481 1482 if (T::GetCurrentState()==FAD::State::kConfigured) 1483 1483 { 1484 1484 // Stay in Configured as long as we have a valid … … 1487 1487 // first event) 1488 1488 if (!IsRunStarted() && nconfigured==nconnected1) 1489 return FAD:: kConfigured;1489 return FAD::State::kConfigured; 1490 1490 1491 1491 if (IsRunStarted()) … … 1495 1495 } 1496 1496 1497 return GetNumFilesOpen()>0 ? FAD:: kWritingData : FAD::kConnected;1497 return GetNumFilesOpen()>0 ? FAD::State::kWritingData : FAD::State::kConnected; 1498 1498 } 1499 1499 1500 1500 if (nconnecting1>0 || nconnecting2>0 || nconnected1!=nconnected2) 1501 return FAD:: kConnecting;1501 return FAD::State::kConnecting; 1502 1502 1503 1503 // nconnected1 == nconnected2 == 0 1504 return runs ? FAD:: kDisconnected : FAD::kOffline;1504 return runs ? FAD::State::kDisconnected : FAD::State::kOffline; 1505 1505 } 1506 1506 … … 1571 1571 1572 1572 // State names 1573 T::AddStateName(FAD:: kOffline, "Disengaged",1573 T::AddStateName(FAD::State::kOffline, "Disengaged", 1574 1574 "All enabled FAD boards are disconnected and the event-builer thread is not running."); 1575 1575 1576 T::AddStateName(FAD:: kDisconnected, "Disconnected",1576 T::AddStateName(FAD::State::kDisconnected, "Disconnected", 1577 1577 "All enabled FAD boards are disconnected, but the event-builder thread is running."); 1578 1578 1579 T::AddStateName(FAD:: kConnecting, "Connecting",1579 T::AddStateName(FAD::State::kConnecting, "Connecting", 1580 1580 "Only some enabled FAD boards are connected."); 1581 1581 1582 T::AddStateName(FAD:: kConnected, "Connected",1582 T::AddStateName(FAD::State::kConnected, "Connected", 1583 1583 "All enabled FAD boards are connected.."); 1584 1584 1585 T::AddStateName(FAD:: kConfiguring1, "Configuring1",1585 T::AddStateName(FAD::State::kConfiguring1, "Configuring1", 1586 1586 "Waiting 3 seconds for all FADs to be configured before requesting configuration."); 1587 1587 1588 T::AddStateName(FAD:: kConfiguring2, "Configuring2",1588 T::AddStateName(FAD::State::kConfiguring2, "Configuring2", 1589 1589 "Waiting until all boards returned their configuration and they are valid."); 1590 1590 1591 T::AddStateName(FAD:: kConfigured, "Configured",1591 T::AddStateName(FAD::State::kConfigured, "Configured", 1592 1592 "The configuration of all boards was successfully cross checked. Waiting for events with a new run number to receive."); 1593 1593 1594 T::AddStateName(FAD:: kWritingData, "WritingData",1594 T::AddStateName(FAD::State::kWritingData, "WritingData", 1595 1595 "The event builder has an open file (that does not mean that new events are currently received)"); 1596 1596 1597 1597 // FAD Commands 1598 T::AddEvent("SEND_CMD", "I:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1598 T::AddEvent("SEND_CMD", "I:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1599 1599 (bind(&StateMachineFAD::SendCmd, this, placeholders::_1)) 1600 1600 ("Send a command to the FADs. Values between 0 and 0xffff are allowed." 1601 1601 "|command[uint16]:Command to be transmittted."); 1602 T::AddEvent("SEND_DATA", "I:2", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1602 T::AddEvent("SEND_DATA", "I:2", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1603 1603 (bind(&StateMachineFAD::SendCmdData, this, placeholders::_1)) 1604 1604 ("Send a command with data to the FADs. Values between 0 and 0xffff are allowed." … … 1606 1606 "|data[uint16]:Data to be sent with the command."); 1607 1607 1608 T::AddEvent("ENABLE_SRCLK", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1608 T::AddEvent("ENABLE_SRCLK", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1609 1609 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdSrclk)) 1610 1610 ("Set SRCLK"); 1611 T::AddEvent("ENABLE_BUSY_OFF", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1611 T::AddEvent("ENABLE_BUSY_OFF", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1612 1612 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdBusyOff)) 1613 1613 ("Set BUSY continously low"); 1614 T::AddEvent("ENABLE_BUSY_ON", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1614 T::AddEvent("ENABLE_BUSY_ON", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1615 1615 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdBusyOn)) 1616 1616 ("Set BUSY constantly high (has priority over BUSY_OFF)"); 1617 T::AddEvent("ENABLE_SCLK", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1617 T::AddEvent("ENABLE_SCLK", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1618 1618 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdSclk)) 1619 1619 ("Set SCLK"); 1620 T::AddEvent("ENABLE_DRS", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1620 T::AddEvent("ENABLE_DRS", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1621 1621 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdDrsEnable)) 1622 1622 ("Switch Domino wave"); 1623 T::AddEvent("ENABLE_DWRITE", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1623 T::AddEvent("ENABLE_DWRITE", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1624 1624 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdDwrite)) 1625 1625 ("Set Dwrite (possibly high / always low)"); 1626 T::AddEvent("ENABLE_CONTINOUS_TRIGGER", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1626 T::AddEvent("ENABLE_CONTINOUS_TRIGGER", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1627 1627 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdContTrigger)) 1628 1628 ("Enable continous (internal) trigger."); 1629 T::AddEvent("ENABLE_TRIGGER_LINE", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1629 T::AddEvent("ENABLE_TRIGGER_LINE", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1630 1630 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdTriggerLine)) 1631 1631 ("Incoming triggers can be accepted/will not be accepted"); 1632 T::AddEvent("ENABLE_COMMAND_SOCKET_MODE", "B:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1632 T::AddEvent("ENABLE_COMMAND_SOCKET_MODE", "B:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1633 1633 (bind(&StateMachineFAD::CmdEnable, this, placeholders::_1, FAD::kCmdSocket)) 1634 1634 ("Set debug mode (yes: dump events through command socket, no=dump events through other sockets)"); 1635 1635 1636 T::AddEvent("SET_TRIGGER_RATE", "I:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1636 T::AddEvent("SET_TRIGGER_RATE", "I:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1637 1637 (bind(&StateMachineFAD::SetTriggerRate, this, placeholders::_1)) 1638 1638 ("Enable continous trigger"); … … 1640 1640 (bind(&StateMachineFAD::Trigger, this, 1)) 1641 1641 ("Issue software triggers"); 1642 T::AddEvent("SEND_N_TRIGGERS", "I", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1642 T::AddEvent("SEND_N_TRIGGERS", "I", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1643 1643 (bind(&StateMachineFAD::SendTriggers, this, placeholders::_1)) 1644 1644 ("Issue N software triggers (note that these are the triggers sent, not the triggers executed)" … … 1652 1652 (""); 1653 1653 */ 1654 T::AddEvent("PHASE_SHIFT", "S:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1654 T::AddEvent("PHASE_SHIFT", "S:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1655 1655 (bind(&StateMachineFAD::PhaseShift, this, placeholders::_1)) 1656 1656 ("Adjust ADC phase (in 'steps')" 1657 1657 "|phase[short]"); 1658 1658 1659 T::AddEvent("RESET_EVENT_COUNTER", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1659 T::AddEvent("RESET_EVENT_COUNTER", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1660 1660 (bind(&StateMachineFAD::Cmd, this, FAD::kCmdResetEventCounter)) 1661 1661 ("Reset the FAD boards' event counter to 0."); 1662 1662 1663 T::AddEvent("SET_RUN_NUMBER", "X:1", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1663 T::AddEvent("SET_RUN_NUMBER", "X:1", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1664 1664 (bind(&StateMachineFAD::SetRunNumber, this, placeholders::_1)) 1665 1665 ("Sent a new run-number to the boards" … … 1671 1671 "|memory[short]:Buffer size in Mega-bytes."); 1672 1672 1673 T::AddEvent("SET_REGISTER", "I:2", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1673 T::AddEvent("SET_REGISTER", "I:2", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1674 1674 (bind(&StateMachineFAD::SetRegister, this, placeholders::_1)) 1675 1675 ("set register to value" … … 1678 1678 1679 1679 // FIXME: Maybe add a mask which channels should be set? 1680 T::AddEvent("SET_REGION_OF_INTEREST", "I:2", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1680 T::AddEvent("SET_REGION_OF_INTEREST", "I:2", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1681 1681 (bind(&StateMachineFAD::SetRoi, this, placeholders::_1)) 1682 1682 ("Set region-of-interest to value" … … 1685 1685 1686 1686 // FIXME: Maybe add a mask which channels should be set? 1687 T::AddEvent("SET_DAC_VALUE", "I:2", FAD:: kConnecting, FAD::kConnected, FAD::kWritingData)1687 T::AddEvent("SET_DAC_VALUE", "I:2", FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1688 1688 (bind(&StateMachineFAD::SetDac, this, placeholders::_1)) 1689 1689 ("Set DAC numbers in range to value" … … 1691 1691 "|val[short]:Value to be set"); 1692 1692 1693 T::AddEvent("CONFIGURE", "X:2;C", FAD:: kConnected, FAD::kConfigured, FAD::kWritingData)1693 T::AddEvent("CONFIGURE", "X:2;C", FAD::State::kConnected, FAD::State::kConfigured, FAD::State::kWritingData) 1694 1694 (bind(&StateMachineFAD::StartConfigure, this, placeholders::_1)) 1695 1695 ("Configure a new run. If the internla trigger is enabled this might even start a new run." … … 1698 1698 "|run_type[string]:Run type which describes the runs"); 1699 1699 1700 T::AddEvent("RESET_CONFIGURE", FAD:: kConfiguring1, FAD::kConfiguring2, FAD::kConfigured)1700 T::AddEvent("RESET_CONFIGURE", FAD::State::kConfiguring1, FAD::State::kConfiguring2, FAD::State::kConfigured) 1701 1701 (bind(&StateMachineFAD::ResetConfig, this)) 1702 1702 ("If configuration failed and the fadctrl is waiting for something, use this to reset the state."); … … 1769 1769 "|enable[bool]:Whether the event builder should ignore data from this slot (yes) or allowed (no)"); 1770 1770 1771 T::AddEvent("CLOSE_OPEN_FILES", FAD:: kDisconnected, FAD::kConnecting, FAD::kConnected, FAD::kWritingData)1771 T::AddEvent("CLOSE_OPEN_FILES", FAD::State::kDisconnected, FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1772 1772 (bind(&StateMachineFAD::CloseOpenFiles, this)) 1773 1773 ("Close all run files opened by the EventBuilder."); … … 1780 1780 1781 1781 // Conenction commands 1782 T::AddEvent("START", FAD:: kOffline)1782 T::AddEvent("START", FAD::State::kOffline) 1783 1783 (bind(&StateMachineFAD::StartConnection, this)) 1784 1784 ("Start EventBuilder thread and connect all valid slots."); 1785 1785 1786 T::AddEvent("STOP", FAD:: kDisconnected, FAD::kConnecting, FAD::kConnected, FAD::kWritingData)1786 T::AddEvent("STOP", FAD::State::kDisconnected, FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1787 1787 (bind(&StateMachineFAD::StopConnection, this)) 1788 1788 ("Stop EventBuilder thread (still write buffered events) and disconnect all slots."); 1789 1789 1790 T::AddEvent("ABORT", FAD:: kDisconnected, FAD::kConnecting, FAD::kConnected, FAD::kWritingData)1790 T::AddEvent("ABORT", FAD::State::kDisconnected, FAD::State::kConnecting, FAD::State::kConnected, FAD::State::kWritingData) 1791 1791 (bind(&StateMachineFAD::AbortConnection, this)) 1792 1792 ("Immediately abort EventBuilder thread and disconnect all slots."); 1793 1793 1794 T::AddEvent("SOFT_RESET", FAD:: kConnected, FAD::kWritingData)1794 T::AddEvent("SOFT_RESET", FAD::State::kConnected, FAD::State::kWritingData) 1795 1795 (bind(&StateMachineFAD::Reset, this, true)) 1796 1796 ("Wait for buffers to drain, close all files and reinitialize event builder thread."); 1797 1797 1798 T::AddEvent("HARD_RESET", FAD:: kConnected, FAD::kWritingData)1798 T::AddEvent("HARD_RESET", FAD::State::kConnected, FAD::State::kWritingData) 1799 1799 (bind(&StateMachineFAD::Reset, this, false)) 1800 1800 ("Free all buffers, close all files and reinitialize event builder thread."); 1801 1801 1802 T::AddEvent("CONNECT", "S:1", FAD:: kDisconnected, FAD::kConnecting, FAD::kConnected)1802 T::AddEvent("CONNECT", "S:1", FAD::State::kDisconnected, FAD::State::kConnecting, FAD::State::kConnected) 1803 1803 (bind(&StateMachineFAD::EnableSlot, this, placeholders::_1, true)) 1804 1804 ("Connect a disconnected slot."); 1805 1805 1806 T::AddEvent("DISCONNECT", "S:1", FAD:: kConnecting, FAD::kConnected)1806 T::AddEvent("DISCONNECT", "S:1", FAD::State::kConnecting, FAD::State::kConnected) 1807 1807 (bind(&StateMachineFAD::EnableSlot, this, placeholders::_1, false)) 1808 1808 ("Disconnect a connected slot."); 1809 1809 1810 T::AddEvent("TOGGLE", "S:1", FAD:: kDisconnected, FAD::kConnecting, FAD::kConnected)1810 T::AddEvent("TOGGLE", "S:1", FAD::State::kDisconnected, FAD::State::kConnecting, FAD::State::kConnected) 1811 1811 (bind(&StateMachineFAD::ToggleSlot, this, placeholders::_1)) 1812 1812 (""); … … 1830 1830 1831 1831 1832 T::AddEvent("ADD_ADDRESS", "C", FAD:: kOffline)1832 T::AddEvent("ADD_ADDRESS", "C", FAD::State::kOffline) 1833 1833 (bind(&StateMachineFAD::AddAddress, this, placeholders::_1)) 1834 1834 ("Add the address of a DRS4 board to the first free slot" 1835 1835 "|IP[string]:address in the format <address:port>"); 1836 T::AddEvent("REMOVE_SLOT", "S:1", FAD:: kOffline)1836 T::AddEvent("REMOVE_SLOT", "S:1", FAD::State::kOffline) 1837 1837 (bind(&StateMachineFAD::RemoveSlot, this, placeholders::_1)) 1838 1838 ("Remove the Iaddress in slot n. For a list see LIST" -
trunk/FACT++/src/ftmctrl.cc
r13829 r13910 20 20 21 21 using namespace std; 22 using namespace std::placeholders;23 22 24 23 // ------------------------------------------------------------------------ … … 1888 1887 fFTM.CmdStopRun(); 1889 1888 1890 return FTM:: kConfiguring1;1889 return FTM::State::kConfiguring1; 1891 1890 } 1892 1891 … … 1909 1908 switch (fFTM.GetState()) 1910 1909 { 1911 case ConnectionFTM::kDisconnected: return FTM:: kDisconnected;1912 case ConnectionFTM::kConnected: return FTM:: kConnected;1910 case ConnectionFTM::kDisconnected: return FTM::State::kDisconnected; 1911 case ConnectionFTM::kConnected: return FTM::State::kConnected; 1913 1912 default: 1914 1913 break; … … 1917 1916 switch (T::GetCurrentState()) 1918 1917 { 1919 case FTM:: kConfiguring1:1918 case FTM::State::kConfiguring1: 1920 1919 // If FTM has received an anwer to the stop_run command 1921 1920 // the counter for the registers has been increased … … 1927 1926 if (fFTM.GetState()!=ConnectionFTM::kIdle && 1928 1927 fFTM.GetState()!=ConnectionFTM::kConfigured) 1929 return FTM:: kConfigError1;1928 return FTM::State::kConfigError1; 1930 1929 1931 1930 fCounterStat = fFTM.GetCounter(FTM::kStaticData); … … 1936 1935 1937 1936 // Next state is: wait for the answer to our configuration 1938 return FTM:: kConfiguring2;1939 1940 case FTM:: kConfiguring2:1941 case FTM:: kConfigured:1937 return FTM::State::kConfiguring2; 1938 1939 case FTM::State::kConfiguring2: 1940 case FTM::State::kConfigured: 1942 1941 // If FTM has received an anwer to the stop_run command 1943 1942 // the counter for the registers has been increased … … 1949 1948 // ====================== 1950 1949 if (fFTM.GetState()!=ConnectionFTM::kConfigured) 1951 return FTM:: kConfigError2;1950 return FTM::State::kConfigError2; 1952 1951 // ====================== 1953 1952 … … 1960 1959 1961 1960 // Next state is: wait for the answer to our configuration 1962 return FTM:: kConfigured;1961 return FTM::State::kConfigured; 1963 1962 1964 1963 default: 1965 1964 switch (fFTM.GetState()) 1966 1965 { 1967 case ConnectionFTM::kIdle: return FTM:: kIdle;1968 case ConnectionFTM::kConfigured: return FTM:: kIdle;1969 case ConnectionFTM::kTriggerOn: return FTM:: kTriggerOn;1966 case ConnectionFTM::kIdle: return FTM::State::kIdle; 1967 case ConnectionFTM::kConfigured: return FTM::State::kIdle; 1968 case ConnectionFTM::kTriggerOn: return FTM::State::kTriggerOn; 1970 1969 default: 1971 1970 throw runtime_error("StateMachienFTM - Execute() - Inavlid state."); … … 1973 1972 } 1974 1973 1975 if (T::GetCurrentState()==FTM:: kConfigured &&1974 if (T::GetCurrentState()==FTM::State::kConfigured && 1976 1975 fFTM.GetState()==ConnectionFTM::kTriggerOn) 1977 return FTM:: kTriggerOn;1976 return FTM::State::kTriggerOn; 1978 1977 1979 1978 return T::GetCurrentState(); … … 1994 1993 1995 1994 // State names 1996 T::AddStateName(FTM:: kDisconnected, "Disconnected",1995 T::AddStateName(FTM::State::kDisconnected, "Disconnected", 1997 1996 "FTM board not connected via ethernet."); 1998 1997 1999 T::AddStateName(FTM:: kConnected, "Connected",1998 T::AddStateName(FTM::State::kConnected, "Connected", 2000 1999 "Ethernet connection to FTM established (no state received yet)."); 2001 2000 2002 T::AddStateName(FTM:: kIdle, "Idle",2001 T::AddStateName(FTM::State::kIdle, "Idle", 2003 2002 "Ethernet connection to FTM established, FTM in idle state."); 2004 2003 2005 T::AddStateName(FTM:: kConfiguring1, "Configuring1",2004 T::AddStateName(FTM::State::kConfiguring1, "Configuring1", 2006 2005 "Command to diable run sent... waiting for response."); 2007 T::AddStateName(FTM:: kConfiguring2, "Configuring2",2006 T::AddStateName(FTM::State::kConfiguring2, "Configuring2", 2008 2007 "New configuration sent... waiting for response."); 2009 T::AddStateName(FTM:: kConfigured, "Configured",2008 T::AddStateName(FTM::State::kConfigured, "Configured", 2010 2009 "Received answer identical with target configuration."); 2011 2010 2012 T::AddStateName(FTM:: kTriggerOn, "TriggerOn",2011 T::AddStateName(FTM::State::kTriggerOn, "TriggerOn", 2013 2012 "Ethernet connection to FTM established, FTM trigger output to FADs enabled."); 2014 2013 2015 T::AddStateName(FTM:: kConfigError1, "ErrorInConfig1", "");2016 T::AddStateName(FTM:: kConfigError2, "ErrorInConfig2", "");2014 T::AddStateName(FTM::State::kConfigError1, "ErrorInConfig1", ""); 2015 T::AddStateName(FTM::State::kConfigError2, "ErrorInConfig2", ""); 2017 2016 2018 2017 // FTM Commands 2019 T::AddEvent("TOGGLE_LED", FTM:: kIdle)2018 T::AddEvent("TOGGLE_LED", FTM::State::kIdle) 2020 2019 (Wrapper(bind(&ConnectionFTM::CmdToggleLed, &fFTM))) 2021 2020 ("toggle led"); 2022 2021 2023 T::AddEvent("PING", FTM:: kIdle)2022 T::AddEvent("PING", FTM::State::kIdle) 2024 2023 (Wrapper(bind(&ConnectionFTM::CmdPing, &fFTM))) 2025 2024 ("send ping"); 2026 2025 2027 T::AddEvent("REQUEST_DYNAMIC_DATA", FTM:: kIdle)2026 T::AddEvent("REQUEST_DYNAMIC_DATA", FTM::State::kIdle) 2028 2027 (Wrapper(bind(&ConnectionFTM::CmdReqDynDat, &fFTM))) 2029 2028 ("request transmission of dynamic data block"); 2030 2029 2031 T::AddEvent("REQUEST_STATIC_DATA", FTM:: kIdle)2030 T::AddEvent("REQUEST_STATIC_DATA", FTM::State::kIdle) 2032 2031 (Wrapper(bind(&ConnectionFTM::CmdReqStatDat, &fFTM))) 2033 2032 ("request transmission of static data from FTM to memory"); 2034 2033 2035 T::AddEvent("GET_REGISTER", "I", FTM:: kIdle)2034 T::AddEvent("GET_REGISTER", "I", FTM::State::kIdle) 2036 2035 (bind(&StateMachineFTM::GetRegister, this, placeholders::_1)) 2037 2036 ("read register from address addr" 2038 2037 "|addr[short]:Address of register"); 2039 2038 2040 T::AddEvent("SET_REGISTER", "I:2", FTM:: kIdle)2039 T::AddEvent("SET_REGISTER", "I:2", FTM::State::kIdle) 2041 2040 (bind(&StateMachineFTM::SetRegister, this, placeholders::_1)) 2042 2041 ("set register to value" … … 2044 2043 "|val[short]:Value to be set"); 2045 2044 2046 T::AddEvent("START_TRIGGER", FTM:: kIdle, FTM::kConfigured)2045 T::AddEvent("START_TRIGGER", FTM::State::kIdle, FTM::State::kConfigured) 2047 2046 (Wrapper(bind(&ConnectionFTM::CmdStartRun, &fFTM))) 2048 2047 ("start a run (start distributing triggers)"); 2049 2048 2050 T::AddEvent("STOP_TRIGGER", FTM:: kTriggerOn)2049 T::AddEvent("STOP_TRIGGER", FTM::State::kTriggerOn) 2051 2050 (Wrapper(bind(&ConnectionFTM::CmdStopRun, &fFTM))) 2052 2051 ("stop a run (stop distributing triggers)"); 2053 2052 2054 T::AddEvent("TAKE_N_EVENTS", "I", FTM:: kIdle)2053 T::AddEvent("TAKE_N_EVENTS", "I", FTM::State::kIdle) 2055 2054 (bind(&StateMachineFTM::TakeNevents, this, placeholders::_1)) 2056 2055 ("take n events (distribute n triggers)|number[int]:Number of events to be taken"); 2057 2056 2058 T::AddEvent("DISABLE_REPORTS", "B", FTM:: kIdle)2057 T::AddEvent("DISABLE_REPORTS", "B", FTM::State::kIdle) 2059 2058 (bind(&StateMachineFTM::DisableReports, this, placeholders::_1)) 2060 2059 ("disable sending rate reports" 2061 2060 "|status[bool]:disable or enable that the FTM sends rate reports (yes/no)"); 2062 2061 2063 T::AddEvent("SET_THRESHOLD", "I:2", FTM:: kIdle, FTM::kConfigured, FTM::kTriggerOn)2062 T::AddEvent("SET_THRESHOLD", "I:2", FTM::State::kIdle, FTM::State::kConfigured, FTM::State::kTriggerOn) 2064 2063 (bind(&StateMachineFTM::SetThreshold, this, placeholders::_1)) 2065 2064 ("Set the comparator threshold" … … 2067 2066 "|Threshold[counts]:Threshold to be set in binary counts"); 2068 2067 2069 T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM:: kIdle, FTM::kTriggerOn)2068 T::AddEvent("SET_N_OUT_OF_4", "I:2", FTM::State::kIdle, FTM::State::kTriggerOn) 2070 2069 (bind(&StateMachineFTM::SetNoutof4, this, placeholders::_1)) 2071 2070 ("Set the comparator threshold" … … 2073 2072 "|Threshold[counts]:Threshold to be set in binary counts"); 2074 2073 2075 T::AddEvent("SET_PRESCALING", "I:1", FTM:: kIdle)2074 T::AddEvent("SET_PRESCALING", "I:1", FTM::State::kIdle) 2076 2075 (bind(&StateMachineFTM::SetPrescaling, this, placeholders::_1)) 2077 2076 (""); 2078 2077 2079 T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM:: kIdle)2078 T::AddEvent("ENABLE_FTU", "I:1;B:1", FTM::State::kIdle) 2080 2079 (bind(&StateMachineFTM::EnableFTU, this, placeholders::_1)) 2081 2080 ("Enable or disable FTU" … … 2083 2082 "|Enable[bool]:Whether FTU should be enabled or disabled (yes/no)"); 2084 2083 2085 T::AddEvent("DISABLE_PIXEL", "S:1", FTM:: kIdle, FTM::kTriggerOn)2084 T::AddEvent("DISABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn) 2086 2085 (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, false)) 2087 2086 ("(-1 or all)"); 2088 2087 2089 T::AddEvent("ENABLE_PIXEL", "S:1", FTM:: kIdle, FTM::kTriggerOn)2088 T::AddEvent("ENABLE_PIXEL", "S:1", FTM::State::kIdle, FTM::State::kTriggerOn) 2090 2089 (bind(&StateMachineFTM::EnablePixel, this, placeholders::_1, true)) 2091 2090 ("(-1 or all)"); 2092 2091 2093 T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM:: kIdle)2092 T::AddEvent("DISABLE_ALL_PIXELS_EXCEPT", "S:1", FTM::State::kIdle) 2094 2093 (bind(&StateMachineFTM::DisableAllPixelsExcept, this, placeholders::_1)) 2095 2094 (""); 2096 2095 2097 T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM:: kIdle)2096 T::AddEvent("DISABLE_ALL_PATCHES_EXCEPT", "S:1", FTM::State::kIdle) 2098 2097 (bind(&StateMachineFTM::DisableAllPatchesExcept, this, placeholders::_1)) 2099 2098 (""); 2100 2099 2101 T::AddEvent("ENABLE_PATCH", "S:1", FTM:: kIdle)2100 T::AddEvent("ENABLE_PATCH", "S:1", FTM::State::kIdle) 2102 2101 (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, true)) 2103 2102 (""); 2104 2103 2105 T::AddEvent("DISABLE_PATCH", "S:1", FTM:: kIdle)2104 T::AddEvent("DISABLE_PATCH", "S:1", FTM::State::kIdle) 2106 2105 (bind(&StateMachineFTM::EnablePatch, this, placeholders::_1, false)) 2107 2106 (""); 2108 2107 2109 T::AddEvent("TOGGLE_PIXEL", "S:1", FTM:: kIdle)2108 T::AddEvent("TOGGLE_PIXEL", "S:1", FTM::State::kIdle) 2110 2109 (bind(&StateMachineFTM::TogglePixel, this, placeholders::_1)) 2111 2110 (""); 2112 2111 2113 T::AddEvent("TOGGLE_FTU", "I:1", FTM:: kIdle)2112 T::AddEvent("TOGGLE_FTU", "I:1", FTM::State::kIdle) 2114 2113 (bind(&StateMachineFTM::ToggleFTU, this, placeholders::_1)) 2115 2114 ("Toggle status of FTU (this is mainly meant to be used in the GUI)" 2116 2115 "|Board[idx]:Index of the board (0-39)"); 2117 2116 2118 T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM:: kIdle)2117 T::AddEvent("SET_TRIGGER_INTERVAL", "I:1", FTM::State::kIdle) 2119 2118 (bind(&StateMachineFTM::SetTriggerInterval, this, placeholders::_1)) 2120 2119 ("Sets the trigger interval which is the distance between two consecutive artificial triggers." 2121 2120 "|interval[int]:The applied trigger interval is: interval*4ns+8ns"); 2122 2121 2123 T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM:: kIdle)2122 T::AddEvent("SET_TRIGGER_DELAY", "I:1", FTM::State::kIdle) 2124 2123 (bind(&StateMachineFTM::SetTriggerDelay, this, placeholders::_1)) 2125 2124 ("" 2126 2125 "|delay[int]:The applied trigger delay is: delay*4ns+8ns"); 2127 2126 2128 T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM:: kIdle)2127 T::AddEvent("SET_TIME_MARKER_DELAY", "I:1", FTM::State::kIdle) 2129 2128 (bind(&StateMachineFTM::SetTimeMarkerDelay, this, placeholders::_1)) 2130 2129 ("" 2131 2130 "|delay[int]:The applied time marker delay is: delay*4ns+8ns"); 2132 2131 2133 T::AddEvent("SET_DEAD_TIME", "I:1", FTM:: kIdle)2132 T::AddEvent("SET_DEAD_TIME", "I:1", FTM::State::kIdle) 2134 2133 (bind(&StateMachineFTM::SetDeadTime, this, placeholders::_1)) 2135 2134 ("" 2136 2135 "|dead_time[int]:The applied dead time is: dead_time*4ns+8ns"); 2137 2136 2138 T::AddEvent("ENABLE_TRIGGER", "B:1", FTM:: kIdle)2137 T::AddEvent("ENABLE_TRIGGER", "B:1", FTM::State::kIdle) 2139 2138 (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kTrigger)) 2140 2139 ("Switch on the physics trigger" … … 2142 2141 2143 2142 // FIXME: Switch on/off depending on sequence 2144 T::AddEvent("ENABLE_EXT1", "B:1", FTM:: kIdle)2143 T::AddEvent("ENABLE_EXT1", "B:1", FTM::State::kIdle) 2145 2144 (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt1)) 2146 2145 ("Switch on the triggers through the first external line" … … 2148 2147 2149 2148 // FIXME: Switch on/off depending on sequence 2150 T::AddEvent("ENABLE_EXT2", "B:1", FTM:: kIdle)2149 T::AddEvent("ENABLE_EXT2", "B:1", FTM::State::kIdle) 2151 2150 (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kExt2)) 2152 2151 ("Switch on the triggers through the second external line" 2153 2152 "|Enable[bool]:Enable ext2 trigger (yes/no)"); 2154 2153 2155 T::AddEvent("ENABLE_VETO", "B:1", FTM:: kIdle)2154 T::AddEvent("ENABLE_VETO", "B:1", FTM::State::kIdle) 2156 2155 (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kVeto)) 2157 2156 ("Enable veto line" 2158 2157 "|Enable[bool]:Enable veto (yes/no)"); 2159 2158 2160 T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM:: kIdle)2159 T::AddEvent("ENABLE_CLOCK_CONDITIONER", "B:1", FTM::State::kIdle) 2161 2160 (bind(&StateMachineFTM::Enable, this, placeholders::_1, FTM::StaticData::kClockConditioner)) 2162 2161 ("Enable clock conidtioner output in favor of time marker output" 2163 2162 "|Enable[bool]:Enable clock conditioner (yes/no)"); 2164 2163 2165 T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM:: kIdle)2164 T::AddEvent("ENABLE_GROUP1_LPINT", "B:1", FTM::State::kIdle) 2166 2165 (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup1)) 2167 2166 (""); 2168 T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM:: kIdle)2167 T::AddEvent("ENABLE_GROUP1_LPEXT", "B:1", FTM::State::kIdle) 2169 2168 (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup1)) 2170 2169 (""); 2171 T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM:: kIdle)2170 T::AddEvent("ENABLE_GROUP2_LPINT", "B:1", FTM::State::kIdle) 2172 2171 (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPint, FTM::StaticData::kGroup2)) 2173 2172 (""); 2174 T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM:: kIdle)2173 T::AddEvent("ENABLE_GROUP2_LPEXT", "B:1", FTM::State::kIdle) 2175 2174 (bind(&StateMachineFTM::EnableLP, this, placeholders::_1, FTM::StaticData::kLPext, FTM::StaticData::kGroup2)) 2176 2175 (""); 2177 T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM:: kIdle)2176 T::AddEvent("SET_INTENSITY_LPINT", "S:1", FTM::State::kIdle) 2178 2177 (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPint)) 2179 2178 (""); 2180 T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM:: kIdle)2179 T::AddEvent("SET_INTENSITY_LPEXT", "S:1", FTM::State::kIdle) 2181 2180 (bind(&StateMachineFTM::SetIntensity, this, placeholders::_1, FTM::StaticData::kLPext)) 2182 2181 (""); 2183 2182 2184 2183 2185 T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM:: kIdle)2184 T::AddEvent("SET_TRIGGER_SEQUENCE", "S:3", FTM::State::kIdle) 2186 2185 (bind(&StateMachineFTM::SetTriggerSeq, this, placeholders::_1)) 2187 2186 ("Setup the sequence of artificial triggers produced by the FTM" … … 2190 2189 "|LPint[short]:number of triggers of the internal light pulser"); 2191 2190 2192 T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM:: kIdle)2191 T::AddEvent("SET_TRIGGER_MULTIPLICITY", "S:1", FTM::State::kIdle) 2193 2192 (bind(&StateMachineFTM::SetTriggerMultiplicity, this, placeholders::_1)) 2194 2193 ("Setup the Multiplicity condition for physcis triggers" 2195 2194 "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)"); 2196 2195 2197 T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM:: kIdle)2196 T::AddEvent("SET_TRIGGER_WINDOW", "S:1", FTM::State::kIdle) 2198 2197 (bind(&StateMachineFTM::SetTriggerWindow, this, placeholders::_1)) 2199 2198 (""); 2200 2199 2201 T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM:: kIdle)2200 T::AddEvent("SET_CALIBRATION_MULTIPLICITY", "S:1", FTM::State::kIdle) 2202 2201 (bind(&StateMachineFTM::SetCalibMultiplicity, this, placeholders::_1)) 2203 2202 ("Setup the Multiplicity condition for artificial (calibration) triggers" 2204 2203 "|N[int]:Number of requirered coincident triggers from sum-patches (1-40)"); 2205 2204 2206 T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM:: kIdle)2205 T::AddEvent("SET_CALIBRATION_WINDOW", "S:1", FTM::State::kIdle) 2207 2206 (bind(&StateMachineFTM::SetCalibWindow, this, placeholders::_1)) 2208 2207 (""); 2209 2208 2210 T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM:: kIdle)2209 T::AddEvent("SET_CLOCK_FREQUENCY", "S:1", FTM::State::kIdle) 2211 2210 (bind(&StateMachineFTM::SetClockFrequency, this, placeholders::_1)) 2212 2211 (""); 2213 2212 2214 T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM:: kIdle)2213 T::AddEvent("SET_CLOCK_REGISTER", "X:8", FTM::State::kIdle) 2215 2214 (bind(&StateMachineFTM::SetClockRegister, this, placeholders::_1)) 2216 2215 (""); … … 2218 2217 // A new configure will first stop the FTM this means 2219 2218 // we can allow it in idle _and_ taking data 2220 T::AddEvent("CONFIGURE", "C", FTM:: kIdle, FTM::kConfiguring1, FTM::kConfiguring2, FTM::kConfigured, FTM::kTriggerOn)2219 T::AddEvent("CONFIGURE", "C", FTM::State::kIdle, FTM::State::kConfiguring1, FTM::State::kConfiguring2, FTM::State::kConfigured, FTM::State::kTriggerOn) 2221 2220 (bind(&StateMachineFTM::ConfigureFTM, this, placeholders::_1)) 2222 2221 (""); 2223 2222 2224 T::AddEvent("RESET_CONFIGURE", FTM:: kConfiguring1, FTM::kConfiguring2, FTM::kConfigured, FTM::kConfigError1, FTM::kConfigError2)2223 T::AddEvent("RESET_CONFIGURE", FTM::State::kConfiguring1, FTM::State::kConfiguring2, FTM::State::kConfigured, FTM::State::kConfigError1, FTM::State::kConfigError2) 2225 2224 (bind(&StateMachineFTM::ResetConfig, this)) 2226 2225 (""); … … 2228 2227 2229 2228 2230 T::AddEvent("RESET_CRATE", "S:1", FTM:: kIdle)2229 T::AddEvent("RESET_CRATE", "S:1", FTM::State::kIdle) 2231 2230 (bind(&StateMachineFTM::ResetCrate, this, placeholders::_1)) 2232 2231 ("Reset one of the crates 0-3" 2233 2232 "|crate[short]:Crate number to be reseted (0-3)"); 2234 2233 2235 T::AddEvent("RESET_CAMERA", FTM:: kIdle)2234 T::AddEvent("RESET_CAMERA", FTM::State::kIdle) 2236 2235 (Wrapper(bind(&ConnectionFTM::CmdResetCamera, &fFTM))) 2237 2236 ("Reset all crates. The commands are sent in the order 0,1,2,3"); … … 2239 2238 2240 2239 // Load/save static data block 2241 T::AddEvent("SAVE", "C", FTM:: kIdle)2240 T::AddEvent("SAVE", "C", FTM::State::kIdle) 2242 2241 (bind(&StateMachineFTM::SaveStaticData, this, placeholders::_1)) 2243 2242 ("Saves the static data (FTM configuration) from memory to a file" 2244 2243 "|filename[string]:Filename (can include a path), .bin is automatically added"); 2245 2244 2246 T::AddEvent("LOAD", "C", FTM:: kIdle)2245 T::AddEvent("LOAD", "C", FTM::State::kIdle) 2247 2246 (bind(&StateMachineFTM::LoadStaticData, this, placeholders::_1)) 2248 2247 ("Loads the static data (FTM configuration) from a file into memory and sends it to the FTM" … … 2269 2268 2270 2269 // Conenction commands 2271 T::AddEvent("DISCONNECT", FTM:: kConnected, FTM::kIdle)2270 T::AddEvent("DISCONNECT", FTM::State::kConnected, FTM::State::kIdle) 2272 2271 (bind(&StateMachineFTM::Disconnect, this)) 2273 2272 ("disconnect from ethernet"); 2274 2273 2275 T::AddEvent("RECONNECT", "O", FTM:: kDisconnected, FTM::kConnected, FTM::kIdle, FTM::kConfigured)2274 T::AddEvent("RECONNECT", "O", FTM::State::kDisconnected, FTM::State::kConnected, FTM::State::kIdle, FTM::State::kConfigured) 2276 2275 (bind(&StateMachineFTM::Reconnect, this, placeholders::_1)) 2277 2276 ("(Re)connect ethernet connection to FTM, a new address can be given"
Note:
See TracChangeset
for help on using the changeset viewer.