Ohjaus huolehtii prosessorin debuggaus ominaisuuksista eli siitä että käyttäjän haluamat debuggaustoiminnot eli breakpointit ja lokitulostus asetetaan päälle
tai pois ja että kaikki halutut tiedot tulostetaan lokiin ja käyttöliittymälle välitetään tieto kun määrätty breakpoint on saavutettu. Jos käyttöliittymä haluaa
muistin ja rekistereiden sisältöä ohjaus hakee rekisterit CPU:lta ja muistin sisällön IO-laitteilta ja tekee tarvittavat tietojen kopioinnit ja muunnokset ennen
vastauksen välittämistä käyttöliittymälle.
Ohjaus-luokalla ei ole muita julkisia jäsenfunktioita kuin kohdassa 2.2 kuvatut, koska minkään prosessori-osasysteemin muun luokan ei ole tarkoitus kutsua
sitä. Kun käyttöliittymä haluaa että prosessori suorittaa yhden käskyn se kutsuu ohjausta, joka kutsuu välittömästi CPU:n suorita_käsky funktiota.
Kun käsky on suoritettu ohjaus välittää CPU:lta saamansa ajan anturit ja toimilaitteet -osasysteemille. Ennen kontrollin palautusta käyttöliittymälle,
ohjaus tarkastaa vielä debuggausehdot ja suorittaa mahdollisen lokiin kirjoittamisen.
Parseri on Ohjauksen käyttämä luokka, joka tarkastaa käyttöliittymältä tulevan breakpointehtolausekkeen oikeellisuuden ja muuntaa sen Ohjauksen käyttämään muotoon.
CPU mallittaa mikrokontrollerin CPU:n toimintaa. Se on suurelta osin toteutettu valmiiksi. Sen tehtäviin kuuluu käskyn suoritus. Se päivittää liitäntäriman tiedot joka käskyn jälkeen ja tarvittaessa lukee tai kirjoittaa muistiin. Käskynsuoritusfunktion paluuarvo on TRUE tai FALSE. FALSE tarkoittaa, että käskyn suoritus ei onnistunut eli yritettiin suorittaa tuntematon käsky tai lukea tai kirjoittaa sellaiseen muistiosoitteeseen, jota ei ole. Lisäksi toteutetaan funktiot rekisterien arvojen kyselyä ja muuttamista varten. Jokaisen käskyn suorituksen jälkeen tarkistetaan keskeytykset ja päivitetään I/O-laitteiden tilat.
I/O-laitteet sisältää muistin toteutuksen ja luku- ja kirjoitusfunktiot. Muisti toteutetaan merkkitaulukkona. Kaikilla I/O-laitteilla on oma muistiosoitteensa. Lisäksi niiden tilojen päivitysfunktiot toteutetaan tässä moduulissa. Suoritettavan koodin lataus EEPROMiin on jo osittain toteutettu.
Mikrokontrolleri ja auto on kytketty toisiinsa 64-nastaisella liitäntärimalla, joka toteutetaan omana olionaan. Siihen kuuluvat nastojen jännitteiden haku- ja päivitysfunktiot. Itse rimaa mallitetaan taulukolla, jossa on nastojen jännitteet.
Seuraavassa kaikki funktiot joita on tarkoitus kutsua prosessori-osasysteemin sisällä luokkien välillä (eli luokkien julkiset jäsenfunktiot, joita ei ole tarkoitus kutsua osasysteemin ulkopuolelta).
// CPU.h
typedef unsigned char byte; // tavu 8 bittiä
typedef long word; // sana 16 bittiä
typedef struct m6811_s {
long t; /* time in cycles */
word d, x, y; /* normal regs */
word sp; /* stack pointer */
word pc; /* program counter */
unsigned int overflow:1; /* overflow bit (V) */
unsigned int negative:1; /* negative bit (N) */
unsigned int zero:1; /* zero bit */
unsigned int carry:1; /* carry bit (C) */
unsigned int idisable:1; /* disable interrupts (I) */
unsigned int half_carry:1; /* half carry (H) */
unsigned int x_interrupt:1; /* x interrupt (X) */
unsigned int stop_disable:1; /* stop disable (S) */
} m6811;
class CPU
{
public:
// Seuraavan käskyn suoritus
// Palauttaa, onnistuiko käskyn suoritus.
// TRUE = onnistui
// FALSE = epäonnistui (luettiin tuntematon käsky)
// Argumenttina palautetaan tähän asti kuluneet kellojaksot.
bool Suorita_kasky(int *aika);
// Palauttaa sisäisten rekisterien arvot
m6811 Rekisterit();
}; // CPU
// IO-laitteet.h
class IO-laitteet
{
public:
// Funktiot muistin lukemista ja kirjoittamista varten.
// Molemmista on 8 ja 16-bittiset versiot.
void Kirjoita8(word osoite, byte arvo);
void Kirjoita16(word osoite, word arvo);
byte Lue8(word osoite);
word Lue16(word osoite);
// IO-laitteiden päivitysfunktiot.
void Keskeytykset();
void Output_compare();
void AD_muunnin();
}; // IO-laitteet
// liitantarima.h
class Liitantarima
{
// Riman kautta kulkevat tiedot mikrokontrollerin ja auton välillä
// Rimassa on 64 nastaa
public:
// Haetaan tietoa rimasta. Argumenttina annetaan nastan numero (1-64).
// Palauttaa jännitteen voltteina.
double Hae(int nasta);
// Sama bittina, 0 V = 0, 5 V = 1
bool Hae_bitti(int nasta);
// Päivitetään liitäntäriman sisältöä. Argumenttina annetaan nastan
// numero (1-64) ja sen jännite.
void Paivita(int nasta, double jannite);
// Sama bittina, 0 V = 0, 5 V = 1
void Paivita_bitti(int nasta, bool bitti);
}; // Liitantarima
Modulin sisäinen osatoimintojako on kuvattu DFD-kaaviona. Käyttöliittymä-modulin keskeinen osa on event loop, joka on ohjelman kontrollista huolehtiva ikuinen silmukka. Tässä silmukassa suoritetaan mikrokontrolleria jokin tietty aika (aika on vielä speksaamatta, koska se täytyy käytännössä kokeilla), jonka jälkeen kutsutaan fysiikkamallia. Fysiikkamalli päivittää auton voimat ja paikan, tämän jälkeen ohjelman näyttö päivitetään. Event loop huolehtii myös käyttäjän toiminnoista, luomalla yhteyden X-serveriin ja tutkimalla käyttäjän tekemiä palvelupyyntöjä event-jonosta.
Autoluokalla on seuraavat kiinteät ominaisuudet: massa, akseliväli ja leveys. Auto mallinnetaan kaksipyöräisenä eli eturenkaiden voimat on yhdistetty yhteen ja takarenkaiden voimat yhteen renkaaseen. Lisäksi autolla on muuttuvat ominaisuudet nopeusvektori v, kulmanopeus w ja rengaskulma runkoon nähden d.
Auton liikutus -osajärjestelmään kuuluu autoon vaikuttavien voimien laskenta. Autoon vaikuttavat renkaan ja maan väliset kitkavoimat. Kitkavoimat koostuvat ohjausvoimista sekä moottorin ja jarrujen voimasta.
Moottorin renkaaseen kohdistama voima Fa on renkaan suuntainen ja laskettavissa voiman suuntaisesta auton nopeuskomponentista va, moottorin antamasta tehosta P, simuloitavasta aikavälistä t ja auton massasta m: Fa = m/t(sqrt((2Pt/m) + va) - va). Moottorin voima kohdistuu tasan molemmille akseleille. Moottorista kiinnostaa sen tuottama teho, koska se on nopeudesta riippumaton ja renkaista tiehen kohdistuva kiihdyttävä voima pienenee nopeuden kasvaessa.
Jos moottoria ei käytetä, se toimii jarruna. Myös jarruvoima kohdistuu tasaisesti molemmille akseleille. Jarrujen voima Fb kohdistuu renkaan nopeusvektoria vastaan. Jarruvoima on valittu mielenkiinnon kohteeksi, koska se tavallisesti on nopeudesta riippumaton, kun taas jarrujen antama teho on suurilla nopeuksilla suurempi.
Renkaalla on maahan nähden nopeus vp, johon vaikuttavat auton massakeskipisteen nopeus v, auton kulmanopeus keskipisteensä ympäri w sekä auton akseliväli r. Ohjausvoima on rengasta vastaan kohtisuorassa, poispäin nopeusvektorista. Sen suuruus on verrannollinen nopeusvektorin ja renkaan välisen kulman e tangenttiin sekä nopeuden vp neliöön.
Kaikkien edellisten voimien resultantti on voima, joka renkaan kautta yritetään välittää. Renkaasta maahan välittyvä maksimivoima on renkaaseen kohdistuva paino kertaa lepokitkakerroin. Jos renkaan kautta yritetään välittää tätä suurempi voima, pito menetetään ja välittyvä voima onkin vain paino kertaa liikekitkakerroin. Jos Fa on suurempi kuin välittyvän voiman samansuuntainen komponentti (nimetään tämä Fq:ksi), rengas sutii. Sutimisen määrä on verrannollinen (Fa - Fq) / Fq :hun. Sutimisnopeuden kasvaessa myös tiehen välittyvä voima (sekä ohjaus- että moottorivoima) pienenee. Sutimisnopeutta tarvitaan toimilaitteille välitettävän nopeusanturi-informaation laskemiseksi.
Lisäksi autoon lasketaan kohdistuvaksi nopeusvektorin vastainen vakio kitkavoima. Tämä ja renkaiden kitkavoimat yhdessä muuttavat auton nopeutta ja kulmanopeutta. Nopeuden muutos on voima kertaa aika jaettuna auton massalla. Kulmanopeuden muutos on voima kertaa sen vaikutussäde kertaa aika jaettuna inertiamomentilla, joka saadaan kaavasta I = m(akseliväli * akseliväli + leveys * leveys) / 12. Auto on tässä oletettu massajakaumaltaan tiiliskiven kaltaiseksi.
Malli ei ota huomioon esimerkiksi seuraavia seikkoja:
Luokat ovat seuraavat:
class Laitteet {};
class Toimilaite {};
class Anturi {};
class Servo : public Toimilaite {};
class Moottori {};
class Ohjausservo : Public Servo {};
class Moottoriservo : public Servo {};
class Ledikampa : public Toimilaite {};
class Nopeusanturi : public Anturi {};
class Kulmapotentiometri : public Anturi {};
class Fotodiodi : public Anturi {};