summaryrefslogtreecommitdiff
path: root/smtled.c
diff options
context:
space:
mode:
Diffstat (limited to 'smtled.c')
-rw-r--r--smtled.c219
1 files changed, 219 insertions, 0 deletions
diff --git a/smtled.c b/smtled.c
new file mode 100644
index 0000000..74d5901
--- /dev/null
+++ b/smtled.c
@@ -0,0 +1,219 @@
+/*
+ * status.c: A plugin for the Video Disk Recorder
+ * based on the status plugin by kls
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+#include <stdio.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+
+
+
+#include <vdr/plugin.h>
+#include <vdr/status.h>
+
+
+static const char *VERSION = "0.0.4";
+static const char *DESCRIPTION = "Samsung LED display plugin";
+static const char *MAINMENUENTRY = NULL;
+
+// ---
+
+class cSmtledTest : public cStatus {
+private:
+ int CH_Hi;
+ int CH_Lo;
+ int reccount;
+protected:
+ virtual void SetLED(char * cr);
+ virtual void ChannelSwitch(const cDevice *Device, int ChannelNumber);
+ virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
+public:
+ cSmtledTest(void);
+ };
+
+void cSmtledTest::SetLED(char* cw)
+{
+ int fd,n; /* File descriptor for the port */
+ fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
+ if (fd == -1)
+ {
+ /*
+ * Could not open the port.
+ */
+
+ perror("open_port: Unable to open /dev/ttyS1 - ");
+ }
+ else {
+ // fcntl(fd, F_SETFL, 0);
+ n = write(fd, cw, 5);
+ if (n < 0)
+ fputs("write() failed!\n", stderr);
+ close(fd);
+ }
+
+}
+
+void cSmtledTest::ChannelSwitch(const cDevice *Device, int ChannelNumber)
+{
+ if ( !Device->IsPrimaryDevice() || (ChannelNumber == 0) ) {
+ dsyslog("status: cSmtledTest::ChannelSwitch ignore device %d channel %d",
+ Device->CardIndex(), ChannelNumber);
+ return;
+ }
+
+ int chhi,chlo;
+ chhi=(ChannelNumber/100)%100;
+ chlo=ChannelNumber%100;
+ cSmtledTest::CH_Lo=chlo;
+ cSmtledTest::CH_Hi=chhi;
+ char cw[5];
+ cw[0]=0x20;
+ cw[1]=0x40;
+ cw[2]=0x00;
+ cw[2]=cw[2]+(chhi/10)<<4;
+ cw[2]=cw[2]+(chhi%10);
+ cw[3]=0x00;
+ cw[3]=cw[3]+(chlo/10)<<4;
+ cw[3]=cw[3]+(chlo%10);
+ cw[4]='\n';
+ SetLED(cw);
+
+}
+
+void cSmtledTest::Recording(const cDevice *Device, const char *Name, const char *FileName, bool On)
+{
+// dsyslog("status: cStatusTest::Recording %d %s %s %d", Device->CardIndex(), Name, FileName, On);
+ char cw[5];
+
+ if (On==1) {
+ int chhi,chlo;
+ chhi=cSmtledTest::CH_Hi;
+ chlo=cSmtledTest::CH_Lo;
+
+ cw[0]=0x20;
+ cw[1]=0x80;
+ cw[2]=0x00;
+ cw[3]=0x00;
+ cw[4]='\n';
+ SetLED(cw); //error led setzen
+
+ reccount++; //Anzahl der aktiven Aufnahmen erhoehen
+
+ cw[0]=0x20;
+ cw[1]=0x40;
+ cw[2]=0x00;
+ cw[2]=cw[2]+(chhi/10)<<4;
+ cw[2]=cw[2]+(chhi%10);
+ cw[3]=0x00;
+ cw[3]=cw[3]+(chlo/10)<<4;
+ cw[3]=cw[3]+(chlo%10);
+ cw[4]='\n';
+ SetLED(cw); //channel setzen
+
+
+ } else {
+ reccount--; //Anzahl der aktiven Aufnahmen um eins reduzieren
+ if (reccount==0) { //wenn keine Aufnahme mehr aktiv --> LED aus
+ cw[0]=0x20;
+ cw[1]=0x82;
+ cw[2]=0x00;
+ cw[3]=0x00;
+ cw[4]='\n';
+ SetLED(cw); //error led ausschalten
+ }
+
+ }
+}
+cSmtledTest::cSmtledTest(void)
+{
+ reccount=0;
+}
+
+
+// ---
+
+class cPluginSmtled : public cPlugin {
+private:
+ // Add any member variables or functions you may need here.
+ cSmtledTest *statusTest;
+public:
+ cPluginSmtled(void);
+ virtual ~cPluginSmtled();
+ virtual const char *Version(void) { return VERSION; }
+ virtual const char *Description(void) { return DESCRIPTION; }
+ virtual const char *CommandLineHelp(void);
+ virtual bool ProcessArgs(int argc, char *argv[]);
+ virtual bool Start(void);
+ virtual void Housekeeping(void);
+ virtual const char *MainMenuEntry(void) { return MAINMENUENTRY; }
+ virtual cOsdObject *MainMenuAction(void);
+ virtual cMenuSetupPage *SetupMenu(void);
+ virtual bool SetupParse(const char *Name, const char *Value);
+ };
+
+cPluginSmtled::cPluginSmtled(void)
+{
+ // Initialize any member variables here.
+ // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
+ // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
+ statusTest = NULL;
+}
+
+cPluginSmtled::~cPluginSmtled()
+{
+ // Clean up after yourself!
+ delete statusTest;
+}
+
+const char *cPluginSmtled::CommandLineHelp(void)
+{
+ // Return a string that describes all known command line options.
+ return NULL;
+}
+
+bool cPluginSmtled::ProcessArgs(int argc, char *argv[])
+{
+ // Implement command line argument processing here if applicable.
+ return true;
+}
+
+bool cPluginSmtled::Start(void)
+{
+ // Start any background activities the plugin shall perform.
+ statusTest = new cSmtledTest;
+ return true;
+}
+
+void cPluginSmtled::Housekeeping(void)
+{
+ // Perform any cleanup or other regular tasks.
+}
+
+cOsdObject *cPluginSmtled::MainMenuAction(void)
+{
+ // Perform the action when selected from the main VDR menu.
+ return NULL;
+}
+
+cMenuSetupPage *cPluginSmtled::SetupMenu(void)
+{
+ // Return a setup menu in case the plugin supports one.
+ return NULL;
+}
+
+bool cPluginSmtled::SetupParse(const char *Name, const char *Value)
+{
+ // Parse your own setup parameters and store their values.
+ return false;
+}
+
+VDRPLUGINCREATOR(cPluginSmtled); // Don't touch this!