]> git.vomp.tv Git - vompclient-marten.git/blob - command.cc
DEV var in Makefile
[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::VDR_CONNECTED:
156     {
157       doJustConnected((VConnect*)m->from);
158       break;
159     }
160   }
161 }
162
163 void Command::handleCommand(int button)
164 {
165   if (isStandby && (button != Remote::POWER)) return;
166
167   if (viewman->handleCommand(button)) return;
168
169   // command was not handled
170
171   switch(button)
172   {
173     case Remote::DF_LEFT:
174     case Remote::DF_RIGHT:
175     case Remote::VOLUMEUP:
176     case Remote::VOLUMEDOWN:
177     {
178       VVolume* v = new VVolume();
179       v->handleCommand(button); // this will draw+show
180       viewman->add(v);
181       viewman->timedDelete(v, 2, 1);
182       return;
183     }
184     case Remote::MUTE:
185     {
186       VMute* v = new VMute();
187       v->draw();
188       v->show();
189       viewman->add(v);
190       viewman->timedDelete(v, 2, 1);
191       return;
192     }
193     case Remote::POWER:
194     {
195       doStandby();
196       return;
197     }
198 #ifdef DEV
199     case Remote::RECORD:
200     {
201       Osd::getInstance()->screenShot("/out.jpg");
202       return;
203     }
204 #endif
205   }
206 }
207
208 void Command::doStandby()
209 {
210   if (isStandby)
211   {
212     Video::getInstance()->signalOn();
213     Led::getInstance()->on();
214     isStandby = 0;
215
216
217     VConnect* vconnect = new VConnect();
218     viewman->add(vconnect);
219     vconnect->run();
220   }
221   else
222   {
223     ViewMan* viewman = ViewMan::getInstance();
224
225     viewman->removeAll();
226     viewman->redrawAll();
227
228     VDR::getInstance()->configSave("General", "Last Power State", "Off");
229     VDR::getInstance()->disconnect();
230     Video::getInstance()->signalOff();
231     Led::getInstance()->off();
232     isStandby = 1;
233   }
234 }
235
236 void Command::doReboot()
237 {
238   VDR::getInstance()->disconnect();
239   // just kill it...
240   logger->log("Command", Log::NOTICE, "Reboot");
241   reboot(LINUX_REBOOT_CMD_RESTART);
242 }
243
244 void Command::doJustConnected(VConnect* vconnect)
245 {
246   Video* video = Video::getInstance();
247   ViewMan* viewman = ViewMan::getInstance();
248   viewman->removeView(vconnect, 0, 1);
249
250   VInfo* vi = new VInfo();
251   vi->setDimensions(400, 200);
252   if (video->getFormat() == Video::PAL)
253     vi->setScreenPos(170, 200);
254   else
255     vi->setScreenPos(160, 150);
256
257   vi->setMainText("\n               Connected, loading config");
258   vi->draw();
259   vi->show();
260   viewman->add(vi);
261
262
263   VDR* vdr = VDR::getInstance();
264
265   // Power off if first boot and config says so
266   if (firstBoot)
267   {
268     firstBoot = 0;
269
270     char* powerAfterBoot = vdr->configLoad("General", "Power After Boot");
271
272     if (powerAfterBoot)
273     {
274       if (!strcasecmp(powerAfterBoot, "On"))
275       {
276         logger->log("Command", Log::INFO, "Config says Power After Boot = On");
277       }
278       else if (!strcasecmp(powerAfterBoot, "Off"))
279       {
280         logger->log("Command", Log::INFO, "Config says Power After Boot = Off");
281         doStandby();
282         return; // quit here
283       }
284       else if (!strcasecmp(powerAfterBoot, "Last state"))
285       {
286         char* lastPowerState = vdr->configLoad("General", "Last Power State");
287         if (lastPowerState)
288         {
289           if (!strcasecmp(lastPowerState, "On"))
290           {
291             logger->log("Command", Log::INFO, "Config says Last Power State = On");
292           }
293           else if (!strcasecmp(lastPowerState, "Off"))
294           {
295             logger->log("Command", Log::INFO, "Config says Last Power State = Off");
296             doStandby();
297             return; // quit here
298           }
299           else
300           {
301             logger->log("Command", Log::INFO, "Config General/Last Power State not understood");
302           }
303         }
304         else
305         {
306           logger->log("Command", Log::INFO, "Config General/Last Power State not found");
307         }
308       }
309       else
310       {
311         logger->log("Command", Log::INFO, "Config/Power After Boot not understood");
312       }
313     }
314     else
315     {
316       logger->log("Command", Log::INFO, "Config General/Power After Boot not found");
317     }
318   }
319
320
321   // Go S-Video if config says so
322
323   char* svideo = vdr->configLoad("TV", "S-Video");
324
325   if (svideo)
326   {
327     if (!strcasecmp(svideo, "Yes"))
328     {
329       logger->log("Command", Log::INFO, "Switching to S-Video as S-Video=%s", svideo);
330       video->setConnection(Video::SVIDEO);
331     }
332     else
333     {
334       logger->log("Command", Log::INFO, "Leaving video output as S-Video=%s", svideo);
335       video->setConnection(Video::COMPOSITERGB);
336     }
337   }
338   else
339   {
340     logger->log("Command", Log::INFO, "Config TV/S-Video not found");
341   }
342
343   // Set remote type
344
345   char* remoteType = vdr->configLoad("General", "Remote type");
346
347   if (remoteType)
348   {
349     if (!strcasecmp(remoteType, "New"))
350     {
351       logger->log("Command", Log::INFO, "Switching to New remote type");
352       remote->setRemoteType(Remote::NEWREMOTE);
353     }
354     else
355     {
356       logger->log("Command", Log::INFO, "Switching to Old remote type");
357       remote->setRemoteType(Remote::OLDREMOTE);
358     }
359   }
360   else
361   {
362     logger->log("Command", Log::INFO, "Config General/Remote type not found");
363     remote->setRemoteType(Remote::OLDREMOTE);
364   }
365
366   // Save power state = on
367
368   vdr->configSave("General", "Last Power State", "On");
369
370   // Get TV aspect ratio
371
372   char* aspect = vdr->configLoad("TV", "Aspect");
373
374   if (aspect)
375   {
376     if (!strcasecmp(aspect, "16:9"))
377     {
378       logger->log("Command", Log::INFO, "Switching to TV aspect 16:9");
379       video->setAspectRatio(Video::ASPECT16X9);
380     }
381     else
382     {
383       logger->log("Command", Log::INFO, "Switching to TV aspect 4:3");
384       video->setAspectRatio(Video::ASPECT4X3);
385     }
386   }
387   else
388   {
389     logger->log("Command", Log::INFO, "Config TV/Aspect type not found, going 4:3");
390     video->setAspectRatio(Video::ASPECT4X3);
391   }
392
393   video->reinit();
394
395   // config done
396
397   viewman->removeView(vi);
398
399   VWelcome* vw = new VWelcome();
400   viewman->add(vw);
401   viewman->redrawAll();
402
403 /*
404   handleCommand(Remote::DOWN);
405   handleCommand(Remote::DOWN);
406   handleCommand(Remote::DOWN);
407   handleCommand(Remote::OK);
408 */
409 }