static void Main(string[] args)
        {
            // simple test

            AbstractCANHandle handle = null;

            // init
            handle = new handle.ActiveSeatHandle();
            handle.SelectDevice();
            handle.InitSocket(0);

            (handle as handle.ActiveSeatHandle).BeginSession();

            for (uint i = 0; i < 10; ++i)
            {
                (handle as handle.ActiveSeatHandle).BeginTrial();

                (handle as handle.ActiveSeatHandle).Start(
                    AngularAcceleration:
                    /* rad/s^2 (SI) */ 6.8 + i,
                    AngularSpeedSaturation:
                    /* rad/s (SI)   */ -2.5 + i,
                    MaxStimDuration:
                    /* ms (SI)      */ 2.70 + i
                    );

                (handle as handle.ActiveSeatHandle).Stop();

                (handle as handle.ActiveSeatHandle).Reset();

                (handle as handle.ActiveSeatHandle).EndTrial();
            }

            (handle as handle.ActiveSeatHandle).EndSession();

            //handle.onHandleDeactivationRequested();
        }
        public static int Main(String[] args)
        {
            // instantiate backend implementation
            AbstractCANHandle handle = new handle.ActiveSeatHandle();

            Console.WriteLine(
                DateTime.Now.ToString("HH:mm:ss.ffffff")
                + " - [Apollon-feature-IxxatCAN-client] -- INFO : instantiated generic CANHandle"
                );

            // initialize it
            handle.SelectDevice();
            handle.InitSocket(0);
            Console.WriteLine(
                DateTime.Now.ToString("HH:mm:ss.ffffff")
                + " - [Apollon-feature-IxxatCAN-client] -- INFO : backend CANHandle intialized"
                );

            // instantiate a client connection with the first non-ipv6 address
            Int32
                client_port = 0,    // any
                server_port = 8888; // same as server

            System.Net.IPEndPoint localEndPoint
                = new System.Net.IPEndPoint(
                      System.Net.IPAddress.Loopback,
                      client_port
                      );
            System.Net.IPEndPoint remoteEndPoint
                = new System.Net.IPEndPoint(
                      System.Net.IPAddress.Loopback,
                      server_port
                      );
            System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient(localEndPoint);
            client.Connect(remoteEndPoint);

            //System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient("127.0.0.1", port);

            // some status boolean
            bool bEndSession = false;

            // Get a client stream for reading and writing.
            System.Net.Sockets.NetworkStream stream = client.GetStream();

            // double slot
            byte[] data = new byte[256];

            // until end session
            do
            {
                // Wait for 'messages' from the unity app server.
                Console.WriteLine(
                    DateTime.Now.ToString("HH:mm:ss.ffffff")
                    + " - [Apollon-feature-IxxatCAN-client] -- INFO : Wait for messages..."
                    );

                // Read the batch of the TcpServer response bytes.
                switch ((messageID)System.Convert.ToInt16(stream.ReadByte()))
                {
                case messageID.BeginSession:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [BeginSession]."
                        );
                    //(handle as handle.ActiveSeatHandle).BeginSession();
                }
                break;

                case messageID.BeginTrial:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [BeginTrial]."
                        );
                    //(handle as handle.ActiveSeatHandle).BeginTrial();
                }
                break;

                case messageID.Start:
                {
                    // 3 messages

                    /* 1st - [ in: rad/s^2 (SI) | out: deg/s^2 ] */
                    stream.Read(data, 0, 8);
                    System.Double dAngularAcceleration
                    /* extract    */ = System.BitConverter.ToDouble(data, 0)
                                       /* rad -> deg */ * (180.0 / System.Math.PI)
                                       /* trigo. way */ * -1.0;

                    /* 2nd - [ in: rad/s (SI) | out: deg/s ] */
                    stream.Read(data, 0, 8);
                    System.Double dAngularSpeedSaturation
                    /* extract    */ = System.BitConverter.ToDouble(data, 0)
                                       /* rad -> deg */ * (180.0 / System.Math.PI)
                                       /* trigo. way */ * -1.0;

                    /* 3rd - [ in: ms (SI) | out: s ] */
                    stream.Read(data, 0, 8);
                    System.Double dMaxStimDuration
                    /* extract */ = System.BitConverter.ToDouble(data, 0)
                                    /* ms -> s */ * 1000.0;

                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [Start] with args [dAngularAcceleration:"
                        + dAngularAcceleration
                        + "], [dAngularSpeedSaturation:"
                        + dAngularSpeedSaturation
                        + "], [dMaxStimDuration:"
                        + dMaxStimDuration
                        + "] !"
                        );

                    (handle as handle.ActiveSeatHandle).Start(
                        dAngularAcceleration,
                        dAngularSpeedSaturation,
                        dMaxStimDuration
                        );
                }
                break;

                case messageID.Stop:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [Stop]."
                        );
                    //(handle as handle.ActiveSeatHandle).Stop();
                }
                break;

                case messageID.Reset:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [Reset]."
                        );
                    //(handle as handle.ActiveSeatHandle).Reset();
                }
                break;

                case messageID.EndTrial:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [EndTrial]."
                        );
                    //(handle as handle.ActiveSeatHandle).EndTrial();
                }
                break;

                case messageID.EndSession:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : received [EndSession]."
                        );
                    //(handle as handle.ActiveSeatHandle).EndSession();
                    bEndSession = true;
                }
                break;

                case messageID.NoMoreData:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- INFO : waiting for fresh data."
                        );
                }
                break;

                default:
                {
                    Console.WriteLine(
                        DateTime.Now.ToString("HH:mm:ss.ffffff")
                        + " - [Apollon-feature-IxxatCAN-client] -- ERROR : received [UNKNOWN]."
                        );
                    bEndSession = true;
                }
                break;
                } /* switch() */
            } while (!bEndSession);

            // stop
            stream.Close();
            client.Close();
            return(0);
        } /* static Main */