# Expert 1 Sprint 1

---

## K1: Je hebt object georiënteerde software gemaakt die samenwerkt met een database.

Voor het maken van object georiënteerde software die samenwerkt met een database maak ik gebruik van Java, NodeJs, phpMyAdmin en MariaDB.

### Database

De database voor FitBot (ons project) zal dienen als opslag van de oefeningen die wij willen gebruiken. De database zelf zal niet uitgebreid zijn sinds wij inprincipe geen data op te hoefen slaan. De uitdaging van de database zal liggen bij het verbinden van de app en de database.

#### Apache en phpMyAdmin

Apache is een webserver die wordt gebruikt om websites te hosten. phpMyAdmin is een webapplicatie die wordt gebruikt om databases te beheren. Wij maken gebruik van Apache en phpMyAdmin om de database visueel te kunnen beheren. Apache dient als de server waar phpMyAdmin op draait, deze configuratie dient alleen voor het gemak van ons team.

##### MariaDB

MariaDB is een open-source database die vrij gemakelijk is om op te zetten. MariaDB dient als onze database om de oefeningen in op te slaan.

##### NodeJs

NodeJs wordt gebruikt om server-side scripting te doen. Wij maken gebruik van NodeJs om de app te verbinden met de database en om de oefeningen op te halen. 

NodeJs is geinstalleerd op de Pi maar moet nog wel verder worden opgezet.

#### ERD

Een ERD (Entity Relationship Diagram) is een diagram dat de relaties tussen de entiteiten in een database weergeeft. 

Meer informatie over de ERD is te vinden in de [ERD](../../../documentation/database/ERD.md) documentatie.

#### EERD

Een EERD (Entity Enhanced Relationship Diagram) is een diagram dat de relaties tussen de entiteiten in een database weergeeft. Het verschil tussen een ERD en een EERD is dat een EERD meer informatie bevat over de entiteiten en de relaties tussen de entiteiten zoals primary keys, foreign keys, enz.

Meer informatie over de ERD is te vinden in de [EERD](../../../documentation/database/EERD.md) documentatie.

### OOP

Object Oriented Programming is een programmeermethode dat gebruik maakt van objecten en classes. Het doel van OOP is om de code beter te structureren en te hergebruiken. Omdat wij gebruik maken van java voor het maken van de software, is het makkelijk om gebruik te maken van OOP. Java is een object georiënteerde programmeertaal en maakt het makkelijk om gebruik te maken van OOP sinds het een van de belangrijkste concepten is van Java.

#### Inheritance

Inheritance is een princiepe waarbij een nieuwe class wordt gemaakt met behulp van eigenschappen van een bestaande class. De nieuwe class wordt afgeleid van de bestaande class.

Voorbeeld: Een olifant is een dier. Een olifant heeft alle eigenschappen van een dier, zoals ademhalen, eten, slapen, enz. Een olifant heeft ook enkele specifieke eigenschappen, zoals grootte, gewicht, slurf, enz.

Use case: 

```java

public class MainActivity extends RobotActivity implements RobotLifecycleCallbacks {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Register the RobotLifecycleCallbacks to this Activity.
        QiSDK.register(this, this);
    }

    @Override
    protected void onDestroy() {
        // Unregister the RobotLifecycleCallbacks for this Activity.
        QiSDK.unregister(this, this);
        super.onDestroy();
    }

    @Override
    public void onRobotFocusGained(QiContext qiContext) {
        // The robot focus is gained.
    }

    @Override
    public void onRobotFocusLost() {
        // The robot focus is lost.
    }

    @Override
    public void onRobotFocusRefused(String reason) {
        // The robot focus is refused.
    }
}

```

De MainActivity class erft van RobotActivity, dit zorgt ervoor dat MainActivity properties en methods kan gebruiken van RobotActivity.

#### Abstraction

Abstraction is een princiepe om de complexiteit van een object te verbergen en alleen de nodige kenmerken weer te geven.

Voorbeeld: Een auto bestaat uit verschillende onderdelen, zoals motor, versnellingsbak, wielen, enz. Maar we hoeven niet te weten hoe deze onderdelen werken om een auto te besturen. We moeten alleen weten hoe we de auto moeten besturen, zoals hoe we gas moeten geven, remmen, sturen, enz.

Use case:

```java

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        setUpUi();
    }

    private void setUpUi() {
    /*---Hooks---*/
    drawerLayout = findViewById(R.id.drawer_layout);
    navigationView = findViewById(R.id.nav_view);

    /*---Navigation Drawer Menu---*/
    navigationView.bringToFront();

    ActionBarDrawerToggle toggle=new
            ActionBarDrawerToggle(this,drawerLayout,toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawerLayout.addDrawerListener(toggle);
    toggle.syncState();
}

```

In de method `onCreate` wordt de method `setUpUi` aangeroepen. De gebruiker hoeft niet te weten hoe de method `setUpUi` werkt, maar kan deze gewoon gebruiken.

#### Encapsulation

Encapsulation is een princiepe om de interne gegevens van een object te verbergen en alleen toegang te geven via methods.

Voorbeeld: Een bank heeft verschillende methods om geld te storten, geld op te nemen, saldo te controleren, enz. We kunnen niet rechtstreeks toegang krijgen tot de interne gegevens van de bank, zoals de balans, de rekeningnummers, enz. We moeten de methods van de bank gebruiken om deze gegevens te krijgen.

Use case:

```java

To be added

```

Op dit moment is er nog geen gebruik gemaakt van encapsulation. 

#### Polymorphism

Polymorfism is een princiepe waarmee een class verschillende vormen kan hebben. Het kan worden bereikt door methods te hebben met dezelfde naam, maar met verschillende parameters.

Voorbeeld: Een dier kan verschillende geluiden maken, zoals een hond kan blaffen, een kat kan miauwen, enz. Maar we kunnen een algemene method maken die `makeSound` heet en deze method in de dierclass implementeren. De hondclass kan deze method overschrijven en blaffen implementeren, en de katclass kan deze method overschrijven en miauwen implementeren.

Use case:

```java

To be added

```

Op dit moment is er nog geen gebruik gemaakt van polymorphism.

---

## K2: Je hebt de wensen en behoeften van gebruikers verwerkt in een goed doordacht prototype.

De wensen en behoeften van de gebruikers zijn op dit moment nog niet verwerkt in een prototype. Dit is omdat er nog niet genoeg informatie hebben over de wensen en behoeften van de gebruikers. In sprint 2 zal er een prototype worden gemaakt waarin de wensen en behoeften van de gebruikers zijn verwerkt.

De manier waarop ik de wensen en behoeften van de gebruikers wil gaan verwerken in het prototype is door middel van Test/Learning cards. Dit is een manier om de gebruikerservaring te testen en te verbeteren.

---

### ISO

Voor het testen van de gebruikerservaring wordt de ISO (International Standard Organization) definitie van kwaliteit in gebruik gebruikt.

“Qualiteit in gebruik is de mate waarin een product of systeem door specifieke gebruikers kan worden gebruikt om aan hun behoeften te voldoen om specifieke doelen te bereiken met effectiviteit, efficiëntie, vrijheid van risico en tevredenheid in specifieke gebruiksomstandigheden.”

#### Effectiviteit

Effectiviteit is de mate waarin gebruikers specifieke doelen kunnen bereiken met nauwkeurigheid en volledigheid.

##### Test Card

In de test card wordt de test beschreven die wordt uitgevoerd. De test card bestaat uit de volgende onderdelen:

Hypothese:
Test:
Meetmethode:
Criteria:

##### Resulaat 

In `Resultaat` worden de resultaten van de test beschreven. De resultaten worden beschreven aan de hand van de hypothese, test, meetmethode en criteria.

##### Learning Card

In de learning card wordt beschreven wat er is geleerd van de test. De learning card bestaat uit de volgende onderdelen:

Hypothese:
Observatie:
Leerpunt en inzicht:
Advies:

---

De effectiviteit en tevredenheid worden op gelijke manieren getest. Zodra de test is uitgevoerd en de resultaten zijn geanalyseerd, wordt er een learning card gemaakt. In de learning card wordt beschreven wat er is geleerd van de test en wat er kan worden verbeterd. Na alle resultaten te hebben geanalyseerd, wordt er een prototype gemaakt waarin de wensen en behoeften van de gebruikers zijn verwerkt.

---

## K3: Je hebt een infrastructuur ontworpen en gebouwd volgens zelf-gedefinieerde vereisten.

De infrastructuur voor FitBot (ons project) bestaat uit een database, een server en een app. De database wordt gebruikt om de oefeningen in op te slaan, de server wordt gebruikt om de app te verbinden met de database en de app wordt gebruikt om de oefeningen op te halen.

### Diagrams

De infrastructuur van FitBot is weergegeven in de volgende diagrammen:

Architecture diagram
![Architecture diagram](../../../documentation/diagrams/assets/appDiagram.png)

Architecture diagram v2
![Architecture diagram](../../../documentation/diagrams/assets/appDiagramV2.png)

Deployment diagram
![Deployment diagram](../../../documentation/diagrams/assets/appDiagramV3.png)

## K4: Je ontwerpt een embedded systeem op basis van gegeven hardware.

Voor het embed systeem van FibBot is de volgende research gedaan om de positie van een gebruiker te kunnen tracken:

[Wii Board](../../../documentation/research-questions/position-tracking-research.md)

---

## K5: Je kan software schrijven voor een intelligente controller voorzien van actuatoren en sensoren.

Voor het schrijven van software voor een intelligente controller voorzien van actuatoren en sensoren ben ik begonnen met het schrijven van software voor het Wii Balance Board. Het Wii Balance Board is een controller die wordt gebruikt om de positie van een gebruiker te tracken. De software die ik aan het schrijven ben verbind de android app met een Wii Balance Board en trackt de positie van de gebruiker.

Op dit moment kan het device nog niet worden verbonden met de app. Het is mogelijk om het board te discoveren maar de verbinding kan nog niet gemaakt worden.
