Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 ​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:​ sursescheme, 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 Alin331CC -> **:​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 documentedatasheet-uriresurse Internet folosite, eventual grupate pe **Resurse Software** ş**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)ș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]]
pm/prj2023/gpatru/retropm.1685381625.txt.gz · Last modified: 2023/05/29 20:33 by irina_cristina.nita
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0