Debuggaus-osa huolehtii ajettavan ohjelman debuggausominaisuuksista. Luokka MkOhjaus toimii debuggaus-osan (ja osittain myös CPU:n) käyttöliittymänä. Simulaattorin käyttöliittymä-osa suorittaa ajettavan ohjelman käskyjä kutsumalla luokan MkOhjaus funktiota, joka vuorostaan kutsuu luokan MkCPU funktiota, joka tarvittaessa kutsuu luokkien MkIO_laitteet ja MkLiitäntärima funktioita. Käyttöliittymän ja CPU:n väliin on toteutettu "ylimääräinen" MkOhjaus-luokan toiminto, koska debuggausominaisuuksien toteuttaminen vaatii, että prosessorin ja muistin tilaa voidaan tarkastella jokaisen käskyn jälkeen. Koska CPU:n koodi löytyi valmiina ja koska se on simuloitavan laitteiston todellinen fyysinen osa, jonka toteutus ei jatkossa muutu (vaan korkeintaan korvautuu kokonaan toisella), se haluttiin säilyttää omana selkeänä kokonaisuutenaan ja debuggausominaisuudet toteutettiin mahdollisimman suuressa määrin CPU:n ulkopuolella Debuggaus-osan luokissa.
Käyttöliittymä asettaa breakpointien tarkastuksen ja/tai lokiintulostamisen päälle tai pois päältä ja asettaa breakpointehtoja tai lokiin tulostettavia tietoja kutsumalla MkOhjaus-luokan funktioita.
Lokiintulostus toiminnot (eli kaikkien CPU:n rekistereiden ja/tai määritellyn muistialueen kirjoittaminen tekstitiedostoon) on toteutettu luokassa MkLoki. MkBreakpoint luokassa tarkastetaan (jos käyttäjä on asettanut ominaisuudet päälle) ettei ohjelmalaskuri ole käyttäjän määrittelemällä data-alueella ja että pysähdytään kun on suoritettu käyttäjän haluama määrä käskyjä. MkBreakpoint luokan jäsenenä on myös luokan MkRekEhdot olio. Luokassa MkRekEhdot huolehditaan käyttäjän antamien CPU:n rekistereihin kohdistuvien <, > ,= ja #(erisuuri) merkkien avulla tehtyjen ehtojen tarkastamisesta. Ominaisuus toteutettiin omassa luokassaan, koska sen tämänhetkinen toteutus on ehkä syytä myöhemmin korvata jollakin nopeammalla (jos huomataan, että rekisteribreakpointejen asettaminen on todella käyttökelpoinen ominaisuus). Tällä hetkellä toiminnon paras ominaisuus on se, että sen voi kytkeä pois päältä niin täysin, että se ei hidasta ohjelmaa.
MkOhjaus-luokalla ei ole muita julkisia jäsenfunktioita kuin tiedostossa ohjaus.h kuvatut, jotka kaikki on tarkoitettu käyttöliittymä-osasysteemin kutsumiksi, eli minkään prosessori-osasysteemin muun luokan ei ole tarkoitus kutsua MkOhjaus-luokan funktioita.
MkCPU -luokka mallittaa mikrokontrollerin CPU:n toimintaa. Se on suurelta osin toteutettu Motorolan speksien mukaan. Sen tehtäviin kuuluu käskyn suoritus. Jokaisen käskyn suorituksen jälkeen päivitetään I/O-laitteiden tilat ja liitäntärima ja tarkistetaan, onko tullut keskeytyksiä. Käskynsuoritusfunktion paluuarvo 0 tarkoittaa, että käskyn suoritus onnistui. Muut arvot ovat virhekoodeja eli yritettiin suorittaa tuntematon käsky tai lukea tai kirjoittaa sellaiseen muistiosoitteeseen, jota ei ole tai kirjoittaa kirjoitussuojattuun osoitteeseen.
Virhekoodit: const int OK = 0; const int ILLEGAL_OPCODE = 1; const int MEMORY_ERROR = 2; const int SHIFT_ERROR = 3; const int STOP = 4;Lisäksi on toteutettu funktiot rekisterien arvojen kyselyä ja muuttamista varten. Luokan funktioiden esittelyt ovat CPU.h -tiedostossa.
MkIO_laitteet -luokka sisältää muistin toteutuksen ja luku- ja kirjoitusfunktiot sekä I/O-laitteiden päivitysfunktiot ja keskeytysten käsittelyfunktiot. Muisti on toteutettu merkkitaulukkona. I/O-laitteista on toteutettu output comparet, pulse accumulator ja A/D-muunnin. Keskeytyksistä on toteutettu vain sisäiset keskeytykset. Suoritettavan koodin lataus muistiin oli osittain toteutettu valmiiksi. Luokan funktioiden esittelyt ovat IO-laitteet.h -tiedostossa.
Mikrokontrolleri ja auto on kytketty toisiinsa 40-nastaisella liitäntärimalla, joka toteutetaan omana luokkanaan MkLiitantarima. Siihen kuuluvat nastojen jännitteiden haku- ja päivitysfunktiot. Itse rimaa mallitetaan taulukolla, jossa on nastojen jännitteet. Luokan funktioiden esittelyt ovat liitantarima.h -tiedostossa.
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, leveys ja renkaan säde. 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 (Kuva).
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 (Kuva).
Moottorin renkaaseen kohdistama voima Fa on renkaan suuntainen ja sen suuruus saadaan, kun jaetaan akselille kohdistuva vääntömomentti renkaan säteellä ja kerrotaan akselistossa olevan alennusvaihteen suuruudella. Moottorin voima kohdistuu tasan molemmille akseleille.
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. Jarruvoiman suuntaisena on jatkuvasti mukana myös auton mekaniikan kitkavoima. Kitkavoima on vakio, kuitenkin siten, että auton paikoillaan ollessa vaikuttaa suurempi, ns. mekaniikan lepokitka.
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 :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:
Fysiikkamallin ja toimilaitteiden toimintaan keskeisesti vaikuttavat (ja niiden hienosäädön mahdollistavat) parametrit sijaitsevat seuraavissa tiedostoissa:
kitkakertoimet fys/autodata.h mekaniikan lepokitka fys/autodata.h kitkavoima fys/autodata.h maksimi ohjauskulma laitteet/tldata.h ohjausservon nopeus laitteet/tldata.h pakkiviive laitteet/tldata.h moottorin vääntö laitteet/tlmootto.cpp maksimi kierrosluku laitteet/tlmootto.cpp jarruvoima laitteet/tlmootto.cpp
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 {};
class Kaynnistysnappi : public Anturi {};