Serial-plugin
Hulk (Diskussion | Beiträge) |
Hulk (Diskussion | Beiträge) |
||
Zeile 76: | Zeile 76: | ||
<!-- ===Snapshot=== --> | <!-- ===Snapshot=== --> | ||
− | + | == Patches == | |
Der folgende Patch macht das Plugin wieder kompatibel für Versionen >= 1.4. Weiterhin fügt er zusätzliche Einträge ins VDR-Logdatei ein, die zur Fehlersuche sehr nützlich seinen können. | Der folgende Patch macht das Plugin wieder kompatibel für Versionen >= 1.4. Weiterhin fügt er zusätzliche Einträge ins VDR-Logdatei ein, die zur Fehlersuche sehr nützlich seinen können. |
Version vom 26. Dezember 2009, 21:32 Uhr
Inhaltsverzeichnis |
Beschreibung
Autor: Ralf Klueber
Mit diesem Plugin lässt sich der VDR über Hardware-Tasten steuern, die an die serielle Schnittstelle angeschlossen sind. Zusätzlich lassen sich ein bis zu zwei Leuchtdioden ansteuern.
Bilder
Hardwareanforderungen
- Eine kleine Schaltung, die an die serielle Schnittstelle angeschlossen wird.
Schaltplan
Funktionen der LED´s
Die erste LED leuchtet bei einer aktiven Aufnahme und blinkt, wenn keine TV-Karte mehr frei für weitere Aufnahmen ist. Bei Systemen mit nur einer TV-Karte würde die LED bei aktiver Aufnahme immer blinken, da die eine vorhandene Karte für die Aufnahme gebraucht wird. Bei Systemen mit zwei TV-Karten würde die LED bei einer Aufnahme leuchten, da die zweite Karte noch "frei" ist, sie beginnt erst zu blinken, wenn auch die zweite Karte durch eine Aufnahme im Einsatz ist.
Ein kompletter Hardwareausbau ist nicht immer erforderlich und kann den persönlichen Ansprüchen und Erfordernissen angepasst werden. Damit ist eine teilweise Bestückung möglich, so können nur Taster oder nur die Anzeige per LED verwendet werden. Ein Vorwiderstand für die LED wird in der Regel nicht benötigt, da die meisten seriellen Ports eine Konstantstromquelle mit 10-20 mA darstellen. Aus Gründen der Helligkeitssteuerung empfiehlt es sich einen Vorwiderstand mit 1 kOhm bei normalen Anzeige-LEDs (rot, gelb, grün) zu verwenden.
Ein eventuelles Prellen der Tasten lässt sich durch parallel schalten eines zusätzlichen Kondensators (1 nF) zu jedem Taster beheben (Tiefpass). Mit der Softwareversion v0.0.6b ist dies nicht mehr erforderlich.
Nach Start des Plugins sollten etwa 12V zwischen Pin 4 und 5 der serielle Schnittstelle anliegen.
Die Belegung der externen seriellen Schnittstelle des PC ist hier beschrieben. Für die genaue Belegung einer internen serielle Schnittstelle sollte das Handbuch des jeweiligen Mainboards berücksichtigt werden.
Softwareanforderungen
Beim Starten des Betriebsystems muss die serielle Schnittstelle initialisiert werden: /bin/setserial /dev/ttyS0 uart 16550A
Start beim VDR-Start durch Eintrag in die RunVDR:
-P'serial /dev/ttyS0'\
Übliche Zuordnung Schnittstellen zum Linux-Device:
- COM1: /dev/ttyS0
- COM2: /dev/ttyS1
- COM3: /dev/ttyS2
In der setup.conf gibt es diese Parameter für das Plugin:
serial.Flashrate = 5 serial.Port = 1
Die Taster werden wie eine FB in der remote.conf angelernt. Bei der Aufforderung irgendeine Taste zu drücken (Phase 1), muss jedoch eine Taste auf der Tastatur gedrückt werden, NICHT ein Taster an der serielle Schnittstelle!
Bsp.:
Serial.Up Button11 Serial.Down Button7 Serial.Menu Button10 Serial.Ok Button6 Serial.Back Button9 Serial.Left Button12 Serial.Right Button14 Serial.Red Button8 Serial.Green Button1 Serial.Yellow Button4 Serial.Blue Button2
Die Zuordnung kann dann später dort auch beliebig geändert werden.
Patches
Der folgende Patch macht das Plugin wieder kompatibel für Versionen >= 1.4. Weiterhin fügt er zusätzliche Einträge ins VDR-Logdatei ein, die zur Fehlersuche sehr nützlich seinen können.
--- serial.c 2005-07-22 12:48:36.000000000 +0200 +++ serial.c 2007-07-30 18:52:48.135644033 +0200 @@ -72,7 +72,7 @@ int iNumDevices; protected: - virtual void Recording(const cDevice *Device, const char *Name); + virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On); public: int GetLedStatus(int i); @@ -95,11 +95,15 @@ int i; for(i=0; i<iNumDevices; i++) - if(iCardIsRecording[i]) - iOccupiedDevices++; - + if(iCardIsRecording[i]) { + iOccupiedDevices++; + } + if((iNumDevices == iOccupiedDevices) && (iOccupiedDevices >0)) // Blinken { + dsyslog("[serial] all cards are recording"); for(i=0; i<SerialSetup.iFlash; i++) iLedStatus[i] |= LEDREC; // Bit setzen for(i=SerialSetup.iFlash; i<MAXCYCLE; i++) @@ -107,28 +111,39 @@ } else if(iOccupiedDevices > 0) // Dauerleuchten { + dsyslog("[serial] %i cards are recording",iOccupiedDevices); for(int i=0;i<MAXCYCLE;i++) iLedStatus[i] |= LEDREC; // Bit setzen } else // LED aus { + dsyslog("[serial] no card is recording"); for(int i=0;i<MAXCYCLE;i++) iLedStatus[i] &= ~LEDREC; // Bit loeschen } return iLedStatus[i % MAXCYCLE]; } -void cSerialStatus::Recording(const cDevice *Device, const char *Name) + + // The given DVB device has started (On = true) or stopped (On = false) recording "Name". + // Name is the name of the recording, without any directory path. The full file name + // of the recording is given in FileName, which may be NULL in case there is no + // actual file involved. If On is false, Name may be NULL. + +void cSerialStatus::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On) { - int iCardIndex = Device->CardIndex(); - iNumDevices = Device->NumDevices(); + int iCardIndex = Device->CardIndex(); // Returns the card index of this device (0 ... MAXDEVICES - 1). + iNumDevices = Device->NumDevices(); // Returns the total number of devices. if(iCardIndex < MAXDEVICES) { - if(Name && Name[0]) + if(Name && Name[0]) { iCardIsRecording[iCardIndex]++; - else + dsyslog("[serial] card %i starts recording",iCardIndex); + } else { iCardIsRecording[iCardIndex]--; + dsyslog("[serial] card %i stops recording",iCardIndex); + } } }