Skocz do zawartości

Jak pisać biblioteki na Arduino?


macizet

Pomocna odpowiedź

2 godziny temu, farmaceuta napisał:

jest jakis prosty sposob na odwolanie sie do struktury/tablicy z poziomu biblioteki? Powiedzmy tworze strukture/tablice normalnie w szkicu i mam nad nimi pelna kontrole z poziomu biblioteki...cos takiego mozliwe??

Jeśli dobrze zrozumiałem o co Ci chodzi to jednym sposobem jest tzw. dependency injection, masz strukturę A:

struct A
{
    int a;
    int b;
};

i chcesz korzystać z obiektu struktury A, w klasie B:

A a;
B b; // przykład

void setup()
{
    a.a = 10;   // a.a = 10
    b.fun();    // np. fun() ustawia a.a na 1
}

To do klasy B możesz przekazać referencje (lepsza opcja) lub wskaźnik na obiekt struktury A przez konstruktor i wygląda to tak:

class B
{
  public:
    B(A& a) : m_a {a} {}

    void fun()
    {
        m_a.a = 1;
    }

  private:
    A& m_a;
};

W klasie B przechowujesz referencje, którą musisz ustawić w konstruktorze (bo referencja musi mieć na co wskazywać) i wtedy użycie wygląda tak:

A a;
B b(a);

void setup()
{
    a.a = 10;   // a.a = 10
    b.fun();    // a.a = 1
}

W przypadku tablicy klasa mogła by wyglądać tak:

// klasa:
class C
{
  public:
    C(uint8_t* buffer, const uint8_t size) : m_buffer {buffer}, m_size {size} {}

  private:
    uint8_t* m_buffer;
    const uint8_t m_size;
};

// użycie:
uint8_t table[10];
C c(table, 10);

W przypadku tablicy musisz przekazać wskaźnik na pierwszy element i wypada przekazać rozmiar.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Witam Panowie...nabazgralem sobie takie pseudo cos co mi ma zmieniac stan pinu okreslona ilosc razy i okreslony czas on/off..no i dziala, tylko chcialbym zeby ktos zerknal na deklaracje tych moich zmiennych w public/private, no i tak ogolnie czy nie zamotalem sie z tymi zmiennymi...

// h

#ifndef BlinkPin_h
#define BlinkPin_h

//#include "WProgram.h"
#include "Arduino.h"

class BlinkPin
{
   public:
    BlinkPin(uint8_t pin);
    void blink(uint8_t ilosc,  uint32_t zwloka_on, uint32_t zwloka_off);
    void ready();
    uint8_t pinn;
    uint8_t pin;
    uint8_t ilosc;
    uint32_t zwloka_off;
    uint32_t zwloka_on;

   private:
     uint8_t ilosc1;
     bool stan;
     bool blokuj;
     uint32_t czas;
};



#endif

 

// cpp

//#include "WProgram.h"
//#include "Arduino.h"
#include "BlinkPin.h"



 BlinkPin::BlinkPin(uint8_t pin)
    : pinn ( pin )
    , ilosc1 ( 0 )
    , stan ( false )
    , blokuj ( false )
    , czas ( 0 )
{
   pinMode(pinn, OUTPUT);
}

void BlinkPin::blink(uint8_t i,  uint32_t czas_on,  uint32_t czas_off )
{
   if (blokuj == false)  {
      blokuj = true;
      ilosc = i;
      ilosc1 = 0;
      zwloka_off = czas_off;
      zwloka_on = czas_on;
    }
}

void BlinkPin::ready()
{
   
  if ( blokuj == true) {
    
  if (ilosc1 < ilosc) {

if (millis() - czas > zwloka_on && stan == false) {
      digitalWrite(pinn, HIGH);
      stan = true;
      czas = millis();
  }
    if (millis() - czas > zwloka_off && stan == true) {
      digitalWrite(pinn, LOW);
      stan = false;
      czas = millis();
      ilosc1++;
    }
}  else {
    blokuj = false;
   }
   
  }
}

jeszcze zapytam o poczatkowe wartosci zmiennych...jezeli to maja byc zera to musze w konstruktorze to uwzgledniac? czy zmienne te zachowaja sie jak zwykle zmienne globalne i automatycznie zostana przypisane zera do nich?

Link do komentarza
Share on other sites

6 minut temu, farmaceuta napisał:

.jezeli to maja byc zera to musze w konstruktorze to uwzgledniac?

Tak.

A przy okazji: wywaliłbym co się da do private/protected. Jeśli użytkownik nie musi mieć dostępu do tych zmiennych to znaczy, że nie muszą być publiczne. Po co np. użytkownikowi dostęp do pinn? A tak w ogóle to po co tam zmienna pin?

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

2 godziny temu, farmaceuta napisał:

czemu ta zienna jest zbedna?

Jeżeli użytkownik nie musi jej podawać / zmieniać to wyrzucasz ją do private/protected. Jeżeli ustawia ją tylko raz (w konstruktorze) to też. To takie najprostsze podejście.

Plus możesz się obejść bez tej zmiennej.

Edytowano przez H1M4W4R1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

17 minut temu, H1M4W4R1 napisał:

 Jeżeli ustawia ją tylko raz (w konstruktorze) to też. To takie najprostsze podejście.

Plus możesz się obejść bez tej zmiennej.

No wlasnie...sprawdzilem i bez tej zmiennej "pin" tez dziala normalnie...i tego nie moge wlasnie zrozumiec, czemu nie musze tworzyc tej zmiennej?...dobrze rozumiem ze nie musze miec tej zmiennej bo ona i tak powstanie w konstruktorze i po wykonaniu kodu zostanie zniszczona, a ja inicjuje tylko raz pin wiec nie jest mi dalej potrzebna ta zmienna...to jak w przypadku zwyklych funkcji z argumentami tak? czyli tylko lokalnie robie co mam robic tymi zmiennymi i po opuszczeniu one sa skasowane..

Link do komentarza
Share on other sites

20 minut temu, farmaceuta napisał:

No wlasnie...sprawdzilem i bez tej zmiennej "pin" tez dziala normalnie...i tego nie moge wlasnie zrozumiec, czemu nie musze tworzyc tej zmiennej?

Ponieważ uint8_t masz zdefiniowane zarówno w konstruktorze jak i w klasie. Wtedy definicja wewnątrz konstruktora nadpisuje definicję, która jest w klasie, więc zmienna pin wewnątrz klasy jest zbędna.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

A sprawdź sobie, gdzie w programie odwołujesz się do tej zmiennej.

Owszam, masz argument metody która się tak sami nazywa. Ale nie zmienną/własność czy jak to tak nazwiesz.

A do odróżnienia czy "pin" to parametrczy zmienna służy magiczne słówko this.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

54 minuty temu, ethanak napisał:

A do odróżnienia czy "pin" to parametrczy zmienna służy magiczne słówko this.

Albo konsekwentne stosowanie jakiegoś standardu nazewnictwa.

@farmaceuta można się spotkać z zapisem, że zmiennym w klasach dodaje się przedrostek m_ (member) i wtedy czytając kod łatwo jest odróżnić członków klasy od argumentów czy zmiennych lokalnych. 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

9 minut temu, ethanak napisał:

Ja zawsze lubiłem podkreślnik

Pewnego pięknego razu zdecydowaliśmy w firmie, że argumenty funkcji i zmienne lokalne nazywamy właśnie od _ i... do dzisiaj żałuję tej decyzji. Gdyby tyczyło się to tylko memberów to byłoby to na plus. Ale gdy mowa o argumentach i zamiennych lokalnych to po prostu dodaliśmy sobie pracy. Dlatego obecnie jestem za szkołą m_ i tylko do memberów a wszystko inne bez żadnych dodatków.

Edytowano przez Matthew11
  • Lubię! 1
Link do komentarza
Share on other sites

Każdy ma... to co życie mu da...

Ja piszę jednoosobowo, więc konwencja, że w przypadku konfliktu argument funkcji jest z podkreślnikiem całkiem nieźle się sprawdza. Ale zgodzę się, że można inaczej.

Link do komentarza
Share on other sites

Witam...ciag dalszy...😉 mam takie dwa pytania...ale zaczne od jednego...powiedzmy ze chcialbym sie odwolywac do jakiejs funkcji z poziomu biblioteki ktora znajduje sie w glownym kodzie...cos  na zasadzie przerwan INT czy PCInt...czyli jako argument podaje nazwe funkcji ktora stworzylem w kodzie..wewnatrz biblioteki mam odpowiedni wektor przerwania ISR a w nim z kolei wywolanie tej funkcji...jak to zrobic najprosciej? Domyslam sie ze pewnie przez wskazniki, ale jak to ogarnac to nie mam pojecia...😕

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.