Re: Jak "obalit" Serial.print svou funkcí

Miroslav Mraz mrazik na volny.cz
Pondělí Březen 4 16:52:42 CET 2019


Je tam vícenásobná dědičnost, tak do toho není moc vidět. Zkusil bych 
něco jako

class MyLog : public Stream { // Vlastní třída
public:
   MyLog (HardwareSerial & s, Udp & u) : ser(s), udp(u) {};
   using Print::write;
   size_t write (const uint8_t * buffer, size_t size) override  {
     // tady lze udělat nějakou akci, ale není zaručeno, kdy se to 
přesně volá
     size_t res;
     res = ser.write (buffer, size);
     res = udp.write (buffer, size);
     return res;
   };
private:
   HardwareSerial & ser;
   Udp            & udp;
};

static HardwareSerial serial;   // toto je už patrně definováno jinde
static Udp            UDP;      // a toto asi také
static MyLog          log (serial, UDP);  // tohle musíte definovat sám
// použití
int main () { // v Arduinu to bude v loop(), toto je test na PC
   // jsou použitelné všechny metody print, println třídy Print
   log.println("test");
   // a normálně dál pracovat se serial i UDP
   serial.println("serial");
   UDP.println("udp");
   return 0;
}

ale nejsem Arduinista, takže to může být špatně.

Mrazík

Dne 04. 03. 19 v 14:06 Petr Zapadlo napsal(a):
> Zdravím,
> 
> potřeboval bych  "funkci" Serial.print (i println a další) obalit svou 
> funkcí ve které bych z příchozích parametrů vykonal něco svého a 
> následně zavolal Serial.print.
> 
> Cílem má být možnost si logovací hlášky duplicitně posílat na seriový 
> port a zároveň na UDP soket.
> 
> Asi mi něco uniká z c++, ale nedokážu vytvořit funkci, která by byla 
> ochotna akceptovat takovou šíři různých datových typů jako Serial.print, 
> který je ochoten zpracovat a vypsat na seriáku prakticky cokoliv.
> 
> Jak na to?
> 
> Díky
> 
> Petr


Další informace o konferenci Hw-list