Ontwikkelen van Plug-ins voor Televic’s FlexGui
Project aangeboden door Lefebure Kevin voor het behalen van de graad van Bachelor in de Multimedia en Communicatie Technologie Academiejaar 2005-2006
Voorwoord
Zoals u al kan vermoeden is dit het projectdossier dat bij mij stage hoort voor mijn opleiding multimedia en communicatietechnologie. Meer bepaald bij de specialisatie ‘industriële gegevensverwerking’. Ik heb hierbij gekozen voor Televic als stagebedrijf. Dit in de eerste plaats omdat het een bedrijf is dat zeer sterk staat op de markt en altijd met de laatste technologie mee is. Daarenboven is Televic altijd bereid om een goede begeleiding te bieden aan hun stagairs. En als dan nog eens een mooi project wordt voorgesteld, is de keuze vlug gemaakt.
Dankwoord
In de eerste plaats wil ik natuurlijk de PIH bedanken met het gehele docententeam. Zonder de gerichte opleiding die het PIH biedt zou ik zeker geen stage kunnen doen als nu. Toch wil ik de docenten van industriële gegevensverwerking speciaal bedanken. Door hen is mijn interesse nog meer gegroeid net als mijn kennis van de gedoceerde vakken. Verder wil ik Yorick De Weerdt bedanken net als Televic zelf die mij de kans gaven mijn stage te doen binnnen het bedrijf. Ik heb heel veel van hen geleerd. Te meer wil ik Televic bedanken dat ze het vertrouwen in mij hebben om ook na mijn stage voor hen te blijven werken als ontwikkelingsingenieur.
Inhoudsopgave
Ontwikkelen van Plug-ins voor Televic’s FlexGui Voorwoord Dankwoord Inhoudsopgave 1. Stageomschrijving 1.1. Algemeen 1.2. Hoe werkt het pluginsysteem in xml 2. Planning 3. Pluginlijst en functionaliteiten 3.1. overzicht 3.2. FlexPlugInSynoptic 3.3. flexpluginmagnifier 3.4. FlexPlugIn3DBox 3.5. FlexPlugInFileIO 3.6. FlexPlugInDataViewer 4. Gedane onderzoeken buiten de ontwikkeling van plugins 4.1. Documentatie via XSLT 4.2. Plugindump 4.3. DocViewer/appEmbedding 4.4. AppViewer/Takeover 4.5. On-screen keyboard 5. Verslagen Week1 Week 2 Week 3 Vakantie Week 5 Week 6 Week 7 Week 8 Week 9 Week 10 Week 11 6. Bronnen 7. Lijst met figuren
1 2 2 3 4 4 6 7 9 9 11 15 18 23 25 27 27 29 30 32 33 34 34 37 39 41 44 46 48 50 52 54 56 57 58
Stage Televic
3
Kevin Lefebure
1. Stageomschrijving
1.1.
Algemeen
Televic werkt al jaren aan een conferentiesysteem. Dit is een systeem (zowel hard- als software) dat in bijvoorbeeld een parlement geïnstalleerd wordt. Via dit systeem kunnen mensen in het parlement stemmen, luisteren (in verschillende talen) naar wat er gezegd wordt via hoofdtelefoons en spreken via een microfoon. Er zijn nog meer mogelijkheden, maar dit zijn zowat de voornaamste.
Figuur 0: Microfoon
Een deel van dit systeem is iCOS
(interactive
conference
system),
deze
maakt gebruik van FlexGui, een sofwaremodule die met plugins
werkt.
Op
die
interface (iCOS) kan gezien worden wie spreekt op dat moment, wie aanwezig is, wat Figuur 0: conferentiesysteem
de
stemmingsresultaten zijn,...
Het principe van FlexGui werkt volgens plugins. Het is zo dat door het werken met plugins (dll’s) het zeer gemakkelijk wordt om FlexGui aan te passen aan de noden van de klant. De ene zal bijvoorbeeld willen weten hoe laat het is en daarom zal een klokje (een aparte plugin) op de interface worden gezet, terwijl dat voor een ander totaal
Stage Televic
Kevin Lefebure
4
niet relevant is. Vandaar de intentie om alles zo flexibel mogelijk te maken via de plugins. De bedoeling van mijn stage is nu net de bestaande reeks plugins te gaan uitbreiden. Zo zal worden gewerkt aan een 3D-box plugin. Een plugin die een panel weergeeft op de FlexGui waarbinnen een 3D wereld kan worden gecreëerd via DirectX. Via deze plugin zou
Figuur 0: Conferentiezaal
het
dan
bijvoorbeeld
mogelijk
zijn
om
de
stemmingsresultaten real-time te gaan weergeven door middel van cilinders die op en neer gaan.
Het is in de eerste plaats de bedoeling om de mogelijkheden te onderzoeken en naargelang die mogelijkheden de applicatie verder te gaan uitbreiden. Dit zal het grootste deel van mijn werk worden, maar er zal ook aan andere plugins worden gewerkt
evenals
er
onderzoek
zal
worden
gedaan
naar
zaken
buiten
het
conferentiesysteem.
Stage Televic
Kevin Lefebure
5
1.2.
Hoe werkt het pluginsysteem in xml
Alle dll’s worden in een algemene xml-file gedeclareerd als volgt: …
flexplugintcpipclient.dll FlexPlugInTcpIpClient flexplugin3dbox.dll FlexPlugIn3DBox …
Door zo een referentie te leggen naar de dll’s kan binnen het vormen van een applicatie via deze referentie de plugin gebruikt worden als volgt:
Hoe de interne verwerking van de xml-files in zijn werk gaat, is natuurlijk informatie die niet zomaar mag doorgespeeld worden. Ik weet ook niet tot in de puntjes hoe dit systeem werkt, maar dit is nu net het mooie van FlexGui. Iemand kan zomaar een plugin ontwerpen zonder het volledige systeem te moeten/mogen begrijpen.
De methodes die worden opgeroepen vanuit de xml worden verder behandeld per plugin om het toch overzichtelijk te kunnen houden.
Stage Televic
Kevin Lefebure
6
2. Planning Mijn planning is niet opgesteld vanaf het begin tot het einde. Doordat meestal eerst één en ander onderzocht moet worden om te zien of er kan mee gewerkt worden. Voor de eigenlijke ontwikkeling wordt onderzoek gedaan en bekeken op welke manier best wordt gewerkt. Het is ook zo dat er na het ontwikkelen van een andere plugin een idee ontstaat om een eerder gemaakte plugin aan te passen. Dus mijn planning is er een van momenten. Tijd die volgens de planning niet helemaal overeenstemt met de verslagen, is te wijten aan testen en overlopen met mijn stagebegeleider. De gespendeerde tijd start op de aangeduide datum. Daartussen kan dus bv. een halve dag testen tussen zitten. 14/03: Synoptic ontwikkelen;
verwacht 5 dagen;
effectief 4 dagen
20/03: 3D box ontwikkelen;
verwacht 7 dagen;
effectief 8 dagen
30/03: Onderzoek documentatie;
verwacht 0,5 dag;
effectief 0,5 dag
31/03: Aanpassen PluginDump;
verwacht 0,5 dag;
effectief 1 dag
vakantie: Nu en dan wat gewerkt aan de xslt voor de xml-documentatie (geen echte planning) 18/04: 3D box ontwikkelen;
verwacht 3 dagen;
effectief 3 dagen
21/04: DocView research;
verwacht 1,5 dagen;
effectief 2 dagen
25/04: app. embedding;
verwacht 1 dag;
effectief 1 dag
26/04: 3D box ontwikkelen;
verwacht 3 dagen;
effectief 2,5 dagen
02/05: DataSink onderzocht;
verwacht 0,5 dag;
effectief 10min?
02/05: FileIO ontwikkelen;
verwacht 0,5 dag;
effectief 0,5 dag
03/05: Dataview ontwikkelen;
verwacht 2 dagen;
effectief 3 dagen
09/05: xslt (stijl, firefox);
verwacht 1 dag;
effectief 1 dag
10/05: app. embedding (flash);
verwacht 1 dag;
effectief 1 dag
12/05: AppViewer;
verwacht 7 dagen;
effectief 5 dagen;
19/05: 3D box (2 instanties);
verwacht 1 dag;
effectief 1 dag;
23/05: 3D box (sdk probleem);
verwacht 1 dag;
effectief 1 dag;
30/05: Takeover;
verwacht 1 dag;
effectief 1 dag;
01/06: On-screen Keyboard;
verwacht 2 dagen;
effectief 3 dagen;
Stage Televic
Kevin Lefebure
7
Om wat duidelijker te tonen hoe de stage opgevat wordt, heb ik een schematische voorstelling gemaakt. Hierop is duidelijk te zien wat volgt op wat en met welke testen inderdaad iets aangevangen werd.
Figuur 1: Planning
Stage Televic
Kevin Lefebure
8
3. Pluginlijst en functionaliteiten 3.1.
overzicht
Televic heeft een controlepaneel in een kamer naast het parlement. Daar is het mogelijk om een microfoon te activeren binnen het parlement. Het is ook mogelijk FlexGui en de 'synoptic'-plugin te gebruiken om hetzelfde te doen. Dit werkt met een grafische voorstelling van het parlement. Het grote probleem is dat dit programma veel te veel geheugen vraagt, omdat alles wordt getekend met gewone controls. Hier kwam ik dan aan te pas. Deze plugin werd aangepast en alles wordt nu getekend met DirectX. Performance sterk de hoogte in. Er is ook een uitbreiding toegevoegd, namelijk de mogelijkheid om een deel van de 'synoptic' te vergroten in een andere plugin (synopticmagnifier) om zo de leesbaarheid te verbeteren.
Het grootste werk voor het conferentiesysteem was ongetwijfeld de 3DBox-plugin. Dit vroeg het meeste werk omdat het een algemene plugin is die voor van alles kan dienen. Daarom was het ook nodig om alles zo flexibel mogelijk te maken. Wat deze plugin doet is een 3D-wereld opzetten met objecten in. Dit kan gaan van een 3D-klok tot een compleet 3D-menu tot 3D-stemmingsresultaten en indien nodig een animatiefilmpje. Wat deze plugin zo interessant maakt is dat hij vanuit xml volledig kan gestuurd worden. Ieder object kan namelijk apart geanimeerd worden. Zoals al opgegeven hiervoor is dit heel eenvoudig om dan bijvoorbeeld stemmingsresultaten real-time weer te geven. Er bestond reeds een dergelijke plugin, maar ook hier werd er met GDI+ gewerkt en een 2D-wereld.
Een andere plugin is de FileIO-plugin. Deze plugin is nieuw en zorgt voor het wegschrijven of lezen van een file. Deze plugin is heel simpel opgebouwd, maar heeft zijn nut al bewezen. De FileIO-plugin kan bijvoorbeeld een file lezen en lijn per lijn doorsturen naar een ftpclient, die stuurt de data naar een ftpserver die dan alles
Stage Televic
Kevin Lefebure
9
doorstuurt naar een nieuwe FileIO-plugin. Deze kan dan de file wegschrijven. Ook voor het loggen van events, errors,... is dit heel interessant.
Verder is er nog de DataView-plugin. Deze visualiseert de data die tussen verschillende plugins getransporteerd wordt. Ook hier is de plugin behoorlijk simpel opgebouwd, maar ook weer heel nuttig. Real-time kan gecontroleerd worden of bepaalde plugins hun data wel goed doorsturen. In combinatie met de FileIO-plugin kan alles ook weer mooi gelogd worden, wat ideaal is om fouten op te sporen.
Stage Televic
Kevin Lefebure
10
3.2.
FlexPlugInSynoptic
De bedoeling van deze plugin was vanuit een file een visuele voorstelling te maken van een conferentiezaal. Er werd verwacht dat het mogelijk was om via deze plugin te communiceren met de TMS-software (de software die communicatie met de hardware mogelijk maakt). Zo kan er nu gezien worden welke microfoons aan staan, wie met zijn badge is ingelogd op het systeem, enz. Via de visualisatie kan er ook een microfoon worden aangezet. De plugin werkt met directX en wordt net zoals andere plugins aangestuurd vanuit xml.
Figuur 2: synoptic
Hierbij de lijst met methodes die kunnen worden opgeroepen. events: togglemicrophone
Stage Televic
Kevin Lefebure
11
event that tells if microphone is toggled hovermicrophone event called when mouse is moved over a square. call synoptic's GetSelectedMic property to get square number changeMagnifier event that's called if magnifier is enabled. call magnifier's changeview method to update with coordinates of synoptic methods: Dispose ( ) diposes object created from this class
Stop ( ) disposes the directx engine before calling dispose call this when form is closing
SetMicrophonePositions ( String, Int32, Int32, Int32, Int32) Sets the positions of the microphones in screen coordinates fileToReadPositionsFrom: path to the file where in synoptic is described scaleX: int that scales the position in x-direction scaleY: int that scales the position in y-direction micHeight: int that defines the height of a square micWidth: int that defines the width of a square
SetMicOn ( Int32) Set microphone on micro: mic number
SetMicOff ( Int32) Set microphone off micro: mic number
SetMicRequest ( Int32) Set microphone request micro: mic number
SetBadgeIn ( Int32, Int32, String, String, String, String, Boolean) Set badge in micro: mic number badge: badge number lastname: lastname firstname: firstname party: party district: district votingright: boolean votingright
SetBadgeOut ( Int32) Set badge out
Stage Televic
Kevin Lefebure
12
micro: mic number
ShowTooltip ( Boolean) show or hide tooltip value: boolean value
ShowMagnifier ( Boolean) enable or disable magnifier value: boolean value properties: GetMouseX ( ) returns the x coordinate of mouseposition GetMouseY ( ) returns the y coordinate of mouseposition GetSelectedMic ( ) returns the number of the selected microphone GetHoveredMic ( ) returns the number of the hovered microphone GetSelectedMicCondition ( ) returns the condition of the microphone: micon, micoff or micrequest GetSelectedMicBadgeCondition ( ) returns the condition of the badge of the microphone: badgein or badgeout backcolor ( ) sets the backcolor Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue backgroundimage ( ) sets the path to the backgroundimage miconcolor ( ) sets the mic-on-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue micoffcolor ( ) sets the mic-off-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue micrequestcolor ( ) sets the mic-request-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue badgeincolor ( ) sets the badge-in-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue badgeoutcolor ( ) sets the badge-out-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue showmicnr ( ) bool that defines if the microphone number is shown or not
Stage Televic
Kevin Lefebure
13
showbadgenr ( ) bool that defines if the badge number is shown or not showlastname ( ) bool that defines if the lastname is shown or not showfirstname ( ) bool that defines if the firstname is shown or not showparty ( ) bool that defines if the party is shown or not showdistrict ( ) bool that defines if the district is shown or not showvotingright ( ) bool that defines if the votingright is shown or not fontsize ( ) sets the font size
Stage Televic
Kevin Lefebure
14
3.3.
flexpluginmagnifier
Om de leesbaarheid te verbeteren is er ook een "Magnifier"-plugin gemaakt, die net hetzelfde doet, maar dan vergroot
weergegeven en voor een deel van de
conferentiezaal. (zie ook figuur1) no events methods: Dispose ( ) diposes object created from this class
Stop ( ) disposes the directx engine before calling dispose call this when form is closing
SetMicrophonePositions ( String, Int32, Int32, Int32, Int32) Sets the positions of the microphones in screen coordinates fileToReadPositionsFrom: path to the file where in synoptic is described scaleX: int that scales the position in x-direction scaleY: int that scales the position in y-direction micHeight: int that defines the height of a square micWidth: int that defines the width of a square
SetMicOn ( Int32) Set microphone on micro: mic number
SetMicOff ( Int32) Set microphone off micro: mic number
SetMicRequest ( Int32) Set microphone request micro: mic number
SetBadgeIn ( Int32, Int32, String, String, String, String, Boolean) Set badge in micro: mic number badge: badge number lastname: lastname firstname: firstname party: party district: district votingright: boolean votingright
Stage Televic
Kevin Lefebure
15
SetBadgeOut ( Int32) Set badge out micro: mic number
ChangeView ( Int32, Int32) moves the magnifier to specified coordinates x: x coordinate y: y coordinate
properties: backcolor ( ) sets the backcolor Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue backgroundimage ( ) sets the path to the backgroundimage miconcolor ( ) sets the mic-on-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue micoffcolor ( ) sets the mic-off-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue micrequestcolor ( ) sets the mic-request-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue badgeincolor ( ) sets the badge-in-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue badgeoutcolor ( ) sets the badge-out-color Defined as an 8 byte hex formatted value. AARRGGBB AA: Transparancy: The higher this value, the less transparancy RR: Red GG: Green BB: Blue zoomfactor ( ) integer that sets the zoomfactor showmicnr ( ) bool that defines if the microphone number is shown or not showbadgenr ( ) bool that defines if the badge number is shown or not showlastname ( ) bool that defines if the lastname is shown or not showfirstname ( ) bool that defines if the firstname is shown or not showparty ( ) bool that defines if the party is shown or not showdistrict ( ) bool that defines if the district is shown or not
Stage Televic
Kevin Lefebure
16
showvotingright ( ) bool that defines if the votingright is shown or not fontsize ( ) sets the font size
Stage Televic
Kevin Lefebure
17
3.4.
FlexPlugIn3DBox
Deze plugin maakt een 3D wereld in DirectX. Via xml kunnen objecten aangemaakt worden. Er zijn verschillende methodes geïmplementeerd om animaties uit te voeren op deze objecten, maar ook op de lichtinval en de wereld zelf. Bedoeling van deze plugin is een algemene tool te ontwikkelen die zonder code te moeten veranderen een totaal andere 3D-wereld kan creëren.
Figuur 3: 3DBox
Vanuit xml kunnen volgende methodes worden opgeroepen: events: objectClicked event called when mouse down on selectable object objectHoovered
Stage Televic
Kevin Lefebure
18
event called when mouse hoovers selectable object methods: Start ( ) Starts the 3D-engine. before calling this: specify width and height. else: width = height = 200
Create3DObject ( String, String, Boolean, Boolean, String) Creates a 3D-object Xpath: the path to the .x file id: the id of the 3D-object show: hidden or not canSelect: Sets property if object can be selected optionalTexture: paths to textures to use instead of defined textures in .x file. separate with comma
CreateSphere ( String, String, String, Boolean, Boolean, String) creates a sphere object id: id of the object radius: radius of the sphere (double) color: color (hex) show: show object or not canSelect: if object selectable optionalTexture: empty string or path to bitmap
CreateBox ( String, String, String, String, String, Boolean, Boolean, String) creates a box id: id of the object width: width of the object height: height of the object depth: depth of the object color: color of the object show: object visible or not canSelect: object selectable or not optionalTexture: empty string or path to bitmap
CreateCylinder ( String, String, String, String, String, Boolean, Boolean, String) creates a cylinder (along z-axis) id: id of the object radius1: first radius of the object radius2: second radius of the object height: height of the object color: color of the object show: object visible or not canSelect: object selectable or not optionalTexture: empty string or path to bitmap
Create2DPolygon ( String, String, String, String, Boolean, Boolean, String) creates an 2D polygon with equal angles and sides id: id of the object sides: number of sides length: length of the object
Stage Televic
Kevin Lefebure
19
color: color of the object show: object visible or not canSelect: object selectable or not optionalTexture: empty string or path to bitmap
Create3DPolygon ( String, String, String, String, String, Boolean, Boolean, String) creates a 2D polygon out of triangles id: id of the object x: x-coordinates (doubles), separated with comma (number of coordinates multiple of 3) y: y-coordinates (doubles), separated with comma (number of coordinates multiple of 3) z: z-coordinates (doubles), separated with comma (number of coordinates multiple of 3) color: color of the object show: object visible or not canSelect: object selectable or not optionalTexture: empty string or path to bitmap
Create3DTextObject ( String, String, String, String, Boolean, String) Creates a Text-object in 3D id: the id of the 3D text object text: text to render color: color to render with size: normally 1 unit, size is double for scaling, f.e. if size=0.5, size of text=1*0.5 will seem smaller if camera is further away. show: hidden or not extrusion: depth of 3D text along z-axis, double
setOffset ( String, String, String, String) Sets an offset for the specified object. The center of the "object-world" remains the same, but the object itself moves to the specified offset. id: id of the object xoffset: x coord (string) yoffset: y coord (string) zoffset: z coord (string)
StartObjectAnimation ( String, String, String, String, String, String, String, String, Int32) Starts an animation on object or 3D-text with specified id. The coordinates are rather relative. When initializing an object (0,0,0) is his "center". So it's possible that an object has a gravity-point (6,-9,3.4), but it's center is (0,0,0) You must see the object not as the visible part, but as the entire world of the object. Each object has his own world where in he moves. You move that "object-world" from (0,0,0) (if no animation started yet) to its new coordinates. id: the id of the object to animate interval: intervals in miliseconds, separated with comma x: x-coordinates (doubles), separated with comma y: y-coordinates (doubles), separated with comma z: z-coordinates (doubles), separated with comma xangle: angles around x-axis (int), separated with comma yangle: angles around y-axis (int), separated with comma zangle: angles around z-axis (int), separated with comma repeatAll: how many times to repeat (int), -1 repeat always
StartObjectMoveTo ( String, Int32, String, String, String, Int32, Int32, Int32) Starts an animation on object or 3D-text, starting on current location id: the id of the object to animate interval: interval in miliseconds
Stage Televic
Kevin Lefebure
20
x: x-coordinate (double) y: y-coordinate (double) z: z-coordinate (double) xangle: angle around x-axis (int) yangle: angle around y-axis (int) zangle: angle around z-axis (int)
StartWorldAnimation ( String, String, String, String, String, String, String, Int32) Starts an animation on world interval: intervals in miliseconds, separated with comma x: x-coordinates (doubles), separated with comma y: y-coordinates (doubles), separated with comma z: z-coordinates (doubles), separated with comma xangle: angles around x-axis (int), separated with comma yangle: angles around y-axis (int), separated with comma zangle: angles around z-axis (int), separated with comma repeatAll: how many times to repeat (int), -1 repeat always
StartLightAnimation ( String, String, String, String, Int32) Starts an animation on light interval: intervals in miliseconds, separated with comma x: x-coordinates (doubles), separated with comma y: y-coordinates (doubles), separated with comma z: z-coordinates (doubles), separated with comma repeatAll: how many times to repeat (int), -1 repeat always
SetText ( String, String, Int32, Int32, String, Int32, Boolean) sets a 2D text in screen coordinates id: the id of the object text: text to render x: x coordinate (int) y: y coordinate (int) color: color to render with size: size to render with (int) show: hidden or not
ChangeText ( String, String) changes text of 2D or 3D-text object with specified id id: the id of the object text: new text to render
RemoveObjectById ( String) removes a 3D-object, a 3D-text object or a 2D-text object id: id of object to remove
RenderObject ( String, Boolean) sets object hidden or not id: id of object render: render or not
SetCameraPosition ( String, String, String, String, String, String)
Stage Televic
Kevin Lefebure
21
sets the camera's position and target xPos: x coordinate of position yPos: y coordinate of position zPos: z coordinate of position xTarget: x coordinate of target yTarget: y coordinate of target zTarget: z coordinate of target
setObjectForInfo ( String) sets the object that you want info of id: the id of the object
changeSkin ( String, String) Changes the skin of an object id: id of the object skins: skins, seperated with comma properties: width ( ) property that sets width of the 3D-engine height ( ) property that sets height of the 3D-engine getSelectedId ( ) returns the id of the selected object getX ( ) returns the x coord of the object getY ( ) returns the y coord of the object getZ ( ) returns the z coord of the object getXangle ( ) returns the x angle of the object getYangle ( ) returns the y angle of the object getZangle ( ) returns the z angle of the object
Stage Televic
Kevin Lefebure
22
3.5.
FlexPlugInFileIO
De bedoeling van deze plugin is heel eenvoudig. Via het datasink principe geïmplementeerd in de plugins kunnen verschillende plugins communiceren met elkaar. Normaal gebeurd alle communicatie via xml, maar via datasinking kan het ook rechtstreeks. Dit is nu net wat deze plugin moet doen. Een file binnenlezen en die datasinken naar de geregistreerde clients. Of net omgekeerd, wat binnenkomt via datasinking wegschrijven naar een file. Een heel concrete toepassing is bijvoorbeeld een file inlezen en lijn per lijn via de plugin datasinken naar een ftpserver. Die stuurt op zijn beurt de data naar een ftpclient. Die ftpclient sinkt zijn data naar een andere instantie van deze plugin, die dan op zijn beurt de data weer wegschrijft naar een file. Volgende methodes kunnen via xml worden opgeroepen: events: DoneFileReading event that allerts when file is done reading methods: ReadFileLinesStart ( Int32) starts reading a file line by line, make sure the path to read from is set timeout: wait-time between two lines
ReadFileBinaryStart ( Int32, Int32) starts reading a file binary, make sure the path to read from is set timeout: wait-time between two reads buffersize: size of the buffer to write to
ReadFileStop ( ) stops reading the file
WriteFileLinesStart ( ) starts writing to a file, line by line
WriteFileBinaryStart ( ) starts writing to a file binary
WriteFileStop ( ) stops writing to a file properties: SetPathToWriteTo ( )
Stage Televic
Kevin Lefebure
23
gets or sets the path to the file to write to SetPathToReadFrom ( ) gets or sets the path to the file to read from
Stage Televic
Kevin Lefebure
24
3.6.
FlexPlugInDataViewer
Ook deze plugin maakt gebruik van het datasink principe, maar om een totaal ander resultaat te bereiken. Deze plugin kan namelijk een visuele voorstelling maken van alle data die tussen verschillende plugins gedatasinkt wordt. Voorwaarde is natuurlijk wel dat deze plugin geregistreerd wordt door de andere plugins. Dit heeft als gevolg dat alle data die van plugin x naar plugin y moet, ook gedatasinkt wordt naar de dataview-plugin. De bedoeling is dat er kan geselecteerd worden welke communicatie moet gelogd worden. Hier komt de fileIO-plugin weer goed van pas. Deze kan de logging gaan wegschrijven naar een file. Binnen de dataview-plugin wordt er in xml-formaat gedatasinkt als volgt:
- 'data'
Zo wordt een mooie xml file gecreerd van de logging.
Figuur 4: DataView
Volgende methodes kunnen opgeroepen worden vanuit xml: no events
Stage Televic
Kevin Lefebure
25
methods: Reset ( ) Resets all captured data to a blank screen
Start ( ) Starts the visualisation and logging of all communications
Stop ( ) Stops the visualisation and logging of all communications
Hold ( ) pauses or unpauses dataviewing
ViewLogFile ( ) opens a filedialog and sets the selected file to view. properties: width ( ) gets or sets the width of the plug-in height ( ) gets or sets the width of the plug-in
Stage Televic
Kevin Lefebure
26
4. Gedane onderzoeken buiten de ontwikkeling van plugins 4.1.
Documentatie via XSLT
Er werd mij gevraagd om te onderzoeken hoe de documentatie van de plugins het best kon worden opgeslagen om later te kunnen raadplegen. Dit is heel belangrijk omdat de methodes aangeroepen kunnen worden vanuit xml en dus de effectieve sourcefiles niet altijd voorhanden zijn om te raadplegen. Ik wist dat het mogelijk was om een html aan te maken vanuit visual studio met alle documentatie. Maar het is niet echt overzichtelijk. Na wat zoeken bleek dat vanuit visual studio eveneens een xml kan worden aangemaakt. Xml is natuurlijk beter, daar kun je van alles mee doen. Onder andere het volgende. Via een xslt-file die ik opgesteld heb, worden alle eerder gecreëerde xml-files met documentatie ingelezen en samen mooi overzichtelijk in een html pagina gegoten. Wat natuurlijk heel mooi oogt, temeer omdat je er de huistijl kan gaan op toepassen. Eens die xslt proper opgesteld is, is het voldoende om een referentie te leggen naar de documentatie (xml-files). Dit gebeurt als volgt: <SourceFiles>
Stage Televic
Kevin Lefebure
27
Figuur 5: Xslt
Stage Televic
Kevin Lefebure
28
4.2.
Plugindump
Een reeds bestaande applicatie, genaamd flexplugindump werd ook aangepast zodat de xml-files worden ingelezen. Voordien kon een dll worden meegegeven als parameter. Deze tool kon dan alle methodes, properties voor iedere klasse tonen in een textbox. Nu gebeurt hetzelfde, maar wordt alles mooi gesorteerd in een treeview. Bovendien worden per dll de overeenkomstige xml-documentatie-files meegenomen (als die bestaan natuurlijk). Zo is er niet enkel een overzicht van de bestaande methodes en properties, maar is eveneens de juiste documentatie voorzien.
Figuur 6: PluginDump
Stage Televic
Kevin Lefebure
29
4.3.
DocViewer/appEmbedding
Ik mocht onderzoeken in hoeverre het mogelijk was om zonder het volledige officepakket te moeten installeren een Officebestand te openen binnen een bestaande applicatie. Het is mogelijk om via een API voorzien binnen het normale Officepakket om een bestand te openen binnen een eigen gemaakte form. Maar om nu hetzelfde te doen zonder deze API? Een eerste poging was Open-Office. Werkt perfect, ware het niet dat het niet echt stabiel is. Gevolg van open-source? Maar het wordt zeker in de gaten gehouden naar volgende releases toe. Nu bestaat er ook zoiets als WordViewer, een standalone applicatie die zonder licentie een worddocument kan openen, weliswaar read-only. Dat is al een mooie start, maar deze tool moet nu nog binnen onze eigen applicatie. Uit eerder onderzoek, wist ik dat het mogelijk was om een Handle
van
een
window
te
veranderen
van
parent.
Zo
kun
je
applicaties
binnentrekken in een andere. Via enkele methodes voorzien in de win32-API zoals setwindowlong, setparent,... kun je een applicatie binnennemen in een andere en zijn style veranderen, zoals bv. geen captionbar,... Dit was dus een succes met als gevolg dat er mij gevraagd werd om te onderzoeken of dit met iedere applicatie werkt. Conclusie: ja, behalve windows-applicaties die zwaar beveiligd zijn, zoals taakbeheer. Microsoft laat zoiets natuurlijk niet toe.
Stage Televic
Kevin Lefebure
30
Figuur 7: AppEmbedd
Stage Televic
Kevin Lefebure
31
4.4.
AppViewer/Takeover
Dit is een applicatie die op de achtergrond draait en controleert of bepaalde programma's nog draaien. Als die na een bepaalde tijd niet meer blijken te draaien, kan AppViewer een boodschap geven of het programma zelf weer opstarten. AppViewer kan zichtbaar worden gemaakt door een bepaalde toetsencombinatie. Er kunnen programma's toegevoegd, verwijderd of veranderd worden waarop hij moet controleren. Programma's kunnen ook handmatig gestopt en gestart worden vanuit AppViewer. Er is ook een functie voorzien die andere pc's in het netwerk kan overnemen. Er kan geconnecteerd
worden
op
de
opgegeven
ip's
(via
xml
configureerbaar).
Via
verschillende hooks worden alle muis en toetsenbord events opgevangen binnen AppViewer en doorgestuurd over het netwerk. Eens een commando verwerkt op een remote pc, wordt een toetsaanslag of muisbeweging of klik gesimuleerd. Zo is het mogelijk om op verschillende pc's tegelijk eenzelfde configuratie te doen, eenzelfde programma te gaan opstarten,... Er is volledige controle over de andere pc's. Het is ook mogelijk om de events van muis of toetsenbord niet te gaan verwerken op de locale pc, zodanig dat er geen verkeerde dingen gebeuren.
Figuur 8: AppWatcher
Stage Televic
Kevin Lefebure
32
4.5.
On-screen keyboard
Een programma dat een keyboard op het scherm zet om zo via een touch-screen toch te kunnen typen. Het keyboard veranderd dynamisch van lay-out en taal indien nodig. Bijvoorbeeld bij het switchen tussen twee worddocumenten, de één in het Nederlands, de ander in het Grieks.
Figuur 9: Nederlands keyboard
Figuur 10: Grieks keyboard
Stage Televic
Kevin Lefebure
33
5. Verslagen Week1 maandag 13/3/2006 Werd pas verwacht om 10u. Mijn begeleider had de kans de dringende zaken van de dag eerst te bekijken alvorens zich over mij te ontfermen. Om tien uur kreeg ik een rondleiding en voorstelling met collega's. Vervolgens werd mij gevraagd een voorstelling te geven van mijn project (3D voorstelling voor verkiezingen bij WTV). Dit viel blijkbaar in de smaak, want er werd mij gevraagd om een dergelijk systeem te programmeren voor de stemmingsresultaten in bv. een parlement. In de namiddag kon ik dan beginnen met het bestaande systeem te overlopen en proberen te begrijpen. Al vlug snapte ik de grote lijnen van het werken met xml om koppelingen te maken tussen verschillende plugins. Dus was het tijd om een en ander te testen. Na twee bestaande plugins (klok en animatie in GDI+) te vervangen hebben door eigen geschreven plugins in Directx, werd al snel het verschil in CPU-load duidelijk. Directx had grote voordelen.
dinsdag 14/3/2006 Mijn eerste werk bestond erin een plugin te schrijven die een synoptic (een zaal zoals bijvoorbeeld een parlement) uit een file haalt en grafisch gaat voorstellen in directx. Na een tijdje zag men al een zaal te voorschijn komen, voorlopig enkel met het nummer van het zitje. Later vervangen door zitjes als vierkantjes op het scherm. De volgende stap was om de vierkantjes in twee te delen. Een helft om de status van de microfoon mee te geven (on, of, requested), de andere helft voor de status van de badge (in, out). Dit met behulp van kleurcodes die in een texture werden gestopt.
Stage Televic
Kevin Lefebure
34
woensdag 15/3/2006 Na het succes van de vorige dag kwamen nu wat moeilijkere dingen. Er moesten namelijk heel wat properties aangemaakt worden om de flexibiliteit van de plugin te vergroten. Via de xml file die een form genereert werden die properties getest door enkele buttons, labels en textboxen toe te voegen. Al gauw bleek er een probleem te zijn. Sommige van mijn properties bleken niet te werken. Na lang zoeken en proberen ben ik ten einde raad naar mijn begeleider gegaan om het probleem voor te leggen. Na samen wat te overleggen kwamen we tot de conclusie dat het systeem van de properties nog niet op punt stond. Er werden namelijk enkel 'default'-properties aanvaard. Met andere woorden, enkel de properties die standaard bij een form, panel,... horen werden aanvaard. Dit bleek inderdaad toen ik mijn properties gewoon veranderde van naam in bestaande properties om te testen. Het probleem zat dus niet bij mij, maar bij het systeem dat de plugins beheert.
donderdag 16/3/2006 Na de problemen van gisteren, werd vandaag weer een betere dag. Er werd een nieuwe plugin ontwikkeld die een soort vergrootglas voorstelt in combinatie met de vorige plugin. Wanneer over de 'zaal' wordt bewogen met de muis, komt op deze plugin een uitvergroot detail van die zaal op de nieuwe plugin. De bedoeling hiervan is om meer details per zitje op deze plugin te krijgen, zoals bijvoorbeeld de naam van de persoon, partij,... Ook nu werden een heleboel properties toegevoegd, zoals kleurcodes voor de statussen, welke gegevens moeten weergegeven worden,... Maar testen zat er niet in door het probleem beschreven bij de vorige dag.
vrijdag 17/3/2006 Mijn begeleider was deze dag afwezig, dus had ik tijd om wat te testen (behalve properties uiteraard). Zo zijn enkele kleine foutjes rechtgezet, en een geweldig groot probleem gevonden. Uit eerder ervaringen met Directx wist ik dat bij het drukken op ctrl+alt+del de directx-device verloren raakt en er dus een foutmelding optreedt.
Stage Televic
Kevin Lefebure
35
Bijgevolg sluit het programma, wat natuurlijk niet de bedoeling kan zijn. In eerder programma's was ik er nog nooit in geslaagd dit deftig te voorkomen, veel vertrouwen had ik dus niet. Ik wist dat ik het deviceLost, en deviceReset event moest opvangen en daar mijn objecten disposen en resetten, maar ik bleef maar fouten krijgen. Nog erger dan tevoren, mijn pc crashte namelijk telkens ik ctrl+alt+del drukte, waardoor veel tijd werd verloren omdat hij telkens moest herbooten en een foutcontrole moest uitvoeren. Na lang zoeken en proberen bleek dat ik een klein iets vergeten was, ik vergat mijn font-object te disposen. Alles ging perfect na deze rechtzetting en na ctrl+alt+del te drukken, mijn devices werden mooi geresset.
Algemene indruk na mijn eerste week Tof project, toffe mensen, wat moet een mens nog meer hebben. Ik heb ondertussen al geweldig veel bijgeleerd, wat het nog eens interessanter maakt. Hopelijk zijn de volgende weken hetzelfde...
Stage Televic
Kevin Lefebure
36
Week 2 maandag 20/3/2006 Vandaag begonnen aan een algemene plugin die het werk moet vereenvoudigen. Deze plugin moet gelijk welke .x files (directx objecten) kunnen inlezen en weergeven. Vervolgens moeten animaties kunnen toegepast worden vanuit xml (dus eigenlijk vanuit een andere plugin). Als eerste ben ik begonnen met een voorbeeld van microsoft ivm .X files te overlopen en al het nuttige eruit haalt.
dinsdag 21/3/2006 Mijn werk van gisteren werd nu aangepast om meerdere .X files in te lezen in 1 wereld (wat het voorbeeld niet kon). Weinig problemen ondervonden, hier en daar beetje zoekwerk. Op het einde van de dag lukte dit perfect.
woensdag 22/3/2006 Methodes geschreven die animaties kunnen verwerken. Er worden tijdsintervallen, coördinaten en hoeken doorgegeven per object. Alles wordt overlopen tijdens het Renderen en volgens het juiste tijdstip getekend.
donderdag 23/3/2006 Vandaag wereld- en lichtanimaties toegevoegd, beetje problemen gehad bij het renderen. De volgorde waarin de animaties gebeuren blijkt belangrijker dan gedacht, eerst draaien en dan verschuiven of omgekeerd is een groot verschil. Alles beginnen implementeren binnen xml. .X files kunnen zo al binnengelezen worden.
vrijdag 24/3/2006 Alle overige animaties werden in xml geïmplementeerd. Methodes geschreven die tekst aanmaken via id's,om te kunnen verwijderen of onzichtbaar zetten wanneer gewenst. Applicatie getest door verschillende animaties uit te proberen.
Stage Televic
Kevin Lefebure
37
Algemene indruk na mijn tweede week Tof om resultaten te zien, grote vooruitgang geboekt deze week.
Stage Televic
Kevin Lefebure
38
Week 3 maandag 27/3/2006 Methodes voor animaties aangepast, zodat herhaling mogelijk is. Hoeveel keer moet herhaalt worden, wordt meegegeven als integer, -1 is oneindig. Na implementatie enkele bugs gevonden. Laatste object wordt steeds herhaald, zelfs al staat de herhaling af. Blijkbaar een boolean vergeten te resetten. Nog enkele kleinere bugs er uit gehaald. XML file aangemaakt die de stemming in een parlement voorstelt via de aangemaakte plugin.
dinsdag 28/3/2006 Methode toegevoegd die 3D text objecten aanmaakt en animeert. Weinig problemen ondervonden hierbij, methode was gelijkaardig aan gewone objecten. Stemmings-xml file verder aangepast zodat effectief kan worden gestemd. Na kleine foutjes te hebben verbeterd, file opnieuw aangepast om te werken via TMS (applicatie die echte stemmingen kan simuleren). Deze file getest, blijkt goed te werken, maar krijgt te vlug gegevens binnen waardoor weinig tijd over om te tekenen. Ook nog klein foutje gevonden; objecten worden goed geanimeerd, maar blijken niet helemaal tot eindpositie te gaan. TMS software wordt aangepast met timer om pas na verstrijken van timer gegevens te sturen. Applicatie loopt vast.
woensdag 29/3/2006 TMS opnieuw aangepast, opnieuw testen dus. Nog steeds blijkt er een foutje in de dll te bestaan. Gedaan met testen dus. Foutje van de vorige dag ivm animatie opgelost. Tijdens het wachten op een nieuwe test, code opgekuist en goed gedocumenteerd. Voorlopige stagesite aangemaakt.
Stage Televic
Kevin Lefebure
39
donderdag 30/3/2006 Vandaag eens gezocht op mogelijke manieren van genereren van documentatie. In VS bestaat de mogelijkheid om bij het builden van de applicatie een xml bestand mee aan te maken met alle 'summary's' in. Dit aangemaakt en de mogelijkheden bekeken wat er met de xml kan aangevangen worden. In de namiddag getest, met succes ondanks de nog steeds bestaande fout in de TMS.
vrijdag 31/3/2006 Er bestaat een applicatie (flexplugindump) die een dll (plugin) meekrijgt als parameter en daar alle methodes en properties uithaalt. Ik stelde voor om die applicatie te wijzigen door ook de overeenkomstige xml (met documentatie) ook automatisch mee te nemen. Voor elke methode en property die de flexplugindump uit de plugin haalt, haal ik ook de documentatie op uit de xml (indien die bestaat natuurlijk). Zo is het probleem van documentatie opgelost, en zit die samen met de implementatie van de code.
Algemene indruk na mijn derde week Opnieuw veel gedaan deze week, ook deze week zie je een grote vooruitgang. Hopelijk zijn volgende opdrachten ook nog even boeiend om doen.
Stage Televic
Kevin Lefebure
40
Vakantie Deze vakantie besloot ik om thuis te werken aan enkele kleinere projectjes. Ik heb me verdiept in het werken met xml en xslt om zo de documentatie van de dll's in een mooie htm-file te stoppen. Dit ging vlotter dan verwacht, er zat ergens ver weg nog een basis die vlug terugkwam. Verder heb ik gezocht om de installatie van directx sdk onnodig te maken. (naar klanten toe moet dan niets geïnstalleerd worden) Maar na dagen proberen (kopiëren van dll's, prutsen met register) geen enkele vooruitgang. Er is ook niets te vinden op internet, dus heb ik de hoop maar opgegeven op enig succes.
Stage Televic
Kevin Lefebure
41
Week 4 dinsdag 18/4/2006 Deze morgen mijn "vakantiewerk" overlopen en gedemonstreerd. Alles was blijkbaar in orde en goed opgelost. Er werd mij gevraagd om een demo te maken voor de verschillende sprekers (in bv. parlement) met foto weer te geven in 3D. Dit zag ik heel goed te doen, enkel maar een xml file aanmaken die dan weer dynamisch ingelezen en gerenderd wordt. Natuurlijk was dit niet alles, er werd ook gevraagd om 3D objecten te kunnen selecteren. Dit is natuurlijk iets anders, 2D schermcoordinaten omzetten naar 3D objectcoördinaten... Gelukkig na wat sukkelen en googlen toch een voorbeeldje gevonden, aangepast naar mijn project en ja hoor, problem solved. Wel veel tijd in gekropen.
woensdag 19/4/2006 Vandaag de klasses aangepast zodat objecten die aangemaakt worden ook een variabele meekrijgen om te weten of ze selecteerbaar zijn of niet. Methodes geschreven die gegevens kunnen opvragen van het object, bv x-pos, zhoek,... Zo kan binnen de xml een controle worden geplaatst op de objecten. bv. als een object 180° staat gedraaid, draai dan terug tot 0° en omgekeerd. Verder nog een methode ingestopt die een skin van een object kan aanpassen, bv. een ander fotootje op een object plaatsen. Ook dit kan dan vanuit xml. De overige tijd gewerkt aan stagesite. Mijn begeleider was op klantenbezoek, dus moest ik me wat bezighouden.
donderdag 20/4/2006 Deze voormiddag de test van vorige dag uitgebreid met 3D tekstobjecten en zo een bug gevonden. Deze objecten konden maar 1 animatie uitvoeren. Gemakkelijk opgelost, een boolean die niet gereset werd. Verder code een beetje opgekuist en commentaar toegevoegd, in afwachting van een evaluatie met mijn begeleider. Na het overlopen van gedane werken werd één iets gewijzigd, bij het klikken op een object werd eerst verwacht dat je expliciet zei dat je de info van dat object nodig had.
Stage Televic
Kevin Lefebure
42
Dit gebeurt nu automatisch. Ook een documentje geschreven met de info over hoe de xml-documentatie opgebouwd dient te worden. Tijdens het testen is er nog een bug gevonden, namelijk: Er konden geen multiline 3D tekstobjecten gemaakt worden. Dit is opgelost door verschillende meshes aan te maken ipv met één enkele mesh te werken. Alles via CVS op de server gezet.
vrijdag 21/4/2006 Vandaag onderzoek gedaan naar de mogelijkheden van openoffice binnen c#. De bedoeling is om zonder licentie te moeten betalen een office-document te kunnen openen binnen een c# form. Openoffice biedt deze mogelijkheid, maar daar er momenteel weinig documentatie te vinden is, was het toch zoeken hoe alles moest geimplementeerd worden. Na een tijdje kon ik inderdaad een document openen. Daarna wat gespeeld met de verschillende properties, welke toolbars zichtbaar moeten zijn,... Wat wel bleek, is dat openoffice verre van stabiel is, en dit is dus misschien geen goede oplossing naar de klanten toe.
Algemene indruk na mijn vierde week Minder grote vooruitgang dan vorige weken. Tof om eens iets anders te doen dan directx.
Stage Televic
Kevin Lefebure
43
Week 5 maandag 24/4/2006 Omdat de openoffice oplossing om een document binnen een form te krijgen niet zo stabiel is, mocht ik vandaag zoeken naar iets nieuws. Er werd me verteld dat er zoiets bestond als een word-viewer, excel-viewer,... Dit zijn gratis programma's die een office-document kunnen openen. Dit natuurlijk enkel read-only, maar dit is niet zozeer een probleem aangezien het in de eerste plaats die bedoeling heeft. Dit is inderdaad een mooie oplossing; stabiel en geen licentie, maar het grootste probleem is dat dit een stand-alone applicatie is en niet geïmplementeerd kan worden binnen een form. Althans niet zoals mogelijk is met de gewone office. Maar op alles is iets te vinden. Uit eerdere projecten wist ik dat je een window binnen een andere window (form) kan trekken met behulp van zijn handle. Dankzij de win32 API en methodes zoals setparent, setwindowlong,... is het mogelijk om een venster binnen te krijgen in een form en zijn properties te veranderen. Zo is het ook mogelijk om bijvoorbeeld de titelbalk te verwijderen.
dinsdag 25/4/2006 Na het succes van de vorige dag, mocht ik nu eens uitzoeken in hoeverre ieder programma zo kan binnengetrokken worden in een form. Na enkele tests (calc.exe, taskmgr.exe, msn messenger,...) bleek dat je inderdaad elk programma zo kan binnenkrijgen. Het bleek ook wel dat het veranderen van vensterstyle niet lukte op taskmanager. Maar toch was dit zo'n goed nieuws hier, dat ik werd gevraagd eerst een documentje te schrijven voor in de database met referenties. Verder een demo-applicatie gemaakt die messenger, kladblok en de rekenmachine op een form zet.
woensdag 26/4/2006 Vandaag verder gewerkt aan de 3D engine. Methodes geschreven die een box, sphere, cylinder, 2D polygon en 3D polygon kunnen toevoegen zonder gebruik te maken van een .x-file.
Stage Televic
Kevin Lefebure
44
Nieuwe methode geschreven die een offset kan toevoegen aan een object. Zo is het mogelijk om het centerpunt van een object te veranderen. Een rotatie wordt dan gemakkelijker. Voor text-objecten en gewone objecten (dus geen .x-file) werkt dit zonder probleem. Nu is het probleem om objecten uit .x-files te veranderen. Alles zit vervat in een meshcontainer, waarin de verschillende meshes zitten. in die meshes zitten de vectoren waaraan een offset moet worden toegevoegd. Om een of andere reden kunnen sommige vectoren niet aangepast worden (de meeste wel). Waarschijnlijk zijn ze gelockt waardoor niet kan worden geschreven naar het geheugen. Nochtans wordt er geen fout gegenereerd.
donderdag 27/4/2006 Jobhappening
in
het
PIH.
Gesprek
gehad
met
Televic
en
met
PTI-CVO
volwassenenonderwijs. Beide heel positief verlopen.
vrijdag 28/4/2006 Verder gezocht op de fout van woensdag. Van alles geprobeerd, opzoekingen gedaan op internet, maar geen enkele oplossing gevonden. Gelukkig was er nog een alternatief: de .x-file zelf gaan aanpassen en opnieuw inlezen. Dit werkte dan wel perfect behalve voor geanimeerde .x-files. Geen oplossing gevonden voor dit probleem. Het grote voordeel is wel dat zo'n files weinig of niet zullen gebruikt worden, laat staan dat ze een offset moeten toevoegen. Demo gemaakt die de nieuwe functionaliteiten test. Een menu bestaande uit verschillende balken met een tekstje op die dienen als knoppen. Het volledige menu kan worden geroteerd en elke knop kan worden ingedrukt.
Algemene indruk na mijn vijfde week Niet veel speciaals te vertellen. Wel blij dat men hier tevreden is van hetgeen ik doe.
Stage Televic
Kevin Lefebure
45
Week 6 dinsdag 2/5/2006 Verder gewerkt aan de demo ivm het weergeven van een menu. Via een klein panel wordt een soort touch-pad weergegeven. Daarbinnen slepen met de muis veroorzaakt rotatie van het menu. Klein foutje gevonden in de methode die de selectie van 3D objecten doet. Alle objecten werden overlopen om te zien of er een mouseover was, het laatste in de arraylist die hieraan voldeed werd geselecteerd. Dit moet natuurlijk het object zien dat op de voorgrond staat. Dit is dan ook opgelost. In de namiddag het datasink principe van de flexplugins bekeken. Een interface die data van de ene plugin naar de andere stuurt. Bekeken hoe alles werkt teneinde een plugin te schrijven die data gekregen van een plugin kan wegschrijven naar een file of data leest van een file en doorstuurt naar een plugin. Een eerste implementatie is bereikt. Plugin kan schrijven wat hij doorgestuurd krijgt en kan lezen en doorsturen.
woensdag 3/5/2006 De ontwikkelde plugin van gisteren getest met een ftp-plugin. Een client en server ftp opgestart, client krijgt data van de fileIO plugin en stuurt die door naar de server. Op zijn beurt zendt de server de data naar een andere fileIO plugin die de data naar een file schrijft. Een probleem daarbij is dat niet enkel data uit de file wordt weggeschreven maar eveneens de communicatie tussen de client en server ftp onderling. Dus maar een start en stop methode geschreven zodat de plugin weet wanneer te schrijven en wanneer niet. Een nieuwe plugin gestart die de communicatie tussen plugins visualiseert op een picturebox.
donderdag 4/5/2006 In de voormiddag niet zoveel kunnen doen. Ik had een gesprek ivm een eventuele job bij Televic. Goed verlopen trouwens, nogmaals blijkt dat men hier tevreden is.
Stage Televic
Kevin Lefebure
46
Tegen de middag dan verder gewerkt aan de visualisatie van de communicatie. Er wordt nu een lijstje (listview met checkboxes) weergegeven waarin alle geregistreerde plugins zitten. Zo kan geselecteerd worden welke communicaties gezien worden. Ook methodes ingestoken die zorgen dat er automatisch wordt gescrollt of enkel de laatste zoveel lijnen getekend worden. Deze plugin zal ook de mogelijkheid hebben om te gaan loggen naar een xml-file, via de eerder ontwikkelde fileIO-plugin. Test gedaan met grote files. Enkele kleine probleempjes die morgen moeten opgelost worden.
vrijdag 5/5/2006 De problemen opgelost, zo was er een overhead bij het tekenen van data. Nu wordt controle gedaan of de data wel zichtbaar is voordat wordt getekend. Time-out van 30ms bij het lezen van een regel van een file, zodat bij het doorsturen via ftp alles in volgorde toekomt en er geen corrupte data is. Om een of andere reden bleek ook dat de file niet helemaal werd weggeschreven aan de andere kant. Lang op gezocht, blijkt gewoon dat de streamwriter nog eens moet geflusht worden voor hij gesloten wordt. Documentatie van de nieuwe plugins geschreven.
Algemene indruk na mijn zesde week Deze week hopelijk de basis gelegd van een vaste job.
Stage Televic
Kevin Lefebure
47
Week 7 maandag 8/5/2006 Het laatste probleem van vorige week aangepast. De FileIO plugin kon nog geen bytearray doorsturen. De data die wordt gestuurd bestaat uit een array van objecten. Bij het sturen van een byte-array wordt de array als eerste element in de object-array gezet, vervolgens het type (in dit geval de string "byte[]"), vervolgens nog de offset en de count volgens de buffer die gelezen wordt. Nu moeten die offset en de count Uint's zijn, maar (int)data[2] werkt niet (geeft at runtime
casting
probleem).
Om
een
of
andere
reden
werkt
Convert.toInt32((uint)data[2]) wel. Raar, maar probleem opgelost. Alles voorbereiden voor morgen (bezoek Bart Uyttenhove aan Televic). Demo's klaarmaken, documenten op orde zetten,...
dinsdag 9/5/2006 Voor het bezoek nog even gezocht op het xslt probleem, blijkbaar worden er functies gebruikt die niet worden ondersteund door FireFox. Later verder bekijken. Bezoek verloopt goed, misschien iets te veel demomateriaal. Opnieuw wordt er een positieve indruk achtergelaten. Na het bezoek verder gewerkt aan de xslt, andere methode en functie gebruikt. Probleem opgelost. De rest van de namiddag gezocht naar methodes om de 'embeddedApps' te veranderen. Probleem is dat vensters 'flashen' voor ze worden binnengetrokken. Een ander probleem is dat sommige vensters gezocht moeten worden volgens hun caption. Wat ook niet ideaal is. Voorlopige oplossingen werken maar voor bepaalde toepassingen, dus moet er verder worden gezocht.
woensdag 10/5/2006 Na lang zoeken bleek de enige oplossing die iets beter is, de applicatie van waaruit andere programma's worden gestart topmost en maximized zetten. Zo komen de nieuwe geopende programma's in de achtergrond en wordt er niet meer 'geflasht'. De rest van de dag het xslt-bestand aangepast naar de huisstijl van Televic.
Stage Televic
Kevin Lefebure
48
donderdag 11/5/2006 Demo gemaakt als presentatie naar klanten toe ivm 3DBox. Stemmingsresultaten met cilinders en speakers (foto's) op balk in 3D (kan roteren). Kan aangesloten worden via het TMS systeem om live uitslagen te bekijken. Niet moeilijk om doen, maar neemt wel veel tijd in beslag (beetje berekeningen doen in 3D wereld). Wat nu ook bleek is dat de applicatie geen lege 3D-text objecten kan aanmaken, wat niet onbelangrijk is.
vrijdag 12/5/2006 Vandaag begonnen aan een nieuwe applicatie. De bedoeling is om een programma op de achtergrond te laten draaien dat in de gaten houdt welke processen draaien. Als een bepaald process wordt afgesloten, kan deze applicatie het programma opnieuw starten, een melding geven of gewoon niets doen. Het moet mogelijk zijn om via een combinatie op het keyboard de applicatie op de voorgrond te krijgen (het keyboard hooken aan de app). Daar zie je dan welke processen
moeten
draaien,
of
ze
inderdaad
wel
draaien,
welke
actie
moet
ondernomen worden,... Ook moet een applicatie kunnen toegevoegd worden, expliciet stoppen of starten en alles moet aanpasbaar zijn van parameters. Later op de dag een afspraak gehad om mijn contract te tekenen voor Televic!
Algemene indruk na mijn zevende week Mijn contract is binnen, dat is wel het belangrijkste denk ik zo...
Stage Televic
Kevin Lefebure
49
Week 8 maandag 15/5/2006 Verder gewerkt aan de applicatie van vorige week. processen kunnen nu gestopt en gestart worden. De applicatie aangepast, de captionbar verrijkt met een knop "hide". lang op gezocht, maar nu kunnen er knoppen toegevoegd worden aan de titelbalk. mooi effect, maar blijkbaar wel in win98 stijl. xp-stijl is verdwenen.
dinsdag 16/5/2006 Vandaag begonnen om een "takeover" systeem te implementeren. De bedoeling is om muis en toetsenbord te hooken en de events door te sturen naar andere pc. Veel tijd gestoken in het onderzoeken hoe het hooken precies werkt. Het hooken van het keyboard ging redelijk vlot. Protocol opgezet om de tcpcommunicatie vlot te laten verlopen. werkt mooi.
woensdag 17/5/2006 Vandaag de muis gehookt. Werkt ook mooi. Er moet wel een timeout gestoken worden bij de mousemove, anders worden teveel commando's gestuurd na elkaar. Veel getest om de verbinding goed in orde te krijgen. Geen errors meer, thread die communicatie voorziet sluit ook mooi af bij wegvallen server of client.
donderdag 18/5/2006 xslt veranderd. binnen de xml boolean gestoken of de xslt de documentatie moet renderen (voor methodes, properties en classes). tcs-systeem aangesloten en getest op de tms-software. bleek dat maar een instantie van de 3Dbox wordt gestart. beide apart werken wel perfect. probleem voor morgen.
vrijdag 19/5/2006 Na de test van gisteren mocht ik het probleem nu oplossen. veel testen gedaan, maar het duurde lang eer het probleem gevonden was. blijkbaar wordt de win32 api funtie peekmessage maar in een instantie van 3Dbox uitgevoerd.
Stage Televic
Kevin Lefebure
50
Opgelost door de een als master te declareren en de andere als slave. de master roept de paint van de slaves op. Blender geïnstalleerd (3D creater, freeware) en wat mee gewerkt, moeilijke gui.
Algemene indruk na mijn achtste week Ongelofelijk wat je allemaal kan doen met die hooks. Gewoon een pc volledig loggen of een andere overnemen.
Stage Televic
Kevin Lefebure
51
Week 9 maandag 22/5/2006 De applicatie van vorige week wat op punt gezet. Functie in gestoken die xml met ip's leest waarop moet geconnecteerd worden. Ip's worden in listview gezet, ieder item kan gechecked worden. Ook een functie in gestoken die ervoor zorgt dat de locale pc niet mee geprocessed wordt,
dus
niet
meer
reageert
op
muis-events
(behalve
mousemove)
en
toetsaanslagen. Wanneer die op true gezet wordt, wordt de mousepointer een stopteken in plaats van een pijltje. De remote pc's krijgen alleen maar de commando's doorgestuurd wanneer de controlewindow geminimaliseerd is.
dinsdag 23/5/2006 Grote problemen vandaag. Blijkt dat mijn 3Dbox niet wil draaien op een andere pc, zelfs niet na de installatie van de directx-SDK. Nu maar zoeken aan wat het ligt. Eerst van alles geprobeerd met de dll's, die bij mij gekopieerd naar de andere pc. Geen effect. Om zeker te zijn dat het niet aan mijn plugin zelf ligt, heb ik een demo gemaakt en getest. Die werkte dan wel. Na veel zoeken en testen, kan de conclusie enkel zijn dat de pc's problemen hebben met de flexplugin (die als referentie in mijn 3Dbox zit). Waarschijnlijk te wijten aan het feit dat er compatibiliteitsfouten zijn tussen visual studio 2003 en 2005, en andere verklaring vind ik niet. Om zeker te zijn, worden de plugin-files geconverteerd naar 2005 volgende week.
woensdag 24/5/2006 De xslt terug aangepast om wat formattering toe te laten binnen de summary's. met "\n\r" wordt een nieuwe regel begonnen. De parameters zitten nu ook mooi in een table. Mooie doorbraak in het probleem van de vorige dag; bij het verwijderen van .net framework 1.1 werkt alles wel. Gezocht in hoeverre het mogelijk is om binnen een project van visual studio te zeggen dat hij gebruik moet maken van het 2.0 framework. Zoals verwacht niet mogelijk.
Stage Televic
Kevin Lefebure
52
Wat verder gezocht naar een mooie tool om 3D modeling te doen. MilkShape 3D is een gemakkelijke tool. Kan van alles importeren en exporteren. Enige probleem is dat animaties niet meegenomen worden (of toch niet goed) in een .x-file.
Algemene indruk na mijn negende week De helft van de week gezocht op problemen, niet zo tof dus. Gelukkig was het een korte week.
Stage Televic
Kevin Lefebure
53
Week 10 maandag 29/5/2006 Deze voormiddag nogmaals het stemsysteem getest. Aangesloten op de TMSsoftware. Nu werkt alles zoals het moet, twee 3Dboxen werken nu wel naast elkaar. Nog wat geprobeerd met MilkShape 3D, maar animaties gaan zogoed als niet. Verder getest in de namiddag voor de voting. Enkele kleine probleempjes gevonden die opgelost dienen te worden. Flikkering op de cylinders wanneer een 3D-wereld geinitialiseerd werd, anders niet. Probleem nog niet opgelost.
dinsdag 30/5/2006 Vandaag wat kleine zaken aangepast. Functies bij 3Dbox keren nu doubles terug wanneer nodig ipv strings. Bij de takeover een functie ingestopt die via een functietoets een commando naar alle clients stuurt om het actieve venster op positie 0,0 te zetten. Takeover is nu ook voorzien van een controle of een bepaald process 'hangt', dus niet meer reageert. Wanneer na een bepaalde time-out het process nog altijd niet reageert, wordt die afgesloten. Er is ook een logginsysteem voorzien dat alle muis en toetsenbord events gaat loggen, om zo een simulatie te kunnen uitvoeren.
woensdag 31/5/2006 Testen gedaan voor het loggingsysteem, enkele kleine bugs opgelost. Enkele functionaliteiten toegevoegd: de mogelijkheid om een logfile te herhalen, logfile ook locaal uitvoeren of niet. Testen goed doorstaan. In de namiddag een goeie tool gezocht die state-diagrams (UML) kan tekenen. Dia bleek een goede tool te zijn. UML-schema gemaakt voor de takeover, beetje zoeken, nog nooit gedaan. Dankzij een voorbeeldje, ging het al bij al nog vlot.
donderdag 1/6/2006 Vandaag begonnen aan een on-screen keyboard. Net zoals er een binnen windows zit, wordt er nu een gemaakt voor Televic. Gui gemaakt, functionaliteit toegevoegd. Werkt allemaal perfect. Probleem: wat bij ander toetsenbord-layout? Veel op gezocht, morgen verder doen.
Stage Televic
Kevin Lefebure
54
vrijdag 2/6/2006 Vandaag verder gezocht. Iets verder geraakt, het is nu mogelijk om de key-name op te halen, zo kan er al een onderscheid gemaakt worden tussen azerty en qwerty. Het probleem blijft nu wel nog dat er geen Arabische, griekse,… tekens kunnen worden weergegeven op de layout. (toch niet dynamisch).
Algemene indruk na mijn tiende week Toffe week, leuk om zoveel onderzoek te kunnen doen en me te verdiepen in het API systeem.
Stage Televic
Kevin Lefebure
55
Week 11 dinsdag 6/6/2006 Vandaag eindelijk geslaagd in de opzet. Mijn keyboard laadt de lay-out dynamisch. Het verandert mooi van lay-out bij het veranderen van een programma(in een andere taal).
woensdag 7/6/2006 Projecten eens overlopen, hier en daar beetje aanpassingen gedaan. projectdossier op orde gezet.
donderdag 8/6/2006 opleiding voor externen, om al een idee te hebben wat er precies gedaan wordt in de afdeling waar ik terecht ga komen.
vrijdag 9/6/2006 projectdossier afgewerkt, in de namiddag laten drukken
Algemene indruk na mijn elfde week het einde is in zicht, dat is te merken aan de taken die ik nog gedaan heb deze week.
Stage Televic
Kevin Lefebure
56
6. Bronnen www.codeproject.com -hook mouse/keyboard -App. embedding (handles & API-functions)
www.openoffice.org -info over OpenOffice
www.thehazymind.com -info over directx in c#
code uit plugins die reeds bestonden -datasinking -...
mijn stagebegeleider
Stage Televic
Kevin Lefebure
57
7. Lijst met figuren Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur Figuur
4: Planning 5: synoptic 6: 3DBox 7: DataView 8: Xslt 9: PluginDump 10: AppEmbedd 11: AppWatcher 12: Nederlands keyboard 13: Grieks keyboard
Stage Televic
8 11 18 25 28 29 31 32 33 33
Kevin Lefebure
58