Master thesis

News

Back to overview

18 Oct Everywhere Display Software status

2008-10-18 Jonathan

De laatste dagen ben ik bezig geweest met het bruikbaar maken van een rendering engine om de projectors te besturen en een goede abstractielaag voor de applicaties die de projectie moeten kunnen gebruiken.

Hier onder zie je het configuratie bestand dat de lokaties bevat van alle muren en projectors. Verder bevat het de mappings tussen de applicatie vensters en de lokatie waar deze op de muur geprojecteerd moeten worden.

<?xml version="1.0" encoding="utf-8" ?>
<everywhere-display>
        <!-- Define all the walls, just one wall at the moment -->
        <wall name="frontwall">
                <left-bottom x="-10" y="10" z="-5" />
                <right-vector x="20" y="0" z="0" />
                <up-vector x="0" y="0" z="10" />
        </wall>

        <wall name="rightwall">
                <left-bottom x="10" y="10" z="-5" />
                <right-vector x="10" y="-20" z="0" />
                <up-vector x="0" y="0" z="10" />
        </wall>

        <!-- Projectors -->
        <projector name="projector">
                <adaptor>1</adaptor>
                <aspect-ratio>1.333333</aspect-ratio> <!-- 4 / 3-->
                <vertical-angle>2.094395</vertical-angle> <!-- Pi / 1.5 (wide angle) -->
                <position x="0" y="0" z="0" />
        </projector>

        <projector name="projector2">
                <adaptor>1</adaptor>
                <aspect-ratio>1.3333333</aspect-ratio>
                <vertical-angle>2.094395</vertical-angle>
                <position x="0" y="0" z="0" />
        </projector>

        <!-- Applications -->
        <application name="klokapp">
                <assembly>E:\Documents and Settings\user\My Documents\1-ste-master-hci\thesis\ED solution\EverywhereDisplay\EverywhereClock\bin\Debug\EverywhereClock.dll</assembly>
                <class>EverywhereClock.EverywhereClock</class>
        </application>

        <!-- Windows (a surface will be created for each window) -->
        <window name="klok">
                <!-- Paint the window 'main' from the klokapp.dll/Klok on this surface -->
                <application name="klokapp" internal-window="main" />
        </window>

        <!-- Window mappings -->
        <window-mapping window="klok" wall="frontwall">
                <position x="2" y="2" />
                <size width="6" height="6" />
        </window-mapping>
        <window-mapping window="klok" wall="rightwall">
                <position x="3" y="2"/>
                <size width="4" height="4" />
        </window-mapping>

        <!-- Input-->
        <input>
                <!-- TODO -->
        </input>
</everywhere-display>
 

Alle applicatie vensters hebben nu een absolute positie op een muur. Dit heeft tot gevolg dat we een peephole display creëren. Initieel zagen we de peephole metafoor als uitbreiding op de 'normale' projectie, maar onze datastructuur maakt de peephole juist eenvoudiger.

Alle applicaties moeten als .NET bibliotheek gecompileerd worden. Ze moeten een class bevatten die aan de volgende interface voldoet.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace EverywhereDisplay.ApplicationInterface
{
        public delegate void PaintRequestHandler(Rectangle region);

        public interface IEverywhereApplication
        {
                Dictionary<string, IEverywhereWindow> Windows {get; }
        }

        public interface IEverywhereWindow // : Form
        {
                // Dimensions of this window, should be a power of 2
                int Width { get; }
                int Height { get; }

                // Raised when the application wants to be repainted
                event PaintRequestHandler PaintRequest;

                // Called later on when a graphics device context of the
                // directx surface has been created. This window should
                // now paint on 'g'
                void PaintOnDevice(Graphics g, Rectangle region);
        }
}
 

Een applicatie bevat dus een lijst van vensters, en elk venster heeft een breedte en hoogte en moet zijn eigen graphics afhandelen.

Het is Perfect mogelijk om vensters af te leiden van System.Windows.Forms en deze de graphics af te laten handelen, maar dat is geen vereiste.

De volgende stap is om de applicaties meer bruikbaar te maken. Om dit te testen ga ik een applicatie maken die in GUI bevat om andere applicaties at runtime in en uit de projectie te laden. Hierbij kan ik goed de reflexie mogelijkheden testen en de invoer.

De volgende reflexie functionaliteit zal zeker ingebouwd worden:

  • Lijst van applicaties opvragen
  • Lijst van vensters opvragen
  • Positie van een bepaald venster opvragen/aanpassen
  • Vensters of hele applicaties verbergen / zichtbaar maken
  • Projectierichting van beamer aanpassen > focus vragen voor bepaald venster
  • Andere applicatie laden, mappings van vensters toevoegen at runtime

De invoermogelijkheden zullen voorlopig beperkt worden tot het versturen van keystrokes naar verschillende vensters. Een muispijl zou geïmplementeerd kunnen worden, waarbij de projectie altijd rond deze pijl gecentreerd blijft. Welk gedeelte hiervoor in de engine geplaatst moet worden en welk gedeelte als afzonderlijk dll is nu nog niet duidelijk.

Comments