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]] |