# Taakbeschrijving “Synthesis assignment”
## Verdeling

* Toon Buggenhout -> [Website back-end](#website-back-end)
* Lorenz Clijnen  -> [File System (FS) + FS API](#file-system-fs--fs-api)
* Hannes Hugaert  -> [Website Front-end](#website-front-end)
* Gert Roelandts  -> [TCP CMD interface](#tcp-cmd-interface)
* Tim Soubry  -> [LCD API](#lcd-api)
* Sander Speetjens  -> [TFTP Server](#tftp-server)
* Robin Van den Bergh  -> [MQTT](#mqtt)
* Obe Van Lierde ->  [Modbus TCP](#modbus-tcp)
* Joran Van Nieuwenhoven ->  [UDP broadcast](#udp-broadcast)


## File System (FS) + FS API
De bestanden die opgeslagen zijn in een map op de computer moeten voor het compileren van het micro-controller project omgezet worden naar een C-bestand. Dit C bestand moet samen met het micro-controller project gecompileerd worden en bevat de data van de bestanden geordend in een gelinkte lijst (zoals we gezien hebben in labo 2: WebserverMetDeflate).

Voorzie een API zodat:
* men een lijst van bestanden kan opvragen met optioneel een extensie filter (vb: *.jpg, *.png, *.html).
* men de data van een bestand kan opvragen op bestandsnaam.

In een latere fase moet het C bestand zijn data in de QSPI steken (zie Labo 6 van Embedded Systems)
Hierdoor lijkt het me opportuun om de makefsdata tool aan te passen zodat je niet na elke update
van de bestanden in de map het C bestand manueel moet aanpassen.

Indien je ook “animated gifs” wil ondersteunen kan je deze tool gebruiken om de gifs om te zetten naar RAW bestanden die via DMA2D rechtstreeks naar het LCD gestuurd kunnen worden: https://github.com/wimdams/gif2frames

Overleg met uw collega’s over de API, hoe dingen zoals grote van de afbeelding, animated gifs, enzo ondersteund worden.

## LCD API
Deze taak moet het voor de anderen gemakkelijk maken om items op het LCD te plaatsen. Voorzie een API zodat:
* Men een afbeelding op het scherm kan plaatsen op basis van een bestandsnaam (zie FS API).
* Men een afbeelding op het scherm kan plaatsen op basis van een data array.
* Men een tekst op het scherm kan plaatsen. Als de tekst te lang is moet deze automatisch afgebroken worden.
* Men de achtergrond kleur kan aanpassen.
* Men de tekst kleur kan aanpassen.

Overleg met uw collega’s over de API, hoe dingen zoals grote van de afbeelding, animated gifs, enzo ondersteund worden.

## MQTT
Deze taak moet het mogelijk maken om via MQTT items op het LCD te plaatsen.

Je code mag niet rechtstreeks dingen op het LCD plaatsen maar moet dit doen via de LCD API.

Bij het opstarten moet de lijst van afbeeldingen gepubliceerd worden op het topic “getImageList” met de retain bit op true.

Je code kijkt naar veranderingen op de topics “setText”, “setImage”, “setColor”, “setTextColor” Als er een publish gebeurd op 1 van deze topics moet de overeenkomstige actie gedaan worden.

* setText -> plaatst tekst op het LCD
* setImage -> plaatst de afbeelding via bestandsnaam op het LCD
* setColor -> veranderd de achtergrond kleur van het LCD
* setTextColor -> veranderd de tekst kleur van het LCD

De wijzigingen van setColor en setTextColor zie je pas als er een nieuwe tekst of afbeelding is geplaatst.

## TCP CMD interface
Voor deze taak moet je een Command line interface over RAW-TCP maken.

Voor zie een RAW-TCP server die luistert op poort 23 zoals we gezien hebben bij labo 7 van Embedded Systems. Als een client (putty in raw mode) connecteert op poort 23 moet er een welkom tekst verschijnen. Volgende commando’s moeten ingegeven kunnen worden: help, text, color, textColor, listImages, setImage, exit.
* help: laat de lijst met commando’s zien met hun opties en een beetje uitleg.
* text: heeft als argument de tekst die op het LCD moet komen.
* color: heeft als argument een kleur voor de achtergrond van het LCD in te stellen.
* textColor: heeft als argument een kleur voor de tekst op het LCD in te stellen.
* listImages: laat een lijst zien van alle afbeeldingen.
* setImage: heeft als argument de naam van de afbeelding die moet geplaatst worden.
* exit: sluit de verbinding

## UDP broadcast
Voor deze taak moet je een via UDP luisteren op poort 64000 naar een bepaalde boodschap: “Where are you?v1.0”. Als deze boodschap binnenkomt moet je een antwoord terug sturen in het volgend formaat: “XX:XX:XX:XX:XX:XX is present and my owner is YYYYYY ZZZZZZ” waar de x het mac adres voorstelt, y en z de naam en voornaam.

De PC applicatie om de UDP broadcast te sturen is: https://github.com/wimdams/Device_finder

Maak een functie om uw deel van de code vanuit de main te initialiseren waarbij de naam en voornaam kan meegegeven worden.

## Modbus TCP
Voor deze taak moet je een Modbus TCP server implementeren. Vergelijkbaar met de Modbus RTU slave over UART die je gemaakt hebt tijdens de lessen Data communicatie.
Voor de PC applicatie gebruik je https://sourceforge.net/projects/qmodmaster/
Zie dat je deze niet in RTU mode gebruikt maar in TCP mode (zie menu “Options” -> “Modbus TCP” voor het IP adres in te stellen)
Implementeer de functie code 0x10 (Write Multiple Registers) en volgende register map:

| Register Adres | Beschrijving |
|----------------|--------------|
| 01             | 8bit rood van de achtergrond kleur |
| 02             | 8bit groen van de achtergrond kleur |
| 03             | 8bit blauw van de achtergrond kleur |
| 04             | 8bit rood van de tekst kleur |
| 05             | 8bit groen van de tekst kleur |
| 06             | 8bit blauw van de tekst kleur |
| 07             | Nummer voor afbeelding te kiezen. Zie lijst met afbeeldingen via FS API. |
| 08 - 208       | Adressen voor Ascii tekst op te slagen (‘\0’ terminated) deze tekst moet op het LCD komen |

Zie https://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf voor de
specificatie van Modbus TCP.

## TFTP Server
TFTP staat voor trivial file transfer protocol en is een eenvoudig protocol voor bestandsoverdracht. Voor deze taak moet je de TFTP Server van LWIP implementeren (zie instellingen van de *.ioc). Zorg dat je “struct tftp_context” juist is ingevuld zodat uw functies worden opgeroepen
om een bestand te openen, te schrijven, te lezen en te sluiten. Zorg ervoor dat iemand met een TFPT
client:
* De bestanden van het interne file system kan downloaden (zie FS API)
* Een virtueel bestand* kan downloaden met als naam index.txt
De inhoud van het bestand is een lijst met alle bestaande bestanden op het interne file
system
* Een virtueel bestand* met als naam: “virtImage.raw” kan aanmaken en schrijven.
Als het “virtImage.raw” bestand gesloten wordt moet de inhoud als afbeelding op het scherm
getoond worden via de LCD API die een data array neemt als argument.
* Een virtueel bestand* met als naam: “virtTekst.txt” kan aanmaken en schrijven.
Als het “virtTekst.txt” bestand gesloten wordt moet de inhoud als een tekst getoond worden op het scherm.

*Een virtueel bestand bestaat niet echt op het file system maar lijkt voor de TFTP client wel te bestaan. Uw code faked deze bestanden in RAM en maakt deze “on the fly” aan.
Op Windows kan je een TFTP client installeren via Apps -> Optionele onderdelen -> Meer Windows-functies -> TFTP client.
Op Linux kan je atftp installeren via je repository

## Website back-end.
Deze taak is nauw verwant aan de taak “Website front-end” samen moeten ze het ogelijk maken om naar het bordje te surfen en via een webpagina:
* Een afbeelding te kiezen die op het LCD moet komen.
(De gebruiker moet de afbeelding kunnen zien.)
* Een tekst in te geven.
* De kleur van de achtergrond in te stellen.
* De kleur van de tekst in te stellen.

Gebruik hiervoor de technologieën die we gezien hebben in de les: SSI, CGI en AJAX.

## Website front-end.
Deze taak is nauw verwant aan de taak “Website back-end” samen moeten ze het
mogelijk maken om naar het bordje te surfen en via een webpagina:
* Een afbeelding te kiezen die op het LCD moet komen. (De gebruiker moet de afbeelding kunnen zien.)
* Een tekst in te geven.
* De kleur van de achtergrond in te stellen.
* De kleur van de tekst in te stellen.

Gebruik hiervoor de technologieën die we gezien hebben in de les: SSI, CGI en AJAX.