Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 21 maja 2025, o 10:09


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
     Tytuł: NTP client
    PostNapisane: 7 lis 2011, o 09:00 
    Offline
    Nowy

    Dołączył(a): 06 paź 2011
    Posty: 24
    Pomógł: 0

    Witam!!!
    Uruchomiłem kod NTP clienta pobrany z tuxgraphics.com używając karty sieciowej ATB oraz zestawu testowego ATB.
    Nie potrafię rozgryść wywołania poniższej funkcji ( co to za dziwoląg?):
    Kod:
    minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

    oto ciało funkcji:
    Kod:
    uint8_t gmtime(const uint32_t time,char *day, char *clock)
    {
            char dstr[4];
            uint8_t i;
       uint32_t dayclock;
            uint16_t dayno;
       uint16_t tm_year = EPOCH_YR;
       uint8_t tm_sec,tm_min,tm_hour,tm_wday,tm_mon;

       dayclock = time % SECS_DAY;//godzin w danym dniu
       dayno = time / SECS_DAY;//dni

       tm_sec = dayclock % 60UL;//sekund w danym dniu
       tm_min = (dayclock % 3600UL) / 60;
       tm_hour = dayclock / 3600UL;
       tm_wday = (dayno + 4) % 7;   /* day 0 was a thursday */
       while (dayno >= YEARSIZE(tm_year)) {
          dayno -= YEARSIZE(tm_year);
          tm_year++;
       }
       tm_mon = 0;
       while (dayno >= monthlen(LEAPYEAR(tm_year),tm_mon)) {
          dayno -= monthlen(LEAPYEAR(tm_year),tm_mon);
          tm_mon++;
       }
            i=0;
            while (i<3){
                    dstr[i]= pgm_read_byte(&(day_abbrev[tm_wday*3 + i]));
                    i++;
            }
            dstr[3]='\0';
       sprintf_P(day,PSTR("%s %u-%02u-%02u"),dstr,tm_year,tm_mon+1,dayno + 1);
       sprintf_P(clock,PSTR("%02u:%02u:%02u"),tm_hour,tm_min,tm_sec);
            return(tm_min);
    }


    funkcja przyjmuje 3 argumenty:
    1. Zmienna uint32_t time.
    2. Wskaźnik na string day.
    3. Wskaźnik na string clock.


    1. Jak rozszyfrować pierwszy argument funkcji??

    time+(int32_t)-360*(int32_t)hours_offset_to_utc

    2. Co nam daje dopisanie do wartości UL, np. 3600UL

    czym ten zapis różni się od 3600??

    pozdrawiam
    smalski

    _________________
    smalski



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
     Tytuł: Re: NTP client
    PostNapisane: 7 lis 2011, o 12:32 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27402
    Lokalizacja: Szczecin
    Pomógł: 1043

    Na początek to chyba się koledze coś pomyliło (chyba literówka) ale w tym:

    minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

    nie może być znaku MINUS pomiędzy (int32_t)-360 a liczbą 360 - to tak dla ścisłości\

    ad.1) .... to jest konwersja czasu z uwzględnieniem przesunięcia UTC

    ad.2) ... no to jest wyjaśnione w książce ;) UL oznacza, że chcemy aby kompilator potraktował liczbę poprzedzającą ten zapis jako Unsigned Long

    Po wyjaśnieniu wyżej chyba już wiadomo czym będzie się różnić liczba 3600 od 3600UL czy nie? dla pewności podpowiem, że bez UL będzie przechowywana w dwóch bajtach bo przecież mieści się w zakresie 0-65535 a w drugim przypadku będzie przechowywana i brana do obliczeń jako unsigned long czyli będzie zapisana na 4 bajtach - a to chyba spora różnica prawda?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
     Tytuł: Re: NTP client
    PostNapisane: 7 lis 2011, o 13:10 
    Offline
    Nowy

    Dołączył(a): 06 paź 2011
    Posty: 24
    Pomógł: 0

    To, że jest to konwersja czasu to ja wiem:)

    minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);

    tylko co robią te zwroty (int32_t)??Interesuje mnie zrozumienie pierwszego argumentu.
    a minus jest w kodzie, zwrot skopiowałem z kodu źródłowego.

    UL-dzięki, znowu przeoczyłem w książce:)

    kod:
    Kod:
    void print_time_to_lcd(void)
    {
            char day[16];
            char clock[16];
            uint8_t minutes;

            // returns day and time-string in seperate variables:
            minutes=gmtime(time+(int32_t)-360*(int32_t)hours_offset_to_utc,day,clock);<<<<<<<<<<----------- TU
            if (prev_minutes!=minutes){
                    // update complete display including day
                    lcd_clrscr();
                    lcd_gotoxy(0,1);
                    lcd_puts(day);
                    // update complete display
            }
            // write first line
            lcd_gotoxy(0,0);
            lcd_puts(clock);
            lcd_puts_P(" (");
            if (hours_offset_to_utc>=0){
                    lcd_puts_P("+");
            }
            itoa(hours_offset_to_utc,gStrbuf,10);
            adddotifneeded(gStrbuf);
            lcd_puts(gStrbuf);
            lcd_puts_P(")");
            // write to first line
            lcd_gotoxy(15,0);
            lcd_putc(lindicator);
            prev_minutes=minutes;
            // before every hour
            if (minutes==57 && update_at_58_avoid_duplicates==0){
                    client_gw_arp_refresh();  // causes a refresh arp for the GW mac
                    update_at_58_avoid_duplicates=1;
            }
            if (minutes==58 && update_at_58_avoid_duplicates==1){
                    // mark that we will wait for new
                    // ntp update
                    haveNTPanswer=2;
                    send_ntp_req_from_idle_loop=1;
                    update_at_58_avoid_duplicates=2;
            }
            // we need this update_at_58_avoid_duplicates variable
            // otherwise we will send every second an arp or ntp request
            // in that minute
            if (minutes<56){
                    update_at_58_avoid_duplicates=0;
            }
    }


    smalski

    _________________
    smalski



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
     Tytuł: Re: NTP client
    PostNapisane: 7 lis 2011, o 13:15 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27402
    Lokalizacja: Szczecin
    Pomógł: 1043

    (int32_t)360 hmm można powiedzieć że to robić coś podobnego niejako do tego UL ;) tzn mówimy kompilatorowi, że chcemy aby potraktował liczbę 360 jako 32bitową liczbę ze znakiem. Prawidłowo nazywa się to "rzutowanie typów" w języku C.

    Ale jeśli tam jest minus to coś chyba jest nie tak - i zdaje się, że nie powinno się to skompilować ;)

    aaaaa nie !!! zaraz - no przecież,

    (int32_t)-360

    to po prostu rzutowanie ujemnej liczby -360 na ujemną liczbę 32bitową ze znakiem ;) bo domyślnie bez rzutowania kompilator robi promocję typów do 16bitowych. A tu zdaje się wszystkie obliczenia muszą być przeprowadzone na 32 bitowych ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
     Tytuł: Re: NTP client
    PostNapisane: 7 lis 2011, o 13:20 
    Offline
    Nowy

    Dołączył(a): 06 paź 2011
    Posty: 24
    Pomógł: 0

    No i wszystko jasne!!!
    Dziękuję

    _________________
    smalski



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO