Table of Contents

Tema 2 - Christmas LEDs

* Publicare:

* Termen de predare:

* Changelog:

Obiective:

  • construirea unei distribuții Linux complete, build folosind Yocto;
  • creare layere + pachete Yocto;
  • configurări de bază Linux;
  • servicii de sistem Linux;
  • dezvoltare aplicații RESTful;
  • dezvoltare aplicații Terminal UI;
  • interfață GPIO Linux;
  • optimizări de spațiu;

Pentru a rezolva tema, este recomandat să folosiți mașina virtuală Yocto 2022 (~22GB) cu distribuția Yocto gata compilată și cache-uită, altfel timpul de compilare pe un laptop modest poate fi chiar și de 10 ore! Puteți lucra în paralel cu laboratorul pe aceiași mașină (veți folosi descriptori de kas (în format yml) din fișiere diferite + layere separate).

Storyline / Enunț

A venit Crăciunul! Ca viitori ingineri ai unei facultăți de renume din țară (*ahem*), dorim să impresionăm familia / rudele / pisica / vecinii construind o instalație de pom controlabilă din Internet of Things!

Așadar, ne apucăm de treabă: luăm o bandă cu LED-uri și începem prin dezvoltarea unei aplicații care să le poată controla de la distanță, printr-o interfață RESTful HTTP. Însă intervine problema: pe ce o rulăm? Ne amintim ce am studiat la cursul și laboratoarele de S.I și ne dăm seama că avem un Raspberry PI mai vechi aruncat într-o cutie, deci mai rămâne doar de construit / configurat o distribuție lightweight de Linux (sorry, Santa) ce se va interfața cu hardware-ul instalației de lumini și va oferi suport pentru rularea aplicației și conectarea la Internet.

Ca și cerință principală, va trebui să realizați o imagine incorporabilă Linux folosind Yocto ce va expune pe rețea un server HTTP cu API REST-ful (detalii / specificație mai jos) pentru primirea de comenzi de control al LED-urilor.

De asemenea, dorim să vedem, în consolă, o simulare grafică (ASCII Art) a bradului de Crăciun cu luminițele aprinse în starea actuală. Un exemplu de pom luminat poate fi văzut în captura de mai jos (asciinema):

Cerințe

Imaginea Linux de bază:

RESTful HTTP endpoint:

Serverul trebuie să pornească automat la boot (ca daemon). În Yocto aveți două opțiuni de bază: SysVInit (aka rc.d/runlevels, instalat implicit – nu trebuie să mai compilați nimic) și SystemD (mai ușor de definit serviciile, însă trebuie compilat și poate dura ~1h, depinde de puterea de calcul a sistemului).

Terminal UI program:

Bonus task: GPIO

Dorim să trimitem comenzile primite de serverul HTTP către instalația hardware de leduri. Astfel:

Contract (API)

Sistemul va reprezenta un pom de Crăciun cu o serie de luminițe organizate în NG grupuri de câte 1..n LED-uri fiecare (fiecare grup poate conține număr diferit de luminițe). Parametrii aceștia puteți să-i alegeți la liber și să-i hardcodați (în funcție de câte luminițe aveți loc să reprezentați în ASCII Art-ul din terminal), însă ar fi drăguț să aveți minim 3 grupuri (e.g., pentru fiecare etaj al bradului sau pe diagonală).

Fiecare grup are ca identificator unic (unde numerotarea începe de la 1!) este un vector de LED-uri (de dimensiune statică).

Valoarea fiecărui LED dintr-un grup va fi ID-ul numeric al culorii acestuia, folosind culorile clasice din terminal:

Astfel, se definesc următoarele endpointuri RESTful HTTP (atenție: API-ul este strict!):

Toate cererile vor folosi formatul Content-Type: application/json atât la input (pentru cererile POST), cât și la răspuns.

Vedeți exemple de utilizare în fișierul test.py din schelet.

Tema va fi testată în QEMU (v6.2+ pe Ubuntu 22.04) pentru placa virt (este deja tipul implicit pentru build-urile Yocto ale qemuarm, cel folosit la laborator).

Helpers + Mașină virtuală

Ca și punct de pornire, puteți descărca un schelet inițial cu scripturi + structură recomandată (v0.1). Aceasta conține:

Recomandarea de co-existență pentru tema2 + laborator folosind același VM cu Yocto: fișierele kas cu denumiri diferite (tema2.yml vs kas.yml) ce vor importa seturi diferite de layere (desigur, cele de bază vor rămâne, însă se recomandă crearea unui layer numit meta-tema2 și să creați în interiorul lui configurațiile / pachetele necesare tuturor task-urilor).

Nu uitați să inspectați configurația de resurse a VM-ului (și să le ajustați pentru PC-ul vostru). Compilarea unor pachete poate eșua dacă nu aveți suficient RAM (8GB ar trebui să fie OK pentru majoritatea cazurilor).

Trimitere

Soluția temei va fi trimisă în două moduri (vă rugăm să respectați convențiile de denumire cu exactitate!):

Arhiva cu binarele (.tar.gz pls) trebuie să conțină (de preferat să folosiți strict aceste denumiri de fișiere):

Arhiva cu fișierele sursă (.zip pls) este OBLIGATORIU să conțină:

Folosiți Makefile-ul din scheletul temei pentru generarea acestor două arhive, însă este recomandată verificarea manuală a arhivelor după generare!

Nu vor fi punctate temele care nu au hash-ul SHA256 al arhivei încărcat pe Moodle sau cele al căror hash nu corespunde cu arhiva downloadată de pe platforma de hosting la momentul corectării (este folosit și pentru a verifica upload-ul după deadline)!

Notare

Din 100p total, aveți:

Bonus:

Soluțiile care nu au folosit Yocto sau nu rulează deloc (cu excepția unor greșeli minore) nu vor fi punctate!

Precizări

Resurse