Changeset 958

Show
Ignore:
Timestamp:
03/18/08 13:52:22 (15 years ago)
Author:
ppalmers
Message:

add clock source control to dbus

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libffado/src/ffadodevice.cpp

    r937 r958  
    2828#include "libieee1394/ieee1394service.h" 
    2929 
     30#include "libcontrol/Element.h" 
     31#include "libcontrol/ClockSelect.h" 
     32 
    3033#include <iostream> 
    3134#include <sstream> 
     
    4851        debugWarning("failed to add ConfigRom to Control::Container\n"); 
    4952    } 
     53 
     54    m_genericContainer = new Control::Container("Generic"); 
     55    if(m_genericContainer == NULL) { 
     56        debugError("Could not create Control::Container for generic controls\n"); 
     57    } else { 
     58 
     59        if (!addElement(m_genericContainer)) { 
     60            debugWarning("failed to add generic container to Control::Container\n"); 
     61        } 
     62        // add a generic control for the clock source selection 
     63        if(!m_genericContainer->addElement(new Control::ClockSelect(*this))) { 
     64            debugWarning("failed to add clock source control to container\n"); 
     65        } 
     66    } 
    5067} 
    5168 
     
    5471    if (!deleteElement(&getConfigRom())) { 
    5572        debugWarning("failed to remove ConfigRom from Control::Container\n"); 
     73    } 
     74 
     75    // remove generic controls if present 
     76    if(m_genericContainer) { 
     77        if (!deleteElement(m_genericContainer)) { 
     78            debugError("Generic controls present but not registered to the avdevice\n"); 
     79        } 
     80        // remove and delete (as in free) child control elements 
     81        m_genericContainer->clearElements(true); 
     82        delete m_genericContainer; 
    5683    } 
    5784} 
  • trunk/libffado/src/ffadodevice.h

    r864 r958  
    4141    class StreamProcessor; 
    4242    class StreamProcessorManager; 
     43} 
     44 
     45namespace Control { 
     46    class Container; 
    4347} 
    4448 
     
    174178     * @brief Clock source identification struct 
    175179     */ 
    176     struct sClockSource { 
     180    class sClockSource { 
     181        public: 
    177182        sClockSource() 
    178183            : type( eCT_Invalid ) 
     
    183188            , slipping( false ) 
    184189            , description( "" ) 
    185         {} 
     190        {}; 
     191        virtual ~sClockSource() {}; 
    186192        /// indicates the type of the clock source (e.g. eCT_ADAT) 
    187193        enum eClockSourceType type; 
     
    198204        /// description of the clock struct (optional) 
    199205        std::string description; 
     206         
     207        bool operator==(const sClockSource& x) { 
     208            return (type == x.type) && (id == x.id); 
     209        } 
    200210    }; 
    201211    typedef struct sClockSource ClockSource; 
     
    425435    std::auto_ptr<ConfigRom>( m_pConfigRom ); 
    426436    DeviceManager& m_pDeviceManager; 
     437    Control::Container* m_genericContainer; 
    427438protected: 
    428439    DECLARE_DEBUG_MODULE; 
  • trunk/libffado/src/libcontrol/BasicElements.cpp

    r934 r958  
    142142} 
    143143 
     144//// --- 
     145 
     146Enum::Enum() 
     147: Element() 
     148, m_selected( -1 ) 
     149{ 
     150} 
     151 
     152Enum::Enum(std::string n) 
     153: Element(n) 
     154, m_selected( -1 ) 
     155{ 
     156} 
     157 
     158void 
     159Enum::show() 
     160{ 
     161    debugOutput( DEBUG_LEVEL_NORMAL, "Enum Element %s, selected=%d\n", 
     162                 getName().c_str(), m_selected); 
     163} 
     164 
     165// NOTE: dummy implementation for tests 
     166bool 
     167Enum::select(int idx) 
     168{ 
     169    if(idx <3) { 
     170        m_selected=idx; 
     171        return true; 
     172    } else { 
     173        return false; 
     174    } 
     175} 
     176 
     177int 
     178Enum::selected() 
     179{ 
     180    return m_selected; 
     181} 
     182 
     183int 
     184Enum::count() 
     185{ 
     186    return 3; 
     187} 
     188 
     189std::string 
     190Enum::getEnumLabel(int idx) 
     191{ 
     192    switch(idx) { 
     193        case 0: return "enum val 1"; 
     194        case 1: return "enum val 2"; 
     195        case 2: return "enum val 3"; 
     196        default: return "bad index"; 
     197    } 
     198} 
     199 
     200 
     201//// --- 
     202 
     203AttributeEnum::AttributeEnum() 
     204: Enum() 
     205{ 
     206} 
     207 
     208AttributeEnum::AttributeEnum(std::string n) 
     209: Enum(n) 
     210{ 
     211} 
     212 
     213void 
     214AttributeEnum::show() 
     215{ 
     216    debugOutput( DEBUG_LEVEL_NORMAL, "AttributeEnum Element %s\n", 
     217                 getName().c_str()); 
     218    Enum::show(); 
     219} 
     220 
     221// NOTE: dummy implementation for tests 
     222int 
     223AttributeEnum::attributeCount() 
     224{ 
     225    return 2; 
     226} 
     227 
     228std::string 
     229AttributeEnum::getAttributeValue(int attridx) 
     230{ 
     231    switch(attridx) { 
     232        case 0: return "attr val 1"; 
     233        case 1: return "attr val 2"; 
     234        default: return "bad attr index"; 
     235    } 
     236} 
     237 
     238std::string 
     239AttributeEnum::getAttributeName(int attridx) 
     240{ 
     241    switch(attridx) { 
     242        case 0: return "attr 1"; 
     243        case 1: return "attr 2"; 
     244        default: return "bad attr index"; 
     245    } 
     246} 
     247 
    144248} // namespace Control 
  • trunk/libffado/src/libcontrol/BasicElements.h

    r934 r958  
    9494}; 
    9595 
     96/*! 
     97@brief Base class for basic enumerated control elements 
     98*/ 
     99class Enum 
     100: public Element 
     101{ 
     102public: 
     103    Enum(); 
     104    Enum(std::string n); 
     105    virtual ~Enum() {}; 
     106 
     107    virtual bool select(int idx); 
     108    virtual int selected(); 
     109    virtual int count(); 
     110    virtual std::string getEnumLabel(int idx); 
     111 
     112    virtual void show(); 
     113//private: // HACK 
     114    int m_selected; 
     115}; 
     116 
     117/*! 
     118@brief Base class for attribute enumerated control elements 
     119 
     120The idea of this is that one can have a set of config values 
     121available for a certain enum choice. 
     122 
     123Example: for clock source selection: 
     124idx Label     signal  locked  available 
     125  0 WordClock   0       0        1 
     126  1 S/PDIF      1       0        1 
     127  ... 
     128 
     129Attributes: 
     130 0 signal 
     131 1 locked 
     132 2 available 
     133 
     134*/ 
     135class AttributeEnum 
     136: public Enum 
     137{ 
     138public: 
     139    AttributeEnum(); 
     140    AttributeEnum(std::string n); 
     141    virtual ~AttributeEnum() {}; 
     142 
     143    virtual int attributeCount(); 
     144    ///> get a specific attribute value for the selected enum  
     145    virtual std::string getAttributeValue(int attridx); 
     146    ///> get the name of the attribute with a certain index 
     147    virtual std::string getAttributeName(int attridx); 
     148 
     149    virtual void show(); 
     150private: 
     151}; 
     152 
    96153}; // namespace Control 
    97154 
  • trunk/libffado/support/dbus/control-interface.xml

    r933 r958  
    7575  </interface> 
    7676 
     77  <interface name="org.ffado.Control.Element.Enum"> 
     78      <method name="select"> 
     79          <arg type="i" name="idx" direction="in"/> 
     80          <arg type="i" name="success" direction="out"/> 
     81      </method> 
     82      <method name="selected"> 
     83          <arg type="i" name="idx" direction="out"/> 
     84      </method> 
     85      <method name="count"> 
     86          <arg type="i" name="count" direction="out"/> 
     87      </method> 
     88      <method name="getEnumLabel"> 
     89          <arg type="i" name="idx" direction="in"/> 
     90          <arg type="s" name="label" direction="out"/> 
     91      </method> 
     92  </interface> 
     93 
     94  <interface name="org.ffado.Control.Element.AttributeEnum"> 
     95      <method name="select"> 
     96          <arg type="i" name="idx" direction="in"/> 
     97          <arg type="i" name="success" direction="out"/> 
     98      </method> 
     99      <method name="selected"> 
     100          <arg type="i" name="idx" direction="out"/> 
     101      </method> 
     102      <method name="count"> 
     103          <arg type="i" name="count" direction="out"/> 
     104      </method> 
     105      <method name="attributeCount"> 
     106          <arg type="i" name="count" direction="out"/> 
     107      </method> 
     108      <method name="getEnumLabel"> 
     109          <arg type="i" name="idx" direction="in"/> 
     110          <arg type="s" name="label" direction="out"/> 
     111      </method> 
     112      <method name="getAttributeValue"> 
     113          <arg type="i" name="idx" direction="in"/> 
     114          <arg type="s" name="value" direction="out"/> 
     115      </method> 
     116      <method name="getAttributeName"> 
     117          <arg type="i" name="idx" direction="in"/> 
     118          <arg type="s" name="name" direction="out"/> 
     119      </method> 
     120  </interface> 
     121 
    77122  <interface name="org.ffado.Control.Element.MatrixMixer"> 
    78123      <method name="setValue"> 
  • trunk/libffado/support/dbus/controlserver.cpp

    r933 r958  
    146146            *dynamic_cast<Control::Text *>(&e)); 
    147147    } 
     148 
     149    // note that we have to check this before checking the Enum, 
     150    // since Enum is a base class 
     151    if (dynamic_cast<Control::AttributeEnum *>(&e) != NULL) { 
     152        debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::AttributeEnum\n"); 
     153         
     154        return new AttributeEnum(conn(), std::string(path()+"/"+e.getName()), 
     155            *dynamic_cast<Control::AttributeEnum *>(&e)); 
     156    } 
     157     
     158    if (dynamic_cast<Control::Enum *>(&e) != NULL) { 
     159        debugOutput( DEBUG_LEVEL_VERBOSE, "Source is a Control::Enum\n"); 
     160         
     161        return new Enum(conn(), std::string(path()+"/"+e.getName()), 
     162            *dynamic_cast<Control::Enum *>(&e)); 
     163    } 
    148164     
    149165    if (dynamic_cast<ConfigRom *>(&e) != NULL) { 
     
    253269} 
    254270 
     271 
     272// --- Enum 
     273 
     274Enum::Enum( DBus::Connection& connection, std::string p, Control::Enum &slave) 
     275: Element(connection, p, slave) 
     276, m_Slave(slave) 
     277{ 
     278    debugOutput( DEBUG_LEVEL_VERBOSE, "Created Enum on '%s'\n", 
     279                 path().c_str() ); 
     280} 
     281 
     282DBus::Int32 
     283Enum::select( const DBus::Int32& idx ) 
     284{ 
     285    debugOutput( DEBUG_LEVEL_VERBOSE, "select(%d)\n", idx ); 
     286    return  m_Slave.select(idx); 
     287} 
     288 
     289DBus::Int32 
     290Enum::selected() 
     291{ 
     292    int retval = m_Slave.selected(); 
     293    debugOutput( DEBUG_LEVEL_VERBOSE, "selected() => %d\n", retval ); 
     294    return retval; 
     295} 
     296 
     297DBus::Int32 
     298Enum::count() 
     299{ 
     300    int retval = m_Slave.count(); 
     301    debugOutput( DEBUG_LEVEL_VERBOSE, "count() => %d\n", retval ); 
     302    return retval; 
     303} 
     304 
     305DBus::String 
     306Enum::getEnumLabel( const DBus::Int32 & idx ) 
     307{ 
     308    std::string retval = m_Slave.getEnumLabel(idx); 
     309    debugOutput( DEBUG_LEVEL_VERBOSE, "getEnumLabel(%d) => %s\n", idx, retval.c_str() ); 
     310    return retval; 
     311} 
     312 
     313// --- AttributeEnum 
     314AttributeEnum::AttributeEnum( DBus::Connection& connection, std::string p, Control::AttributeEnum &slave) 
     315: Element(connection, p, slave) 
     316, m_Slave(slave) 
     317{ 
     318    debugOutput( DEBUG_LEVEL_VERBOSE, "Created Enum on '%s'\n", 
     319                 path().c_str() ); 
     320} 
     321 
     322DBus::Int32 
     323AttributeEnum::select( const DBus::Int32& idx ) 
     324{ 
     325    debugOutput( DEBUG_LEVEL_VERBOSE, "select(%d)\n", idx ); 
     326    return  m_Slave.select(idx); 
     327} 
     328 
     329DBus::Int32 
     330AttributeEnum::selected() 
     331{ 
     332    int retval = m_Slave.selected(); 
     333    debugOutput( DEBUG_LEVEL_VERBOSE, "selected() => %d\n", retval ); 
     334    return retval; 
     335} 
     336 
     337DBus::Int32 
     338AttributeEnum::count() 
     339{ 
     340    int retval = m_Slave.count(); 
     341    debugOutput( DEBUG_LEVEL_VERBOSE, "count() => %d\n", retval ); 
     342    return retval; 
     343} 
     344 
     345DBus::Int32 
     346AttributeEnum::attributeCount() 
     347{ 
     348    int retval = m_Slave.attributeCount(); 
     349    debugOutput( DEBUG_LEVEL_VERBOSE, "attributeCount() => %d\n", retval ); 
     350    return retval; 
     351} 
     352 
     353DBus::String 
     354AttributeEnum::getEnumLabel( const DBus::Int32 & idx ) 
     355{ 
     356    std::string retval = m_Slave.getEnumLabel(idx); 
     357    debugOutput( DEBUG_LEVEL_VERBOSE, "getEnumLabel(%d) => %s\n", idx, retval.c_str() ); 
     358    return retval; 
     359} 
     360 
     361DBus::String 
     362AttributeEnum::getAttributeValue( const DBus::Int32 & idx ) 
     363{ 
     364    std::string retval = m_Slave.getAttributeValue(idx); 
     365    debugOutput( DEBUG_LEVEL_VERBOSE, "getAttributeValue(%d) => %s\n", idx, retval.c_str() ); 
     366    return retval; 
     367} 
     368 
     369DBus::String 
     370AttributeEnum::getAttributeName( const DBus::Int32 & idx ) 
     371{ 
     372    std::string retval = m_Slave.getAttributeName(idx); 
     373    debugOutput( DEBUG_LEVEL_VERBOSE, "getAttributeName(%d) => %s\n", idx, retval.c_str() ); 
     374    return retval; 
     375} 
     376 
    255377// --- ConfigRom 
    256378 
  • trunk/libffado/support/dbus/controlserver.h

    r933 r958  
    108108public: 
    109109    Discrete( DBus::Connection& connection, 
    110                   std::string p, 
    111                   Control::Discrete &slave ); 
     110              std::string p, 
     111              Control::Discrete &slave ); 
    112112     
    113113    DBus::Int32 setValue( const DBus::Int32 & value ); 
     
    132132private: 
    133133    Control::Text &m_Slave; 
     134}; 
     135 
     136class Enum 
     137: public org::ffado::Control::Element::Enum 
     138, public Element 
     139{ 
     140public: 
     141    Enum( DBus::Connection& connection, 
     142          std::string p, 
     143          Control::Enum &slave ); 
     144     
     145    DBus::Int32 select( const DBus::Int32 & idx ); 
     146    DBus::Int32 selected( ); 
     147    DBus::Int32 count( ); 
     148    DBus::String getEnumLabel( const DBus::Int32 & idx ); 
     149 
     150private: 
     151    Control::Enum &m_Slave; 
     152}; 
     153 
     154class AttributeEnum 
     155: public org::ffado::Control::Element::AttributeEnum 
     156, public Element 
     157{ 
     158public: 
     159    AttributeEnum( DBus::Connection& connection, 
     160                   std::string p, 
     161                   Control::AttributeEnum &slave ); 
     162     
     163    DBus::Int32 select( const DBus::Int32 & idx ); 
     164    DBus::Int32 selected( ); 
     165    DBus::Int32 count( ); 
     166    DBus::Int32 attributeCount(); 
     167    DBus::String getEnumLabel( const DBus::Int32 & idx ); 
     168    DBus::String getAttributeValue( const DBus::Int32 & idx ); 
     169    DBus::String getAttributeName( const DBus::Int32 & idx ); 
     170 
     171private: 
     172    Control::AttributeEnum &m_Slave; 
    134173}; 
    135174 
  • trunk/libffado/support/dbus/test-dbus-server.cpp

    r864 r958  
    139139    c5.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 
    140140    cont1.addElement(&c5); 
     141     
     142    Control::Discrete d1("test_discr1"); 
     143    d1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 
     144    cont1.addElement(&d1); 
     145     
     146    Control::Enum e1("test_enum"); 
     147    e1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 
     148    cont1.addElement(&e1); 
     149 
     150    Control::AttributeEnum a1("test_attrenum"); 
     151    a1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 
     152    cont1.addElement(&a1); 
     153     
     154    Control::Text t1("test_text"); 
     155    t1.setVerboseLevel(DEBUG_LEVEL_VERBOSE); 
     156    cont1.addElement(&t1); 
    141157 
    142158    // Note: create handlers AFTER all children are added 
  • trunk/libffado/support/mixer/ffadomixer.in

    r953 r958  
    168168    def getModelId(self): 
    169169        return self.iface.getModelId() 
    170     
     170 
     171class ClockSelectInterface: 
     172    def __init__(self, servername, devicepath): 
     173        self.basepath=devicepath + '/Generic/ClockSelect' 
     174        self.servername=servername 
     175        self.bus=dbus.SessionBus() 
     176        self.dev = self.bus.get_object(self.servername, self.basepath) 
     177        self.iface = dbus.Interface(self.dev, dbus_interface='org.ffado.Control.Element.AttributeEnum') 
     178    def count(self): 
     179        return self.iface.count() 
     180    def select(self, idx): 
     181        return self.iface.select(idx) 
     182    def selected(self): 
     183        return self.iface.selected() 
     184    def getEnumLabel(self, idx): 
     185        return self.iface.getEnumLabel(idx) 
     186    def attributeCount(self): 
     187        return self.iface.attributeCount() 
     188    def getAttributeValue(self, idx): 
     189        return self.iface.getAttributeValue(idx) 
     190    def getAttributeName(self, idx): 
     191        return self.iface.getAttributeName(idx) 
    171192 
    172193if __name__ == "__main__": 
     
    236257                exec('forms.append('+mixerapp+'())') 
    237258                forms[idx].hw = ControlInterface(server, basepath+'/DeviceManager/'+path) 
     259                forms[idx].clockselect = ClockSelectInterface(server, basepath+'/DeviceManager/'+path) 
    238260                forms[idx].initValues() 
    239261                forms[idx].show() 
  • trunk/libffado/support/mixer/mixer_af2.py

    r864 r958  
    184184                    state) 
    185185        self.hw.setDiscrete(self.SelectorControls[sender][0], state) 
     186     
     187    def updateClockSelection(self,a0): 
     188        #disable the combobox 
     189        self.comboClockSelect.setEnabled(False) 
     190        #change the clock source 
     191        self.clockselect.select(a0) 
     192        #refresh the clock source selection box 
     193        self.initClockSelector() 
     194        #make the box available again 
     195        self.comboClockSelect.setEnabled(True) 
     196 
     197    def initClockSelector(self): 
     198        self.comboClockSelect.clear() 
     199        nbsources = self.clockselect.count() 
     200        for idx in range(nbsources): 
     201            desc = self.clockselect.getEnumLabel(idx) 
     202            self.comboClockSelect.insertItem(desc) 
     203        active_idx = self.clockselect.selected(); 
     204        if active_idx >= 0: 
     205            self.comboClockSelect.setCurrentItem(active_idx) 
    186206         
    187207    def initValues(self): 
     
    241261                # connect the UI element 
    242262                QObject.connect(ctrl,SIGNAL('stateChanged(int)'),self.updateSelector) 
     263             
     264            self.initClockSelector() 
     265            # connect the clock selector UI element 
     266            QObject.connect(self.comboClockSelect, SIGNAL('activated(int)'), self.updateClockSelection) 
  • trunk/libffado/support/mixer/mixer_af2.ui

    r864 r958  
    5050            </property> 
    5151            <attribute name="title"> 
    52                 <string>ANALOG OUT</string> 
     52                <string>&amp;ANALOG OUT</string> 
    5353            </attribute> 
    5454            <widget class="QLabel"> 
     
    8484                </property> 
    8585                <property name="text"> 
    86                     <string>Mute</string> 
     86                    <string>&amp;Mute</string> 
    8787                </property> 
    8888                <property name="toggleButton"> 
     
    18401840            </property> 
    18411841            <attribute name="title"> 
    1842                 <string>S/PDIF OUT</string> 
     1842                <string>S/PDIF &amp;OUT</string> 
    18431843            </attribute> 
    18441844            <widget class="QLabel"> 
     
    27162716            </property> 
    27172717            <attribute name="title"> 
    2718                 <string>SETTINGS</string> 
     2718                <string>SETTI&amp;NGS</string> 
    27192719            </attribute> 
     2720            <widget class="QLabel"> 
     2721                <property name="name"> 
     2722                    <cstring>AnOut_textLabel1_2_6</cstring> 
     2723                </property> 
     2724                <property name="geometry"> 
     2725                    <rect> 
     2726                        <x>20</x> 
     2727                        <y>50</y> 
     2728                        <width>50</width> 
     2729                        <height>21</height> 
     2730                    </rect> 
     2731                </property> 
     2732                <property name="text"> 
     2733                    <string>1</string> 
     2734                </property> 
     2735                <property name="alignment"> 
     2736                    <set>AlignCenter</set> 
     2737                </property> 
     2738            </widget> 
     2739            <widget class="QLabel"> 
     2740                <property name="name"> 
     2741                    <cstring>AnOut_textLabel1_2_3_4</cstring> 
     2742                </property> 
     2743                <property name="geometry"> 
     2744                    <rect> 
     2745                        <x>78</x> 
     2746                        <y>50</y> 
     2747                        <width>50</width> 
     2748                        <height>21</height> 
     2749                    </rect> 
     2750                </property> 
     2751                <property name="text"> 
     2752                    <string>2</string> 
     2753                </property> 
     2754                <property name="alignment"> 
     2755                    <set>AlignCenter</set> 
     2756                </property> 
     2757            </widget> 
     2758            <widget class="QPushButton"> 
     2759                <property name="name"> 
     2760                    <cstring>btnIn1Pad</cstring> 
     2761                </property> 
     2762                <property name="geometry"> 
     2763                    <rect> 
     2764                        <x>22</x> 
     2765                        <y>80</y> 
     2766                        <width>50</width> 
     2767                        <height>21</height> 
     2768                    </rect> 
     2769                </property> 
     2770                <property name="text"> 
     2771                    <string>Pad</string> 
     2772                </property> 
     2773                <property name="toggleButton"> 
     2774                    <bool>true</bool> 
     2775                </property> 
     2776            </widget> 
     2777            <widget class="QPushButton"> 
     2778                <property name="name"> 
     2779                    <cstring>btnIn2Pad</cstring> 
     2780                </property> 
     2781                <property name="geometry"> 
     2782                    <rect> 
     2783                        <x>80</x> 
     2784                        <y>80</y> 
     2785                        <width>50</width> 
     2786                        <height>21</height> 
     2787                    </rect> 
     2788                </property> 
     2789                <property name="text"> 
     2790                    <string>Pad</string> 
     2791                </property> 
     2792                <property name="toggleButton"> 
     2793                    <bool>true</bool> 
     2794                </property> 
     2795            </widget> 
    27202796            <widget class="QLabel"> 
    27212797                <property name="name"> 
     
    27372813                </property> 
    27382814            </widget> 
    2739             <widget class="QLabel"> 
    2740                 <property name="name"> 
    2741                     <cstring>AnOut_textLabel1_2_6</cstring> 
     2815            <widget class="QGroupBox"> 
     2816                <property name="name"> 
     2817                    <cstring>groupBox1</cstring> 
    27422818                </property> 
    27432819                <property name="geometry"> 
    27442820                    <rect> 
    27452821                        <x>20</x> 
    2746                         <y>50</y> 
    2747                         <width>50</width> 
    2748                         <height>21</height> 
    2749                     </rect> 
    2750                 </property> 
    2751                 <property name="text"> 
    2752                     <string>1</string> 
    2753                 </property> 
    2754                 <property name="alignment"> 
    2755                     <set>AlignCenter</set> 
    2756                 </property> 
    2757             </widget> 
    2758             <widget class="QLabel"> 
    2759                 <property name="name"> 
    2760                     <cstring>AnOut_textLabel1_2_3_4</cstring> 
    2761                 </property> 
    2762                 <property name="geometry"> 
    2763                     <rect> 
    2764                         <x>78</x> 
    2765                         <y>50</y> 
    2766                         <width>50</width> 
    2767                         <height>21</height> 
    2768                     </rect> 
    2769                 </property> 
    2770                 <property name="text"> 
    2771                     <string>2</string> 
    2772                 </property> 
    2773                 <property name="alignment"> 
    2774                     <set>AlignCenter</set> 
    2775                 </property> 
    2776             </widget> 
    2777             <widget class="QPushButton"> 
    2778                 <property name="name"> 
    2779                     <cstring>btnIn1Pad</cstring> 
    2780                 </property> 
    2781                 <property name="geometry"> 
    2782                     <rect> 
    2783                         <x>22</x> 
    2784                         <y>80</y> 
    2785                         <width>50</width> 
    2786                         <height>21</height> 
    2787                     </rect> 
    2788                 </property> 
    2789                 <property name="text"> 
    2790                     <string>Pad</string> 
    2791                 </property> 
    2792                 <property name="toggleButton"> 
    2793                     <bool>true</bool> 
    2794                 </property> 
    2795             </widget> 
    2796             <widget class="QPushButton"> 
    2797                 <property name="name"> 
    2798                     <cstring>btnIn2Pad</cstring> 
    2799                 </property> 
    2800                 <property name="geometry"> 
    2801                     <rect> 
    2802                         <x>80</x> 
    2803                         <y>80</y> 
    2804                         <width>50</width> 
    2805                         <height>21</height> 
    2806                     </rect> 
    2807                 </property> 
    2808                 <property name="text"> 
    2809                     <string>Pad</string> 
    2810                 </property> 
    2811                 <property name="toggleButton"> 
    2812                     <bool>true</bool> 
    2813                 </property> 
     2822                        <y>120</y> 
     2823                        <width>521</width> 
     2824                        <height>60</height> 
     2825                    </rect> 
     2826                </property> 
     2827                <property name="title"> 
     2828                    <string>Clock Source</string> 
     2829                </property> 
     2830                <widget class="QComboBox"> 
     2831                    <property name="name"> 
     2832                        <cstring>comboClockSelect</cstring> 
     2833                    </property> 
     2834                    <property name="geometry"> 
     2835                        <rect> 
     2836                            <x>10</x> 
     2837                            <y>20</y> 
     2838                            <width>500</width> 
     2839                            <height>31</height> 
     2840                        </rect> 
     2841                    </property> 
     2842                </widget> 
    28142843            </widget> 
    28152844        </widget>