updated links for join map

Andrew Welker
2020-05-12 15:02:05 -06:00
parent 5fa97aa507
commit 6c17400a0b
2 changed files with 52 additions and 52 deletions

@@ -1,16 +1,16 @@
# What is a Join Map?
A join map is a class that defines the list of joins accessible to an ```EssentialsBridgeableDevice``` across an EISC Bridge.
A join map is a class that defines the list of joins accessible to an `EssentialsBridgeableDevice` across an EISC Bridge.
## Why use a Join Map?
A join map is necessary to bridge joins across an EISC bridge from Essentials to a SIMPL program. Join maps can be overriden in your configuration as necessary, but by default each device has a standard join map that publishes joins as a function of the joinOffset property of the device within a given Essentials Bridge. Join maps are reusable and extensible. Several join maps for standard device types already exist within Essentials, and those can be utilized for plugin creation without creation of a new join map. Utilizing standard join maps allows you to create a consistent API between device types that allows switching of devices via config without any new SIMPL or SIMPL#Pro code being written.
A join map is necessary to bridge joins across an EISC bridge from Essentials to a SIMPL program. Join maps can be overriden in a configuration as necessary, but by default each device has a standard join map that publishes joins as a function of the joinOffset property of the device within a given Essentials Bridge. Join maps are reusable and extensible. Several join maps for standard device types already exist within Essentials, and those can be utilized for plugin creation without creation of a new join map. Utilizing standard join maps allows you to create a consistent API between device types that allows switching of devices via config without any new SIMPL or SIMPL#Pro code being written.
## How Join maps Work
Whenever you instantiate a device and link that device to an EISC bridge utilizing your configuration in Essentials, the method ```LinkToApi()``` is called. This method matches various methods, feedbacks, and properties to joins on the EISC bridge in order to create a consistent API for communication to SIMPL.
Whenever you instantiate a device and link that device to an EISC bridge utilizing your configuration in Essentials, the method `LinkToApi()` is called. This method matches various methods, feedbacks, and properties to joins on the EISC bridge in order to create a consistent API for communication to SIMPL.
Whenever ```LinkToApi()``` is called, it creates a new instance of the device's joinMap class on demand. The constructor of that joinMap creates an object containing the join metadata, adds any configured join offsets to the standard join map, and adds all associated joins to a global join list that can be easily referenced from the command line.
Whenever `LinkToApi()` is called, it creates a new instance of the device's joinMap class on demand. The constructor of that joinMap creates an object containing the join metadata, adds any configured join offsets to the standard join map, and adds all associated joins to a global join list that can be easily referenced from the command line.
There are several components for each join within a join map.
@@ -26,7 +26,7 @@ There are several components for each join within a join map.
[JoinName("Online")]
```
If the attribute is present, the join data is added to the publically available list ```Joins```. This can be used to "prebuild" functionality within a join map that you may not yet need. If you do not add this attribute (or simply comment it out), the join data will not be displayed whenever join data is printed using the ```getjoinmap``` command.
If the attribute is present, the join data is added to the publically available list `Joins`. This can be used to "prebuild" functionality within a join map that you may not yet need. If you do not add this attribute (or simply comment it out), the join data will not be displayed whenever join data is printed using the `getjoinmap` command.
### JoinData
@@ -34,13 +34,13 @@ If the attribute is present, the join data is added to the publically available
JoinData() { JoinNumber = 1, JoinSpan = 1 };
```
```JoinData``` is the only real pertinent information to the bridge. JoinData contains all the information that the bridge utilizes to create each associated connection from the EISC to the methods, properties, and feedbacks associated with a device.
`JoinData` contains the pertinent information for the bridge. JoinData contains the information that the bridge utilizes to create each associated connection from the EISC to the methods, properties, and feedbacks associated with a device.
```JoinNumber``` is the index of the join you wish to tie to a given method, property, or feedback. This join, combined with the offset defined in the device declaration on a bridge, will give you the SIMPL EISC join linked to the given data.
`JoinNumber` is the 1-based index of the join you wish to tie to a given method, property, or feedback. This join, combined with the offset defined in the brdige's configuration for a device, will give you the SIMPL EISC join linked to the given data.
```JoinSpan``` determines a number of associated joins. Perhaps you have a list of Camera Presets, or a list of inputs. You can create one single join map entry and define the span of all associated join types.
`JoinSpan` determines a number of associated joins. Perhaps you have a list of Camera Presets, or a list of inputs. You can create one single join map entry and define the span of all associated join types.
A ```JoinData``` object with a ```JoinNumber``` of 11 and a ```JoinSpan``` of 10 is associated with joins 11-20.
A `JoinData` object with a `JoinNumber` of 11 and a `JoinSpan` of 10 and a `joinOffset` of 0 is associated with joins 11-20 on the EISC.
### JoinMetadata
@@ -48,11 +48,11 @@ A ```JoinData``` object with a ```JoinNumber``` of 11 and a ```JoinSpan``` of 10
JoinMetadata() { Label = "Reports Online Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital }
```
```JoinMetadata``` provides the plurality of data reported when the ```getjoinmap``` command is used.
`JoinMetadata` provides the data reported when the `getjoinmap` command is used.
```Label``` is the description of the what this join does.
`Label` is the description of the what this join does.
```JoinCapabilities``` is represented by an enum defining the direction that the data is flowing for this join. Appropriate values are:
`JoinCapabilities` is represented by an enum defining the direction that the data is flowing for this join. Appropriate values are:
```csharp
public enum eJoinCapabilities
@@ -64,7 +64,7 @@ public enum eJoinCapabilities
}
```
```JoinType``` is represented by an enum defining the data type in SIMPL. Appropriate values are:
`JoinType` is represented by an enum defining the data type in SIMPL. Appropriate values are:
```csharp
public enum eJoinType
@@ -86,11 +86,11 @@ public enum eJoinType
JoinDataComplete(JoinData data, JoinMetadata metadata);
```
```JoinDataComplete``` represents the ```JoinData``` and the ```JoinMetadata``` in a single object. You can call upon an instance of ```JoinDataComplete``` to report any information about a specific join. In a device bridge, you would typically utilize the ```JoinNumber``` property to link a feature from the plugin to the EISC API.
`JoinDataComplete` represents the `JoinData` and the `JoinMetadata` in a single object. You can call an instance of `JoinDataComplete` to report any information about a specific join. In a device bridge, you would utilize the `JoinNumber` property to link a feature from the plugin to the EISC API.
### Example Join Map
This is the join map for ```IBasicCommunication``` Devices
This is the join map for `IBasicCommunication` Devices
```csharp
namespace PepperDash.Essentials.Core.Bridges
@@ -134,7 +134,7 @@ namespace PepperDash.Essentials.Core.Bridges
A mechanism for printing join maps to console from a running Essentials program is built in to Essentials.
Given a single Generic Communication device with an offset of 11 and a key of "Com-1", defined on a bridge with a key of "Bridge-1" and IPID of A0, the command ```getjoinmap Bridge-1 Com-1``` would return:
Given a single Generic Communication device with an offset of 11 and a key of "Com-1", defined on a bridge with a key of "Bridge-1" and IPID of A0, the command `getjoinmap Bridge-1 Com-1` would return:
```sh
Join Map for device 'Com-1' on EISC 'Bridge-1':

@@ -1,6 +1,6 @@
# SIMPL Windows Bridging
Essentials allows for devices defined within the SIMPL# Pro application to be bridged to a SIMPL Windows application over Ethernet Intersystem Communication (EISC). This allows a SIMPL Windows program to take advantage of some of the features of the SIMPL# Pro environment, without requiring the entire application to be written in C#.
Essentials allows for devices defined within the SIMPL# Pro application to be bridged to a SIMPL Windows application over Ethernet Intersystem Communication (EISC). This allows a SIMPL Windows program to take advantage of some of the features of the SIMPL# Pro environment, without requiring the entire application to be written in C#.
Some of the main advantages are:
@@ -14,9 +14,9 @@ Some of the main advantages are:
## Implementation
Bridges are devices that are defined within the devices array in the config file. They are unique devices with a specialized purpose; to act as a bridge between Essentials Devices and applications programmed traditionally in Simpl Windows. This is accomplished by instantiating a Three Series Intersystem Communication symbol within the bridge device, and linking its Boolean/Ushort/String inputs and outputs to actions on one or multiple Essentials device(s). The definition for which joins map to which actions is defined within the device to be bridged to in a class that derives from JoinMapBase.
Bridges are devices that are defined within the devices array in the config file. They are unique devices with a specialized purpose: to act as a bridge between Essentials Devices and applications programmed traditionally in SIMPL Windows. This is accomplished by instantiating a Three Series Intersystem Communication symbol within the bridge device, and linking its Boolean/Ushort/String inputs and outputs to actions on one or multiple Essentials device(s). The definition for which joins map to which actions is defined within the device to be bridged to in a class that derives from JoinMapBase.
Let's consider the following Essentials Configuration:
Let's consider the following Essentials Configuration:
```JSON
{
@@ -139,9 +139,9 @@ We have four Essentials Devices configured:
1. Bridge with a Key of "deviceBridge"
We want to have access to the com port for VTC Control from Simpl Windows and we want to control the display from Simpl Windows. To accomplish this, we have created a bridge device and added the devices to be bridged to the "devices" array on the bridge. As you can see we define the device key and the join start, which will determine which joins we will use on the resulting EISC to interact with the devices. In the Bridge control properties we defined ipid 03, and we will need a corresponding Ethernet System Intercommunication in the Simpl Windows program at ipid 03.
We want to have access to the com port for VTC Control from SIMPL Windows and we want to control the display from SIMPL Windows. To accomplish this, we have created a bridge device and added the devices to be bridged to the "devices" array on the bridge. As you can see we define the device key and the join start, which will determine which joins we will use on the resulting EISC to interact with the devices. In the Bridge control properties we defined ipid 03, and we will need a corresponding Ethernet System Intercommunication in the SIMPL Windows program at ipid 03.
Now that our devices have been built, we can refer to the device join maps to see which joins correspond to which actions.
Now that our devices have been built, we can refer to the device join maps to see which joins correspond to which actions.
See below:
@@ -226,7 +226,7 @@ PowerOn = 2
IsTwoWayDisplay = 3
VolumeUp = 5
VolumeDown = 6
VolumeMute = 7
VolumeMute = 7
```csharp
namespace PepperDash.Essentials.Core.Bridges
@@ -266,35 +266,35 @@ namespace PepperDash.Essentials.Core.Bridges
}
```
Considering our Bridge config, we can see that the display controls will start at join 1, and the VTC Com port will start at join 51. The result is a single EISC that allows us to interact with our Essentials devices.
Considering our Bridge config, we can see that the display controls will start at join 1, and the VTC Com port will start at join 51. The result is a single EISC that allows us to interact with our Essentials devices.
To control diplay power from Simpl Windows, we would connect Digital Signals to joins 1 & 2 on the EISC to control Display Power On & Off.
To control diplay power from SIMPL Windows, we would connect Digital Signals to joins 1 & 2 on the EISC to control Display Power On & Off.
To utilize the com port device, we would connect Serial Signals (VTC_TX$ and VTC_RX$) to join 51 on the EISC.
You can refer to our [Simpl Windows Bridging Example](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for a more complex example.
You can refer to our [SIMPL Windows Bridging Example](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for a more complex example.
Example device config: <https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json>
## Notes
1. It is important to realize that there are no safety checks (yet) when assigning joinStarts in bridge configurations. If you were to put two devices on a bridge with overlapping joins, the most recently bridged join would overwrite previously bridged joins. For now it is on the programmer to ensure there are no conflicting join maps.
1. It is important to realize that there are no safety checks (yet) when assigning joinStarts in bridge configurations. If you were to put two devices on a bridge with overlapping joins, the most recently bridged join would overwrite previously bridged joins. For now it is on the programmer to ensure there are no conflicting join maps.
2. There is _no_ limit to the amount of times a device may be bridged to. You may have the same device on multiple bridges across multiple applications without problem. That being said, we recommend using common sense. Accessing a single com port for VTC control via multiple bridges may not be wise...
2. There is _no_ limit to the amount of times a device may be bridged to. You may have the same device on multiple bridges across multiple applications without problem. That being said, we recommend using common sense. Accessing a single com port for VTC control via multiple bridges may not be wise...
3. A bridge need not only bridge between applications on the same processor. A bridge may bridge to an application on a completely separate processor; simply define the ip address in the Bridge control properties accordingly.
3. A bridge need not only bridge between applications on the same processor. A bridge may bridge to an application on a completely separate processor; simply define the ip address in the Bridge control properties accordingly.
4. For devices included in Essentials, you will be able to find defined join maps below. If you are building your own plugins, you will need to build the join map yourself. It would be beneficial to review the wiki entry on the [Feedback Class](https://github.com/PepperDash/Essentials/wiki/Feedback-Classes) for this.
4. For devices included in Essentials, you will be able to find defined join maps below. If you are building your own plugins, you will need to build the join map yourself. It would be beneficial to review the wiki entry on the [Feedback Class](https://github.com/PepperDash/Essentials/wiki/Feedback-Classes) for this.
5. When building plugins, we highly recommend reusing JoinMaps, as this will make code more easily interchangeable. For example; if you were to build a display plugin, we'd recommend you use/extend the existing ```DisplayControllerJoinMap```. This way, you can swap plugins without needing any change on the Simpl Windows side. This is extremely powerful when maintaining Simpl Windows code bases for large deployments that may utilize differing equipment per room. If you can build a Simpl Windows program that interacts with established join maps, you can swap out the device via config without any change needed to Simpl Windows.
5. When building plugins, we highly recommend reusing JoinMaps, as this will make code more easily interchangeable. For example; if you were to build a display plugin, we'd recommend you use/extend the existing `DisplayControllerJoinMap`. This way, you can swap plugins without needing any change on the SIMPL Windows side. This is extremely powerful when maintaining SIMPL Windows code bases for large deployments that may utilize differing equipment per room. If you can build a SIMPL Windows program that interacts with established join maps, you can swap out the device via config without any change needed to SIMPL Windows.
6. Related to item 5, you can use the same paradigm with respect to physical device communication. If you were to have a DSP device in some rooms communicating over RS232 and some via SSH, it would be trival to swap the device from a Com port to an SSH client in the Essentials Devicee Config and update the Bridge Config to brigde to the desired communication method. Again this would require no change on the Simpl Windows side as long as you maintain the same join Start in the Bridge Device Configuration.
6. Related to item 5, you can use the same paradigm with respect to physical device communication. If you were to have a DSP device in some rooms communicating over RS232 and some via SSH, it would be trival to swap the device from a Com port to an SSH client in the Essentials Devicee Config and update the Bridge Config to brigde to the desired communication method. Again this would require no change on the SIMPL Windows side as long as you maintain the same join Start in the Bridge Device Configuration.
## Common Use Cases
1. There are 10 conference rooms that all operate the same, but have hardware differences that are impossible to account for in SIMPL Windows. For example, each room might have a DM-MD8X8 chassis, but the input and output cards aren't all in the same order, or they might be different models but function the same. You can use Essentials with a unique configuration file for each hardware configuration.
1. There are 10 conference rooms that all operate the same, but have hardware differences that are impossible to account for in SIMPL Windows. For example, each room might have a DM-MD8X8 chassis, but the input and output cards aren't all in the same order, or they might be different models but function the same. You can use Essentials with a unique configuration file for each hardware configuration.
2. You have a floor of conference rooms that all share some centralized hardware like DSP, AV Routing and a shared CEN-GWEXER gateway with multiple GLS-OIR-CSM-EX-BATT occupancy sensors. All the shared hardware can be defined in the Essentials configuration and bridged over an EISC to each program that needs access. The same device can even be exposed to multiple programs over different EISCs.
2. You have a floor of conference rooms that all share some centralized hardware like DSP, AV Routing and a shared CEN-GWEXER gateway with multiple GLS-OIR-CSM-EX-BATT occupancy sensors. All the shared hardware can be defined in the Essentials configuration and bridged over an EISC to each program that needs access. The same device can even be exposed to multiple programs over different EISCs.
3. You have a SIMPL program that works for many room types, but because some rooms have different models of processors than others (CP3/CP3N/AV3/PRO3/DMPS3 variants), you have to maintain several versions of the program, compiled for each processor model to maintain access to features like the System Monitor slot. You can use Essentials running in a slot on a processor to expose the System Monitor and many other features of the processor, regardless of model. Now you only need to maintain a single SIMPL program defined for your most complex processor application (ex. PRO3)
3. You have a SIMPL program that works for many room types, but because some rooms have different models of processors than others (CP3/CP3N/AV3/PRO3/DMPS3 variants), you have to maintain several versions of the program, compiled for each processor model to maintain access to features like the System Monitor slot. You can use Essentials running in a slot on a processor to expose the System Monitor and many other features of the processor, regardless of model. Now you only need to maintain a single SIMPL program defined for your most complex processor application (ex. PRO3)
## Join Map Documentation
@@ -302,106 +302,106 @@ Example device config: <https://github.com/PepperDash/Essentials/blob/master/Pep
## Device Type Join Maps
Please note that these joinmaps *may* be using a deprecated implementation. The implementation is valid but nonetheless frowned upon for new features and plugins.
Please note that these joinmaps _may_ be using a deprecated implementation. The implementation is valid but nonetheless frowned upon for new features and plugins.
### AirMediaController
> supports: AM-200, AM-300
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/AirMediaControllerJoinMap.cs>
### AppleTvController
> supports: IR control of Apple TV
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/AppleTvJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/AppleTvJoinMap.cs>
### CameraControlBase
> supports: any camera that derives from CameraBase
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/CameraControllerJoinMap.cs>
### DisplayController
> supports: IR controlled displays, any two way display driver that derives from PepperDash.Essentials.Core.DisplayBase
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DisplayControllerJoinMap.cs>
### DmChasisController
> supports: All DM-MD-8x8/16x16/32x32 chassis, with or w/o DM-CPU3 Card
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmChassisControllerJoinMap.cs>
### DmRmcController
> supports: All DM-RMC devices
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmRmcControllerJoinMap.cs>
### DmTxController
> supports: All Dm-Tx devices
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmTxControllerJoinMap.cs>
### DmpsAudioOutputController
> supports: Program, Aux1, Aux2 outputs of all DMPS3 Control Systems
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs>
### DmpsRoutingController
> supports: Av routing for all DMPS3 Control Systems
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs>
### GenericRelayController
> supports: Any relay port on a Crestron Control System or Dm Endpoint
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs>
### GenericLightingJoinMap
> supports: Devices derived from PepperDash.Essentials.Core.Lighting.LightingBase
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/GenericLightingJoinMap.cs>
### GlsOccupancySensorBase
> supports: Any Crestron GLS-Type Occupancy sensor - single/dual type
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs>
### HdMdxxxCEController
> supports: HD-MD-400-C-E, HD-MD-300-C-E, HD-MD-200-C-E, HD-MD-200-C-1G-E-B/W
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs>
### IBasicCommunication
> supports: Any COM Port on a Control System or Dm Endpoint device, TCP Client, SSH Client, or UDP Server
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs>
### IDigitalInput
> supports: Any Digital Input on a Control System, or DM Endpoint device
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/IDigitalInputJoinMap.cs>
### SystemMonitorController
> supports: Exposing the system monitor slot for any Control System
<https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs>
<https://github.com/PepperDash/Essentials/blob/master/essentials-framework/Essentials%20Core/PepperDashEssentialsBase/Bridges/JoinMaps/SystemMonitorJoinMap.cs>
## Example SIMPL Windows Program
We've provided an [example program](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for SIMPL Windows that works with the provided example Essentials configuration file [SIMPLBridgeExample_configurationFile.json](https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json). Load Essentials and the example SIMPL program to two slots on the same processor and you can get a better idea of how to take advantage of SIMPL Windows bridging.
We've provided an [example program](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for SIMPL Windows that works with the provided example Essentials configuration file [SIMPLBridgeExample_configurationFile.json](https://github.com/PepperDash/Essentials/blob/master/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json). Load Essentials and the example SIMPL program to two slots on the same processor and you can get a better idea of how to take advantage of SIMPL Windows bridging.
Next: [Essentials architecture](Arch-summary)