From c32864756051a976e87879cd5827f4d95b5d55d5 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 22 Apr 2000 13:51:48 +0200 Subject: [PATCH] Implemented Channel Display --- MANUAL | 19 ++++++++++++++++--- config.c | 3 +-- dvbapi.c | 15 +++++++++------ dvbapi.h | 7 +++++-- interface.c | 39 +++++++++++++++++++++++++++------------ interface.h | 7 ++++--- osm.c | 14 +++++++++++++- 7 files changed, 75 insertions(+), 29 deletions(-) diff --git a/MANUAL b/MANUAL index 9e5036c1..8fb4529e 100644 --- a/MANUAL +++ b/MANUAL @@ -3,9 +3,22 @@ Video Disk Recorder User's Manual * Selecting a Channel - You can select a channel either by pressing the "Up" or "Down" key (while - no On Screen Menu is displayed), or browsing through the channel list in - the menu and pressing "Ok" on the desired channel. + There are three ways to select a channel: + + 1. With no On Screen Menu displayed press the "Up" or "Down" key to switch + to the next higher or lower channel. + 2. Press the "Menu" button to bring up the On Screen Menu, select "Channels" + and browse through the list with the "Up" and "Down" key; to switch to the + selected channel press "Ok". + 2. Directly type in the channel number with the numeric keys ('0'..'9'); + if no key is pressed for about half a second, the digits collected so + far will define the channel number. + + After switching to a different channel the channel number and name, as well + as the current time are displayed at the top of the screen. This line + automatically goes away after about two seconds, or if any key is pressed. + To bring up the channel display without switching channels you can press + the "Ok" button. * Instant Recording diff --git a/config.c b/config.c index c29fea8b..64c09147 100644 --- a/config.c +++ b/config.c @@ -4,7 +4,7 @@ * See the main source file 'osm.c' for copyright information and * how to reach the author. * - * $Id: config.c 1.3 2000/04/15 12:48:00 kls Exp $ + * $Id: config.c 1.4 2000/04/22 13:32:27 kls Exp $ */ #include "config.h" @@ -206,7 +206,6 @@ bool cChannel::Switch(void) if (!DvbApi.Recording()) { isyslog(LOG_INFO, "switching to channel %d", Index() + 1); CurrentChannel = Index(); - Interface.DisplayChannel(CurrentChannel + 1, name); for (int i = 3; --i;) { if (DvbApi.SetChannel(frequency, polarization, diseqc, srate, vpid, apid, ca, pnr)) return true; diff --git a/dvbapi.c b/dvbapi.c index ef2f8086..3f10dd37 100644 --- a/dvbapi.c +++ b/dvbapi.c @@ -4,7 +4,7 @@ * See the main source file 'osm.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.c 1.3 2000/04/15 14:45:04 kls Exp $ + * $Id: dvbapi.c 1.4 2000/04/22 13:09:49 kls Exp $ */ #include "dvbapi.h" @@ -1001,7 +1001,7 @@ cDvbApi::cDvbApi(void) memset(&colorPairs, 0, sizeof(colorPairs)); start_color(); leaveok(stdscr, TRUE); - window = stdscr; + window = NULL; #endif } @@ -1054,19 +1054,21 @@ void cDvbApi::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, co } #endif -void cDvbApi::Open(int w, int h) +void cDvbApi::Open(int w, int h, int d) { cols = w; rows = h; #ifdef DEBUG_OSD - //XXX size... + window = subwin(stdscr, h, w, d, 0); + syncok(window, TRUE); #define B2C(b) (((b) * 1000) / 255) #define SETCOLOR(n, r, g, b, o) init_color(n, B2C(r), B2C(g), B2C(b)) #else w *= charWidth; h *= lineHeight; - int x = (720 - w) / 2; //TODO PAL vs. NTSC??? - int y = (576 - h) / 2; + d *= lineHeight; + int x = (720 - MenuColumns * charWidth) / 2; //TODO PAL vs. NTSC??? + int y = (576 - MenuLines * lineHeight) / 2 + d; Cmd(OSD_Open, 4, x, y, x + w - 1, y + h - 1); #define SETCOLOR(n, r, g, b, o) Cmd(OSD_SetColor, n, r, g, b, o) #endif @@ -1108,6 +1110,7 @@ void cDvbApi::Fill(int x, int y, int w, int h, eDvbColor color) wmove(window, y + r, x); // ncurses wants 'y' before 'x'! whline(window, ' ', w); } + wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work #else Cmd(OSD_FillBlock, color, x * charWidth, y * lineHeight, (x + w) * charWidth - 1, (y + h) * lineHeight - 1); #endif diff --git a/dvbapi.h b/dvbapi.h index 3c447cf1..8303d59f 100644 --- a/dvbapi.h +++ b/dvbapi.h @@ -4,7 +4,7 @@ * See the main source file 'osm.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.h 1.3 2000/04/15 13:36:10 kls Exp $ + * $Id: dvbapi.h 1.4 2000/04/22 13:07:34 kls Exp $ */ #ifndef __DVBAPI_H @@ -21,6 +21,9 @@ typedef unsigned char __u8; #include #include "../DVB/driver/dvb.h" +#define MenuLines 15 +#define MenuColumns 40 + enum eDvbColor { clrBackground, #ifndef DEBUG_OSD clrOBSOLETE, //FIXME apparently color '1' can't be used as FgColor with e.g. clrRed as BgColor??? @@ -59,7 +62,7 @@ private: int cols, rows; void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL); public: - void Open(int w, int h); + void Open(int w, int h, int d = 0); void Close(void); void Clear(void); void Fill(int x, int y, int w, int h, eDvbColor color = clrBackground); diff --git a/interface.c b/interface.c index a5465135..fd1fa2dc 100644 --- a/interface.c +++ b/interface.c @@ -4,16 +4,13 @@ * See the main source file 'osm.c' for copyright information and * how to reach the author. * - * $Id: interface.c 1.3 2000/04/15 17:38:11 kls Exp $ + * $Id: interface.c 1.4 2000/04/22 13:51:48 kls Exp $ */ #include "interface.h" #include #include "remote.h" -#define MenuLines 15 -#define MenuColumns 40 - #ifndef DEBUG_REMOTE cRcIo RcIo("/dev/ttyS1"); #endif @@ -26,6 +23,7 @@ cInterface::cInterface(void) { open = 0; cols[0] = 0; + keyFromWait = kNone; } void cInterface::Init(void) @@ -35,10 +33,10 @@ void cInterface::Init(void) #endif } -void cInterface::Open(void) +void cInterface::Open(int NumCols, int NumLines, int StartLine) { if (!open++) - DvbApi.Open(MenuColumns, MenuLines); + DvbApi.Open(NumCols, NumLines, StartLine); } void cInterface::Close(void) @@ -65,19 +63,24 @@ unsigned int cInterface::GetCh(void) eKeys cInterface::GetKey(void) { - return Keys.Get(GetCh()); + eKeys Key = keyFromWait != kNone ? keyFromWait : Keys.Get(GetCh()); + keyFromWait = kNone; + return Key; } -eKeys cInterface::Wait(int Seconds) +eKeys cInterface::Wait(int Seconds, bool KeepChar) { int t0 = time_ms(); + eKeys Key = kNone; while (time_ms() - t0 < Seconds * 1000) { - eKeys Key = GetKey(); + Key = GetKey(); if (Key != kNone) - return Key; + break; } - return kNone; + if (KeepChar) + keyFromWait = Key; + return Key; } void cInterface::Clear(void) @@ -312,8 +315,20 @@ void cInterface::LearnKeys(void) void cInterface::DisplayChannel(int Number, const char *Name) { -//TODO #ifndef DEBUG_REMOTE RcIo.Number(Number); #endif + if (Name) { + Open(MenuColumns, 1); + char buffer[MenuColumns + 1]; + snprintf(buffer, sizeof(buffer), "%d %s", Number, Name ? Name : ""); + Write(0, 0, buffer); + time_t t = time(NULL); + struct tm *now = localtime(&t); + snprintf(buffer, sizeof(buffer), "%02d:%02d", now->tm_hour, now->tm_min); + Write(-5, 0, buffer); + if (Wait(2, true) == kOk) + GetKey(); + Close(); + } } diff --git a/interface.h b/interface.h index 1707c46e..76fdab8d 100644 --- a/interface.h +++ b/interface.h @@ -4,7 +4,7 @@ * See the main source file 'osm.c' for copyright information and * how to reach the author. * - * $Id: interface.h 1.4 2000/04/22 09:55:52 kls Exp $ + * $Id: interface.h 1.5 2000/04/22 13:07:16 kls Exp $ */ #ifndef __INTERFACE_H @@ -19,14 +19,15 @@ public: private: int open; int cols[MaxCols]; + eKeys keyFromWait; unsigned int GetCh(void); void QueryKeys(void); void HelpButton(int Index, const char *Text, eDvbColor FgColor, eDvbColor BgColor); - eKeys Wait(int Seconds = 1); + eKeys Wait(int Seconds = 1, bool KeepChar = false); public: cInterface(void); void Init(void); - void Open(void); + void Open(int NumCols = MenuColumns, int NumLines = MenuLines, int StartLine = 0); void Close(void); eKeys GetKey(void); void Clear(void); diff --git a/osm.c b/osm.c index 021d71ac..7d1c7849 100644 --- a/osm.c +++ b/osm.c @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/people/kls/vdr * - * $Id: osm.c 1.6 2000/04/22 09:56:33 kls Exp $ + * $Id: osm.c 1.7 2000/04/22 13:35:37 kls Exp $ */ #include @@ -67,8 +67,16 @@ int main(int argc, char *argv[]) cMenuMain *Menu = NULL; cTimer *Timer = NULL; int dcTime = 0, dcNumber = 0; + int LastChannel = -1; while (!Interrupted) { + // Channel display: + if (CurrentChannel != LastChannel) { + cChannel *channel = Channels.Get(CurrentChannel); + if (channel) + Interface.DisplayChannel(CurrentChannel + 1, channel->name); + LastChannel = CurrentChannel; + } // Direct Channel Select (action): if (dcNumber) { Interface.DisplayChannel(dcNumber); @@ -146,6 +154,7 @@ int main(int argc, char *argv[]) case kMenu: Menu = new cMenuMain; Menu->Display(); break; + // Up/Down Channel Select: case kUp: case kDown: { int n = CurrentChannel + (key == kUp ? 1 : -1); @@ -154,6 +163,9 @@ int main(int argc, char *argv[]) channel->Switch(); } break; + // Viewing Control: + case kOk: LastChannel = -1; break; // forces channel display + //TODO if replaying switch to progress display instead default: break; } }