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

Linux - jak wykrywać zdarzenia dotyczące napędu CD?

09 Lut 2018 23:22 1074 4
  • Specjalista elektronik
    Parę spraw powiązanych - ale wszystko można sprowadzić do przechwycenia informacji o zdarzeniu wciśnięcia przycisku na napędzie CD.

    Po pierwsze, jak wykryć (z poziomu programu), że napęd CD został zamknięty? Chodzi o to, żeby użytkownik mógł włożyć płytę, a program automatycznie sprawdzał, co na niej jest. Informacja, czy została przy tym włożona płyta, też by się przydała, ale na to już znalazłem jakiś sposób, wystarczy spróbować ją czytać, może jest lepszy - ale jeśli spróbuję automatycznie czytać CD zanim użytkownik go zamknie, to system zamknie CD i użytkownik nie zdąży włożyć płyty.

    Po drugie, w niektórych wersjach Linux-a napęd CD nie daje się otworzyć przez naciśnięcie przycisku - zapewne system dostaje sygnał, że przycisk został naciśnięty, ale może brakuje w nim jakiegoś programu, czy opcji w konfiguracji, i sygnał zostaje zignorowany - jaka jest normalnie jego droga, jak sprawdzić, gdzie jest gubiony? Sprawdzałem output z 'dmesg', nie ma żadnej informacji.
  • Poziom 29  
    _jta_ napisał:
    Po pierwsze, jak wykryć (z poziomu programu), że napęd CD został zamknięty?

    Z wykryciem wciśniecia przycisku może być problem, jako, że nie jest to zdarzenie obsługiwane przez ACPI. W kwesti samego sprawdzenia statusu to tu masz fajne rozwiązanie: https://www.linuxquestions.org/questions/slackware-14/detect-cd-tray-status-4175450610/
    prosty programik sprawdzający status i zwracający odpowiedni wynik.

    _jta_ napisał:
    Po drugie, w niektórych wersjach Linux-a napęd CD nie daje się otworzyć przez naciśnięcie przycisku

    Najczęściej jest to spowodowane zajętością samego urządzenia. Co jest z koleji często spowodowane tym, że napęd jest zamontowany i otwarte są na nim jakieś pliki
    polecenia do weryfiacji powyższego:
    Kod: bash
    Zaloguj się, aby zobaczyć kod


    Samo wysuwanie można wywoływać z poziomu terminala poleceniem eject
    Kod: bash
    Zaloguj się, aby zobaczyć kod
    -> wysuwa tackę
    Kod: bash
    Zaloguj się, aby zobaczyć kod
    -> wsuwa tackę, choć zależnie od napędu może to nie być możliwe
    Kod: bash
    Zaloguj się, aby zobaczyć kod
    -> Zależnie od statusu otwiera jak jest zamknięta, albo zamyka jak jest otwarta, ale patrze poprzednie polecenie
  • Specjalista elektronik
    Działanie 'eject' znam, ale mi chodzi o sprawdzanie, jaka jest sytuacja, bez ingerowania w nią - po to, żeby użytkownik mógł wcisnąć przycisk na napędzie, włożyć płytę, zamknąć napęd, i wtedy program automatycznie by sprawdzał, czy są na niej pliki do odtwarzania. Przez 'eject' dowiem się, jaki był stan, poprzez pomiar czasu wykonywania, ale to oznacza zmienianie stanu, i jakbym chciał w ten sposób sprawdzać, to przed włożeniem płyty szufladka cały czas by się wysuwała i chowała - nie byłoby to ułatwienie dla użytkownika, ani nie wychodziłoby to "na zdrowie" dla napędu.

    Czasem komputerem posługują się osoby niepełnosprawne, dla których wpisanie polecenia 'eject' byłoby bardzo trudne, natomiast mogą w miarę łatwo znaleźć przycisk i go wcisnąć. A tu jest taka sytuacja, że sprawdziłem trzy komputery, i na każdym jest inaczej: na jednym system wykrywa włożenie płyty CD, wykonuje 'mount', a jeśli jakiś program czyta plik z płyty, to po wciśnięciu przycisku na napędzie przerywa to czytanie i wysuwa płytę; na drugim system nie pokazuje, żeby wykrywał włożenie płyty, a na trzecim wykrywa, ale nie wykonuje 'mount', a na wciśnięcie przycisku nie reaguje (jakkolwiek, kiedy nie ma płyty, po wciśnięciu posłusznie otwiera napęd). Na dwóch pierwszych jest Ubuntu 12.04, na trzecim Ubuntu 16.04. Idealnie byłoby tak, jak jest na tym pierwszym - ale jak to zrobić?

    Programik przerobiłem na coś takiego:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Samo wykrycie, że w napędzie jest płyta CD, można zrobić inaczej: przeczytać plik "/sys/block/sr0/dev" i usunąć LF na końcu, resztę poprzedzić przez "/run/udev/data/b" (zwykle wychodzi "/run/udev/data/b11:0") i przeczytać zawartość pliku o takiej nazwie (kilkadziesiąt linii, u mnie pod Ubuntu 16.04 jest 40 z płytą w środku, 36 bez niej). Jeśli w przeczytanym pliku wystąpi linia "E:ID_CDROM_MEDIA=1", to znaczy, że w napędzie jest płyta CD/DVD. Na razie nie wiem, czy tam zawsze jest 1, może to zależy od rodzaju płyty - dotąd sprawdziłem na dwóch płytach (i nie wiem, czy to zadziała na tym komputerze, który nie sygnalizuje wykrycia włożenia płyty). Robi to taki skrypt:
    Kod: tcl
    Zaloguj się, aby zobaczyć kod
  • Poziom 29  
    _jta_ napisał:
    A tu jest taka sytuacja, że sprawdziłem trzy komputery, i na każdym jest inaczej:(...)

    Najprościej trzeba by porównać konfiguracje tych 3 jednostek. Za obsługę "autorun" odpowiada udev. Różnica w działąniu na poszczególnych maszynach może wynika, ze różnic sprzętowych lub konfiguracyjnych.
    Sprawdź konfigurację udev w /etc/udev/rules.d/ , czy na danej wersji systemu jest tam coś dodane, czy korzysta z domyślnej konfiguracji np. /lib/udev/rules.d/.
    Oczywiście warunkiem jest, że taką płytę musi też się dać z automatu zamontować ręcznie, czyt istnieje odpowiedni wpis w fstab.
    Dodatkowe INFO: https://askubuntu.com/questions/359855/how-to-detect-insertion-of-dvd-disc

    _jta_ napisał:
    "/run/udev/data/b"
    Jest uzupełniany właśnie przez udev. Różnice na poszczególnych komputerach mogą wynikać z innych wersji systemu lub samego udev.
    ID_CDROM_MEDIA=1 jest niezależnie od rodzaju płyty. Zależnie od rodzaju poniżej powinna być jeszcze analogiczna informacja np.E:ID_CDROM_MEDIA_CD_RW=1