1 # -*- coding: utf-8 -*-
3 # maintainer: <plnick@vuplus-support.org>
5 #This plugin is free software, you are allowed to
6 #modify it (if you keep the license),
7 #but you are not allowed to distribute/publish
8 #it without source code (this version and your modifications).
9 #This means you also have to distribute
10 #source code of your modifications.
14 from Screens.Screen import Screen
15 from Screens.MessageBox import MessageBox
16 from Plugins.Plugin import PluginDescriptor
17 from Components.ActionMap import ActionMap,NumberActionMap
18 from enigma import eActionMap
19 from Components.config import config, getConfigListEntry, ConfigInteger, ConfigSubsection, ConfigSelection, ConfigText, ConfigYesNo, NoSave, ConfigNothing
20 from Components.ConfigList import ConfigListScreen
21 from Components.HdmiCec import HdmiCec
22 from Components.Sources.StaticText import StaticText
23 from Tools import Notifications
25 from enigma import eHdmiCEC
27 from Components.InputDevice import iInputDevices
29 class HdmiCecPlugin(Screen,ConfigListScreen):
31 <screen position="center,center" size="590,320" title="HDMI-CEC Plugin" >
32 <ePixmap pixmap="skin_default/buttons/red.png" position="20,0" size="140,40" alphatest="on" />
33 <ePixmap pixmap="skin_default/buttons/green.png" position="160,0" size="140,40" alphatest="on" />
34 <ePixmap pixmap="skin_default/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" />
35 <ePixmap pixmap="skin_default/buttons/blue.png" position="440,0" size="140,40" alphatest="on" />
37 <widget source="key_red" render="Label" position="20,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#9f1313" transparent="1" />
38 <widget source="key_green" render="Label" position="160,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#1f771f" transparent="1" />
39 <widget source="key_yellow" render="Label" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#a08500" transparent="1" />
40 <widget source="key_blue" render="Label" position="440,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#18188b" transparent="1" />
42 <widget name="config" zPosition="2" position="30,50" size="540,270" scrollbarMode="showOnDemand" transparent="1" />
45 def __init__(self, session):
46 Screen.__init__(self, session)
47 config.hdmicec.input_address = ConfigText(default = "0", visible_width = 50, fixed_size = False)
48 config.hdmicec.input_value1 = ConfigText(default = "0", visible_width = 50, fixed_size = False)
49 config.hdmicec.input_value2 = ConfigText(default = "", visible_width = 50, fixed_size = False)
50 config.hdmicec.input_value3 = ConfigText(default = "", visible_width = 50, fixed_size = False)
51 config.hdmicec.input_value4 = ConfigText(default = "", visible_width = 50, fixed_size = False)
52 config.hdmicec.avvolup = NoSave(ConfigNothing())
53 config.hdmicec.avvoldown = NoSave(ConfigNothing())
54 config.hdmicec.avvolmute = NoSave(ConfigNothing())
55 config.hdmicec.avpwroff = NoSave(ConfigNothing())
56 config.hdmicec.avpwron = NoSave(ConfigNothing())
57 config.hdmicec.tvpwroff = NoSave(ConfigNothing())
58 config.hdmicec.tvpwron = NoSave(ConfigNothing())
59 self["key_red"] = StaticText(_("Close"))
60 self["key_green"] = StaticText(_("Save"))
61 self["key_yellow"] = StaticText(_("Connect"))
62 self["key_blue"] = StaticText(_("Disconnect"))
63 self["shortcuts"] = ActionMap(["ShortcutActions", "SetupActions", "NumberActions" ],
66 "cancel": self.keyCancel,
67 "red": self.keyCancel,
68 "green": self.keySave,
69 "yellow": self.keyConnect,
70 "blue": self.keyDisconnect,
73 ConfigListScreen.__init__(self, self.list,session = session)
76 def createSetup(self):
78 self.hdmienabled = getConfigListEntry(_(_("HDMI CEC enabled:")), config.hdmicec.enabled)
79 self.hdmiactivesourcereply = getConfigListEntry(_(_("Active Source Reply On:")), config.hdmicec.active_source_reply)
80 self.hdmitvstandby = getConfigListEntry(_("VU standby => TV activity:"), config.hdmicec.standby_message)
81 self.hdmitvdeepstandby = getConfigListEntry(_("VU deepstandby => TV activity:"), config.hdmicec.deepstandby_message)
82 self.hdmitvwakeup = getConfigListEntry(_("VU on => TV activity:"), config.hdmicec.wakeup_message)
83 self.hdmivustandby = getConfigListEntry(_("TV standby => VU+ activity:"), config.hdmicec.vustandby_message)
84 self.hdmivuwakeup = getConfigListEntry(_("TV on => VU+ activity:"), config.hdmicec.vuwakeup_message)
85 self.hdmitvinput = getConfigListEntry(_("Choose TV HDMI input:"), config.hdmicec.tvinput)
86 self.hdmiavinput = getConfigListEntry(_("Choose A/V-Receiver HDMI input:"), config.hdmicec.avinput)
87 self.hdmiavvolup = getConfigListEntry(_("A/V-Receiver volume up:"), config.hdmicec.avvolup)
88 self.hdmiavvoldown = getConfigListEntry(_("A/V-Receiver volume down:"), config.hdmicec.avvoldown)
89 self.hdmiavvolmute = getConfigListEntry(_("A/V-Receiver toggle mute:"), config.hdmicec.avvolmute)
90 self.hdmiavpwron = getConfigListEntry(_("A/V-Receiver power on:"), config.hdmicec.avpwron)
91 self.hdmiavpwroff = getConfigListEntry(_("A/V-Receiver power off:"), config.hdmicec.avpwroff)
92 self.hdmitvpwron = getConfigListEntry(_("TV power on:"), config.hdmicec.tvpwron)
93 self.hdmitvpwroff = getConfigListEntry(_("TV power off:"), config.hdmicec.tvpwroff)
94 self.hdmienabletvrc = getConfigListEntry(_("Use TV remotecontrol:"), config.hdmicec.enabletvrc)
95 self.hdmidevicename = getConfigListEntry(_("Set VU device name:"), config.hdmicec.devicename)
96 self.hdmiinputaddress = getConfigListEntry(_("Address (0~FF):"), config.hdmicec.input_address)
97 self.hdmiinputvalue1 = getConfigListEntry("Value 1 (message):", config.hdmicec.input_value1)
98 self.hdmiinputvalue2 = getConfigListEntry("Value 2 (optional):", config.hdmicec.input_value2)
99 self.hdmiinputvalue3 = getConfigListEntry("Value 3 (optional):", config.hdmicec.input_value3)
100 self.hdmiinputvalue4 = getConfigListEntry("Value 4 (optional):", config.hdmicec.input_value4)
101 self.hdmilogenabledfile = getConfigListEntry("Log to file enabled :", config.hdmicec.logenabledfile)
102 self.hdmilogenabledserial = getConfigListEntry("Serial log enabled :", config.hdmicec.logenabledserial)
103 # self.list.append( self.hdmiinputaddress )
104 # self.list.append( self.hdmiinputvalue1 )
105 # self.list.append( self.hdmiinputvalue2 )
106 # self.list.append( self.hdmiinputvalue3 )
107 # self.list.append( self.hdmiinputvalue4 )
108 # self.list.append( self.hdmilogenabledfile )
109 self.list.append( self.hdmienabled )
110 if config.hdmicec.enabled.value is True:
111 self.list.append( self.hdmidevicename )
112 self.list.append( self.hdmitvinput )
113 self.list.append( self.hdmiavinput )
114 self.list.append( self.hdmivuwakeup )
115 self.list.append( self.hdmivustandby )
116 self.list.append( self.hdmitvwakeup )
117 self.list.append( self.hdmitvstandby )
118 self.list.append( self.hdmitvdeepstandby )
119 if config.hdmicec.avinput.value is not "0":
120 self.list.append( self.hdmiavvolup )
121 self.list.append( self.hdmiavvoldown )
122 self.list.append( self.hdmiavvolmute )
123 self.list.append( self.hdmiavpwron )
124 self.list.append( self.hdmiavpwroff )
125 self.list.append( self.hdmitvpwron )
126 self.list.append( self.hdmitvpwroff )
127 self.list.append( self.hdmienabletvrc )
128 self.list.append( self.hdmiactivesourcereply )
129 self.list.append( self.hdmilogenabledserial )
130 self["config"].list = self.list
131 self["config"].l.setList(self.list)
133 def keyDisconnect(self):
136 physaddress1 = int("0x" + str(config.hdmicec.tvinput.value) + str(config.hdmicec.avinput.value),16)
137 physaddress2 = int("0x00",16)
138 address = int('0',16)
139 cecmessage = int('0x9D',16)
140 cecmessagetwo = physaddress1
141 cecmessagethree = physaddress2
142 cmd = struct.pack('BBB',cecmessage,cecmessagetwo,cecmessagethree)
143 logcmd = "[HDMI-CEC] send cec message %x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,address)
146 eHdmiCEC.getInstance().sendMessage(address, len(cmd), str(cmd))
149 if config.hdmicec.logenabledserial.value:
151 if config.hdmicec.logenabledfile.value:
152 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
158 addresstmp=config.hdmicec.input_address.value
159 tmp1=config.hdmicec.input_value1.value
160 tmp2=config.hdmicec.input_value2.value
161 tmp3=config.hdmicec.input_value3.value
162 tmp4=config.hdmicec.input_value4.value
163 address=int(addresstmp,16)
164 if address not in range(0,256):
171 if val1 not in range(0,256):
173 if val2 not in range(0,256):
175 if val3 not in range(0,256):
177 if val4 not in range(0,256):
179 cmd = struct.pack('BBBB',val1,val2,val3,val4)
180 logcmd = "[HDMI-CEC] ** Test Message ** Send message value: %x:%x:%x:%x to address %x" % (val1,val2,val3,val4,address)
187 if val1 not in range(0,256):
189 if val2 not in range(0,256):
191 if val3 not in range(0,256):
193 cmd = struct.pack('BBB',val1,val2,val3)
194 logcmd = "[HDMI-CEC] ** Test Message ** Send message value: %x:%x:%x to address %x" % (val1,val2,val3,address)
200 if val1 not in range(0,256):
202 if val2 not in range(0,256):
204 cmd = struct.pack('BB',val1,val2)
205 logcmd = "[HDMI-CEC] ** Test Message ** Send message value: %x:%x to address %x" % (val1,val2,address)
208 if val1 not in range(0,256):
210 cmd = struct.pack('B',val1)
211 logcmd = "[HDMI-CEC] ** Test Message ** Send message value: %x to address %x" % (val1, address)
214 eHdmiCEC.getInstance().sendMessage(address, len(cmd), str(cmd))
217 if config.hdmicec.logenabledserial.value:
219 if config.hdmicec.logenabledfile.value:
220 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
226 if self["config"].getCurrent() == self.hdmiavvolup:
227 address = int("5",16)
228 cecmessage = int("44",16)
229 cecmessagetwo = int("41",16)
230 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
231 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
232 elif self["config"].getCurrent() == self.hdmiavvoldown:
233 address = int("5",16)
234 cecmessage = int("44",16)
235 cecmessagetwo = int("42",16)
236 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
237 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
238 elif self["config"].getCurrent() == self.hdmiavvolmute:
239 address = int("5",16)
240 cecmessage = int("44",16)
241 cecmessagetwo = int("43",16)
242 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
243 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
244 elif self["config"].getCurrent() == self.hdmiavpwron:
245 address = int("5",16)
246 cecmessage = int("44",16)
247 cecmessagetwo = int("6D",16)
248 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
249 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
250 elif self["config"].getCurrent() == self.hdmiavpwroff:
251 address = int("5",16)
252 cecmessage = int("44",16)
253 cecmessagetwo = int("6C",16)
254 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
255 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
256 elif self["config"].getCurrent() == self.hdmitvpwroff:
257 address = int("0",16)
258 cecmessage = int("36",16)
259 cmd = struct.pack('B',cecmessage)
260 logcmd = "[HDMI-CEC] send cec message %x to %x" % (cecmessage,address)
261 elif self["config"].getCurrent() == self.hdmitvpwron:
262 address = int("0",16)
263 cecmessage = int("04",16)
264 cmd = struct.pack('B',cecmessage)
265 logcmd = "[HDMI-CEC] send cec message %x to %x" % (cecmessage,address)
267 ConfigListScreen.keySave(self)
269 eHdmiCEC.getInstance().sendMessage(address, len(cmd), str(cmd))
270 messagecmd = int("45",16)
273 if config.hdmicec.logenabledserial.value:
275 if config.hdmicec.logenabledfile.value:
276 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
279 def keyConnect(self):
282 messageReceived(address, message)
285 ConfigListScreen.keyLeft(self)
286 if self["config"].getCurrent() == self.hdmienabled:
288 if self["config"].getCurrent() == self.hdmiavinput:
292 ConfigListScreen.keyRight(self)
293 if self["config"].getCurrent() == self.hdmienabled:
295 if self["config"].getCurrent() == self.hdmiavinput:
302 ConfigListScreen.keySave(self)
304 def openconfig(session, **kwargs):
305 session.open(HdmiCecPlugin)
307 def autostart(reason, **kwargs):
309 if kwargs.has_key("session") and reason == 0:
310 session = kwargs["session"]
311 eHdmiCEC.getInstance().messageReceived.get().append(messageReceived)
312 eHdmiCEC.getInstance().messageReceivedKey.get().append(messageReceivedKey)
314 def Plugins(**kwargs):
315 return [PluginDescriptor(name=_("HDMI-CEC"), description="HDMI-CEC Configuration", where = PluginDescriptor.WHERE_PLUGINMENU, needsRestart = True, fnc=openconfig),
316 PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart)]
318 def messageReceived(address, message):
319 logcmd = "[HDMI-CEC] received cec message %x from %x" % (message, address)
321 if config.hdmicec.logenabledserial.value:
323 if config.hdmicec.logenabledfile.value:
324 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
327 if config.hdmicec.enabled.value is True:
328 from Screens.Standby import inStandby
329 from Screens.Standby import Standby
337 physaddress1 = int("0x" + str(config.hdmicec.tvinput.value) + str(config.hdmicec.avinput.value),16)
338 physaddress2 = int("0x00",16)
340 addresstv = int("0x00",16)
341 addressav = int("0x05",16)
342 addressglobal = int("0x0F",16)
344 powerstatereportmessage = int("0x90",16)
345 powerstate = int("0x00",16)
347 physaddressmessage = int('0x84',16)
348 devicetypmessage = int('0x03',16)
350 activesourcemessage = int('0x82',16)
352 menuonmessage = int('0x8E',16)
353 menustatemessage = int('0x00',16)
355 setnamemessage = int('0x47',16)
357 sendkeymessage = int("44",16)
358 sendkeypwronmessage = int("6D",16)
359 sendkeypwroffmessage = int("6C",16)
361 if message == 0x8f: # request power state
363 cecmessage = powerstatereportmessage
364 cecmessagetwo = powerstate
365 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
366 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
368 elif message == 0x83: # request physical address
369 address = addressglobal
370 cecmessage = physaddressmessage
371 cecmessagetwo = physaddress1
372 cecmessagethree = physaddress2
373 cecmessagefour = devicetypmessage
374 cmd = struct.pack('BBBB',cecmessage,cecmessagetwo,cecmessagethree,cecmessagefour)
375 logcmd = "[HDMI-CEC] send cec message %x:%x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,cecmessagefour,address)
377 elif message == 0x86: # request streampath
378 address = addressglobal
379 cecmessage = activesourcemessage
380 cecmessagetwo = physaddress1
381 cecmessagethree = physaddress2
382 cmd = struct.pack('BBB',cecmessage,cecmessagetwo,cecmessagethree)
383 logcmd = "[HDMI-CEC] send cec message %x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,address)
385 if config.hdmicec.enabletvrc.value:
386 addresstwo = addresstv
387 cecmessage = menuonmessage
388 cecmessagetwo = menustatemessage
389 cmdtwo = struct.pack('BB',cecmessage,cecmessagetwo)
390 logcmdtwo = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
392 elif message == 0x8d: # request menu state
393 if config.hdmicec.enabletvrc.value:
395 cecmessage = menuonmessage
396 cecmessagetwo = menustatemessage
397 cmd = struct.pack('BB',cecmessage,cecmessagetwo)
398 logcmd = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
400 elif message == 0x46: # request device name
402 cecmessage = setnamemessage
403 name_len = len(config.hdmicec.devicename.value)
406 cmd = struct.pack('B4s',cecmessage,cecmessagetwo)
408 cecmessagetwo = config.hdmicec.devicename.value
409 cmd = struct.pack('B'+str(name_len+1)+'s',cecmessage,cecmessagetwo)
410 logcmd = "[HDMI-CEC] send cec message %x:%s to %x" % (cecmessage,cecmessagetwo,address)
412 elif message == 0x85: # request active source
414 address = addressglobal
415 cecmessage = activesourcemessage
416 cecmessagetwo = physaddress1
417 cecmessagethree = physaddress2
418 cmd = struct.pack('BBB',cecmessage,cecmessagetwo,cecmessagethree)
419 logcmd = "[HDMI-CEC] send cec message %x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,address)
421 if config.hdmicec.enabletvrc.value:
422 addresstwo = addresstv
423 cecmessage = menuonmessage
424 cecmessagetwo = menustatemessage
425 cmdtwo = struct.pack('BB',cecmessage,cecmessagetwo)
426 logcmdtwo = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
429 if config.hdmicec.vuwakeup_message.value == "vuwakeup":
431 address = addressglobal
432 cecmessage = activesourcemessage
433 cecmessagetwo = physaddress1
434 cecmessagethree = physaddress2
435 cmd = struct.pack('BBB',cecmessage,cecmessagetwo,cecmessagethree)
436 logcmd = "[HDMI-CEC] send cec message %x:%x:%x to %x" % (cecmessage,cecmessagetwo,cecmessagethree,address)
438 if config.hdmicec.enabletvrc.value:
439 addresstwo = addresstv
440 cecmessage = menuonmessage
441 cecmessagetwo = menustatemessage
442 cmdtwo = struct.pack('BB',cecmessage,cecmessagetwo)
443 logcmdtwo = "[HDMI-CEC] send cec message %x:%x to %x" % (cecmessage,cecmessagetwo,address)
445 elif message == 0x36:
446 if config.hdmicec.vustandby_message.value == "vustandby":
447 if inStandby == None:
448 logcmd = "[HDMI-CEC] VU+ STB goto standby"
449 session.open(Standby)
450 elif config.hdmicec.vustandby_message.value == "vudeepstandby":
451 import Screens.Standby
452 logcmd = "[HDMI-CEC] VU+ STB goto deepstandby"
453 session.open(Screens.Standby.TryQuitMainloop,1)
456 eHdmiCEC.getInstance().sendMessage(address, len(cmd), str(cmd))
458 eHdmiCEC.getInstance().sendMessage(addresstwo, len(cmdtwo), str(cmdtwo))
461 if config.hdmicec.logenabledserial.value:
463 if config.hdmicec.logenabledfile.value:
464 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
467 if config.hdmicec.logenabledserial.value:
469 if config.hdmicec.logenabledfile.value:
470 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmdtwo)
473 def messageReceivedKey(address, message):
474 logcmd = "[HDMI-CEC] received cec message part two %x from %x" % (message, address)
476 if config.hdmicec.logenabledserial.value:
478 if config.hdmicec.logenabledfile.value:
479 filelog = "echo %s >> /tmp/hdmicec.log" % (logcmd)
481 if config.hdmicec.enabled.value is True:
482 rcdevicename = iInputDevices.getDeviceName('event0') # hschang : get rc device name, /dev/input/event0
483 keyaction = eActionMap.getInstance()
485 #start translate keycodes
486 if message == 0x32 or message == 0x09: #key menu
488 elif message == 0x20: #key 0
490 elif message == 0x21: #key 1
492 elif message == 0x22: #key 2
494 elif message == 0x23: #key 3
496 elif message == 0x24: #key 4
498 elif message == 0x25: #key 5
500 elif message == 0x26: #key 6
502 elif message == 0x27: #key 7
504 elif message == 0x28: #key 8
506 elif message == 0x29: #key 10
508 elif message == 0x30: #key bouquet up
510 elif message == 0x31: #key bouquet down
512 elif message == 0x53: #key info/epg
514 elif message == 0x00: #key ok
516 elif message == 0x03: #key left
518 elif message == 0x04: #key right
520 elif message == 0x01: #key up
522 elif message == 0x02: #key down
524 elif message == 0x0d: #key exit
526 elif message == 0x72: #key red
528 elif message == 0x71: #key blue
530 elif message == 0x73: #key green
532 elif message == 0x74: #key yellow
534 elif message == 0x44: #key play
535 if rcdevicename.find("advanced"):
536 key = int(164) # KEY_PLAYPAUSE
538 key = int(207) # KEY_PLAY
539 elif message == 0x46: #key pause
540 if rcdevicename.find("advanced"):
541 key = int(164) # KEY_PLAYPAUSE
543 key = int(119) # KEY_PAUSE
544 elif message == 0x45: #key stop
546 elif message == 0x47: #key record
548 elif message == 0x49: #fast forward
549 if rcdevicename.find("advanced"):
550 key = int(163) # KEY_NEXTSONG
552 key = int(208) # KEY_FASTFORWARD
553 elif message == 0x48: #rewind
554 if rcdevicename.find("advanced"):
555 key = int(165) # KEY_NEXTSONG
557 key = int(168) # KEY_FASTFORWARD
558 elif message == 0x60: #play 2
560 elif message == 0x61: #key pause 2
561 if rcdevicename.find("advanced"):
562 key = int(164) # KEY_PLAYPAUSE
564 key = int(119) # KEY_PAUSE
565 elif message == 0x64: #key stop 2
567 elif message == 0x62: #key record 2
569 #end translate keycodes
571 keyaction.keyPressed(rcdevicename, key, int(0))
572 keyaction.keyPressed(rcdevicename, key, int(1))