Skip to content

Welcome

Welcome to the Home I/O SDK guide. This guide describes what the SDK is, how it works and where to look for additional information.

Home I/O SDK is made of a .NET 2.0 assembly (EngineIO.dll), corresponding documentation, tools and some samples to help you getting started. This assembly enables custom code to access the simulation I/O points.

How It Works

The inter-process communication (IPC) is done through a memory mapped file (EngineIO.dll). The memory is divided into three groups: Inputs, Outputs, and Memories. These groups are a convention defined by us, standing from the point of view of a controller. Every I/O point, despite being an input, output or memory, has a unique Memory Address, Name, and Value.

Some considerations to take into account when using the assembly EngineIO.dll:

  • The MemoryMap class is a Singleton, meaning that only one instance can exist at any given time. This instance represents a Cached Copy of the memory mapped file;
  • The MemoryMap.Instance.Update() method is responsible for synchronizing your cached copy with the memory mapped file. This method must be called every time you want to access the latest I/O points or receive event notifications.

Simple example showing how to switch the living room lights on/off using C#.

using System;
using System.Threading;

using EngineIO;

namespace EngineIO.Samples
{
    class Program
    {
        //In this sample we are switching the living room light on and off 10 times.
        static void Main(string[] args)
        {
            //We are using a MemoryBit which we get from the MemoryMap.
            //You can find all the memory addresses at the Memory Addresses page.
            MemoryBit livingRoomLight = MemoryMap.Instance.GetBit(0, MemoryType.Output);

            for (int i = 0; i < 10; i++)
            {
                livingRoomLight.Value = !livingRoomLight.Value;

                //When using a memory value before calling the Update method we are using a cached value.
                Console.WriteLine("Light is on? " + livingRoomLight.Value);

                //Calling the Update method will write the livingRoomLight.Value to the memory map.
                MemoryMap.Instance.Update();

                Thread.Sleep(1000);
            }

            //When we no longer need the MemoryMap we should call the Dispose method to release all the allocated resources.
            MemoryMap.Instance.Dispose();

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Each group (Inputs, Outputs and Memories) support the following Data Types:

Data Types Range Notes
Bit True or False
Byte 0 to 255
Short -3,768 to 32,767
Int -2,147,483,648 to 2,147,483,647
Long 9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Float -3.403 × 1038 to 3.403 × 1038
Double -1.798 × 10 308 to 1.798 × 10308
String 64 UNICODE Characters
DateTime 00:00:00, January 1, 0001 through 23:59:59, December 31, 9999 Represents an instant in time, typically expressed as a date and time of day.
TimeSpan -10675199.02:48:05.4775808 to 10675199.02:48:05.4775807 Represents a time interval that is measured as a positive or negative number of days, hours, minutes, seconds, and fractions of a second.

Engine I/O Explorer Tool

You will find the Engine I/O Explorer inside the SDK zip file. This tool allows you to easily browse the I/O points memory address, name, type, and value. It is a valuable tool when used during the development phase.

Additional Information

Please take a look at the included samples, they show good practices on how to use the EngineIO.dll assembly.