aboutsummaryrefslogtreecommitdiff
path: root/ParrotZikTray.py
diff options
context:
space:
mode:
authorDmitry Moiseev <m0sia@m0sia.ru>2013-11-18 18:16:39 +0600
committerDmitry Moiseev <m0sia@m0sia.ru>2013-11-18 18:16:39 +0600
commit7cdabc6754a5150a5f0e2039148aa11163cbb297 (patch)
tree4e352f5dabbd63b44b6b6b75971e76b00f0673f2 /ParrotZikTray.py
parentc932addf717a1f241dbc2a4ad8f78e9b5166e7ce (diff)
downloadpyParrotZikTCP-7cdabc6754a5150a5f0e2039148aa11163cbb297.tar.xz
pyParrotZikTCP-7cdabc6754a5150a5f0e2039148aa11163cbb297.zip
Added charging state support
Diffstat (limited to '')
-rw-r--r--ParrotZikTray.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/ParrotZikTray.py b/ParrotZikTray.py
new file mode 100644
index 0000000..4d6a6b0
--- /dev/null
+++ b/ParrotZikTray.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+
+import sys
+import gtk
+import re
+import os
+import ParrotZik
+
+UPDATE_FREQUENCY = 30 # seconds
+
+class ParrotZikIndicator:
+ def __init__(self):
+
+ self.menu_setup()
+
+ if sys.platform=="linux2":
+ import appindicator
+ self.icon_directory = os.path.sep + 'usr' + os.path.sep+ 'share' + os.path.sep+'icons' + os.path.sep+'zik'+ os.path.sep
+ self.statusicon = appindicator.Indicator("new-parrotzik-indicator",
+ "indicator-messages",
+ appindicator.CATEGORY_APPLICATION_STATUS)
+ self.statusicon.set_status(appindicator.STATUS_ACTIVE)
+ self.statusicon.set_icon_theme_path(self.icon_directory)
+ self.statusicon.set_menu(self.menu)
+ else:
+ print "Win32"
+ self.icon_directory = os.path.dirname(os.path.realpath(sys.argv[0])) + os.path.sep+ 'share' + os.path.sep+'icons' + os.path.sep+'zik'+ os.path.sep
+ self.statusicon = gtk.StatusIcon()
+ self.statusicon.connect("popup-menu", self.gtk_right_click_event)
+ self.statusicon.set_tooltip("Parrot Zik")
+ self.menu_shown=False
+ sys.stdout = open("debug.log", "w")
+ sys.stderr = open("debug.log", "w")
+
+ self.setIcon("audio-headset")
+ self.connected=False
+
+ self.p = re.compile('90:03:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}')
+
+ return
+
+ def pos(menu, ignore, icon):
+ return (Gtk.StatusIcon.position_menu(menu, icon))
+
+ def setIcon(self, name):
+ if sys.platform=="linux2":
+ self.statusicon.set_icon(name)
+ else:
+ self.statusicon.set_from_file(self.icon_directory+name+'.png')
+
+ def gtk_right_click_event(self, icon, button, time):
+ if not self.menu_shown:
+ self.menu_shown=True
+ self.menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.statusicon)
+ else:
+ self.menu_shown=False
+ self.menu.popdown()
+
+ def menu_setup(self):
+ self.menu = gtk.Menu()
+
+ self.info_item = gtk.MenuItem("Parrot Zik Not connected..")
+ self.info_item.set_sensitive(False)
+ self.info_item.show()
+ self.menu.append(self.info_item)
+
+ self.check = gtk.CheckMenuItem("Noise Cancellation")
+ self.check.connect("activate", self.toggleANC)
+ self.check.set_sensitive(False)
+ self.check.show()
+ self.menu.append(self.check)
+
+ self.check2 = gtk.CheckMenuItem("Auto Connection")
+ self.check2.connect("activate", self.toggleAuto)
+ self.check2.set_sensitive(False)
+ self.check2.show()
+ self.menu.append(self.check2)
+
+ self.about = gtk.MenuItem()
+ self.about.set_label("About")
+ self.about.connect("activate", self.show_about_dialog)
+ self.about.show()
+ self.menu.append(self.about)
+
+ self.quit_item = gtk.MenuItem("Quit")
+ self.quit_item.connect("activate", self.quit)
+ self.quit_item.show()
+ self.menu.append(self.quit_item)
+
+ def ParrotZikMac(self):
+ if sys.platform == "linux2":
+ out = os.popen("bluez-test-device list").read()
+ res = self.p.findall(out)
+ if len(res)>0:
+ return res[0]
+ else:
+ return ''
+ else:
+ import _winreg
+ aReg = _winreg.ConnectRegistry(None,_winreg.HKEY_LOCAL_MACHINE)
+ aKey = _winreg.OpenKey(aReg, 'SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices')
+ for i in range(10):
+ try:
+ asubkey_name=_winreg.EnumKey(aKey,i)
+ mac =':'.join(asubkey_name[i:i+2] for i in range(0,12,2))
+ res = self.p.findall(mac)
+ if len(res)>0:
+ return res[0]
+ else:
+ return ''
+ except EnvironmentError:
+ break
+
+
+ def EstablishConnection(self):
+ if self.connected:
+ if not self.parrot.sock:
+ print "Lost connection"
+ self.connected = False
+ else:
+ print "Connection already established"
+ else:
+ mac=self.ParrotZikMac()
+ if mac:
+ self.parrot = ParrotZik.ParrotZik(mac)
+ if not self.parrot.sock:
+ print "Failed to connect to Parrot Zik %s" % mac
+ return False
+
+ self.connected = True
+ self.name = self.parrot.getFriendlyName()
+ self.version = self.parrot.getVersion()
+
+ self.check.set_sensitive(True)
+ if self.parrot.getNoiseCancel() == "true":
+ self.check.set_active(True)
+ else:
+ self.check.set_active(False)
+
+ self.check2.set_sensitive(True)
+ if self.parrot.getAutoConnection() == "true":
+ self.check2.set_active(True)
+ else:
+ self.check2.set_active(False)
+
+ self.CheckBattery()
+ return True
+
+ def toggleANC(self,widget):
+ if self.connected:
+ if self.check.get_active():
+ self.parrot.setNoiseCancel("true")
+ else:
+ self.parrot.setNoiseCancel("false")
+
+ def toggleAuto(self,widget):
+ if self.connected:
+ if self.check2.get_active():
+ self.parrot.setAutoConnection("true")
+ else:
+ self.parrot.setAutoConnection("false")
+
+ def CheckBattery(self):
+ if self.connected:
+ print "Updating battery"
+ self.batteryLevel = int(self.parrot.getBatteryLevel())
+
+ if self.parrot.BatteryCharging:
+ self.batteryLevel = "Charging"
+ self.setIcon("zik-battery-charging")
+ self.batteryLevel="Unknown"
+ self.batteryState="Charging"
+ elif self.batteryLevel>80:
+ self.setIcon("zik-battery-100")
+ self.batteryState="In Use"
+ elif self.batteryLevel>60:
+ self.setIcon("zik-battery-080")
+ self.batteryState="In Use"
+ elif self.batteryLevel>40:
+ self.setIcon("zik-battery-060")
+ self.batteryState="In Use"
+ elif self.batteryLevel>20:
+ self.setIcon("zik-battery-040")
+ self.batteryState="In Use"
+ else:
+ self.setIcon("zik-battery-low")
+ self.batteryState="In Use"
+
+ self.info_item.set_label("Connected to: "+self.name+
+ "\nFirmware version: "+self.version+
+ "\nState: "+self.batteryState+
+ "\nBattery Level: "+str(self.batteryLevel))
+ else:
+ self.setIcon("zik-audio-headset")
+ self.info_item.set_label("Parrot Zik Not connected..")
+ self.check.set_sensitive(False)
+ self.check2.set_sensitive(False)
+ return True
+
+ def show_about_dialog(self, widget):
+ about_dialog = gtk.AboutDialog()
+
+ about_dialog.set_destroy_with_parent(True)
+ about_dialog.set_name("Parrot Zik Tray")
+ about_dialog.set_version("0.1")
+ about_dialog.set_authors(["Dmitry Moiseev m0sia@m0sia.ru"])
+ about_dialog.run()
+ about_dialog.destroy()
+
+ def main(self):
+ self.EstablishConnection()
+ gtk.timeout_add(UPDATE_FREQUENCY * 1000, self.EstablishConnection)
+ gtk.timeout_add(UPDATE_FREQUENCY * 1000, self.CheckBattery)
+ gtk.main()
+
+ def quit(self, widget):
+ sys.exit(0)
+
+if __name__ == "__main__":
+ indicator = ParrotZikIndicator()
+ indicator.main() \ No newline at end of file