<Vendor Name="FPP">
    <Controller Name="FPP">
        <!-- FPP's various serial outputs configured on the "Other" output tab -->
        <Variant Name="">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <MaxSerialPortChannels>4096</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <OpenSourceFirmware/>
            <SupportsAutoLayout/>
            <SupportsUpload/>
            <SupportsAutoUpload/>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
                <Protocol>DMX</Protocol>
                <Protocol>OpenDMX</Protocol>
                <Protocol>GenericSerial</Protocol>
                <Protocol>LOR</Protocol>
                <Protocol>Pixelnet</Protocol>
                <Protocol>Pixelnet-Open</Protocol>
                <Protocol>Renard</Protocol>
            </SerialProtocols>
            <InputProtocols>
                <Protocol>ddp-input</Protocol>
            </InputProtocols>
            <ConfigDriver>FPP</ConfigDriver>
        </Variant>
    </Controller>
    <AbstractVariant Name="BaseFPPSettings">
        <OpenSourceFirmware/>
        <SupportsPixelPortCommonSettings/>
        <SupportsPixelZigZag/>
        <MaxZigZag>600</MaxZigZag>
        <SupportsUpload/>
        <SupportsInputOnlyUpload/>
        <MaxInputUniverses>1000</MaxInputUniverses>
        <InputProtocols>
            <Protocol>e131</Protocol>
            <Protocol>artnet</Protocol>
            <Protocol>ddp</Protocol>
        </InputProtocols>
        <SupportsMultipleSimultaneousInputProtocols/>
        <SupportsAutoUpload/>
        <SupportsFullxLightsControl/>
        <SupportsDefaultBrightness/>
        <SupportsDefaultGamma/>
        <PreferredInputProtocol>DDP</PreferredInputProtocol>
		<PreferredState>xLights Only</PreferredState>
        <ConfigDriver>FPP</ConfigDriver>
		<FPS40Pixels>800</FPS40Pixels>
		<FPS40Pixels_SR>720</FPS40Pixels_SR>
    </AbstractVariant>
    <AbstractVariant Name="FPPStringCape" Base="FPP:BaseFPPSettings">
        <MaxSerialPortChannels>512</MaxSerialPortChannels>
        <MaxPixelPortChannels>4800</MaxPixelPortChannels>
        <SupportsVirtualStrings/>
        <SupportsAutoLayout/>
        <SupportsRemotes/>
        <SupportsSmartRemotes>6</SupportsSmartRemotes>
        <AllSmartRemoteTypesPerPortMustBeSame/>
        <SupportsPixelPortEndNullPixels/>
        <PixelProtocols>
            <Protocol>ws2811</Protocol>
        </PixelProtocols>
        <SerialProtocols>
            <Protocol>dmx</Protocol>
            <Protocol>pixelnet</Protocol>
        </SerialProtocols>
        <SmartRemoteTypes>
            <Type>falcon_v1</Type>
            <Type>fpp_v2</Type>
            <Type>falcon_v4</Type>
        </SmartRemoteTypes>
        <fppStringFileName>co-bbbStrings</fppStringFileName>
    </AbstractVariant>
    <AbstractVariant Name="FPPStringCapeTTYs" Base="FPP:BaseFPPSettings">
        <MaxSerialPortChannels>512</MaxSerialPortChannels>
        <MaxPixelPortChannels>4800</MaxPixelPortChannels>
        <SupportsVirtualStrings/>
        <SupportsAutoLayout/>
        <SupportsRemotes/>
        <SupportsSmartRemotes>6</SupportsSmartRemotes>
        <AllSmartRemoteTypesPerPortMustBeSame/>
        <SupportsPixelPortEndNullPixels/>
        <PixelProtocols>
            <Protocol>ws2811</Protocol>
        </PixelProtocols>
        <SerialProtocols>
            <Protocol>DMX-Open</Protocol>
            <Protocol>DMX-Pro</Protocol>
            <Protocol>GenericSerial</Protocol>
            <Protocol>LOR</Protocol>
            <Protocol>Pixelnet-Lynx</Protocol>
            <Protocol>Pixelnet-Open</Protocol>
            <Protocol>Renard</Protocol>
        </SerialProtocols>
        <SmartRemoteTypes>
            <Type>falcon_v1</Type>
            <Type>fpp_v2</Type>
            <Type>falcon_v4</Type>
        </SmartRemoteTypes>
        <fppStringFileName>co-bbbStrings</fppStringFileName>
    </AbstractVariant>
    <AbstractVariant Name="FPPShiftStringCape" Base="FPP:FPPStringCapeTTYs">
        <fppStringDriverType>BBShiftString</fppStringDriverType>
        <SmartRemoteTypes>
            <Type>falcon_v1</Type>
            <Type>fpp_v2</Type>
            <Type>falcon_v4</Type>
            <Type>falcon_v5</Type>
        </SmartRemoteTypes>
        <!-- The BBShiftString driver takes its bit cell from the ports at run time, so it can
             drive far more than the WS2811 family, and the idle level and bit width are per
             port.  T0/T1 and the end of the cell are single latch instants shared by every
             port on the PRU though, so the whole controller runs one bit cell: the protocols
             are partitioned into PixelProtocolGroups below and a config may only use one of
             them.  Mirrors PixelString::protocolTiming() in FPP. -->
        <SupportsMultipleSimultaneousOutputProtocols/>
        <PixelProtocols>
            <Protocol>ws2811</Protocol>
            <Protocol>ws2812</Protocol>
            <Protocol>ws2812b</Protocol>
            <Protocol>ws2813</Protocol>
            <Protocol>ws2815</Protocol>
            <Protocol>ws2818</Protocol>
            <Protocol>sk6812</Protocol>
            <Protocol>sk6813</Protocol>
            <Protocol>sm16703</Protocol>
            <Protocol>gs8206</Protocol>
            <Protocol>gs8208</Protocol>
            <Protocol>tm1809</Protocol>
            <Protocol>tm1812</Protocol>
            <Protocol>ucs1904</Protocol>
            <Protocol>ucs2903</Protocol>
            <Protocol>apa104</Protocol>
            <Protocol>apa106</Protocol>
            <Protocol>apa109</Protocol>
            <Protocol>sk6812rgbw</Protocol>
            <Protocol>sk6818</Protocol>
            <Protocol>sm16704</Protocol>
            <Protocol>ucs2904</Protocol>
            <Protocol>ws2814</Protocol>
            <Protocol>tm1814</Protocol>
            <Protocol>tm1814a</Protocol>
            <Protocol>ucs8903</Protocol>
            <Protocol>ucs8904</Protocol>
            <Protocol>ucs1903</Protocol>
            <Protocol>ws2811 slow</Protocol>
            <Protocol>tm1803</Protocol>
            <Protocol>gw6205</Protocol>
            <Protocol>tm1804</Protocol>
            <Protocol>sk6822</Protocol>
            <Protocol>pl9823</Protocol>
            <Protocol>ucs1912</Protocol>
            <Protocol>ge8822</Protocol>
        </PixelProtocols>
        <PixelProtocolGroups>
            <!-- 800kHz WS2811 family, plus the parts that differ in polarity (tm1814) or bit
                 width (ucs8903/8904) rather than timing, so those really are per port -->
            <Group>ws2811,ws2812,ws2812b,ws2813,ws2815,ws2818,sk6812,sk6813,sm16703,gs8206,gs8208,tm1809,tm1812,ucs1904,ucs2903,apa104,apa106,apa109,sk6812rgbw,sk6818,sm16704,ucs2904,ws2814,tm1814,tm1814a,ucs8903,ucs8904</Group>
            <Group>ucs1903,ws2811 slow</Group>
            <Group>tm1803</Group>
            <Group>gw6205</Group>
            <Group>tm1804</Group>
            <Group>sk6822,pl9823</Group>
            <Group>ucs1912</Group>
            <Group>ge8822</Group>
        </PixelProtocolGroups>
    </AbstractVariant>
    <AbstractVariant Name="FPPStringRPIWS281XPiHat" Base="FPP:BaseFPPSettings">
        <MaxSerialPortChannels>512</MaxSerialPortChannels>
        <MaxPixelPortChannels>4200</MaxPixelPortChannels>
        <SupportsVirtualStrings/>
        <SupportsAutoLayout/>
        <SupportsPixelPortEndNullPixels/>
        <PixelProtocols>
            <Protocol>ws2811</Protocol>
        </PixelProtocols>
        <SerialProtocols>
            <Protocol>DMX-Open</Protocol>
            <Protocol>DMX-Pro</Protocol>
            <Protocol>GenericSerial</Protocol>
            <Protocol>LOR</Protocol>
            <Protocol>Pixelnet-Lynx</Protocol>
            <Protocol>Pixelnet-Open</Protocol>
            <Protocol>Renard</Protocol>
        </SerialProtocols>
        <fppStringFileName>co-pixelStrings</fppStringFileName>
        <fppStringDriverType>RPIWS281X</fppStringDriverType>
    </AbstractVariant>
    <AbstractVariant Name="FPPStringDPIPiHat" Base="FPP:BaseFPPSettings">
        <MaxSerialPortChannels>512</MaxSerialPortChannels>
        <MaxPixelPortChannels>4200</MaxPixelPortChannels>
        <SupportsVirtualStrings/>
        <SupportsAutoLayout/>
        <SupportsRemotes/>
        <SupportsSmartRemotes>6</SupportsSmartRemotes>
        <AllSmartRemoteTypesPerPortMustBeSame/>
        <SupportsPixelPortEndNullPixels/>
        <PixelProtocols>
            <Protocol>ws2811</Protocol>
        </PixelProtocols>
        <SerialProtocols>
            <Protocol>DMX-Open</Protocol>
            <Protocol>DMX-Pro</Protocol>
            <Protocol>GenericSerial</Protocol>
            <Protocol>LOR</Protocol>
            <Protocol>Pixelnet-Lynx</Protocol>
            <Protocol>Pixelnet-Open</Protocol>
            <Protocol>Renard</Protocol>
        </SerialProtocols>
        <SmartRemoteTypes>
            <Type>falcon_v1</Type>
            <Type>fpp_v2</Type>
        </SmartRemoteTypes>
        <fppStringFileName>co-pixelStrings</fppStringFileName>
        <fppStringDriverType>DPIPixels</fppStringDriverType>
    </AbstractVariant>
    <Controller Name="LED Panels">
        <Variant Name="" ID="LED Panels" Base="FPP:BaseFPPSettings">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <MaxSerialPortChannels>512</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <SupportsLEDPanelMatrix/>
            <SupportsAutoLayout/>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
                <Protocol>DMX-Open</Protocol>
                <Protocol>DMX-Pro</Protocol>
                <Protocol>GenericSerial</Protocol>
                <Protocol>LOR</Protocol>
                <Protocol>Pixelnet-Lynx</Protocol>
                <Protocol>Pixelnet-Open</Protocol>
                <Protocol>Renard</Protocol>
            </SerialProtocols>
        </Variant>
    </Controller>
    <Controller Name="Virtual Matrix">
        <Variant Name="" ID="Virtual Matrix" Base="FPP:BaseFPPSettings">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <MaxSerialPortChannels>512</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <SupportsVirtualMatrix/>
            <SupportsLEDPanelMatrix/>
            <SupportsAutoLayout/>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
                <Protocol>DMX-Open</Protocol>
                <Protocol>DMX-Pro</Protocol>
                <Protocol>GenericSerial</Protocol>
                <Protocol>LOR</Protocol>
                <Protocol>Pixelnet-Lynx</Protocol>
                <Protocol>Pixelnet-Open</Protocol>
                <Protocol>Renard</Protocol>
            </SerialProtocols>
        </Variant>
    </Controller>
    <Controller Name="Pi4/Pi5 Virtual Matrix">
        <Variant Name="" ID="Pi4 Virtual Matrix" Base="FPP:BaseFPPSettings">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <MaxSerialPortChannels>512</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <SupportsVirtualMatrix/>
            <MaxVirtualMatrixPorts>2</MaxVirtualMatrixPorts>
            <SupportsLEDPanelMatrix/>
            <SupportsAutoLayout/>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
                <Protocol>DMX-Open</Protocol>
                <Protocol>DMX-Pro</Protocol>
                <Protocol>GenericSerial</Protocol>
                <Protocol>LOR</Protocol>
                <Protocol>Pixelnet-Lynx</Protocol>
                <Protocol>Pixelnet-Open</Protocol>
                <Protocol>Renard</Protocol>
            </SerialProtocols>
            <AltNames>
                <AltName>Pi4 Virtual Matrix</AltName>
            </AltNames>
        </Variant>
    </Controller>
    <Controller Name="Pi Hat">
        <Variant Name="2 Output RPIWS281X" ID="PiHat" Base="FPP:FPPStringRPIWS281XPiHat">
            <MaxPixelPort>2</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <SupportsVirtualMatrix/>
            <SupportsLEDPanelMatrix/>
            <fppSerialPort1>ttyAMA0</fppSerialPort1>
        </Variant>
        <Variant Name="2 Output DPI" ID="PiHat-DPIPixels" Base="FPP:FPPStringDPIPiHat">
            <MaxPixelPort>2</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <SupportsLEDPanelMatrix/>
            <fppSerialPort1>ttyAMA0</fppSerialPort1>
        </Variant>
        <Variant Name="24 Output DPI" ID="DPIPixels-24" Base="FPP:FPPStringDPIPiHat">
            <MaxPixelPort>24</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
            <SupportsVirtualMatrix/>
            <SupportsLEDPanelMatrix/>
            <fppSerialPort1>ttyAMA0</fppSerialPort1>
        </Variant>
    </Controller>
    <Controller Name="Octoscroller">
        <Variant Name="" ID="Octoscroller" Base="FPP:BaseFPPSettings">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <SupportsLEDPanelMatrix/>
            <SupportsAutoLayout/>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
            </SerialProtocols>
        </Variant>
    </Controller>
    <Controller Name="RGBCape24">
        <Variant Name="" ID="RGBCape24" Base="FPP:FPPStringCape">
            <MaxPixelPort>24</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <fpp>3</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
        </Variant>
    </Controller>
    <Controller Name="RGBCape48">
        <Variant Name="Revision C" ID="RGBCape48C" Base="FPP:FPPStringCape">
            <MaxPixelPort>48</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <fpp>6</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,8</fpp4>
            <fpp5>33,8</fpp5>
            <fpp6>41,8</fpp6>
        </Variant>
        <Variant Name="Revision F" ID="RGBCape48F" Base="FPP:FPPStringCape">
            <MaxPixelPort>48</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <fpp>6</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,8</fpp4>
            <fpp5>33,8</fpp5>
            <fpp6>41,8</fpp6>
        </Variant>
    </Controller>
    <Controller Name="F4-B">
        <Variant Name="" ID="F4-B" Base="FPP:FPPStringCape">
            <MaxPixelPort>4</MaxPixelPort>
            <MaxSerialPort>1</MaxSerialPort>
        </Variant>
    </Controller>
    <Controller Name="F16-B">
        <Variant Name="No Expansion (8 Serial)" ID="F16-B" Base="FPP:FPPStringCape">
            <MaxPixelPort>16</MaxPixelPort>
            <MaxSerialPort>8</MaxSerialPort>
        </Variant>
        <Variant Name="32 Outputs (8 Serial)" ID="F16-B-32" Base="FPP:FPPStringCape">
            <MaxPixelPort>32</MaxPixelPort>
            <MaxSerialPort>8</MaxSerialPort>
            <fpp>1</fpp>
            <fpp1>17,16</fpp1>
        </Variant>
        <Variant Name="48 outputs (No Serial)" ID="F16-B-48" Base="FPP:FPPStringCape">
            <MaxPixelPort>48</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <fpp>2</fpp>
            <fpp1>17,16</fpp1>
            <fpp2>33,16</fpp2>
        </Variant>
    </Controller>
    <Controller Name="Mirage">
        <Variant Name="No Receivers" ID="Mirage" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>24</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>3</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
        <Variant Name="One Receiver" ID="Mirage1Diff" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>28</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>4</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,4</fpp4>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
        <Variant Name="Two Receivers" ID="Mirage2Diff" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>32</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>5</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,4</fpp4>
            <fpp5>29,4</fpp5>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
        <Variant Name="Three Receivers" ID="Mirage3Diff" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>36</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>6</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,4</fpp4>
            <fpp5>29,4</fpp5>
            <fpp6>33,4</fpp6>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
        <Variant Name="Four Receivers" ID="Mirage4Diff" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>40</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>7</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,4</fpp4>
            <fpp5>29,4</fpp5>
            <fpp6>33,4</fpp6>
            <fpp7>37,4</fpp7>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
        <Variant Name="Five Receivers" ID="Mirage5Diff" Base="FPP:FPPStringCapeTTYs">
            <MaxPixelPort>44</MaxPixelPort>
            <MaxSerialPort>2</MaxSerialPort>
            <fpp>8</fpp>
            <fpp1>1,8</fpp1>
            <fpp2>9,8</fpp2>
            <fpp3>17,8</fpp3>
            <fpp4>25,4</fpp4>
            <fpp5>29,4</fpp5>
            <fpp6>33,4</fpp6>
            <fpp7>37,4</fpp7>
            <fpp8>40,4</fpp8>
            <fppSerialPort1>ttyS1</fppSerialPort1>
            <fppSerialPort2>ttyS2</fppSerialPort2>
        </Variant>
    </Controller>
    <Controller Name="FPP Player Only">
        <Variant Name="" ID="SP">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
            </SerialProtocols>
            <InputProtocols>
                <Protocol>player only</Protocol>
            </InputProtocols>
            <PlayerOnly/>
            <PreferredInputProtocol>Player Only</PreferredInputProtocol>
            <ConfigDriver>FPP</ConfigDriver>
        </Variant>
    </Controller>
    <Controller Name="FPP Video Playing Remote Only">
        <Variant Name="" ID="MP">
            <MaxPixelPort>0</MaxPixelPort>
            <MaxSerialPort>0</MaxSerialPort>
            <MaxSerialPortChannels>0</MaxSerialPortChannels>
            <MaxPixelPortChannels>0</MaxPixelPortChannels>
            <PixelProtocols>
            </PixelProtocols>
            <SerialProtocols>
            </SerialProtocols>
            <InputProtocols>
                <Protocol>player only</Protocol>
            </InputProtocols>
            <PlayerOnly/>
            <PreferredInputProtocol>Player Only</PreferredInputProtocol>
            <ConfigDriver>FPP</ConfigDriver>
        </Variant>
    </Controller>
</Vendor>
