logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Wydaje się, że Openbeken /w IRSend dla denon wysyła nieprawidłowe dane wyjściowe

ErrorGap 28 Sty 2024 02:41 2325 5
REKLAMA
Treść została przetłumaczona angielski » polski Zobacz oryginalną wersję tematu
  • Pomocny post
    #1 20932660
    ErrorGap
    Poziom 5  
    Posty: 8
    Pomógł: 2
    Ocena: 16
    Kupiłem kilka Tuya IRC03, które służą zarówno jako odbiornik, jak i nadajnik podczerwieni.

    Moją intencją było wysłanie sygnałów do zestawu stereo Denon, aby można go było obudzić i przełączyć na właściwe wejście z innego pomieszczenia.

    Dane przychodzące z pilota wyglądają następująco:

    Przycisk ZAWIESZ:
    Cytat:
    Informacje:IR:IR IR_Kaseikyo_Denon 0x314 0x0 0 (48 bitów)


    Przycisk WŁ.:
    Cytat:
    Informacje:IR:IR IR_Kaseikyo_Denon 0x214 0x0 0 (48 bitów)


    Kiedy próbuję opublikować, tj. Używając cmnd/IRDevice/IRSend, ładunek:
    Kaseikyo_Denon 0x314 0x0


    Dzienniki urządzenia:
    Cytat:
    Błąd: IR: IRSend cmnd jest nieprawidłowy [kaseikyo_denon 0x31], a nie jak [NEC-0-1A] lub [NEC 0 1A 1].


    OK, więc nie lubi Kaseikyo_Denon (czy jest gdzieś lista protokołów?), ale Denon w pewnym sensie współpracuje z cmnd/IRDevice/IRSend przy użyciu ładunku:
    denon 0x314 0x0


    Przetwornik pokazuje w logu:
    Cytat:
    Info:IR:IR wyślij denon 0x314 0x0 protokół 3 adres 0x314 cmd 0x0 powtórzeń 0 nadpisanie bitów 0


    Ale rzeczywiste otrzymane dane (testowane przez inny IRC03) docierają do odbiornika jako:
    Cytat:
    Informacje:IR:IR IR_Denon 0x14 0x0 0


    Próbowałem następnie porównać to z kodami Denona z IRDB (https://github.com/probonopd/irdb) i wydaje się, że te również usuwają adresy z przodu dowolnego adresu (więc 0x144 staje się po prostu 0x4).

    Korzystanie z protokołu NEC itp. jest odbierane zgodnie z oczekiwaniami, ale oczywiście nie działa na moim urządzeniu:
    Cytat:
    cmnd/IRDevice/IRSend gdzie indziej 0x314 0x0
    Nadajnik: Info:IR:IR wyślij nec 0x314 0x0 protokół 7 adres 0x314 cmd 0x0 powtórzeń 0 nadpisanie bitów 0
    Odbiornik: Info:IR:IR IR_NEC 0x314 0x0 0



    Wydaje mi się, że mogłem to wyśledzić. Ten fragment znajduje się pod sterownikiem/drv_ir.cpp


    extern "C" commandResult_t IR_Send_Cmd(const void *context, const char *cmd, const char *args_in, int cmdFlags) {
        int numProtocols = sizeof(ProtocolNames)/sizeof(*ProtocolNames);
        if (!args_in) return CMD_RES_NOT_ENOUGH_ARGUMENTS;
        char args[20];
        strncpy(args, args_in, 19);
        args[19] = 0;
    
        // split arg at hyphen;
        char *p = args;
        while (*p && (*p != '-') && (*p != ' ')){
            p++;
        }
    etc etc


    Teraz, jeśli args_in jest oddzielany od bufora poleceń, na przykład z httpsserver/http_fns.c, wygląda na to, że ma około 128 znaków (łącznie z samym poleceniem)
    char tmpA[128];
    ...
    commandLen = http_getArg(request->url, "cmd", tmpA, sizeof(tmpA));
    


    Jeśli więc naszym poleceniem jest „IRSend”, będzie to około 120 kolejnych znaków (plus terminator) potencjalnego wejścia

    Teraz, jeśli spojrzymy na miejsca, w których wszystko zostaje odcięte
    IRSend Kaseikyo_Sharp 1 1 0
    To polecenie (6 znaków), spacja, następnie „Kaseikyo_Sharp” (14 znaków) - i to pozostawia tylko około 5 znaków na resztę args_in. Wszystko więcej zostanie posiekane

    Co więcej, jednym z identyfikatorów dostawców jest „Kaseikyo_Mitsubishi”, który sam w sobie składa się z 19 znaków.

    Powinno to zostać naprawione poprzez zwiększenie tego
    char args[20];

    do czegoś takiego
    char args[40];


    Pozwoliłoby to na wprowadzenie większego łańcucha dostawcy plus 5-znakowy adres arg, 4-znakowy CMD arg, i trochę więcej dla powtórzeń/zastąpienia (bity, jak sądzę, są faktycznie ustawione w kodzie w folderze „Arduino-IRremote-mod”, tj.
      #define KASEIKYO_BITS               (KASEIKYO_VENDOR_ID_BITS + KASEIKYO_VENDOR_ID_PARITY_BITS + KASEIKYO_ADDRESS_BITS + KASEIKYO_COMMAND_BITS + KASEIKYO_PARITY_BITS)


    To powiedziawszy, jeśli OBK potencjalnie pozwoli kiedyś na wyjście w formacie RAW, tablica znaków args z pewnością musiałaby być jeszcze większa.
  • REKLAMA
  • #2 20940824
    p.kaczmarek2
    Moderator Smart Home
    Posty: 14663
    Pomógł: 656
    Ocena: 12676
    Dziękuję, masz rację, bufor był za mały. Zastosowałem twoją łatkę do obu gałęzi (głównej ze starą biblioteką IR i forkiem Vfonov z nowym IR). Czy możesz ponownie sprawdzić, czy teraz to działa?
    Pomogłem? Kup mi kawę.
  • REKLAMA
  • #3 20945549
    ErrorGap
    Poziom 5  
    Posty: 8
    Pomógł: 2
    Ocena: 16

    Dane w dziennikach wychodzących wyglądają teraz OK. Odbiornik nadal nie odbiera niczego, więc być może będę musiał zagłębić się w tę kwestię nieco głębiej. Nie rejestruje również niczego na drugim urządzeniu, które ustawiłem do odbioru.

    Oto, co widzę w logach, gdy nacisnę przycisk „VolUp” na pilocie:
    Cytat:
    Informacje:IR:IR IR_Kaseikyo_Denon 0x14 0x17 0 (48 bitów)


    Zakładam, że byłoby to równoważne poleceniu wysyłania:
    IRSend Kaseikyo_Denon 14 17


    Wysłanie takiego powoduje wygenerowanie dziennika:
    Cytat:
    Info:IR:IR wyślij Kaseikyo_Denon 14 17 protokół 12 adres 0x14 cmd 0x17 powtórzeń 0 nadpisanie bitów 0


    Mam inne urządzenie IRC03 do odbierania sygnału i w dzienniku nie pojawia się nic odpowiadającego powyższemu zdarzeniu wysyłania. Nie jest to zły adres/cmd, ale brak jakichkolwiek zarejestrowanych danych, choć spodziewałbym się, że będzie ono odpowiadać temu samemu zdarzeniu odbioru, co naciśnięcie przycisku na pilocie.

    Jeśli jednak użyję następującego polecenia z urządzenia nr 1:
    IRSend Denon 14 17


    Następnie w dziennikach urządzenia nr 2 widać następujące informacje:
    Cytat:
    Informacje:IR:IR IR_Denon 0x14 0x17 0 (15 bitów)
    Informacje:IR:IR IR_Denon 0x14 0x17 2 (15 bitów)


    Zatem drugie urządzenie odbiera podczerwień wysyłaną z urządzenia nr 1 – a adres+cmd jest zgodny – jeśli użyję protokołu „Denon”. Oczywiście nie działa to na moim amplitunerze surround, prawdopodobnie dlatego, że oczekuje on poleceń urządzenia Denon od pilota Kaseikyo, a te różnią się od pilota Denon.

    Testowanie z innymi typami pilotów Kaseikyo również skutkuje brakiem danych w dziennikach urządzenia nr 2, w tym:
    - kaseikyo_sharp
    - kaseikyo_panasonic
    - kaseikyo_mitsubishi

    Wysyłanie kodów dla innych modeli, takich jak Samsung, również pokrywa się z danymi wysłanymi i odebranymi, więc wygląda na to, że po prostu Kaseikyo_Denon skutkuje brakiem danych wejściowych z drugiego urządzenia.

    Polecenie: IRSend Samsung 14 17
    Dziennik (urządzenie nr 1): Informacje: IR: IR wyślij Samsung 14 17 protokół 18 adres 0x14 cmd 0x17 powtórzeń 0 nadpisanie bitów 0
    Dziennik (urządzenie nr 2): Info:IR:IR IR_Samsung 0x14 0x17 0 (32 bity)

    (oczywiście ADDR i CMD dla tych urządzeń nie spełniałyby tej samej funkcji, ale przynajmniej pokazują, że dane wyjściowe i wejściowe między dwoma urządzeniami OpenBeken są zgodne z oczekiwaniami)

    Mam stary amplituner stereo Sony i listwę dźwiękową Samsung, do których muszę znaleźć piloty, więc następnym krokiem będzie porównanie danych wejściowych z pilota z dziennikami wejść/wyjść tych urządzeń i sprawdzenie, czy transmisja w podczerwieni działa prawidłowo oczekiwany. Jeśli tak, może występować inny błąd, prawdopodobnie w bibliotece „Arduino-IRremote”. Może to być także kolejny krótki bufor w dalszej części kodu (a może usuwa gdzieś podkreślenie z typu sygnału), w którym to przypadku mam nadzieję, że uda mi się to wykopać bez większych trudności. Myślę, że problem leży w szczególności w Kaseikyo, ponieważ nawet samo wysłanie tego jako typu sygnału (nie _othervendor) powoduje brak błędów podczas wysyłania, ale nic nie jest odbierane.

    Może minąć trochę czasu, zanim będę miał solidniejsze dane na ten temat, ale będę kopał dalej i zobaczę, czy uda mi się znaleźć coś przydatnego.
  • REKLAMA
  • #4 20962397
    ErrorGap
    Poziom 5  
    Posty: 8
    Pomógł: 2
    Ocena: 16

    OK, więc po włamaniu się do niektórych danych debugowania MARK i śledzeniu przepływu
    Wygląda na to, że operacja IRSend w rzeczywistości nie uderza w nic, co spowodowałoby wyświetlenie wyniku. Powinien znaleźć się tutaj w kodzie IRSend.hpp:

    void IRsend::sendPulseDistanceWidthFromArray(PulsePauseWidthProtocolConstants *aProtocolConstants, uint32_t *aDecodedRawDataArray,
            unsigned int aNumberOfBits, int_fast8_t aNumberOfRepeats) {
    ...



    Ale zamiast tego zostało to na nowo zdefiniowane w drv_ir.cpp i nie ma nic więcej do zrobienia

     // this is to replicate places where the library uses the static class.
    // will need to update to call our dynamic class
    class SpoofIrSender {
        public:
           ...
            void sendPulseDistanceWidthFromArray(PulsePauseWidthProtocolConstants *aProtocolConstants, uint32_t *aDecodedRawDataArray,
                unsigned int aNumberOfBits, int_fast8_t aNumberOfRepeats) {
                
            }
    };


    Dodając znacznik debugowania do obu funkcji, kończy się on na pustym.

    Inne protokoły, takie jak SONY, będą działać, ponieważ np. używają funkcji „sendPulseDistanceWidth” (która nie została zastąpiona) zamiast zastąpionej funkcji „sendPulseDistanceWidthFromArray”

    Jest już trochę za późno, ale zobaczę, czy uda mi się zaktualizować rzeczy, aby spowodowało to, że coś się stanie z modułami używającymi sendPulseDistanceWidthFromArray kiedy znów będę miał trochę więcej czasu na szturchanie.
  • REKLAMA
  • #5 20994282
    Vincent0815
    Poziom 1  
    Posty: 1
    Cześć!

    Przede wszystkim bardzo dziękuję za to świetne rozwiązanie! Udało mi się przeflashować Tuyę S06 i sprawić, że będzie można jej używać w asystencie domowym. Niestety mam problem, którego nie udało mi się rozwiązać. Mogę bez problemu wysyłać kody Ir w formatach NEC, ale utknąłem w kwestii „odległości impulsu”. Czy ktoś ma pomysł, jak mogę przekonwertować to przechwycone pojedyncze polecenie na polecenie wysyłania ir?

    Debug:IR:IR decode returned true, protocol 1
    Debug:IR: Raw-Data=0x85
    Debug:IR: 9 bits
    Debug:IR: LSB first
    Debug:IR:IR decode returned true, protocol PulseDistance (1)
    Info:MQTT:Publishing val IR_PulseDistance 0x721 0x70E 0 (9 bits) to IR-Blaster/ir/get retain=0
    Info:IR:IR MQTT publish IR_PulseDistance 0x721 0x70E 0 (9 bits) took 3ms
    Debug:IR:IR fire event took 0ms
    Debug:IR:IR decode returned true, protocol 1
    Debug:IR: Raw-Data=0x85
    Debug:IR: 9 bits
    Debug:IR: LSB first
    Debug:IR:IR decode returned true, protocol PulseDistance (1)
    Info:MQTT:Publishing val IR_PulseDistance 0x622 0x60F 0 (9 bits) to IR-Blaster/ir/get retain=0
    Info:IR:IR MQTT publish IR_PulseDistance 0x622 0x60F 0 (9 bits) took 1ms
    Debug:IR:IR fire event took 0ms
    Info:MQTT:MQTT client in mqtt_incoming_publish_cb topic IR-Blaster/ir/get
    Debug:MQTT:channelSet topic 4209020 with arg IR_PulseDistance 0x721 0x70E 0 (9 bits)
    Info:MQTT:MQTT client in mqtt_incoming_publish_cb topic IR-Blaster/ir/get
    Debug:MQTT:channelSet topic 4209020 with arg IR_PulseDistance 0x622 0x60F 0 (9 bits)
    
  • #6 21000625
    ErrorGap
    Poziom 5  
    Posty: 8
    Pomógł: 2
    Ocena: 16
    Nie widzę żadnego przechwytywania?

    Jak wygląda data Twojego odbioru IRReive?

    Najłatwiej jest po prostu użyć urządzenia, które odbiera i wysyła, przechwytuje i zapisuje żądane zdarzenia przycisków, a następnie używa tego samego typu urządzenia i kodów dla usługi IRSend
REKLAMA