<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=1267&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-07-18T20:59:51+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1267&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-18T19:27:14+01:00</updated>
<published>2012-07-18T19:27:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10174#p10174</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10174#p10174"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10174#p10174"><![CDATA[
No zagadki to już bardziej się nadają albo do &quot;Działu Rybnego&quot; albo do &quot;Łamigłówek&quot; - ja nie za bardzo mam czas na zagadki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Mogę pomóc ale w konkretnych i jasno sprecyzowanych problemach/pytaniach<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 18 lip 2012, o 19:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-18T20:59:51+01:00</updated>
<published>2012-07-18T19:23:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10172#p10172</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10172#p10172"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=10172#p10172"><![CDATA[
DO SKASOWANIA <img src="https://forum.atnel.pl/images/smilies/icon_twisted.gif" alt=":twisted:" title="Szalony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 18 lip 2012, o 19:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-13T13:02:54+01:00</updated>
<published>2012-07-13T13:02:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9697#p9697</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9697#p9697"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9697#p9697"><![CDATA[
Dokładniuśko TAK <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Wtedy robisz sobie zdarzenie bez funkcji zwrotnej dla usera ale na takich samych zasadach<br /><br />czyli możesz w ogóle ze swojej biblioteki wywalić funkcję do rejestracji i tego IF'a sprawdzającego callbacka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lip 2012, o 13:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-13T11:29:14+01:00</updated>
<published>2012-07-13T11:29:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9694#p9694</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9694#p9694"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9694#p9694"><![CDATA[
OK. Czyli jak ta osoba nie będzie chciała używać własnej funkcji to:<br />1) nie rejestruje jej (bo nie ma czego rejestrować),<br />2) w pętli głównej wywołuje tylko funkcję KEYB_IVENT<br />i to wszystko?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 13 lip 2012, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-07-13T06:47:00+01:00</updated>
<published>2012-07-13T06:47:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9676#p9676</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9676#p9676"/>
<title type="html"><![CDATA[Re: Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9676#p9676"><![CDATA[
Myślę, że na razie twój największy kłopot to jest ze zrozumieniem &quot;<strong><span style="color: #0040FF">funkcji typu callback</span></strong>&quot; zgadza się ? nie za bardzo wiesz o co w tym chodzi - zresztą widać to po tym kodzie, zatem spróbuję to na początek przybliżyć.<br /><br />1. funkcje callback to funkcje zwrotne - co to oznacza? Ni mniej ni więcej tylko to, że jak piszesz komuś np jakiejś drugiej osobie jakąś funkcję do obsługi klawiatury - wszystko super. No ale ta osoba chciałaby mieć możliwość wykonywania własnej funkcji gdy zostanie naciśnięty jakikolwiek klawisz (bo np chce zliczać ilość naciśnięć klawiszy) ... to jak to zrobisz ???? A przecież nie możesz pozwolić na to żeby ta osoba grzebała w twojej bibliotece do obsługi klawiatury.<br /><br />2. mówisz więc tej osobie, &quot;słuchaj zrobię ci tą bibliotekę&quot; ale żebyś mi nie mieszał w niej to umożliwię ci to żeby ta moja bibblioteka wywoływała jakąś jedną twoją funkcję, którą sam sobie napiszesz. Może to być dowolna funkcja i mnie nie obchodzi co w niej będzie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />3. w związku z powyższym musisz tej osobie przekazać jeszcze jakąś możliwość dzięki, której ta twoja biblioteka dowie się w późniejszym czasie, gdy osobnik ten otrzyma bibliotekę, - możliwość ta to właśnie jakaś jedna dodatkowa funkcja, pozwalająca na zarejestrowanie na potrzeby tej biblioteki funkcji użytkownika<br /><br />4. zatem po napisaniu swojej bibloteki przygotujemy funkcję typu <strong><span style="color: #0040FF">register_my_func( );</span></strong> której argumentem będzie wskaźnik na przyszłą funkcję tej osoby, i podamy jej instrukcję jak ma tego używać.<br /><br />5. napiszesz więc, do tej osoby maila i poinformujesz, że:<br /><br />  a.) zanim zaczniesz myśleć o korzystaniu z mojej biblioteki stwórz w kodzie swoją własną funkcję do zliczania kliknięć np <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">     void klik( void );</div><br /><br />   b.) gdy już ją będziesz miał to zanim użyjesz funkcji mojej biblioteki - jeszcze przed pętlą główną, zarejestruj tą swoją funkcję na potrzeby mojej biblioteki, masz w tym celu ode mnie dodatkową funkcję o nazwie <strong>register_my_func( );</strong>, zrób to tak<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">    register_my_func( klik );</div><br /><br />   c.) dopiero po tej operacji możesz w pętli głównej korzystać z mojej biblioteki i mieć pewność, że gdy wykryje ona wciśnięcie jakiegokolwiek klawisza to wywoła twoją własną funckję, którą zarejestrowałeś jak wyżej<br /><br />    d.) co by się stało gdybyś zapomniał zarejestrować swojej funkcji i jej w ogóle nie stworzył a wywołał moją bibliotekę ? NIC BY SIĘ NIE STAŁO - ponieważ ja w kodzie bibliooteki sprawdzam to czy dokonałeś rejestracji - jeśli nie to nie zostanie wywołana żadna funkcja <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> więc śpij spokojnie - a oczywiście cała reszta biblioteki będzie działać nadal poprawnie. Sprawdzenie czy zarejestrowałeś swoją funkcję u mnie wygląda tak:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">   if( user_callback ) user_callback; // jeśli wskaźnik do funkcji użytkownika nie jest pusty to wywołaj tę funkcję</div><br /><br />---------------------------------<br /><br />dobra koniec wyjaśnień - tymczasem ty w tym kodzie, który pokazałeś, no właśnie co? sprawdziłeś czy jest zarejestrowana jakaś funkcja i ją próbujesz wywołać <br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">if (keyb_event_callback) (*keyb_event_callback)();</div><br /><br />ale gdzie masz tą własną funkcję i jej rejestrację ??? zostało tylko to:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">register_keyb_event_callback(...?...);</div><br /><br />czyli napisz własną funkcję i ją właśnie zarejestruj w tym nawiasie w miejscu tego znaku zapytania <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lip 2012, o 06:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[szopler]]></name></author>
<updated>2012-07-13T00:17:48+01:00</updated>
<published>2012-07-13T00:17:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9671#p9671</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9671#p9671"/>
<title type="html"><![CDATA[Problem ze zrozumieniem EVENTów :(]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1267&amp;p=9671#p9671"><![CDATA[
Chyba głąb ze mnie nieziemski, ale jakoś nie mogę pojąć zdarzeń <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Na początek chciałbym zrobić coś prostego - obsługę klawiszy. Wyklepałem sobie takie &quot;cóś&quot;:<br />[syntax=c]#ifndef THREE_BUTTON_KEYBOARD_H_<br />#define THREE_BUTTON_KEYBOARD_H_<br /><br />// Ustawienia użytkownika<br />#define SW1_PIN0<br />#define SW2_PIN 1<br /><br />#define SWx_PORTPORTB<br />#define SWx_PINPINB<br />//------------------------<br /><br />// Deklaracje funkcji globalnych<br />void KEYB_EVENT(void);<br />void register_keyb_event_callback(void (*callback) (void));<br /><br />#endif[/syntax]<br />oraz:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &quot;3_Button_Keyboard.h&quot;<br /><br />volatile uint8_t keyb_press_flag;<br />uint8_t klucz;<br /><br />static void (*keyb_event_callback) (void);<br /><br />void register_keyb_event_callback(void (*callback) (void))<br />{<br />keyb_event_callback = callback;<br />}<br /><br />unsigned int debounce(void)// funkcja Freddiego Chopina<br />{<br />   static unsigned int last = 0;<br />   unsigned int port;<br />   unsigned int wynik;<br /><br />   port = SWx_PIN&amp;0b00000011; //odczyt tylko z młodszych pinów<br />    wynik=last&amp;(~port);<br />    last=port;<br /><br />   return wynik;<br />}<br /><br />void KEYB_EVENT(void)<br />{<br />if (keyb_press_flag)<br />{<br />if (keyb_event_callback) (*keyb_event_callback)();<br />klucz = debounce();<br />switch (klucz)<br />{<br />case 0b00000010:<br />licznik_przycisku--;<br />break;<br />case 0b00000001:<br />licznik_przycisku++;<br />break;<br />case 0b00000011:<br />zmienna_X = licznik_przycisku;<br />break;<br />default:<br />zmienna_X = -1;<br />break;<br />}<br />keyb_press_flag = 0;<br />}<br />}<br />[/syntax]<br />I teraz jak tego użyć w main.c ?<br />[syntax=c]#include &quot;3_Button_Keyboard.h&quot;<br />register_keyb_event_callback(...?...);<br /><br />?![/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=82">szopler</a> — 13 lip 2012, o 00:17</p><hr />
]]></content>
</entry>
</feed>