<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Ne, v mĂ©m příkladu je pĹ™eci stav uBat1=3753, tak uartSend("\1mV",
    adUbat1, 0); vypíše 3753mV<br>
    Pokud by adUbat bylo 53, vypíše 53mV<br>
    a pokud by bylo zadáno uartSend("\1mV", adUbat1, 3);<br>
    vyleze 3753,000mV<br>
    nebo tĹ™eba 3753,001, pokud float hodnota nevyšla pĹ™esnÄ› 3753,000<br>
    <br>
    NÄ›jak tak to fungovalo, uĹľ je to dlouho.<br>
    Ale jak se tu o tom teÄŹ diskutuje a ještÄ› jsme na krouĹľku došli k
    sĂ©riáku, tak si asi koneÄŤnÄ› udÄ›lám tu knihovnu, kde tohle bude jedno
    z pĹ™etĂ­ĹľenĂ­.<br>
    <br>
    PH<br>
    <br>
    <div class="moz-cite-prefix">Dne 20.04.2024 v 11:27 Martin Záruba
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:62da3616-1d24-431d-9cf0-0c397e03b07f@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <p><font face="Arial">Jen dotaz: Co vypíše:</font></p>
      <p><font face="Arial">uBat1 je 53</font></p>
      <p><font face="Arial">uartSend("\1mV",adUbat1,0);<br>
        </font></p>
      <p><font face="Arial">nevypíše to</font></p>
      <p><font face="Arial">53mV      ?</font></p>
      <pre class="moz-signature" cols="72">Martin Záruba</pre>
      <div class="moz-cite-prefix">Dne 20.4.2024 v 10:36 Pavel HudeÄŤek
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:cafe8589-63d8-448f-9f19-eb19f16669d4@seznam.cz">
        <meta http-equiv="Content-Type"
          content="text/html; charset=UTF-8">
        Tady asi došlo k mĂ­rnĂ©mu nedorozumÄ›nĂ­:<br>
        Oba umĂ­me zobrazit jen jednu hodnotu.<br>
        Oba umĂ­me poĹľadovanĂ˝ poÄŤet des. mĂ­st.<br>
        Oba umĂ­me text pĹ™ed nĂ­m i po nÄ›m.<br>
        Já nemám formátovánĂ­ tisĂ­cĹŻ, ale zas mĹŻĹľu ve vĂ˝stupnĂ­m textu
        použít #.<br>
        Zas to formátovánĂ­ s # se asi dá ohackovat, Ĺľe zobrazĂ­ tĹ™eba 2
        ÄŤĂ­sla zakĂłdovanĂ˝ do jednoho longu?<br>
        <br>
        // adUin je 12,3456  uBat1 je 3753<br>
        // UART_sendDT je ','  UART_sendPosChr je '\1'<br>
        uartSend("Uin=\1 V\n", adUin, 2);<br>
        uartSend("\1mV", adUbat1, 0);<br>
        vĂ˝sledek je:<br>
        Uin=12,34 V<br>
        3753mV<br>
        <br>
        Ten uartSend byl trochu prasáckej, mist nakopĂ­ruje do globálnĂ­
        uartSendMist a pak zavolá cislo((long)(v * m)), kde m je tĹ™eba
        1000 pro mist=3. A cislo pak do poĹľadovanĂ©ho mĂ­sta vnutĂ­
        oddÄ›lovaÄŤ a uartSendMist vynuluje. Tohle jsem uĹľ nÄ›kde mÄ›l i na
        ty tisĂ­ce, jen se to nevypĂ­nalo samo.<br>
        <br>
        Chystám se Ĺľe bych si z tÄ›hle vÄ›cĂ­ koneÄŤnÄ› udÄ›lal nÄ›jakou
        knihovnu, zatĂ­m to jen kopĂ­ruju mezi projekty a nejÄŤastÄ›jc si
        vystaÄŤĂ­m s putchar2, text na poslánĂ­ textu a cislo na poslánĂ­
        longu.<br>
        takĹľe poslednÄ› to bylo ve stylu<br>
        text("Uin="); cislo(static_cast<long>(1000.0*adUin));
        text(" mV\r\n");<br>
        <br>
        Buffer je na zásobnĂ­ku, takĹľe sám vznikne a sám zmizĂ­.<br>
        Ale 100 B, to je 20 % RAMky na ATtiny816, coĹľ je hodnÄ›, případnÄ›
        1,25 % na AVR64DD32, to uĹľ by bylo v pohodÄ›.<br>
        MÄ› se to obecnÄ› nelĂ­bĂ­, protoĹľe rád používám dÄ›je na pozadĂ­.
        Funkce cekej(uint32_t ms) je i vĂ­c neĹľ pĹŻlka programu a pokud
        moĹľno všechno ÄŤekánĂ­ volá aspoň cekej(0). No a kdyĹľ se tÄ›ch
        ÄŤekánĂ­ sejde vĂ­ce takovĂ˝ch, kde mezitĂ­m vzniknul buffer..<br>
        TakĹľe mám snahu takovĂ© buffery nedÄ›lat.<br>
        Další vÄ›c je, Ĺľe mám snahu minimalizovat mĂ­sta, kde je potĹ™eba
        omezovat velikost stringu. TakĹľe mÄ› staÄŤĂ­ buffer na 10B celej
        vstup mĹŻĹľe mĂ­t 254, vĂ˝stup aĹľ 264 a ve verzi s txtPred + txtPo
        mĹŻĹľou klidnÄ› oba texty mĂ­t do 254.<br>
        <br>
        Ovšem to s F a PSTR je pro mÄ› novinka, za to dĂ­ky.<br>
        <br>
        Byl jsem zvyklĂ˝ na codevision, tam se daly deklarovat promÄ›nnĂ©
        do RAM, EEPROM i Flash, "text" byl ve flash a všechno fungovalo
        do velkĂ© mĂ­ry samo, vÄŤetnÄ› toho, Ĺľe v EEPROM je pointer do
        flash. Super vÄ›c, pokud se po kompilaci k binárce sprostÄ›
        pĹ™ikopĂ­rujou UTF8 texty ve 4 jazycĂ­ch a za nÄ› bitmapa fontĹŻ. PĹ™i
        prvnĂ­m spuštÄ›nĂ­ program ve flash najde "Tady>>>", pak
        dohledá začátky jazykĹŻ, hlášky v default jazyku a nakonec font.
        Pointery hodĂ­ do EEPROM a odteÄŹ se mĹŻĹľe na displeji 10 ms po
        zapnutĂ­ objevit tĹ™eba normálnĂ­ ÄŤeština.<br>
        A v případÄ› GCC jsem si myslel, Ĺľe nic uĹľ takhle elegantnÄ›
        nepĹŻjde.<br>
        VlastnÄ› opravdu nejde, protoĹľe si sice mĹŻĹľu nadeklarovat
        promÄ›nnou v EEPROM, ale nemĹŻĹľu jĂ­ přímo používat, jen pĹ™es
        funkce na ÄŤtenĂ­ a zápis EEPROM, kterĂ˝ maj navĂ­c hroznÄ› dlouhĂ˝
        názvy. "Super" do vzorce se 3 kalibraÄŤnĂ­ma konstantama.<br>
        Tak aspoň snad zas mĹŻĹľu mĂ­t texty ve flash:-)<br>
        <br>
        PH<br>
        <br>
        <div class="moz-cite-prefix">Dne 19.04.2024 v 21:23 Martin
          Záruba napsal(a):<br>
        </div>
        <blockquote type="cite"
          cite="mid:ab12d61f-7c9b-4434-9138-43db4d9875b4@volny.cz">
          <meta http-equiv="Content-Type"
            content="text/html; charset=UTF-8">
          <p><font face="Arial">Já to tak pĹŻvodnÄ› dÄ›lal, jenĹľe byl to
              mnohem sloĹľitÄ›jší a vlastnÄ› mĹŻĹľete takto udÄ›lat jen ÄŤĂˇst
              neĹľ narazĂ­te na prvnĂ­ formátovacĂ­ znak. Pak uĹľ je to
              stejnÄ› jen odeslánĂ­ ÄŤĂ­sla. protoĹľe nevĂ­te, zda nebude
              následovat další formátovacĂ­ znak po libovolnĂ© poÄŤtu
              "vĂ˝plnĂ­". Tvar text,val, mĂ­st se mi nelĂ­bil, protoĹľe s nĂ­m
              neudÄ›láte tĹ™eba 10mV. Takto je text kdekoli, dokonce je
              kdekoli i tĹ™eba \n, takĹľe nemá smysl println. A varinta
              txtPred, val, mĂ­st, txtPo to sice umĂ­, ale jsou 4
              parametry a stejnÄ› nejde udÄ›lat tĹ™eba odskoÄŤenĂ© tisĂ­ce.
              Taky se mi lĂ­bĂ­, Ĺľe to seĹľere i float. PĹ™edpokládĂ­m, Ĺľe
              buffer se vytvoří na zásobnĂ­ku a po opuštÄ›nĂ­ funkce zmizĂ­.
              Je to tak?</font></p>
          <p><font face="Arial">JeštÄ› to chci doplnit o moĹľnost mĂ­t
              formátovacĂ­ Ĺ™etÄ›zec ve flash. NenĂ­ mi ale jasnĂ©, jakĂ˝ je
              rozdĂ­l mezi PSTR("V pamÄ›ti flash") a F("V pamÄ›ti flash").
              Asi se mi vĂ­c lĂ­bĂ­ F(" "), je to kratší zápis a dovoluje
              pĹ™etĂ­ĹľenĂ­ funkce. Ale moĹľná má nÄ›jakou nevĂ˝hodu, na kterou
              jsem nepĹ™išel.<br>
            </font></p>
          <pre class="moz-signature" cols="72">Martin Záruba</pre>
          <div class="moz-cite-prefix">Dne 19.4.2024 v 20:50 Pavel
            HudeÄŤek napsal(a):<br>
          </div>
          <blockquote type="cite"
            cite="mid:b4bb63a0-c0e8-4e00-bb0f-836ae08e652c@seznam.cz">Moc
            pÄ›knĂ˝. <br>
            Já bych teda akorát nekopĂ­roval celĂ˝ text do velkĂ©ho bufferu
            a mĂ­sto toho text pĹ™ed ÄŤĂ­slem rovnou odesĂ­lal v prvnĂ­m
            do/while, pak pĹ™eved a odeslal ÄŤĂ­slo a nakonec odeslal
            zbytek vstupnĂ­ho textu. <br>
            <br>
            UĹľ jsem taky kdysi pouĹľil variantu, kdy se zadávajĂ­
            parametry (text, val, mist) a v textu je pak znak pro
            umĂ­stÄ›nĂ­ ÄŤĂ­sla a des. mĂ­st se odešle podle hodnoty mist.
            ÄŚastÄ›jc mám ale (txtPred, val, mist, txtPo). <br>
            <br>
            OdesĂ­lánĂ­ mám teda tĂ©měř vĹľdy rovnou prĹŻběžnÄ› po znacĂ­ch a
            odesĂ­lacĂ­ funkce ÄŤeká jen na dokonÄŤenĂ­ pĹ™edchozĂ­ho znaku,
            takĹľe konverze na vĂ˝stupnĂ­ text probĂ­há paralelnÄ› s
            odesĂ­lánĂ­m. <br>
            <br>
            PH <br>
            <br>
            Dne 19.04.2024 v 19:23 Martin Záruba napsal(a): <br>
            <blockquote type="cite">UĹľ jsem se Vás dost natrápil na toto
              tĂ©ma a mÄ›l jsem pocit, Ĺľe nic moc ĂşspornĂ©ho a jednoduše
              pouĹľitelnĂ©ho nenĂ­. JenĹľe jsem paliÄŤatĂ˝ a zkusil jsem pĹ™ece
              nÄ›co vymyslet. PoĹľadavek byl: <br>
              <br>
              VĂ˝pis na poĹľadovanĂ˝ poÄŤet mĂ­st s moĹľnostĂ­ textu pĹ™ed i za
              ÄŤĂ­slem. <br>
              <br>
              PotlaÄŤenĂ­ nevĂ˝znamnĂ˝ch nul. <br>
              <br>
              Co nejĂşspornÄ›jší kĂłd jak funkce, tak volánĂ­, vhodnĂ˝ pro
              malinky procesor. <br>
              <br>
              PřímĂ˝ tisk bez nutnosti psanĂ­ Serial.print(); <br>
              <br>
              Vyrobil jsem toto, posuÄŹte a navrhnÄ›te prosĂ­m co by ještÄ›
              Ĺˇlo lĂ­p. <br>
              <br>
              <br>
              void pr(int32_t h, const char* f) { <br>
              Â  char buf[100]; <br>
              Â  uint8_t i = 0xFF; <br>
              Â  int32_t x = abs(h); <br>
              Â  do { <br>
              Â Â Â  i++; <br>
              Â Â Â  buf[i] = f[i]; <br>
              Â  } while (f[i] != 0); <br>
              <br>
              Â  do { <br>
              Â Â Â  i--; <br>
              Â Â Â  if (buf[i] == '#') { <br>
              Â Â Â Â Â  if (x != 0) { <br>
              Â Â Â Â Â Â Â  buf[i] = x % 10 + (uint8_t)'0'; <br>
              Â Â Â Â Â Â Â  if (h < 0 && x < 10) { <br>
              Â Â Â Â Â Â Â Â Â  i--; <br>
              Â Â Â Â Â Â Â Â Â  buf[i] = '-'; <br>
              Â Â Â Â Â Â Â  } <br>
              Â Â Â Â Â  } else { <br>
              Â Â Â Â Â Â Â  buf[i] = ' '; <br>
              Â Â Â Â Â  } <br>
              Â Â Â Â Â  x /= 10; <br>
              Â Â Â  } <br>
              Â  } while (i != 0); <br>
              Â  Serial.print(buf); <br>
              } <br>
              <br>
              <br>
              Funkce má jedinĂ˝ formátovacĂ­ znak # <br>
              <br>
              Příklady: <br>
              <br>
              int32_t napetimV = 5432; <br>
              pr(napetimV, "Pokus1=###.###V\n"); <br>
              pr(-21, Â  Â Â  "Pokus2=### zaporne cislo\n"); <br>
              pr(9876543,  "Pokus3=# ### ### cislo s mezerami po
              1000\n"); <br>
              float a = 54.3; <br>
              pr(a*10,     "Pokus4=####.# vypis float na 1 desetinne
              misto\n"); <br>
              <br>
              VĂ˝sledek vypadá takto: <br>
              <br>
              Pokus1=  5.432V <br>
              Pokus2=-21 zaporne cislo <br>
              Pokus3=9 876 543 cislo s mezerami po 1000 <br>
              Pokus4=   54.3 vypis float na 1 desetinne misto <span
              style="white-space: pre-wrap">
</span></blockquote>
          </blockquote>
        </blockquote>
        <br>
        <br>
        <fieldset class="moz-mime-attachment-header"></fieldset>
        <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a
        class="moz-txt-link-abbreviated" href="http://www.HW.cz"
        moz-do-not-send="true">www.HW.cz</a>
<a class="moz-txt-link-abbreviated moz-txt-link-freetext"
        href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext"
        href="http://list.hw.cz/mailman/listinfo/hw-list"
        moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
      </blockquote>
      <br>
      <fieldset class="moz-mime-attachment-header"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>