Alle info aangeduid met is niet noodzakelijk en enkel voor de super-geïnteresseerden
Java-experten
Isabel Gonzalez: igonzale@etro.vub.ac.be Ke.3.15 tel: (02/629) 2969
Hans Ingelberts: hingelbe@etro.vub.ac.be K.5.328A tel: (02/629) 2930
In het werkcollege elektrotechniek "de pingpongbal" is het de bedoeling een pingpongbal te laten zweven in een doorzichtige kolom op een ingestelde hoogte.
De pingpongbal kan je doen zweven door hem met een ventilator omhoog te stuwen of aan te zuigen. De hoogte kan je meten met een ultrasone sensor.
Om de bal stabiel te krijgen op een ingestelde hoogte zal je een goede regelkring moeten maken. Deze regelkring kan je programmeren in een microcontroller (MCU).
Om op een gebruiksvriendelijke manier je regelkring in te kunnen stellen zal je ook nog een grafische user interface (GUI) in java moeten programmeren.
Dit java programma communiceert met je microcontroller over een USB interface.
Studenten die graag programmeren kunnen ook nog via java een webcam aanspreken en zo de instelhoogte van de bal bepalen door dit met je hand op de kolom aan
te duiden en de beelden van de cam te analyseren. Studenten die liever extra aandacht besteden aan elektronica kunnen hun regelkring ook volledig opbouwen uit
analoge elektronica (opamps e.d.).
Java documentatie (op de parallel website onder documentation)
Interessant voor project: Java spelregels (1 pagina), Java Summary (7 pagina's)
Printen van bytes in hexadecimaal stelsel:
System.out.format("%02x", 255); (met %x geef je aan dat er een argument volgt dat hexadecimaal geprint moet worden, de 02 zorgt ervoor dat je een nullen schrijft, bvb 0f ipv gewoon f)
De java Formatter klasse heeft uitgebreide mogelijkheden om waarden af te drukken.
Je kan zo ook formatteren naar string, bvb:
StringBuilder sb = new
StringBuilder();
Formatter
formatter = new Formatter(sb, Locale.US);
formatter.format("
%02x
%02x
%02x",
15,
91,
100);
String
string = sb.toString().toUpperCase(); // omzetten naar je string
System.out.println(string);
Zelf je Java programmeer omgeving
installeren en instellen
Zorg er voor dat je de Java
Runtime
(jre)
en
Java
Development
Kit
(jdk) geinstalleerd hebt.
(32bit versie vereist voor USB communicatie en webcam!!!).
Installeer Eclipse, hiervoor moet je enkel de files downloaden en extracten in een folder (niets installeren dus). Er wordt een eclipse folder aangemaakt waarin je het programma vind.
Kies "Eclipse IDE version for Java Developers" in de download sectie.
Dit zijn de evaluatiecriteria:
Correctheid
Begrijpbaarheid: gebruik logische namen, indenteer correct (!!) en kuis je code op (!!).
Flexibiliteit: aanpasbaarheid & uitbreidbaarheid
Herbruikbaarheid: delen van je code kunnen gebruikt worden om andere problemen op te lossen.
Om dit te bereiken heb je ten eerste de principes van gestructureerd programmeren (zie Modula-2 project)
Duidelijke naamgeving (dan is niet veel documentatie nodig). Tip: gebruik Refactor => Rename in Eclipse om namen in 1x aan te passen over het gehele project.
Documenteer niet-triviale code. Er is wel gevraagd een handleiding te schrijven. Die moet sowieso de structuur van je programma uitleggen, voor bepaalde details kan je naar de code verwijzen. Er moet zeker een schema met de codestructuur gedocumenteerd worden!!
Geen redundantie, geen dubbele code.
Ten tweede heb je de mogelijkheden die Object-geöriënteerd programmeren biedt:
Encapsulatie: een object vormt een logisch geheel die een bepaald aspect van je probleem oplost. Je steekt niet alles in 1 object, maar verdeelt de verschillende verantwoordelijkheden over verschillende objecten (zo bekom je duidelijke en herbruikbare code). Je zorgt ervoor dat niet alle objecten met elkaar praten, want dan krijg je spagetticode.
Overerving (inheritance): gemeenschappelijke onderdelen worden in hoofdklasses gestoken, specificiteiten in subklasses. Zo bekom je herbruikbaarheid en flexibiliteit.
Polymorfisme & abstractie: een abstracte klasse of een interface definieren een abstract concept. Dit concept kan dan gebruikt worden in delen van je programma, die onafhankelijk van de concrete invulling van het concept worden! Dit zorgt voor de uitbreidbaarheid van je programma. Een interface definieert wat een bepaald deel van je programma moet kennen van een ander.
Tracht flexibiliteit en herbruikbaarheid te bereiken voor de
volgende aspecten
Maak een abstractie van je regelaar in Java: Je regelaar zit in de MCU en niet in Java. Toch kan je in java ook regelaar klasse maken. Met je GUI stel je die java regelaar in. Je java regelaar zorgt er voor dat de juiste instellingen bij de echte regelaar geraken.
Voorbeeld 'Vrienden': wat is object-geöriënteerd programmeren?
Download de klasse Persoon ergens op je pc.
Start Eclipse , hij zal je vragen waar je je workspace wilt hebben. Maak een folder bij jou files (bvb 'java'). Vink 'Remember my decision' aan. Eclipse bied je dan een welkom-pagina met een introductie aan, je kan die skippen met (rechtsboven).
Maak een nieuw java projekt in Eclipse en geef het een naam. Eclipse maakt een folder met die naam aan.
Alternatief: Download de file direct onder de map src in de project map gemaakt door Eclipse. Selecteer vervolgens het projekt en druk F5 om te refreshen, jou file verschijnt nu onder Default Package. Open hem.
Run de Main van Vrienden met (je moet wel ergens in de file te staan)
Uitbreiding vrienden-voorbeeld: Leugenaars en Ontkenners
Oefeningen:
Voeg een klasse Leugenaar toe (iemand die altijd liegt, dit is natuurlijk ook een persoon) en maak van Piet een leugenaar.
Print de vrienden-keten af: "Jan heeft als vriend Piet heeft als vriend xxx"
Spelen
met
een
USB
muis
(een USB HID class device)
Installatie instructies:
Zorg er voor dat libusb-win32 en
libusbjava correct geinstalleerd zijn. (zie onder "Programma's" op deze
pagina)
Start Eclipse , hij zal je vragen waar je je workspace wilt hebben. Maak een folder bij jou files (bvb 'java'). Vink 'Remember my decision' aan. Eclipse bied je dan een welkom-pagina met een introductie aan, je kan die skippen met (rechtsboven).
Maak een nieuw java projekt in Eclipse en open de project properties. Ga naar Java Build Path, selecteer tabblad "Libraries", Add external Jars en voeg ch.ntb.usb-x.x.x.jar toe. (normaal gezien te vinden in je java/jdk/jre/lib folder). Deze library stelt je USB functionaliteit ter beschikking. Zonder deze library kent java niets van USB!
Oefeningen:
In de documentatie van libusbjava kan je zien welke classen de library allemaal ter beschikking stelt. Hiervan gaan we enkel de classen USB en Device gebruiken.requestType:
Dit is 1 byte die volgende
informatie bevat: Bit 7: Request direction
(0=Host to device - Out, 1=Device to host - In). request:
Dit is de identificatie van de
request: 1 bytevalue:
Dit zijn 2 bytes waarvan de twee meest
significante byte het type raport is en de andere de identificatie van
het raport.index:
Dit is het nummer van de interface over
dewelke je de request wilt sturendata:
De data die je meestuurt of
lege data in dewelke het Device iets mag zetten als antwoord.size:
De grootte (in aantal bytes) van de data
die je meestuurt of terug verwachttimeout:
De tijd in milliseconden die je wacht
voor je beslist dat de transfer mislukt isreopenOnTimeout:
een boolean: Als de transfer
te lang duurde en dus als mislukt beschouwd wordt, wil je dan het
device opnieuw openen? (dit heeft enkele herinitialisaties tot gevolg
die het mogelijke probleem kunnen oplossen)
0x01 (GET_REPORT). Het type van
request
is Device
naar Host, class type, interface recipient)Installatie instructies:
Zorg er voor dat libusb-win32 en
libusbjava correct geinstalleerd zijn. (In de etro pc zaal is dit het
geval, anders zie onder "Programma's" op deze pagina)
Start Eclipse , hij zal je vragen waar je je workspace wilt hebben. Maak een folder bij jou files (bvb 'java'). Vink 'Remember my decision' aan. Eclipse bied je dan een welkom-pagina met een introductie aan, je kan die skippen met (rechtsboven).
Maak een nieuw java projekt in Eclipse en open de project properties. Ga naar Java Build Path, selecteer tabblad "Libraries", Add external Jars en voeg ch.ntb.usb-x.x.x.jar toe. (normaal gezien te vinden in je java/jdk/jre/lib folder). Deze library stelt je USB functionaliteit ter beschikking. Zonder deze library kent java niets van USB!
Oefeningen:
Maak een nieuwe klasse aan en selecteer "public void main(String[] args)".
Probeer zoals bij de muis het MCU bord te openen als USB Device (dit bord heeft een andere Vender en Product ID)
Probeer via controle transfers
ledjes aan en uit te schakelen
Let op, deze keer schrijf je iets naar het device
Let op, dit is geen class device maar een vendor specific device
De request ID is vastgelegd als 0x01
Het adres wordt meegegeven
als value
van de controle transfer, deze value
bestaat uit twee bytes waarvan het de meest significante is die het
adres bevat, de andere is "don't care"
Ook dit device heeft maar 1 interface
Voor een GUI-applicatie gaan we gebruik maken van Visual Classes van de Visual Editor (hier wat documentatie).
Maak een nieuwe klasse, maar kies Visual Class (via zwart pijltje naast ). Kies een Frame (is een applicatie met window) en selecteer "public void main(String[] args)".
Nu zie je je window grafisch en ook de gegenereerde code van de JFrame klasse.
Voeg componenten toe via de Palette (zie je rechts van je scherm): knoppen, sliders, ...
Voeg akties toe aan de knoppen door met rechtermuis op het component te klikken en Events -> actionPerformed (of een andere actie) te kiezen. Je krijgt dan de mogelijkheid om eigen code toe te voegen.
Voeg een button toe
waarmee je één van de leds aan en uit kan zetten. Doe dit met een
LedBord object.
Zelf tekenen doe je door de void paint(Graphics g) van je JFrame te overschrijven. Deze methode wordt door Windows opgeroepen.
Vergeet niet super.paint(g); op te roepen zodat je buttons en andere componenten getekend worden.
De essentie van java GUIs |
Een GUI bestaat componenten, hierarchisch geordend: componenten worden geplaatst binnen in een container, een container kan in een container staan. Elk component is een object met eigen attributen en methodes. Windows zal events triggeren telkens er iets gebeurd, zoals een muisklik.De events vang je op met listeners die 'luisteren' naar bepaalde events. Het ordenen van de componenten gebeurt via de layout manager van een container. Een JPanel kan je als container gebruiken waarop je andere componenten kan plaatsen. Een JPanel kan je ook gebruiken voor te tekenen. Deze paintComponent(Graphics g) methode wordt opgeroepen door windows om een component te tekenen. Deze wordt elke keer opgeroepen als Windows denkt dat het nodig is, bvb als je je window herschaalt. Je kan ook expliciet aangeven dat een component of de hele window hertekend moet worden. Dit doe je door de repaint() methode op te roepen van het component of de frame. Als je de painComponent(Graphics g) methode overschrijft gebruik je het Graphics object om tekencommando's te versturen. |
De standaard
java-objecten voor GUIs staan in de javax.swing package (de awt
package is een verouderde package voor dit). De API van de swing
package laat je alle mogelijkheden zien, maar is nogal uitgebreid
en afschrikwekkend in het begin. Gelukkig vind je bij elke belangrijke
klasse een link naar een handige tutorial. |
Oefening
om GUIs te leren
maken
Oefening om GUIs te leren maken mbv de Visual Editor (een plugin voor Eclipse) (hier wat documentatie + hoe te installeren).
Maak een nieuwe klasse, maar kies Visual Class (via zwart pijltje naast ). Kies een Frame onder de Swing componenten (is een applicatie met window) en selecteer "public void main(String[] args)". Een frame is een window.
Nu zie je je window grafisch en ook de gegenereerde code van de JFrame klasse. De visual editor genereert dus java code. Best kom je niet aan die code, dan zal de Visual Editor in de war geraken. Wel kan je code toevoegen.
Voeg GUI componenten toe via de Palette (zie je rechts van je scherm) of via de knop : knoppen, sliders, ... De Swing componenten zijn de basiscomponenten.
Test-oefening: hoe
goed is je basiskennis van java? Voorspel de output van het
programma.
Tip: analyseer eerst hoe
de klasses met elkaar relateren.
Hier is nog eentje: Three Classes
Wie een iets grotere uitdaging wilt, kan dit programma bekijken (klasse-schema).
Meer over java:
GUI layout (zie onze Java doc)
plaatsen van componenten mbv. absolute posities
groeperen van componenten in een box
scheiden data - view
event listeners
Vector
inner classes
packages, class & jar files, import
applets
- Back to the top -