]> git.vomp.tv Git - vompclient-marten.git/blob - command.cc
New gui code
[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   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->removeAll();
234
235     VDR::getInstance()->configSave("General", "Last Power State", "Off");
236     VDR::getInstance()->disconnect();
237     Video::getInstance()->signalOff();
238     Led::getInstance()->off();
239     isStandby = 1;
240   }
241 }
242
243 void Command::doReboot()
244 {
245   VDR::getInstance()->disconnect();
246   // just kill it...
247   logger->log("Command", Log::NOTICE, "Reboot");
248   reboot(LINUX_REBOOT_CMD_RESTART);
249 }
250
251 void Command::doJustConnected(VConnect* vconnect)
252 {
253   Video* video = Video::getInstance();
254   viewman->removeView(vconnect, 0, 1);
255
256   VInfo* vi = new VInfo();
257   vi->create(400, 200);
258   if (video->getFormat() == Video::PAL)
259     vi->setScreenPos(170, 200);
260   else
261     vi->setScreenPos(160, 150);
262
263   vi->setMainText("\n               Connected, loading config");
264   vi->draw();
265   vi->show();
266   viewman->add(vi);
267
268
269   VDR* vdr = VDR::getInstance();
270
271   // Power off if first boot and config says so
272   if (firstBoot)
273   {
274     firstBoot = 0;
275
276     char* powerAfterBoot = vdr->configLoad("General", "Power After Boot");
277
278     if (powerAfterBoot)
279     {
280       if (!strcasecmp(powerAfterBoot, "On"))
281       {
282         logger->log("Command", Log::INFO, "Config says Power After Boot = On");
283       }
284       else if (!strcasecmp(powerAfterBoot, "Off"))
285       {
286         logger->log("Command", Log::INFO, "Config says Power After Boot = Off");
287         doStandby();
288         return; // quit here
289       }
290       else if (!strcasecmp(powerAfterBoot, "Last state"))
291       {
292         char* lastPowerState = vdr->configLoad("General", "Last Power State");
293         if (lastPowerState)
294         {
295           if (!strcasecmp(lastPowerState, "On"))
296           {
297             logger->log("Command", Log::INFO, "Config says Last Power State = On");
298           }
299           else if (!strcasecmp(lastPowerState, "Off"))
300           {
301             logger->log("Command", Log::INFO, "Config says Last Power State = Off");
302             doStandby();
303             return; // quit here
304           }
305           else
306           {
307             logger->log("Command", Log::INFO, "Config General/Last Power State not understood");
308           }
309         }
310         else
311         {
312           logger->log("Command", Log::INFO, "Config General/Last Power State not found");
313         }
314       }
315       else
316       {
317         logger->log("Command", Log::INFO, "Config/Power After Boot not understood");
318       }
319     }
320     else
321     {
322       logger->log("Command", Log::INFO, "Config General/Power After Boot not found");
323     }
324   }
325
326
327   // Go S-Video if config says so
328
329   char* svideo = vdr->configLoad("TV", "S-Video");
330
331   if (svideo)
332   {
333     if (!strcasecmp(svideo, "Yes"))
334     {
335       logger->log("Command", Log::INFO, "Switching to S-Video as S-Video=%s", svideo);
336       video->setConnection(Video::SVIDEO);
337     }
338     else
339     {
340       logger->log("Command", Log::INFO, "Leaving video output as S-Video=%s", svideo);
341       video->setConnection(Video::COMPOSITERGB);
342     }
343   }
344   else
345   {
346     logger->log("Command", Log::INFO, "Config TV/S-Video not found");
347   }
348
349   // Set remote type
350
351   char* remoteType = vdr->configLoad("General", "Remote type");
352
353   if (remoteType)
354   {
355     if (!strcasecmp(remoteType, "New"))
356     {
357       logger->log("Command", Log::INFO, "Switching to New remote type");
358       remote->setRemoteType(Remote::NEWREMOTE);
359     }
360     else
361     {
362       logger->log("Command", Log::INFO, "Switching to Old remote type");
363       remote->setRemoteType(Remote::OLDREMOTE);
364     }
365   }
366   else
367   {
368     logger->log("Command", Log::INFO, "Config General/Remote type not found");
369     remote->setRemoteType(Remote::OLDREMOTE);
370   }
371
372   // Save power state = on
373
374   vdr->configSave("General", "Last Power State", "On");
375
376   // Get TV aspect ratio
377
378   char* aspect = vdr->configLoad("TV", "Aspect");
379
380   if (aspect)
381   {
382     if (!strcasecmp(aspect, "16:9"))
383     {
384       logger->log("Command", Log::INFO, "/// Switching to TV aspect 16:9");
385       video->setTVsize(Video::ASPECT16X9);
386     }
387     else
388     {
389       logger->log("Command", Log::INFO, "/// Switching to TV aspect 4:3");
390       video->setTVsize(Video::ASPECT4X3);
391     }
392   }
393   else
394   {
395     logger->log("Command", Log::INFO, "Config TV/Aspect type not found, going 4:3");
396     video->setTVsize(Video::ASPECT4X3);
397   }
398
399   // config done
400
401   viewman->removeView(vi);
402
403   VWelcome* vw = new VWelcome();
404   vw->draw();
405   vw->show();
406   viewman->add(vw);
407 //  viewman->redrawAll();
408
409 /*
410   handleCommand(Remote::DOWN);
411   handleCommand(Remote::DOWN);
412   handleCommand(Remote::DOWN);
413   handleCommand(Remote::OK);
414 */
415 }