Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Delphi] Aplikacja sterowana pilotem od TV.

piotrek5001 11 Cze 2004 22:32 6858 23
  • #1 11 Cze 2004 22:32
    piotrek5001
    Poziom 24  

    Witam!

    Dziś wykonałem układ ze strony http://www.irkabelek.prv.pl (schemat jest w załączniku). Służy on do sterowania komputerem za pomocą dowolnego pilota (na przykład od telewizora). W programie GIRDER z zainstalowaną wtyczką IGOR SFH-56 DEVICE wszystko działa bez problemu.

    Chciałbym napisać w C++ Builderze lub Delphi aplikację, która była by sterowana pilotem, właśnie za pomocą tego układu (czyli przechwytywała by kody tak jak GIRDER). Jak się do tego zabrać? Przypuszczam, że trzeba zaimportować procedury i funkcje z biblioteki IGOR SFH-56 DEVICE (jest to biblioteka DLL). Tylko niestety nie wiem jak (tzn. nie wiem jak się nazywają i jakie wartości mają zwracać).

    BARDZO PROSZĘ O POMOC!
    Z góry dziękuję!


    Serdecznie pozdrawiam!
    Piotr Szura.

    Zamykam. - arnoldziq

    0 23
  • #2 15 Cze 2004 10:11
    Anonymous
    Użytkownik usunął konto  
  • #3 15 Cze 2004 10:38
    Bielsky
    Poziom 20  

    Jeżeli to ma być aplikacja sterowana pilotem - nie widzę większego problemu, gorzej jeśli chcesz nią sterować inne aplikacje.
    W pierwszym wypadku wystarczy odczytywać to, co się pojawia na wejściu portu com.
    Ściągnij sobie komponent do delphi (z tego, co pamiętam udało mi się go też zainstalować pod builderem) http://delphi.icm.edu.pl/ftp/d20free/comdrv32.zip
    Jest do niego program demonstracyjny, pod którym możesz dowolnie konfigurować port i obserwować, co się na nim pojawia.

    0
  • #4 15 Cze 2004 14:09
    piotrek5001
    Poziom 24  

    Chcę sterować SWOJĄ aplikacją.

    0
  • #5 15 Cze 2004 15:35
    mcy
    Poziom 15  

    Komunikacja w Windowsach opiera o system przesyłania zdarzeń. Każde okno (edycyjne, labele,listy są oknami) jeżeli jest aktywne przyjmuje komuniakty do tzw. pętli komunikatów callback WndProc(). Tam następuje "obróbka" komunikatów. Również twoja aplikacja odbiera komunikaty np. do każdego okna edycyjnego możesz wysłać tekst z dowolnego innego programu znając tzw. handle (uchwyt okna) tak działają programy typu girder. Jak znaleźć uchwyt? Wykorzystaj program Spy lub Spy++ dołączane do każdego pakietu oprogramowania VStudio,V.NET,Deplhi,CBuilder. Zaznaczasz okno, i odczytujesz komunikaty, kóre do niego docierają - np. WM_QUIT(handle,0,0,0)
    Aplikacja powinna działać tak:
    1) odczyt kodu klawisza z pilota poprzez port RS
    2) odczyt uchwytu okna, Lparam, HParam) przypisanego do tego znaku
    3) wysłanie komunikatu do aplikacji

    0
  • #6 15 Cze 2004 21:14
    piotrek5001
    Poziom 24  

    Nie mogę sobie poradzić z instalacją komponentu. Używam Delphi 7. Robię tak :

    - Uruchamiam Delphi7

    - Wybieram Menu->Close All

    - Wybieram Component->Install component...

    - Klikam Browse (pierwszy od góry) i wybieram plik ComDrv32.pas. Klikam Otwórz.

    - Następnie klikam Yes.

    I teraz występuje błąd :(. Oto zawartość pola z informacjami (błędami) :

    [Warning] ComDrv32.pas(255): Symbol 'AllocateHWnd' is deprecated
    [Warning] ComDrv32.pas(265): Symbol 'DeallocateHWnd' is deprecated
    [Error] ComDrv32.pas(611): Types of actual and formal var parameters must be identical
    [Warning] ComDrv32.pas(624): Combining signed and unsigned types - widened both operands
    [Fatal Error] dclusr.dpk(36): Could not compile used unit 'D:\GIRDER\comdrv32\ComDrv32.pas'




    Bardzo proszę o pomoc. Inne komponenty normalnie się instalują. Tylko z tym coś nie tak.


    Aha, i jeszcze jedno. Gdy wyskakuje ten błąd, zaznaczona jest linijka kodu (na brązowo - czyli błąd). Oto ta linijka :


    WriteFile( FComPortHandle, DataPtr^, DataSize, nsent, nil );



    Pozdrawiam.

    0
  • #7 16 Cze 2004 09:49
    Bielsky
    Poziom 20  

    Ten komponent używałem dość dawno, pod delphi2 i bcb4. Mogli od tego czasu pozmieniać jakieś biblioteki, z których korzysta.
    (miałem wczoraj po południu problem z rozumieniem polskiego :) i zrozumiałem że chcesz swoją aplikacjĄ sterować inne, dlatego nie sprawdziłem u siebie jak to działa, choć problem mnie zianteresował)
    W zeszłym tygodniu ktoś na forum wrzucił nieco przerobiny program demonstracyjny z tego komponentu jako "najlepszy program do RS-a" czy jakoś tak, niestety nie mogę teraz tego znaleźć.

    poczytaj też ten wątek:
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=139435&highlight=

    0
  • #8 16 Cze 2004 14:17
    piotrek5001
    Poziom 24  

    Znowu problem :(.

    Zainstalowałem sobie Delphi3. Komponent zainstalował się bez żadnego problemu. Otworzyłem i skompilowałem przykładowy program (TCommPortDriver Test). Ustawiłem COM1 i nacisnąłem Connect. Program połączył się z portem.

    Niestety nie są odbierane ŻADNE sygnały. Pole Receive, jak było, tak jest puste. Próbowałem wysyłać sygnały z dwuch różnych pilotów.

    Proszę o dalszą pomoc. Z góry dziękuję.

    Serdecznie pozdrawiam
    Piotr Szura

    0
  • #9 16 Cze 2004 14:36
    Bielsky
    Poziom 20  

    tak sobie myślę......
    sygnał z odbiornika jest przez dsr a nie przez rxd.
    Podejrzewam, że tsop generuje sygnał w standardzie ttl-a i trzeba się było uciec do takiego podstępu. (sprawdzę w wolnej chwili, chyba że zrobisz to szybciej).
    Jeżeli na tyle dobrze znasz pascala - przyjrzyj się, czy da się przerobić komponent tak, aby czytał z dsr portu.

    Poszukaj noty katalogowej TSOP, sprawdź czy to nie wysyła sygnału w jakimś kodzie typu manchester, poszukaj też informacji o kodzie RC5, zwłaszcza jego parametrach czasowych.

    Mam jeszcze jeden pomysł. Chyba najprostszy w realizacji.
    Napisz swoją aplikację nie przejmując się sterowaniem.
    Uruchom program girder, przechwyć w nim zdarzenia generowane przy uruchamianiu wszystkich funkcji twojego programu (wciskanie przycisków) i przypisz je w girderze.
    Dodatkowa korzyść będzie taka, że będzie można równocześnie wykorzystywać pilota do sterowania innych aplikacji.

    Jeszcze jedno naiwne pytanie:
    czy girder widzi te piloty ?

    0
  • #10 16 Cze 2004 15:08
    piotrek5001
    Poziom 24  

    Girder bez żadnego problemu widzi każdy pilot (nawet taki do otwierania samochodu, tylko, że on generuje za każdym razem inny kod).

    Wiem, że można przechwycić zdarzenia systemowe Girderem i w ten sposób sterować aplikację, jednakże chciałbym, aby nie używać do tego celu dodatkowych aplikacji.

    Pascala niestety na tyle nie znam, aby przerobić ten komponent. Nie wiem na jakiej zasadzie działa w Pascalu komunikacja przez port i nie wiem jakich poleceń używać itd.

    Jeżeli coś uda Ci się zrobić, bardzo proszę o sprawozdanie.

    Pozdrawiam!

    0
  • #11 16 Cze 2004 15:43
    Bielsky
    Poziom 20  

    oki.
    Do końca tygodnia jestem mocno zajęty.
    Umówmy się że nawzajem - o ile coś wykombinujesz podeślesz relację.

    0
  • #12 16 Cze 2004 16:02
    piotrek5001
    Poziom 24  

    OK. Jak coś się uda, to podeślę.

    Może w międzyczasie ktoś inny napisze.

    Pozdrawiam.

    0
  • #13 16 Cze 2004 16:49
    Bielsky
    Poziom 20  

    Mam.
    zobacz:
    http://www.ustr.net/infrared/jvc.shtml
    Te 36 khz to rodzaj nośnej. Sam sygnał wysyłany jest w postaci paczek o czasie trawnia odpowiadającym czasowi symbolu. Jest to niekompatybilne z RS, chyba będzie trzeba pogrzebać w dość niskopoziomowej obsłudze portu.

    Acha. W dziale pomoce na elektrodzie jest artykuł po polsku po łebkach opisujący RC5

    0
  • #14 16 Cze 2004 17:22
    piotrek5001
    Poziom 24  

    Niestety nie znam się na niskopoziomowym programowaniu.

    Może w tym przypadku udało by się jednak skożystać z biblioteki IGOR, która współpracuje z Girderem. Popróbuje jeszcze z tym komponentem.

    Pozdrawiam.

    0
  • #16 17 Cze 2004 17:00
    piotrek5001
    Poziom 24  

    Napisałem do autora (podejżewam, że do tego co trzeba). Jeżeli będzie tak dobry i odpowie, napiszę odpowiedź na forum.

    Pozdrawiam.

    0
  • #17 17 Cze 2004 19:21
    piotrek5001
    Poziom 24  

    Mam odpowiedź.

    Mam nadzieję, że Pan Janusz U. nie będzie miał nic przeciwko temu, że napiszę ją tutaj. Oto treść :

    Wysłałem następującego maila :

    Cytat:


    Witam! Podejżewam, że to Pan jest autorem wtyczki do WinAmpa, która wykorzystuje wtyczkę IGOR PLUGIN.

    Czy mógłby Pan podzielić się informacją na temat, jak użyć pliku (biblioteki DLL) IGOR we własnej aplikacji? Chodzi mi o to, aby sterować pilotem własną aplikację. Chciałem użyć do tego celu bibliotekę DLL IGOR, lecz nie wiem jakie procedury zaimporotować itd.

    Bardzo proszę o pomoc.
    Z góry bardzo dziękuję.



    W odpowiedzi otrzymałem :

    Cytat:


    Od: "Janusz U." <nopsoft@if.pw.edu.pl>
    Do: "Piotr Szura" <pioszura@plusnet.pl>
    Temat: Re: Igor Plugin
    Data: 17 czerwca 2004 18:39

    Girder posiada API na swojej stronie - ja wlasnie z niego skorzystalem i
    dostosowalem do wlasnych / winampowskich potrzeb. (ogolnie jest np. funkcja
    dokonujaca tlumaczen jezykowych, jest tez prosta obsluga zdarzenia jak
    nacisniecie klawisza pilota - wszystko to za sprawa interfejsu plugina Igora
    C. - istotna jest jedynie wersja tego interfejsu, w tej chwili akurat nie
    pamietam cyfr - chodzi tu zwlaszcza o zwracany numer do plugina, gdyz moja
    bibloteka najzyczajniej emuluje girdera...

    pzdr.
    Janusz U.
    [/quote]


    --

    Niestety dalej nie mam pojęcia co robić. Ale to już jest istotna informacja, za co bardzo dziękuję Autorowi. Jak będę mieć czas, popróbuję coś zrobić.


    Pozdrawiam serdecznie!

    0
  • #18 17 Cze 2004 21:37
    piotrek5001
    Poziom 24  

    Znalazłem kilka programików (3), które działają na RC5. Załączam je do tego postu. Niestety, źródeł nie mogę dołączyć, ponieważ autor nie wyraził zgody na ich udostępnianie (spróbuj porozmawiać z nim przez GG, może Ci je udostępni - mi się udało).

    Pozdrawiam.

    P.S.
    Oto strona, z którtej to pobrałem :
    http://www.w.cz.prv.pl

    0
    Załączniki:
  • #19 18 Cze 2004 08:58
    Bielsky
    Poziom 20  

    Jeżeli opis API wystarcza do tego, żeby napisać taką wtyczkę - masz wytłumaczone jak plugin komunikuje się się z programem. Trzeba to wykorzystać "podszywając" się pod girdera.

    0
  • #20 18 Cze 2004 11:32
    neos
    Poziom 2  

    Wyjście z odbirnika podczerwieni wchodzi na linie DSR. Nie jest to linia odbircza RSa, tylko sterująca!. Jeżeli chcesz czytać dabe wychodzące z odbirnika musisz sprawdzać stan linii DSR - przerwaniowo lub w pętli. Ciąg zmian tych stanów tworzy poszczególne bity ramki. Jak zbierzesz całą ramkę, masz kod z pilota - proste. Gorzej z napisaniem. Mi, po wielu trudach udało sie.

    PS.
    Lepiej skorzystaj z API girdera i pluginu - po co tworzyć drzwi do lasu.

    0
  • #21 18 Cze 2004 17:30
    piotrek5001
    Poziom 24  

    Neos, czy możesz podesłać źródła?

    0
  • #22 18 Cze 2004 18:54
    leoha
    Poziom 16  

    pioszura napisał:
    Neos, czy możesz podesłać źródła?


    Jeżeli TAK to ja też jestem chętny !

    0
  • #23 20 Cze 2004 15:10
    piotrek5001
    Poziom 24  

    Witam!

    Dziś troszkę przerobiłem układ. Zaieniłem we wtyczce RS232 piny z 6 na 2 (czyli z DSR na RXD). Komponent do sterowania portem COM reaguje na sygnały pobrane z pilota. Problem jest taki, że jest to zawsze taki sam sygnał (na różnych przyciskach pilota).

    Co z tym zrobić?

    0
  • #24 26 Wrz 2004 17:33
    Janusz U.
    Poziom 11  

    Witam.

    Poniewaz Google zwrocily mi moj adres, postanowilem zareagowac i pomoc. Skoro ma byc open, niechaj bedzie:)
    Oto maly listing modulu symulujacego interfejs Girdera (jest on nieco uproszczony pod katem biblioteki Igora Cesko...):

    {target: Delphi 3.0}
    {author: NopSoft (Janusz U.)}
    {wersja po minimalizacji ilosci funkcji dla konkretnej biblioteki Igora...}
    unit igorp;

    interface

    uses Windows, SysUtils;

    const
    libname : PChar = 'IgorPlug.dll';
    pexport : procedure(event:string) = nil;

    gir_major_ver = 3;//for simulation
    gir_minor_ver = 2;{jak bylo 3.0 zamiast 3.2 to plugin Igora-a nie dzialal!!!}
    gir_micro_ver = 0;

    // generic return values
    GIR_TRUE = 1;
    GIR_FALSE = 0;
    GIR_ASYNC_LEARN = 2;

    type
    {functions supported by Girder application}
    t_i18n_translate = function (orig: PCHAR; store: PCHAR; size : integer): integer; stdcall;
    t_send_event = function (eventstring : PCHAR; payload: pbytearray; len : integer; device : integer):integer; stdcall;
    t_null = procedure;stdcall;//bo wycialem wiele innych funkcji...

    p_functions = ^s_functions_1;
    s_functions_1 = record
    size : DWORD;
    parse_girder_reg,
    get_link_name,
    set_command,
    target_enum,
    realloc_pchar,
    show_osd,
    hide_osd,
    start_osd_draw,
    stop_osd_draw,
    treepicker_show,
    register_cb : t_null;
    i18n_translate : t_i18n_translate; {!}
    get_osd_settings,
    get_osd_fontname,
    gir_malloc, {!}
    gir_free, {!}
    get_int_var,
    get_double_var,
    get_string_var,
    set_int_var,
    set_double_var,
    set_string_var,
    delete_var,
    run_parser : t_null;
    send_event : t_send_event; {!}
    trigger_command : t_null;
    parent_hwnd : HWND;
    end;

    {functions supported by dynamic girder library}
    tgir_open = function (gir_major_ver, gir_minor_ver, gir_micro_ver: integer; api_functions: p_functions): integer; stdcall;
    tgir_close = function :integer; stdcall;
    tgir_start = function :integer; stdcall;
    tgir_stop = function :integer; stdcall;
    tgir_config = procedure; stdcall;
    tgir_requested_api = function (max_api: integer): integer; stdcall;
    tgir_name = procedure (data : PCHAR; len : integer); stdcall;
    tgir_version = procedure (data : PCHAR; len : integer); stdcall;
    tgir_description = procedure (data : PCHAR; len : integer); stdcall;
    tgir_devicenum = function :integer; stdcall;

    tgirdll = record
    libh :THandle;

    ver,name,descr:array[0..100] of char;




    devnum,reqapi:integer;

    gir_open : tgir_open;
    gir_close : tgir_close;
    gir_start : tgir_start;
    gir_stop : tgir_stop;
    gir_config : tgir_config;
    gir_requested_api : tgir_requested_api;
    gir_name : tgir_name;
    gir_version : tgir_version;
    gir_description : tgir_description;
    gir_devicenum : tgir_devicenum;
    end;

    function openlib(var l:tgirdll):boolean;
    procedure closelib(var l:tgirdll);

    procedure fill_s_func(h:HWnd);//important!!!

    implementation

    var
    s_func: s_functions_1;

    function i18ntranslate(orig: PCHAR; store: PCHAR; size : integer): integer; stdcall;
    begin
    // messagebox(0,orig,'translate language',0);
    i18ntranslate := GIR_FALSE;//ja nie tlumacze...
    end;

    function sendevent(eventstring : PCHAR; payload: pbytearray; len : integer; device : integer):integer; stdcall;
    begin
    // messagebox(0,eventstring,'event',0);
    if @pexport<>nil then pexport(eventstring);
    sendevent := GIR_TRUE;
    end;

    procedure fill_s_func(h:HWnd);
    begin
    fillchar(s_func,sizeof(s_func),0); //przypisanie wartosci nil do funkcji...
    with s_func do begin
    size := sizeof(s_func);
    i18n_translate := @i18ntranslate;{!}
    send_event := @sendevent;{!}
    parent_hwnd := h;
    end;
    end;

    function openlib(var l:tgirdll):boolean;
    begin
    openlib:=false;
    with l do begin
    libh := LoadLibrary(libname);
    if libh = 0 then exit;

    gir_open := GetProcAddress(libh,'gir_open'); {ok}
    gir_close := GetProcAddress(libh,'gir_close'); {ok}
    if (@gir_open = nil) or
    (@gir_close = nil) then
    begin
    closelib(l);
    exit;
    end;
    gir_start := GetProcAddress(libh,'gir_start'); {ok}
    gir_stop := GetProcAddress(libh,'gir_stop'); {ok}
    gir_config := GetProcAddress(libh,'gir_config'); {ok!}
    gir_requested_api := GetProcAddress(libh,'gir_requested_api'); {ok}
    gir_name := GetProcAddress(libh,'gir_name'); {ok}
    gir_version := GetProcAddress(libh,'gir_version'); {ok}
    gir_description := GetProcAddress(libh,'gir_description'); {ok}
    gir_devicenum := GetProcAddress(libh,'gir_devicenum'); {ok}

    if @gir_version<>nil then gir_version(@ver,sizeof(ver)) else ver[0]:=#0;
    if @gir_name<>nil then gir_name(@name,sizeof(name)) else name[0]:=#0;
    if @gir_description<>nil then gir_description(@descr,sizeof(descr)) else descr[0]:=#0;

    if @gir_devicenum<>nil then devnum := gir_devicenum else devnum := -1;
    if @gir_requested_api<>nil then reqapi := gir_requested_api(1{apiver}) else reqapi := -1;

    if @gir_open<>nil then
    if gir_open(gir_major_ver, gir_minor_ver, gir_micro_ver, @s_func) = GIR_FALSE then begin
    closelib(l);
    exit;
    end;
    if @gir_start<>nil then
    if gir_start = GIR_FALSE then begin
    closelib(l);
    exit;
    end;
    end;
    openlib:=true;
    end;

    procedure closelib(var l:tgirdll);
    begin
    with l do begin
    if @gir_stop<>nil then gir_stop;
    if @gir_close<>nil then gir_close;
    FreeLibrary(libh);
    end;
    end;

    end.

    P.S. Milo by bylo byc gdzies na liscie osob...:),
    bo ja zdolnosci graficznych to raczej nie mam, jednak to z braku mojego czasu (jestem bardziej elektronikiem niz programista; Prosze wiec wybaczyc pewien chaos w projekcie plugina do WinAmpa.Mmoze ktos dokonczy mego dziela, skoro sa zwolennicy?).
    Dla tych, ktorzy chca zrozumiec jak mniej/wiecej dziala rozkodowanie, polecam pobrac analizator z mojej strony (PC-DOC + 8051), lub chocby rejestrator dla portu LPT (Centronics). Bez sprzetu mozna rowniez wiele...

    pozdrawiam i zycze powodzenia,
    Janusz Uzycki
    /THE BEST REGARDS/
    www.knf.pw.edu.pl,,
    Festiwal Nauki 2004, (Telefony komorkowe).(karty SIM)

    0