torsdag den 27. november 2008

week 10

Deltagere: Peter, Michael, Asger
Varighed: 3 timer
Mål: Undersøg Behaviour programmering med nxj klasser

Plan:
* Kør BumperCar på NXT'en
* Undersøg koden for NXJ's behaviors
* Tilføj exit behavior
* Tilføj play behavior

Bemærk, vi bruger lejos 0.7, som har en forbedret Behavior og Abritrator

BumperCar på NXT


NXT'en kører fremad til touchsensoren bliver aktiveret, når det sker
kører den lidt tilbage, og dreje en smule til venstre. Derefter
starter den forfra. Hvis man holder touchsensoren nede bliver den ved
med at bakke og dreje gentagende gange, uden at køre fremad.

Koden


I Abritrator finder man en Monitor med følgende kode.

//FIND HIGHEST PRIORITY BEHAVIOR THAT WANTS CONTROL
highestPriority = NONE;
for( int i = maxPriority; i >= 0; i--)
{
if(_behavior[i].takeControl())
{
_highestPriority = i;
break;
}
}
if(_highestPriority > _current && _current != NONE)
{
_behavior[_current].suppress();
}
Thread.yield();


Det den gør er at gennemløbe alle behaviors startende med den der har
højst priotet, når den finder en som ønsker kontrol stopper den
gennemløbet og vælger den behavior.

Dvs. at DriveForward.takeControl kun bliver kaldt når HitWall retunere
false i sin takeControl.


Exit Behavior


At implementere en exitbehavior "burde" være simpelt. Desværre ser det
ud til at de ellers gode ændringer der er kommet i version 0.7 af NXJ
har tilføjet nogle nye problemer. Fx starter Abritrator en monitor
tråd, som ikke er sat til daemon, derfor kan ens program ikke afslutte
så længe den tråd kører, hvilket den bliver ved med så længe, at der
er en Behavior der vil have kontrol. Derfor, for at lave en
exitbehavior, så skal den have kendskab til alle andre behaviors, som
have mulighed for at slå dem alle fra.

Opdatering:


Ved at Kalde Abritrator med false som andet argument, så den ikke ikke
retunere ved inaktivitet, så fungere det hele meget bedre. Dog er
semantiken for action og suppress ændret lidt, så suppress bliver kun
kaldt, hvis action ikke har retuneret før en anden Behavior skal
afvikles. Derfor lavede vi om i DriveForward, så den har en whileløkke
der bliver ved med at kalde Thread.yield() indtil suppress bliver
kaldt, på den måde er vi sikret at suppress bliver kaldt.

Play sound


Når alle behaviors er sat ind, og man aktivere hitwall og sound
samtidig, så ignorers sound da hitwall har højere priotet. Hvis man
derefter aktivere exit, så afslutter programmet.

Ingen kommentarer: