]> git.vomp.tv Git - vompclient-marten.git/blob - command.cc
I18n improvements. German translation added. Centre text justify.
[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->create(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   wallpaper = new VWallpaper();
103   if (screenSize == Video::PAL)
104   {
105     logger->log("Command", Log::DEBUG, "PAL wallpaper selected");
106     wallpaper->init("/wallpaperPAL.jpg");
107   }
108   else
109   {
110     logger->log("Command", Log::DEBUG, "NTSC wallpaper selected");
111     wallpaper->init("/wallpaperNTSC.jpg");
112   }
113   wallpaper->draw();
114   wallpaper->show();
115   viewman->add(wallpaper);
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     Video::getInstance()->signalOff();
234     viewman->removeAll();
235     wallpaper->show();
236
237     VDR::getInstance()->configSave("General", "Last Power State", "Off");
238     VDR::getInstance()->disconnect();
239     Led::getInstance()->off();
240     isStandby = 1;
241   }
242 }
243
244 void Command::doReboot()
245 {
246   VDR::getInstance()->disconnect();
247   // just kill it...
248   logger->log("Command", Log::NOTICE, "Reboot");
249   reboot(LINUX_REBOOT_CMD_RESTART);
250 }
251
252 void Command::doJustConnected(VConnect* vconnect)
253 {
254   I18n::initialize();
255   Video* video = Video::getInstance();
256   viewman->removeView(vconnect, 0);
257
258   VInfo* vi = new VInfo();
259   vi->create(400, 200);
260   if (video->getFormat() == Video::PAL)
261     vi->setScreenPos(170, 200);
262   else
263     vi->setScreenPos(160, 150);
264
265   vi->setOneLiner(tr("Connected, loading config"));
266   vi->draw();
267   vi->show();
268   viewman->add(vi);
269
270
271   VDR* vdr = VDR::getInstance();
272   char* config;
273
274   // Power off if first boot and config says so
275   if (firstBoot)
276   {
277     firstBoot = 0;
278
279     config = vdr->configLoad("General", "Power After Boot");
280
281     if (config)
282     {
283       if (!strcasecmp(config, "On"))
284       {
285         logger->log("Command", Log::INFO, "Config says Power After Boot = On");
286       }
287       else if (!strcasecmp(config, "Off"))
288       {
289         logger->log("Command", Log::INFO, "Config says Power After Boot = Off");
290         doStandby();
291         delete[] config;
292         return; // quit here
293       }
294       else if (!strcasecmp(config, "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             delete[] config;
308             return; // quit here
309           }
310           else
311           {
312             logger->log("Command", Log::INFO, "Config General/Last Power State not understood");
313           }
314         }
315         else
316         {
317           logger->log("Command", Log::INFO, "Config General/Last Power State not found");
318         }
319       }
320       else
321       {
322         logger->log("Command", Log::INFO, "Config/Power After Boot not understood");
323       }
324       delete[] config;
325     }
326     else
327     {
328       logger->log("Command", Log::INFO, "Config General/Power After Boot not found");
329     }
330   }
331
332
333   // Go S-Video if config says so
334
335   config = vdr->configLoad("TV", "Connection");
336
337   if (config)
338   {
339     if (!strcasecmp(config, "S-Video"))
340     {
341       logger->log("Command", Log::INFO, "Switching to S-Video as Connection=%s", config);
342       video->setConnection(Video::SVIDEO);
343     }
344     else
345     {
346       logger->log("Command", Log::INFO, "Switching to RGB/Composite as Connection=%s", config);
347       video->setConnection(Video::COMPOSITERGB);
348     }
349     delete[] config;
350   }
351   else
352   {
353     logger->log("Command", Log::INFO, "Config TV/S-Video not found");
354   }
355
356   // Set remote type
357
358   config = vdr->configLoad("General", "Remote type");
359
360   if (config)
361   {
362     if (!strcasecmp(config, "New"))
363     {
364       logger->log("Command", Log::INFO, "Switching to New remote type");
365       remote->setRemoteType(Remote::NEWREMOTE);
366     }
367     else
368     {
369       logger->log("Command", Log::INFO, "Switching to Old remote type");
370       remote->setRemoteType(Remote::OLDREMOTE);
371     }
372     delete[] config;
373   }
374   else
375   {
376     logger->log("Command", Log::INFO, "Config General/Remote type not found");
377     remote->setRemoteType(Remote::OLDREMOTE);
378   }
379
380   // Get TV aspect ratio
381
382   config = vdr->configLoad("TV", "Aspect");
383   if (config)
384   {
385     if (!strcasecmp(config, "16:9"))
386     {
387       logger->log("Command", Log::INFO, "/// Switching to TV aspect 16:9");
388       video->setTVsize(Video::ASPECT16X9);
389     }
390     else
391     {
392       logger->log("Command", Log::INFO, "/// Switching to TV aspect 4:3");
393       video->setTVsize(Video::ASPECT4X3);
394     }
395     delete[] config;
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 = vdr->configLoad("TV", "Widemode");
404   if (config)
405   {
406     if (!strcasecmp(config, "Letterbox"))
407     {
408       logger->log("Command", Log::INFO, "Setting letterbox mode");
409       video->setMode(Video::LETTERBOX);
410     }
411     else
412     {
413       logger->log("Command", Log::INFO, "Setting chop-sides mode");
414       video->setMode(Video::NORMAL);
415     }
416     delete[] config;
417   }
418   else
419   {
420     logger->log("Command", Log::INFO, "Config TV/Widemode not found, Setting chop-sides mode");
421     video->setMode(Video::NORMAL);
422   }
423
424   // config done
425
426   // Save power state = on
427
428   vdr->configSave("General", "Last Power State", "On");
429
430
431   viewman->removeView(vi);
432
433   VWelcome* vw = new VWelcome();
434   vw->draw();
435   vw->show();
436   viewman->add(vw);
437 //  viewman->redrawAll();
438
439 /*
440   handleCommand(Remote::DOWN);
441   handleCommand(Remote::DOWN);
442   handleCommand(Remote::OK);
443   handleCommand(Remote::DOWN);
444   handleCommand(Remote::DOWN);
445   handleCommand(Remote::DOWN);
446   handleCommand(Remote::OK);
447   handleCommand(Remote::OK);
448   handleCommand(Remote::UP);
449   handleCommand(Remote::OK);
450   handleCommand(Remote::DF_LEFT);
451   handleCommand(Remote::OK);
452   handleCommand(Remote::BACK);
453   */
454
455 }