PowerTGS440

SerialTypeWriter, PROGMEM, new & delete

Feb 9th, 2021 (edited)
227
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // --- funkcja wyświetla ilość wolnej pamięci dynamicznej RAM -----------------------------------------
  2. void freeRAM()
  3. {
  4.   extern int __heap_start, *__brkval;
  5.   int v;
  6.   Serial.print(F("Wolna pamiec [bajty] : "));
  7.   Serial.println( (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval) );  
  8. }
  9.  
  10. // --- komunikaty zapisane w pamieci programu --- definiujemy jako const char [] PROGMEM ----------
  11. const char msg_00 [] PROGMEM  = "Nie mozna pozyskac tej wiadomosci! Nie istnieje.";
  12. const char msg_01 [] PROGMEM  = "Hello, twoje Arduino zostalo uruchomione";
  13. const char msg_02 [] PROGMEM  = "Komunikaty ktore widzisz zostaly zdefiniowane z pamieci programu";
  14. const char msg_03 [] PROGMEM  = "Dzieki takiemu rozwiazaniu w RAM masz wiecej wolnej pamieci";
  15. const char msg_04 [] PROGMEM  = "Dostep do tych napisow trzeba wydobyc z pamieci PROG do RAM";
  16. const char msg_05 [] PROGMEM  = "Nie jest to trudne, a oszczednosci olbrzymie";
  17.  
  18. // --- tablica ulatwiajaca wybor odpowiedniego komunikatu ----------------------------------------
  19. const char * const wiadomosc [] PROGMEM = { msg_00, msg_01, msg_02, msg_03, msg_04, msg_05 };
  20.  
  21. // --- funkcja wyciągająca napis z tablic msg_xx -------------------------------------------------
  22. void EkstrakcjaWiadomosci(byte nr_wiadomosci)
  23. {
  24.     // musimy sprawdzic czy nr_wiadomości do wyłuskania z pamięci RAM nie jest
  25.     // już poza tablica wiadomosc [] - zabezpieczamy się przed błędem :-)
  26.     if( nr_wiadomosci >= sizeof (wiadomosc) / 2 )
  27.     {  
  28.         char *bufor = new char [ strlen_P( pgm_read_word (& wiadomosc[0] ) ) ]; // dynamiczny przydział pamięci bufora
  29.         strcpy_P ( bufor, (char*) pgm_read_word (& wiadomosc[0] ));             // kopiujemy z pamięci msg: error do bufor      
  30.         TypeWriter( bufor, 50 );                                                // drukujemy komunikak błędu na ekran
  31.         freeRAM();                                                              // wolna pamięć - bufor jeszcze istnieje
  32.         delete bufor;                                                           // kasujemy bufor z pamięci        
  33.         freeRAM();                                                              // wolna pamięć - bufor już nie istnieje
  34.     }
  35.     // numer wiadomości do wyświetlenia jest w tablicy (zmienna musi mieć wartość 1,2,3,4,5)
  36.     // wiadomosc nr. 0 to nasz komunikat o błędzie, oczywiście dostęp do niej przez podanie 0
  37.     else
  38.     {                  
  39.       char *bufor = new char [ strlen_P( pgm_read_word (& wiadomosc[nr_wiadomosci] ) ) ];            
  40.       strcpy_P ( bufor, (char*) pgm_read_word (& wiadomosc[nr_wiadomosci] ));
  41.       TypeWriter(bufor, 50);
  42.       freeRAM();                                                                // wolna pamięć - bufor isnieje w RAM
  43.       delete bufor;                                                             // kasujemy bufor z pamięci
  44.       freeRAM();                                                                // wolna pamięć - bufor już nie istnieje
  45.     }
  46. }
  47.  
  48. // --- Serial Type Writer by PowerTGS -------------------------------------------------------------
  49. // jako wejście otrzymuje adres tablicy znaków [] i czas opóźnienia wyświetlenia jednego znaku
  50. void TypeWriter(const String & message, unsigned int wait)
  51. {
  52.   for(const char c : message)
  53.   {
  54.     Serial.write(c);    
  55.     delay(wait);  
  56.   }
  57.   Serial.write("\n");
  58. }
  59.  
  60. // --- SETUP ------------------------------------------------------------------------------------
  61.  
  62. void setup()
  63. {
  64.   Serial.begin(9600);
  65.   EkstrakcjaWiadomosci(1);
  66.   EkstrakcjaWiadomosci(2);
  67.   EkstrakcjaWiadomosci(3);
  68.   EkstrakcjaWiadomosci(4);
  69.   EkstrakcjaWiadomosci(5);
  70.   EkstrakcjaWiadomosci(6);              // wiadomosc 6 nie istnieje, sprawdzmy co się stanie
  71. }
  72.  
  73. void loop()
  74. {
  75.   // put your main code here, to run repeatedly:
  76. }
Add Comment
Please, Sign In to add comment