CEC-säätöä (libcec, Jessie, Samsung, rpi2, VDR)

DVB kortit, emolevyt, adapterit, antennit, kotelot jne

CEC-säätöä (libcec, Jessie, Samsung, rpi2, VDR)

ViestiKirjoittaja kurg » 11.06.2015 11:43

Lähtökohdat:
-Debian Jessie 8.1
-libcec GitHub:sta (8.6.2015)
-Samsung P2370HD televisio (kaukosäädin: BN59-00865A)
-Raspbian Pi 2 (uusin firmware 8.6.2015)
-VDR 2.2.0 cecremote-pluginilla
-Käyttämäni paikallinen src-hakemisto: /usr/local/src

LIBCEC:n asennus

libcec:n haku GitHub:sta:
Koodi: Valitse kaikki
sudo apt-get install autoconf libtool liblockdev1-dev libudev-dev git cmake
cd /usr/local/src
git clone --recursive git://github.com/Pulse-Eight/libcec.git


Tarpeen vain Raspberry:llä:
Editoi: libcec/src/libcec/cmake/CheckPlatformSupport.cmake
- check_library_exists(bcm_host vchi_initialise "" HAVE_RPI_API)
+ check_library_exists(bcm_host bcm_host_init "" HAVE_RPI_API)
Rivin 'set(LIB_INFO "${LIB_INFO}, 'RPi'")' alle lisää:
include_directories(/opt/vc/include /opt/vc/include/interface/vcos/pthreads /opt/vc/include/interface/vmcs_host/linux)

platform:n kääntäminen:
Koodi: Valitse kaikki
cd /usr/local/src/libcec/src/platform
mkdir build
cd build
cmake ..
make
sudo make install


libcec:n kääntäminen:
Koodi: Valitse kaikki
cd /usr/local/src/libcec
mkdir build
cd build
export LIBRARY_PATH=/opt/vc/lib
cmake -DBUILD_SHARED_LIBS=1 ..
make
sudo make install


Jos tarvitsee muokata lähdekoodia, niin uusintakäännökseen tarvitaan vain:
Koodi: Valitse kaikki
export LIBRARY_PATH=/opt/vc/lib
make
sudo make install


Raspberry Pi:llä libcec-kirjasto asentuu paikkaan, joka ei ole oletuksena etsittävien kirjastosijaintien joukossa. Näin ollen lisää tiedostoon /etc/ld.so.conf.d/arm-linux-gnueabihf.conf rivi:
/usr/local/lib/arm-linux-gnueabihf
Aja tämän jälkeen "sudo ldconfig"

libcec:n testaus:
cec-client


LIBCEC:n muokkaus Samsung:n merkkikohtaisia nappeja varten

Oletuksena libcec kohtelee Samsungin merkkikohtaisia nappeja jotenkin eri tavalla kuin "tavallisia" nappeja. Tämä näkyy mm. siten, että vdr-plugin cecremote ei tunnista erikoisnappien ylöspäästöä, eli nämä napit toimivat vain kerran, jonka jälkeen on painettava jotain muuta nappia, jotta seuraava erikoisnäppäinpainallus tunnistetaan. Tässä kyseisessä tapauksessa erikoisnapit ovat kaukosäätimen "CH LIST" ja "RETURN"-napit. Koska kaukosäätimessä on ylipäätään niin vähän CEC:ä käyttäviä nappeja, tarvitsin myös nämä napit omaan "normaaliin" käyttöön.

cec-client näyttää "normaaleille" napeille seuraavaa ("0"-nappi):
Koodi: Valitse kaikki
TRAFFIC: [         3713425]     >> 01:44:20
DEBUG:   [         3713426]     >> TV (0) -> Recorder 1 (1): user control pressed (44)
DEBUG:   [         3713427]     key pressed: 0 (20)
TRAFFIC: [         3713495]     >> 01:8b:20
DEBUG:   [         3713496]     >> TV (0) -> Recorder 1 (1): vendor remote button up (8B)
DEBUG:   [         3713497]     key released: 0 (20)


libcec:n tuloste erikoisnappeilla ("RETURN"):
Koodi: Valitse kaikki
TRAFFIC: [         3681598]     >> 01:8a:91
DEBUG:   [         3681599]     >> TV (0) -> Recorder 1 (1): vendor remote button down (8A)
DEBUG:   [         3681599]     key pressed: return (Samsung) (91)
TRAFFIC: [         3681668]     >> 01:8b:32
DEBUG:   [         3681668]     >> TV (0) -> Recorder 1 (1): vendor remote button up (8B)


TRAFFIC-rivin keskimmäisen numeron tulkitseminen (include/cectypes.h):
Koodi: Valitse kaikki
CEC_OPCODE_USER_CONTROL_PRESSED          = 0x44
CEC_OPCODE_USER_CONTROL_RELEASE          = 0x45
CEC_OPCODE_VENDOR_REMOTE_BUTTON_DOWN     = 0x8A
CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP       = 0x8B

Samaisesta tiedostosta löytyy myös näppäinkohtaiset koodit (TRAFFIC-rivin kolmas numero).

Tästä huomataan, että ensinnäkin napin ylöspäästö laukaiseen kaikkien nappien kohdalla merkkikohtaisen toiminnon 0x8b (CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP). Tästä ei kuitenkaan vaikuta sinällään olevan haittaa, vaikka loogisemmalta tuntuisi 0x45 (CEC_OPCODE_USER_CONTROL_RELEASE) (ilmeisesti kysymyksessä tämän television omituisuus). Toisekseen, "key released: x (y)" -rivi puuttuu erikoisnapilta kokonaan. Tämä tuntuu virheelliseltä.

Normaalien nappien painalluksen käsittelyn nähdäkseni oleellinen kohta, src/libcec/implementations/CECCommandHandler.cpp HandleVendorRemoteButtonDown:
Koodi: Valitse kaikki
  if (client)
    client->SetCurrentButton((cec_user_control_code) command.parameters[0]);


Samsungin erikoisnappien painalluksen käsittelyn vastaava kohta, src/libcec/implementations/ANCommandHandler.cpp, HandleVendorRemoteButtonDown:
Koodi: Valitse kaikki
  key.keycode = (cec_user_control_code)command.parameters[0];
  if (client)
    client->AddKey(key);


Tästä päättelin voivani tehdä seuraavan muokkauksen, src/libcec/implementations/ANCommandHandler.cpp, HandleVendorRemoteButtonDown:
Koodi: Valitse kaikki
  key.keycode = (cec_user_control_code)command.parameters[0];
  if (client)
    //client->AddKey(key);
    client->SetCurrentButton(key.keycode); //oma lisäys


Tämän jälkeen uudelleenkääntö ja asennus, jonka jälkeen cec-client näyttää erikoisnapit kuten tavalliset napit ja VDR:n cecremote pluginilla toimii myös erikoisnapit normaalisti.

Huom! On hyvin mahdollista, että olen ymmärtänyt libcec:n väärin, ja korjaan olematonta virhettä tekemällä virheen. Voi myös olla, että korjaan jotain toista virhettä lisäämällä toisen virheen.

Haiskahtaa jotenkin siltä, että tämän Samsung-television CEC-koodit eivät mene ihan niinkuin pitäisi. Minkä tahansa napin ylöspäästö lähettää koodin 0x8B (CEC_OPCODE_VENDOR_REMOTE_BUTTON_UP) siten, että viestin kolmas kenttä (TRAFFIC-numerosarjan kolmas numero) on aina viimeksi painettu "normaalinappi". Näinollen ei voida varmuudella sanoa, että mikä nappi itseasiassa on päästetty ylös. Esim.: Jos painan "0"-nappia (0x20), niin sen ylöspäästöviesti on "01:8b:20". Jos sitten painan erikoisnappia "RETURN" (0x91), niin jälleen ylöspäästöviesti on myös "01:8b:20", ei esimerkiksi "01:8b:91".
kurg
Vanhempi asiantuntija
 
Viestit: 175
Liittynyt: 13.04.2006 17:17

Paluu Laitteistot

Paikallaolijat

Käyttäjiä lukemassa tätä aluetta: Ei rekisteröityneitä käyttäjiä ja 1 vierailijaa