This shows you the differences between two versions of the page.
| pm:prj2023:gpatru:retropm [2023/05/29 20:33] irina_cristina.nita [Software Design] | pm:prj2023:gpatru:retropm [2023/05/30 12:09] (current) irina_cristina.nita [Download] | ||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| RetroPM se bazează în principal pe comunicarea dintre 3 microcontrollere cu scopuri diferite: | RetroPM se bazează în principal pe comunicarea dintre 3 microcontrollere cu scopuri diferite: | ||
| - | * ESP32: Se ocupa de Afișarea pe 2 display-uri input-ul si output-ul pentru utilizator (comenzile în timp ce se tastează, un prompt cu utilizatorul curent etc.) și cu conectarea la un server NTP pentru a afișa ora actuala pe display.  | + | * ESP32: Se ocupa de afișarea pe 2 display-uri a input-ului si output-ului pentru utilizator (comenzile în timp ce se tastează, un prompt cu utilizatorul curent etc.) și cu conectarea la un server NTP pentru a afișa ora actuala pe display.  | 
| * STM32F103: Se ocupa de logica principala (FSM-ul) a sistemului. Acesta este responsabil de procesarea input-ului, de a decide dacă o comanda este invalida, ce privilegii are un user când când dorește sa modifice un fișier etc. | * STM32F103: Se ocupa de logica principala (FSM-ul) a sistemului. Acesta este responsabil de procesarea input-ului, de a decide dacă o comanda este invalida, ce privilegii are un user când când dorește sa modifice un fișier etc. | ||
| * Raspberry Pi Pico: Se ocupa de prelucrarea input-ului de la utilizator (tastele sunt procesate în caractere ASCII) pentru a le comunica către STM32. | * Raspberry Pi Pico: Se ocupa de prelucrarea input-ului de la utilizator (tastele sunt procesate în caractere ASCII) pentru a le comunica către STM32. | ||
| + | {{pm:prj2023:gpatru:retro-pm-diagr.png?800}} | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| Line 140: | Line 140: | ||
| Pentru partea de logica principala, atât în STM32, cât și în ESP32 am folosit logica unor FSM-uri. | Pentru partea de logica principala, atât în STM32, cât și în ESP32 am folosit logica unor FSM-uri. | ||
| - | ===== Rezultate Obţinute ===== | + | ESP32 are FSM-uri separate pentru procesarea de SSID/Parola (pentru conectarea cu serverul NTP), procesarea comenzilor speciale pentru SD, rulării comenzilor: | 
| - | <note tip> | + | <code c> | 
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | enum State { | 
| - | </note> | + | MW_LOADING, | 
| + | MW_RUNNING, | ||
| + | MW_RUNNING_SETUP | ||
| + | }; | ||
| - | ===== Concluzii ===== | + | enum CredentialsState { | 
| + | CRED_NOT_PROV, | ||
| + | CRED_PROV, | ||
| + | CRED_NO_CHECK | ||
| + | }; | ||
| - | ===== Download ===== | + | enum CredentialsProvStatus { | 
| + | NONE, | ||
| + | SSID, | ||
| + | BOTH | ||
| + | }; | ||
| - | <note warning> | + | enum NTPState { | 
| - | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | + | NTP_NOT_CONN, | 
| + | NTP_CONN | ||
| + | }; | ||
| - | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | + | enum SDState { | 
| - | </note> | + | SD_PROC_B, | 
| + | SD_NO_PROC_B, | ||
| + | SD_PROC_FN | ||
| + | }; | ||
| - | ===== Jurnal ===== | + | enum SDCommand { | 
| + | SD_COMM_NONE, | ||
| + | SD_COMM_WR, | ||
| + | SD_COMM_RD, | ||
| + | SD_COMM_AP, | ||
| + | SD_COMM_CR, | ||
| + | SD_COMM_LS, | ||
| + | SD_COMM_RM | ||
| + | }; | ||
| + | </code> | ||
| - | <note tip> | + | FSM-ul pentru STM32 se ocupa de inițializare, iar apoi intra într-un loop Procesare Comanda <-> Afișare Status. | 
| - | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | |
| - | </note> | + | |
| - | ===== Bibliografie/Resurse ===== | + | <code Rust> | 
| + | pub enum State { | ||
| + | StateGetSsid, | ||
| + | StateGetSsidPwd, | ||
| + | StateInit, | ||
| + | StateLoadCmd, | ||
| + | StateDoneLoadCmd | ||
| + | } | ||
| + | </code> | ||
| <note> | <note> | ||
| - | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | Comunicarea dintre ESP32 și STM32 a fost cea mai "tricky" parte din software. Fiind doar 2 canale de comunicare seriale (unul prin care ESP32 trebuia sa proceseze o comanda legată de sistemul de fișiere, și unul pentru afișarea pe display a input-ului), și pentru ca a evita procesarea comenzilor la nivel de string de fiecare data (și pentru a mapa mai ușor la numărul de argumente așteptate), am folosit un byte de start pentru a determina tipul unei comenzi. | 
| + | |||
| + | Code snippet ca exemplu: | ||
| + | <code c> | ||
| + | match processed_cmd.cmd_type { | ||
| + | CommandType::CmdLs => { | ||
| + | first_byte = '5' as u8; | ||
| + | } | ||
| + | |||
| + | CommandType::CmdAp => { | ||
| + | first_byte = '2' as u8; | ||
| + | } | ||
| + | |||
| + | CommandType::CmdRd => { | ||
| + | first_byte = '1' as u8; | ||
| + | } | ||
| + | |||
| + | CommandType::CmdRm => { | ||
| + | first_byte = '6' as u8; | ||
| + | } | ||
| + | |||
| + | CommandType::CmdWr => { | ||
| + | first_byte = '3' as u8; | ||
| + | } | ||
| + | |||
| + | CommandType::CmdCr => { | ||
| + | first_byte = '4' as u8; | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| </note> | </note> | ||
| + | ===== Rezultate Obţinute ===== | ||
| - | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | + | Ferris facandu-si prezenta simitita Ła power-up: | 
| + | |||
| + | {{ pm:prj2023:gpatru:ferris_startup.jpeg?500 }} | ||
| + | |||
| + | Cum arata circuitul final (utilizatorul logat default este root, se vede ca LCD-ul 16x2 este folosit pentru ca utilizatorul sa vadă ce tastează, iar display-ul OLED este folosit pentru informații despre sistemul de fișiere + afișarea orei). | ||
| + | |||
| + | Comanda ls care implicit afișează numele și dimensiunea fișierelor din /: | ||
| + | |||
| + | {{ pm:prj2023:gpatru:retro-final.jpeg?500 }} {{ pm:prj2023:gpatru:ls_example1.jpeg?500 }} | ||
| + | |||
| + | Video: (just in case): | ||
| + | |||
| + | <html> | ||
| + | <iframe width="560" height="315" src="https://www.youtube.com/embed/11CuGCW_KQc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> | ||
| + | </html> | ||
| + | ===== Concluzii ===== | ||
| + | |||
| + | Mi-ar fi plăcut sa pot sa implementez alte funcționalități ( de ex. mutarea cursorului printr-o secvența de caractere apăsate etc.), dar am subestimat dificultatea proiectului. | ||
| + | |||
| + | Concluzie finala: o experienta placuta (mai ales cand am făcut câteva scurturi XD). | ||
| + | ===== Download ===== | ||
| + | |||
| + | {{:pm/prj2023/gpatru/source_code_retro_pm_2.zip|Download source code & .sch}} | ||
| + | |||
| + | |||
| + | |||
| + | ===== Bibliografie/Resurse ===== | ||
| + | * [[https://docs.rust-embedded.org/book/| The Embedded Rust Book]] | ||
| + | * [[http://www.openmusiclabs.com/learning/digital/input-matrix-scanning/index.html| Matrix Scanning]] | ||