Call for Sales and Service: 1-800-889-3751
UI Development Introduction
Introduction to User-Interface Development with Unity

The Parallax Control System UI System utilizes Unity Software for deploying sophisticated front-end user interfaces. Known for its powerful cross-platform capabilities, Unity allows seamless deployment of interactive UIs to Android, iOS, macOS, PC, and other platforms, making it an ideal choice for versatile and dynamic control system interfaces.  Parallax Control System provides a plugin for Unity which enables secure communication via MQTT between the user-interface project and the back-end control system logic. The interconnection between Unity, Node-RED and the .NET console app is pre-established, eliminating the need for additional integration work. The Plugin allows UI programmers the ability to not only create the UI with drag and drop features, but also features a UI generation tool. This makes it an ideal choice for programmers looking for an all-in-one solution with minimal setup requirements.


Parallax Control Processor: Typical programmer work-flow


 

Main Components of the Control System:

Parallax Plugin for Unity Software: A plugin designed for use with Unity Software. (Note: Unity Software must be obtained separately.)

Node-RED: An open-source flow-based development tool. Comes pre-loaded on the processor.

Parallax Nodes for Node-Red: Nodes for integrating with the Parallax Plugin for Unity Software.

Parallax Control Engine: An instruction set preloaded on the Parallax Control Processor.

 

Overview of UI and back-end signal flow

 Programmers have the option of choosing to handle back-end logic programming in either Node Red or a .NET console application. The system utilizes an MQTT broker, which runs on a pre-configured Node-RED server to facilitate communication between system components.

 

Node Red acts as the MQTT Broker, or message handler. It is the relay of all messages between the control panel and the processor.

 

Parallax provides a set of custom nodes for handling logic, and the programmer has the ability to create their own custom nodes using javascript. 

Setup Parallax Plugin for Unity
Installing Unity Hub

If you don’t already have Unity installed, install Unity Hub:

https://unity.com/download

We recommend installing the latest LTS version. 

Add your platform build support. This allows Unity to build UI for those platforms.

Import the Parallax Control Plugin for Unity Software

 

Create a new project.

Go to Assets -> Import Package -> Custom Package.

Import Package

Select the .unitypackage file and press Import.

Import Unity Package

The ParallaxControlSystem package for Unity is now installed and ready to use.

 
How to use the Parallax Control Plugin for Unity Software
Setting up the canvas in Unity (without setup wizard)
Connect Unity to MQTT Broker

Adding ParallaxProcessor Prefab 

The ParallaxProcessor prefab enables MQTT message handling between the UI project and the Control System.

 

This guide assumes the Automated UI generation tool is NOT being used to build the scene. When using the Automated UI Generation tool, the ParallaxProcessor prefab will be added to the scene already.

 

Adding ParallaxProcessor prefab to the scene

 

The ParallaxProcessor prefab contain the fields:

Broker Address: IP Address of the MQTT server.

Broker Port: Port of the MQTT server. Use port 1883 for programmatic access.

Username: as set in your Node-RED MQTT broker node.

Password: as set in your Node-RED MQTT broker node.

MQTT topics to subscribe to: In this field, you need to specify the topics that correspond to the message types your system will handle: Digital, Analog, and Serial. This field contains an expandable list where you can add or define these topics. Ensure that the topics specified here precisely match the topics defined in your MQTT output node, which sends feedback states to the touch-panel UI. Essentially, by subscribing to these topics, you enable the system to listen and react to feedback coming from the MQTT output node, reflecting the current state of each type (Digital, Analog, Serial) in the user interface.

 

 

Test connection

Ensure the MQTT broker is configured:

Aedes MQTT broker node

 

 

In the Unity editor, press the play button, check the Console to see the connection status. The Unity debug console log shows if the connection has been established:

 

 

View the debug log in Node-RED:

Message received in Node-RED debug log

 

 

Expand the log to view details:

The “id” field shows the Parallax-Touchpanel, along with its unique identifier

 

 

Access MQTT Server Web Page on the device:

The MQTT Node Red server comes pre-installed on the processor. The web page is accessible by the processors IP Address, at port 1880.

User: admin

Password: <devicemacaddress>

Default Programmatic Access Port: 1883

Default Web Page Port: 1880

Login to the Node Red web page to begin your logic programming.

Note: you may also spin up a node red server on your local machine for pre-programming and testing.

Setting up the Canvas

The default layout

This is the default layout when starting a new project. Rename your scene.

iPhone 12 selected in simulator

Select the Game Tab, then in the drop down, select Simulator, select your device.

Scene tab

In the scene tab you’ll see an outline of your workspace. Since we are working in 2D, we can delete the “Main Camera” object.

Add Canvas

Right click to show all the available UI elements to add to your project. After deleting the Main Camera, add a Canvas to the scene. This will be your main workspace area.

Modify Canvas

After adding the Canvas to the scene, a Canvas Scaler will appear in the Inspector panel. Modify the Render Mode to: Overlay and Screen Match Mode to: Shrink You are now ready to start laying out the canvas with UI elements.
Create a background for the Canvas

Add an Image to the scene

Right click Canvas -> UI -> Image

Set the alignment of your newly added Image object

Press Alt and the bottom right option to expand the Image object to fill the space

Expand the image to the extents of the workspace.

You now have a white background. To learn more about anchoring and aligning objects using the RectTransform, watch this video: https://youtu.be/FeheZqu85WI 

View your background on the iPad

Select Simulator -> Select iPad Pro 12.9 Verify your background scales correctly in both portrait and landscape by pressing the Rotate button:
Add an image to the Canvas

Now that you’ve added a background to the image, we will overlay a background logo. The final result will look like so:

 

The image for the logo will be a child component of the background image we created in the previous section.

Right click the background object, add another image. In the Inspector, the Source Image property field accepts a .png. Drag your image to this field.

For organizational purposes, it recommended to create folders for your images. Navigate to the Assets folder, right click Create Folder, name the folder Images.

Drag your image, select It is likely you will want to select Preserve Aspect to maintain the proportions of your image.

Add Header, Footer, Body, Navigation and Pages to the Canvas workspace area.

Current Hierarchy

Under the “bg” component, add a new Empty GameObject, name it “top”. Notice the “top” object is now a child of the “bg”. This will serve as a placeholder for the top bar area.

With the “top” component selected, go to the Rect Transform, select Alt + Top and Stretch-Top. It should look  like this:

Next, add an Image component as a child element of the “top”, change the color.

 

The hierarchy should now look like this:

Next, go back to the Simulator to test. Make sure the objects scales to different devices and rotates properly as well.

Confirm the top flex’s properly: Select Simulator, iPad 12.9, Landscape Mode

Now switch back to portrait mode on iPhone. Add in the footer.

To do this, right click on “bg” select Create Empty GameObject. Rename it “footer”. Using the Rect Transform, select Alt + Bottom, Stretch.

Now add the background: add an Image as a child of the “footer”. Stretch it: In Rect Transform select Alt + Stretch/Stretch. Change the color.

Here is the result:

Next, we will add a body area that will be common to all pages.

Add an Empty GameObject as child of “bg”, rename it “body”. Align it in Rect Transform: Select Alt + Stretch/Stretch. Note that it will go to the far extents/edges. We only want it to cover the center area of the body, not go past the header or footer:

So to fix this, using the rect tool, drag the blue dots until they encapsulate the area between the header and footer, they will snap in place:

In the next section we will create the Canvas Pages and show how to flip through them using the footer navigation.

Adding Canvas Pages, Navigation

Next, add a Canvas as a child component to the “body”, set the RectTransform: Select Alt + Stretch/Stretch.

The Canvas should now be covering the body. Rename the Canvas to “Audio_Page”. Hide the Canvas by checking the hidden eye icon to the left of the Canvas in the hierarchy:

 

Select the Audio_Page in the Hierarchy and Ctrl + D to duplicate it, rename it “Video_Page”:

 

Show/Hide your pages in the developer view so they are not in the way of your work.

Add a navigation menu with Buttons

In this section we will add 3 Buttons as child objects of the “footer_bg”. Then use a custom script to toggle between the Canvas on each press.

  • First, we will want to control the layout of our Buttons. Do this by adding a Horizontal Layout Group to your “footer_bg”. To do this, in the Inspector, click Add Component -> Horizontal Layout Group. Add a spacing of 2. Change Child Alignment to “Middle Center”. The Horizontal Layout Group will evenly distribute the objects.
  • Add 3 Buttons as child to the “footer_bg” component. Name them Home, Audio, Video. The 3 Buttons will now spread out evenly across the parent object.

3 Button’s added to footer

In the next section we will explain how to add page flip for the nav bar.

Add Page Flip to Nav Bar
Icons resource: You can use tools like Adobe Photoshop, or Illustrator to create your own graphics and drop them into the Assets/Images folder. Another great paid resource for customizable png images is: https://thenounproject.com 
Create a Prefab

Drag the MyCustomRowObject to the newly created Prefab folder, it will turn into a prefab object for reusability.

 

Unhide the Audio_Page and add a GameObject container. Expand it to fill the area and rename it “body”.

Next add another GameObject called “MyCustomRowObject”, in the RectTransform set it to (ALT + Middle/Stretch) so that it expands to fill the width of the body container. Set it to a height of 50 pixels. Add a background Image. Add a Horizontal Layout Group to the background Image. Next, add an empty GameObject for the slider. Add another empty GameObject for the Text. Both cells should automatically populate next to each other. Add the Slider and Text object as child components to each of the Empty GameObjects.

Next we will save the “MyCustomRowObject” as a prefab. First create a new folder under the Assets folder called Prefabs. Then drag the “MyCustomRowObject” into the folder. When you drag it into the prefab folder it will turn blue indicating it is now a prefab.

You can now delete the MyCustomRowObject prefab from your scene, as it is saved as a prefab for later use.

In the next section we will use the prefab in the ScrollingListController script to create a horizontal or vertical scrolling list.

Troubleshooting UI: Objects appear non-interactable. See: Raycast Targets
Knowing about raycast targets will save you some headache when developing custom prefabs. A good understanding of these concepts can indeed save a lot of debugging time and make the development process smoother. A raycast is like a laser beam shooting out from your mouse click or finger, whatever that laser lands on you can interact with. But imagine there is an invisible layer over that button, instead of hitting the button, the laser hits the invisible layer, and so the button is not triggered. Below is an analogy for Unity Raycast Targets – playing darts. In a game of darts, you throw darts at a dartboard. The dartboard here represents a 2D game in Unity, and the different scoring sections on the board represent different objects (or UI elements) in the game. 1. **Raycasting:** Throwing a dart at the dartboard is similar to raycasting in Unity. Just like the dart follows a straight line towards the board, raycasting in Unity is about drawing an imaginary line (ray) from a point in a certain direction to check what it hits first. 2. **Raycast Target:** Now, imagine that some sections of the dartboard are covered with a transparent shield. You can see these sections, but when you throw a dart at them, it can’t reach the board because of the shield. This shield can be thought of as the “Raycast Target” set to false in Unity. It makes the object (or section of the dartboard) visible but not interactable – the raycast (dart) can’t hit it. 3. **Raycast Target true/false:** If there’s no shield on the dartboard section (Raycast Target = true), then when you throw a dart (perform a raycast), it will hit and interact with that section. But if there is a shield (Raycast Target = false), the dart will not be able to interact with that section – it’s as if the dart “misses” that section and checks for the next thing it can hit. 4. **Hierarchy & Raycasting:** Let’s add another layer to this analogy. Say there’s a small, secondary dartboard (child object) hanging in front of the larger dartboard (parent object). If you throw a dart aimed at the smaller board (and it doesn’t have a shield), you’ll hit it – not the larger board behind it. That’s because, just like raycasting, the dart will hit the first object it encounters. To sum up, in Unity 2D, setting the “Raycast Target” option is like deciding whether to put a shield on sections of your dartboard – you’re setting whether or not an object can be “hit” by user interactions like clicks or touches. In Unity’s UI system, an Image component with a transparent texture can still block raycasts if its raycastTarget property is set to true. The raycast doesn’t take the alpha (transparency) value of the image into account. It only cares whether or not the Image component is set as a raycast target and the image’s size and position. So if you have a transparent image in front of a button, and both of them have raycastTarget set to true, the raycast will hit the transparent image first and won’t reach the button, even if the image is fully transparent and the button is visible to the player. To make the button interactable, you would need to set the raycastTarget property of the transparent Image to false. This way, the raycast will “pass through” the transparent image and can hit the button behind it. This is an important point to remember when designing UIs in Unity. Even a fully transparent object can block interactions if it’s set as a raycast target.
Parallax UI Configurator (Automated UI Generation)
What is the Parallax UI Configurator

The Parallax UI Configurator is a set of panels within the Unity Editor that allows the user-interface programmer the ability to deploy a complete user-interface control panel with zero code and very little knowledge of the Unity Software environment. 

The UI Configurator can be used to deploy a full working UI, or it can be used to deploy the initial framework, form which the UI programmer can then further customize.

Accessing the Configuration View

The configuration view provides the UI programmer with a single set of panels from which a completed UI program can be built.

 

To access the configuration view:

In Unity, at the top bar, select Window -> Parallax UI Configuration.

Elements of the Configuration View

The Parallax UI Configurator consists of the follow panels:

  1. UI Components
  2. Database Viewer
  3. Setup Wizard
  4. Connection Settings

Control Panel

Database Viewer

Scene Wizard

Connection Settings

Configuration View: UI Components
Control Panel

The control panel allows you to control all the UI elements that are on the scene and configure them directly from the control panel window.

Note: The control panel window is typically used once the UI has been created. If no components are in the scene, the control panel will show no objects.

Name Filter: Search for a UI Component in the scene by its name.

Element List: Each item Type in the list contains a collection of UI components found in the scene.

Content: Contains a list of all the UI Components found in the scene. 

For each item that was found, it will indicate the name of the UI Component, and the name of the page it is located on.

Upon expanding the item in the list, it will show the UI components relevant JoinID information.

Selection: The selection button is a helper function to locate the selected UI Components in the scene.

Configuration View: Database Viewer
Database Viewer

Database Viewer lets you add your own custom elements to a Scriptable Objects database and expand the system at your discretion.

Database Viewer consists of an Element List and a Content Area for the selected database type.

Each type of Database Type in Element List contains all the objects necessary for the functioning of the system as a whole. Each Database Type can be customized with multiple variants, which can be later recalled inside of the Scene Wizard. This allows the development of custom templates, which can be re-used in the Scene Wizard to generate completed user-interface projects. 

Content section displays all objects of the selected database type.

Element List for each type of database may have a completely different set of data that is necessary for the operation of the system and is under the control of the developer just in one click in Database View Window.

Configuration View: Setup Wizard
Setup Wizard

The setup wizard panel generates a complete UI along with JoinID’s from you to quickly set up the framework of your UI, and automatically generates the scene.

Navigation position determines the position of the Nav bar and Info Bar (top or bottom).
Elements Variant is an object of the WizardElementsVariant type that defines objects created on the stage and built in the list of pages
Color Scheme is an object of the ColorScheme type that defines the color scheme of building element, pages and tabs
Pages List is a list element that you need to fill with all sorts of elements that correspond to each page and has nested data

Every Page in Pages List contain:
Page Name is a string field that you can enter based on purpose of that page
Navigation Icon is a sprite field that allow you to add icon to Page in navigation panel
Elements are a list of types that you can add to add and display on this page

Elements can contain items:
Button
Text
Image
Slider
Dropdown
InputField
USBCamera
VideoPlayer
WebRTCPlayer
SmartList
Row
Tile

Row and Tile elements can hold more same child elements

UI Elements
UI Elements

UI elements, or User Interface elements, are the fundamental components that make up the graphical user interface in software applications. They are the visual and interactive parts that allow users to interact with the software, providing ways to input data, navigate, and receive feedback. UI elements are designed to be intuitive and efficient, helping users perform tasks and making the experience as smooth and pleasant as possible. 

 

Parallax Control provides a set of pre-built UI Elements, which are located in the Assets/Prefabs folder. 

 

The pre-built UI Elements contain:

Button

Slider

InputTextField

TextOutputField

Dropdown

Image

VideoPlayer

WebRTC Player

USBCamera

 

UI_VideoPlayer

The UI_VideoPlayer contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Allows selection of video by matching video name.

Analog Join ID: Allows selection of video by element of video in the list.

Videos Database: The videos database field accepts a scriptable object of type VideosDatabase. The ScriptableObjects is located in Assets/ScriptableObjects folder.

UI_Video Player Fields

 

Videos Database

 
The Videos Database contains a Video Clip List.
To setup, simply drag and drop the videos in to the Video Clip List.
You can play videos by the order of the element, or by the videos name.
UI_WebRTC

The UI_WebRTC contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

URL: The url for the web rtc stream player to listen on

For instance:

http://192.168.10.13:1985/rtc/v1/whip-play/?app=live&stream=livestream

Web RTC Player

 
 
 
 
UI_USB Cam Player

The UI_USB Cam Player contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

 

UI_Time

The UI_Time contains the following fields:

 

Hours: Show or hide

Minutes: Show or hide

Seconds: Show or hide

Milliseconds: Show or hide

 

 

The time system is tied to the local system which it is running on.

UI_Tile

The UI_Tile contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

 

A tile is essentially a visual container with a background that encapsulates UI Elements. 

UI_Text

The UI_Text contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Sets text dynamically from the control system. 

 

 

The UI_Text element contains a text object which can be set dynamically from the control system.

UI_Slider

The UI_Slider contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Analog Join ID: The Analog Join ID for the slider.

Slider Min: the minimum value for the slider.
Slider Max: the maximum value for the slider.

Default Value: the default value for the slider handle.

 

The UI_Slider element contains a slider which accepts user touch based feedback; the value of the slider can also be set from the control system.

UI_Row

The UI_Row contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

 

The UI_Row element allows other UI element to be added to the row. The UI_Row element will automatically position the UI element within the horizontal row. 

UI_Input Field

The UI_Input Field contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Sends the user specified text to the control system. 

UI_Input Field text is sent when the user finishes editing the text content by either losing focus of the input field or pressing enter.

UI_Image

The UI_Image contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Allows selection of the image by matching its name.

Analog Join ID: Allows selection of the image from the Sprites Database by its element.

Sprites Database: Contains a ScriptableObject of type UPL_Sprites Database. The UPL_Sprites Database is located in the Assets/ParallaxControlSystem/ScriptableObjects folder and contains a Sprites List.

 

UPL_Sprites Database

 

The Sprites List contains the list of image objects. The image object can be selected by the control system by element or string match.

UI_Header

The UI_Header contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Sets text dynamically from the control system. 

 

The UI_Header sets a header text to the top of the page.

UI_Dropdown

The UI_Dropdown contains the following fields:

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Analog Join ID: Sends the element of the item in the list that was selected to the control system.

Dropdown elements:

Contains a list of elements that will be shown in the drop down list. Each element in the list contains a Text and Image (Sprite).

UI_Dropdown

UI_Button

The UI_Button contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Press Join ID: The unique ID for the button to be sent to the control system. The Join ID also provides feedback from the control system.

Dynamic Text Serial Join ID: Allows the button label to be dynamically set from the control system. 

Button Settings: The button settings section contains a Unity Event system. This field is used to trigger custom actions on the button press. 

Button Type: Contains an option for Single Click, or Long Click.

Single Click: A momentary high signal sent to the control system.

Long Click: Sends a high signal, along with a time stamp indicating the time in ms in which the button has been held down. Upon release, a low value is sent.

Highlighted Color: Contains a color picker to set the high feedback state of the button. 

 

UI_Button

 

UI_Smart List

The UI_Smart List contains the following fields:

 

Visibility Digital Join ID: If empty, the object will be visible. If a value is entered, it will be invisible until the value is received from the control system.

Dynamic Text Serial Join ID: Identifies the smart list.

Smart Join Prefix: Adds a prefix to an item in the list.

Smart Element Prefab Database: Contains a ScriptableObject of custom type UPL_Smart Panel.  The UPL_Smart Panel Prefab Database is located in the Assets/ParallaxControlSystem/ScriptableObject folder.  

 

UPL_Smart Panel Prefab Database

 

The UPL_Smart Panel Prefab Database contains a custom prefab which is duplicated in the Smart List. Prefabs consists of UI_Elements laid out specifically to fit the needs of the project.

 

UI_Smart List

 

Hardware Configuration
Building User Interface (Android)

File -> Build Settings

Build Settings

 

Follow the steps below to confirm the Api Compatibility Level is set correctly in your Unity Project.

In Unity, navigate to File -> Build Settings. Select Player Settings.

Under Player tab, select Other Settings. Scroll down to Configuration.

Ensure .NET Framework and IL2CPP are selected

Android specific build settings

 

After you’re done, go back to the Build Settings window, ensure the scene is selected. Unity will then build the necessary files to the folder location of your choosing (create a new UI Build folder for these files).

Building to android is straight forward, it creates a .apk file which can be transferred to your android device via usb or bluetooth.

 

PoE Touchpanel Setup
To connect the touchpanel directly (wirelessly) to the control processors on-board access-point, ensure the touch-panels ip address is set to DHCP as it will acquire an address from the access point. The default SSID is cm4-. The default password is the control processors mac address (all lower-case, no colons). Note: If connecting to the onboard access point (by wireless laptop, or wireless tablet), the client device will acquire an address in the 192.168.10.0 subnet from the server (processor). The processor will have a static ip address of 192.168.10.10 on its wireless access point by default. LOADING USER-INTERFACE PROGRAM TO THE PARALLAX POE TOUCHPANEL: If using the PoE Android Touchpanel, download the Android File Transfer tool and put the .apk in the touchpanels download folder. A connection can be made by Bluetooth, or usb (recommended). Select apkinstaller -> Install, navigate to the download folder and select the .apk you just built. SET THE BOOT UI APP: On the home screen, navigate to settings -> accessibility -> boot app, select your application (must be installed already for it to show on the list). LOCK/UNLOCK THE UI APP USING THE SERVICE ONLY EXIT SEQUENCE: To prevent end-users from getting out of the app, press the power button on the back of the touchpanel 3 times within 5 seconds. Test the current state of the app lock/unlock feature by dragging your finger from the bottom of the screen upwards, or from the top downwards. If the app is not locked, you will see the android menus. If the screen is successfully locked no exit or settings menu will appear. TESTING THE BOOT UI APP AND APP LOCK/UNLOCK FEATURE: After setting your application to auto-start, and setting the app lock feature, do a full test by simulating a power loss; remove the POE plug from the back of the unit. Plug the POE back into the unit. Once the touchpanel starts it should immediately load your custom .apk user-interface. There should be no way for the user to exit the application.
Coming Soon: Installing .APK to Android

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.

Coming Soon: Installing to iPhone or iPad

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.

Coming Soon: Configuring Android Tablet

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.

Coming Soon: Configuring iOS

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.

Coming Soon: Changing Target IP Address

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.

Coming Soon: Checking Debug Logs

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut orci sapien, cursus tempor aliquet eget, dapibus sed mauris. Duis vehicula non elit id tristique. Integer ut nisi a ligula bibendum luctus. Ut varius pellentesque pellentesque. Mauris tincidunt tellus at sapien sagittis mattis. Proin laoreet lacus eget rutrum aliquam. Nulla porttitor imperdiet posuere. Fusce consectetur hendrerit lacus eget molestie. Integer dolor augue, dictum eu justo sed, efficitur molestie urna. Ut cursus lorem ligula, sed mattis tortor volutpat nec.

Proin semper lobortis felis, vel finibus ipsum mattis quis. Nulla ullamcorper leo eu felis consequat consequat. Donec dignissim accumsan ipsum nec interdum. Donec quis semper nisi. Quisque at sem bibendum, sodales sapien et, ultricies orci. Sed nec sapien eu odio aliquet faucibus vitae nec sem. Sed sed elit porttitor, lobortis nunc quis, efficitur orci. Mauris vehicula ultrices sagittis.

In non imperdiet est. Suspendisse consequat eget libero quis tempus. Suspendisse felis purus, ultrices sed semper sed, malesuada a erat. Sed faucibus a ante at tempor. Etiam lectus est, porta et mauris non, accumsan convallis felis. Suspendisse ut maximus est, quis ornare erat. Maecenas finibus purus ut auctor dignissim. Cras vel nisl dictum, elementum ex non, sollicitudin urna. Nam congue urna consectetur leo vehicula porta eu non justo. Nam ultrices finibus congue. Quisque auctor hendrerit augue, et congue erat fringilla sed. Ut pellentesque diam a suscipit facilisis. Donec eleifend sollicitudin facilisis. Sed ultricies efficitur ante a vehicula.

Nunc ultricies porta libero, sed placerat dui sagittis posuere. Aliquam eget scelerisque orci. Phasellus sollicitudin orci vel turpis semper bibendum. Pellentesque odio justo, elementum nec ex vel, sollicitudin rutrum sem. Phasellus quis enim aliquet, porta arcu et, eleifend orci. Mauris consequat consectetur pretium. Donec vitae tellus maximus, convallis tortor sit amet, viverra quam.

Vestibulum mollis elit felis, maximus bibendum risus egestas id. Maecenas placerat auctor odio, nec dignissim nisi tincidunt vitae. Nulla quis gravida nisl. Proin hendrerit nibh elit, at eleifend ligula placerat eu. Cras ipsum erat, dapibus vel mauris bibendum, rutrum tincidunt arcu. Sed aliquet dapibus ante. Aenean pharetra, mauris aliquet placerat cursus, turpis mauris dictum ligula, suscipit sollicitudin massa metus vitae urna. Vivamus imperdiet, urna vitae gravida convallis, sem ligula egestas mauris, et iaculis ex arcu et lorem. Vestibulum porttitor massa neque, quis tempor sem ornare et. Sed quis pretium dolor. Suspendisse nibh eros, finibus at nisl id, sodales mollis tellus. Nam condimentum turpis nec eros rhoncus, eget imperdiet tellus suscipit. Sed nec commodo augue, sed fringilla nisl. Fusce lacinia arcu at blandit tristique.