]> git.vomp.tv Git - vompclient-marten.git/blob - command.cc
Widescreen version 2...
[vompclient-marten.git] / command.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "command.h"
22
23 Command* Command::instance = NULL;
24
25 Command::Command()
26 {
27   if (instance) return;
28   instance = this;
29   initted = 0;
30   isStandby = 0;
31   firstBoot = 1;
32 }
33
34 Command::~Command()
35 {
36   instance = NULL;
37 }
38
39 Command* Command::getInstance()
40 {
41   return instance;
42 }
43
44 int Command::init()
45 {
46   if (initted) return 0;
47   initted = 1;
48
49   logger = Log::getInstance();
50   viewman = ViewMan::getInstance();
51   remote = Remote::getInstance();
52
53   if (!logger || !viewman || !remote)
54   {
55     initted = 0;
56     return 0;
57   }
58
59   return 1;
60 }
61
62 int Command::shutdown()
63 {
64   if (!initted) return 0;
65   initted = 0;
66   return 1;
67 }
68
69 void Command::stop()
70 {
71 //  VDR::getInstance()->cancelFindingServer();
72   irun = 0;
73 }
74
75 void Command::run()
76 {
77   if (!initted) return;
78   irun = 1;
79
80   mainPid = getpid();
81
82   Video* video = Video::getInstance();
83
84   UCHAR screenSize = video->getFormat();
85
86   // moved from startup because surface delete doesn't work
87
88   // just in case
89   video->signalOn();
90   Led::getInstance()->on();
91
92   // Blue background
93   View* v = new View();
94   v->setDimensions(video->getScreenWidth(), video->getScreenHeight());
95   v->setBackgroundColour(Colour::VIDEOBLUE);
96   v->draw();
97   v->show();
98   viewman->add(v);
99   viewman->removeView(v);
100
101   // Wallpaper
102   VWallpaper* w = new VWallpaper();
103   if (screenSize == Video::PAL)
104   {
105     logger->log("Command", Log::DEBUG, "PAL wallpaper selected");
106     w->init("/wallpaperPAL.jpg");
107   }
108   else
109   {
110     logger->log("Command", Log::DEBUG, "NTSC wallpaper selected");
111     w->init("/wallpaperNTSC.jpg");
112   }
113   w->draw();
114   w->show();
115   viewman->add(w);
116
117   VConnect* vconnect = new VConnect();
118   viewman->add(vconnect);
119   vconnect->run();
120
121
122   UCHAR button = 0;
123   while(irun)
124   {
125     button = remote->getButtonPress(2);  // FIXME why is this set to 2 and not 0? so it can quit
126     if ((button == Remote::NA_NONE) || (button == Remote::NA_UNKNOWN)) continue;
127
128     if (button != Remote::NA_SIGNAL) handleCommand(button);
129     processMessageQueue();
130   }
131 }
132
133 void Command::postMessage(Message* m)
134 {
135   MessageQueue::postMessage(m);
136   kill(mainPid, SIGURG);
137 }
138
139 void Command::processMessage(Message* m)
140 {
141   logger->log("Command", Log::DEBUG, "processing message %i", m->message);
142
143   switch(m->message)
144   {
145     case Message::STANDBY:
146     {
147       doStandby();
148       break;
149     }
150     case Message::STOP_PLAYBACK:
151     {
152       handleCommand(Remote::STOP); // an odd way of doing it, but so simple
153       break;
154     }
155     case Message::STREAM_END:
156     {
157       // post a message to ViewMan and then run the viewman message queue
158       Message* m = new Message();
159       m->message = Message::STREAM_END;
160       m->to = VVideoLive::getInstance();
161       viewman->postMessage(m);
162       handleCommand(Remote::NA_NONE);
163       break;
164     }
165     case Message::VDR_CONNECTED:
166     {
167       doJustConnected((VConnect*)m->from);
168       break;
169     }
170   }
171 }
172
173 void Command::handleCommand(int button)
174 {
175   if (isStandby && (button != Remote::POWER)) return;
176
177   if (viewman->handleCommand(button)) return;
178
179   // command was not handled
180
181   switch(button)
182   {
183     case Remote::DF_LEFT:
184     case Remote::DF_RIGHT:
185     case Remote::VOLUMEUP:
186     case Remote::VOLUMEDOWN:
187     {
188       VVolume* v = new VVolume();
189       v->handleCommand(button); // this will draw+show
190       viewman->add(v);
191       viewman->timedDelete(v, 2, 1);
192       return;
193     }
194     case Remote::MUTE:
195     {
196       VMute* v = new VMute();
197       v->draw();
198       v->show();
199       viewman->add(v);
200       viewman->timedDelete(v, 2, 1);
201       return;
202     }
203     case Remote::POWER:
204     {
205       doStandby();
206       return;
207     }
208 #ifdef DEV
209     case Remote::RECORD:
210     {
211       Osd::getInstance()->screenShot("/out.jpg");
212       return;
213     }
214 #endif
215   }
216 }
217
218 void Command::doStandby()
219 {
220   if (isStandby)
221   {
222     Video::getInstance()->signalOn();
223     Led::getInstance()->on();
224     isStandby = 0;
225
226
227     VConnect* vconnect = new VConnect();
228     viewman->add(vconnect);
229     vconnect->run();
230   }
231   else
232   {
233     ViewMan* viewman = ViewMan::getInstance();
234
235     viewman->removeAll();
236     viewman->redrawAll();
237
238     VDR::getInstance()->configSave("General", "Last Power State", "Off");
239     VDR::getInstance()->disconnect();
240     Video::getInstance()->signalOff();
241     Led::getInstance()->off();
242     isStandby = 1;
243   }
244 }
245
246 void Command::doReboot()
247 {
248   VDR::getInstance()->disconnect();
249   // just kill it...
250   logger->log("Command", Log::NOTICE, "Reboot");
251   reboot(LINUX_REBOOT_CMD_RESTART);
252 }
253
254 void Command::doJustConnected(VConnect* vconnect)
255 {
256   Video* video = Video::getInstance();
257   ViewMan* viewman = ViewMan::getInstance();
258   viewman->removeView(vconnect, 0, 1);
259
260   VInfo* vi = new VInfo();
261   vi->setDimensions(400, 200);
262   if (video->getFormat() == Video::PAL)
263     vi->setScreenPos(170, 200);
264   else
265     vi->setScreenPos(160, 150);
266
267   vi->setMainText("\n               Connected, loading config");
268   vi->draw();
269   vi->show();
270   viewman->add(vi);
271
272
273   VDR* vdr = VDR::getInstance();
274
275   // Power off if first boot and config says so
276   if (firstBoot)
277   {
278     firstBoot = 0;
279
280     char* powerAfterBoot = vdr->configLoad("General", "Power After Boot");
281
282     if (powerAfterBoot)
283     {
284       if (!strcasecmp(powerAfterBoot, "On"))
285       {
286         logger->log("Command", Log::INFO, "Config says Power After Boot = On");
287       }
288       else if (!strcasecmp(powerAfterBoot, "Off"))
289       {
290         logger->log("Command", Log::INFO, "Config says Power After Boot = Off");
291         doStandby();
292         return; // quit here
293       }
294       else if (!strcasecmp(powerAfterBoot, "Last state"))
295       {
296         char* lastPowerState = vdr->configLoad("General", "Last Power State");
297         if (lastPowerState)
298         {
299           if (!strcasecmp(lastPowerState, "On"))
300           {
301             logger->log("Command", Log::INFO, "Config says Last Power State = On");
302           }
303           else if (!strcasecmp(lastPowerState, "Off"))
304           {
305             logger->log("Command", Log::INFO, "Config says Last Power State = Off");
306             doStandby();
307             return; // quit here
308           }
309           else
310           {
311             logger->log("Command", Log::INFO, "Config General/Last Power State not understood");
312           }
313         }
314         else
315         {
316           logger->log("Command", Log::INFO, "Config General/Last Power State not found");
317         }
318       }
319       else
320       {
321         logger->log("Command", Log::INFO, "Config/Power After Boot not understood");
322       }
323     }
324     else
325     {
326       logger->log("Command", Log::INFO, "Config General/Power After Boot not found");
327     }
328   }
329
330
331   // Go S-Video if config says so
332
333   char* svideo = vdr->configLoad("TV", "S-Video");
334
335   if (svideo)
336   {
337     if (!strcasecmp(svideo, "Yes"))
338     {
339       logger->log("Command", Log::INFO, "Switching to S-Video as S-Video=%s", svideo);
340       video->setConnection(Video::SVIDEO);
341     }
342     else
343     {
344       logger->log("Command", Log::INFO, "Leaving video output as S-Video=%s", svideo);
345       video->setConnection(Video::COMPOSITERGB);
346     }
347   }
348   else
349   {
350     logger->log("Command", Log::INFO, "Config TV/S-Video not found");
351   }
352
353   // Set remote type
354
355   char* remoteType = vdr->configLoad("General", "Remote type");
356
357   if (remoteType)
358   {
359     if (!strcasecmp(remoteType, "New"))
360     {
361       logger->log("Command", Log::INFO, "Switching to New remote type");
362       remote->setRemoteType(Remote::NEWREMOTE);
363     }
364     else
365     {
366       logger->log("Command", Log::INFO, "Switching to Old remote type");
367       remote->setRemoteType(Remote::OLDREMOTE);
368     }
369   }
370   else
371   {
372     logger->log("Command", Log::INFO, "Config General/Remote type not found");
373     remote->setRemoteType(Remote::OLDREMOTE);
374   }
375
376   // Save power state = on
377
378   vdr->configSave("General", "Last Power State", "On");
379
380   // Get TV aspect ratio
381
382   char* aspect = vdr->configLoad("TV", "Aspect");
383
384   if (aspect)
385   {
386     if (!strcasecmp(aspect, "16:9"))
387     {
388       logger->log("Command", Log::INFO, "/// Switching to TV aspect 16:9");
389       video->setTVsize(Video::ASPECT16X9);
390     }
391     else
392     {
393       logger->log("Command", Log::INFO, "/// Switching to TV aspect 4:3");
394       video->setTVsize(Video::ASPECT4X3);
395     }
396   }
397   else
398   {
399     logger->log("Command", Log::INFO, "Config TV/Aspect type not found, going 4:3");
400     video->setTVsize(Video::ASPECT4X3);
401   }
402
403   // config done
404
405   viewman->removeView(vi);
406
407   VWelcome* vw = new VWelcome();
408   viewman->add(vw);
409   viewman->redrawAll();
410
411 /*
412   handleCommand(Remote::DOWN);
413   handleCommand(Remote::DOWN);
414   handleCommand(Remote::DOWN);
415   handleCommand(Remote::OK);
416 */
417 }