BUGFIX: Optimize strings and borders to fit layout on Neo1973
BUGFIX: Do not set default route yet FEATURE: Add Label with visible Name FEATURE: Generate IP Address from configured mask + last byte of BT Address FEATURE: Set pand state from actual deamon state OPTIMIZATION: Only wait until hci- and ifconfig are finished instead of fixed time CLEANUP: Remove unused functions git-svn-id: http://www.neo1973-germany.de/svn@60 46df4e5c-bc4e-4628-a0fc-830ba316316d
This commit is contained in:
parent
12551ae94f
commit
5d293b46f5
2 changed files with 73 additions and 51 deletions
|
@ -45,7 +45,7 @@ class BluetoothScanner(threading.Thread):
|
|||
self.update_callback(self.update_list())
|
||||
time.sleep(BLUETOOTH_UPDATE_INTERVAL) # scan every x seconds
|
||||
else:
|
||||
time.sleep(1) # check again if we are active in a second
|
||||
time.sleep(2) # check again if we are active in a second
|
||||
|
||||
|
||||
def set_active(self, active):
|
||||
|
@ -96,6 +96,8 @@ class BluetoothPanel(gtk.VBox):
|
|||
self.update_ui_condition = threading.Condition()
|
||||
self.scan_for_bt_peers = True # to be handled in critical section!
|
||||
self.async_updated = False # to be handled in critical section!
|
||||
self.visible_peers_backup = []
|
||||
self.connected_peers_backup = []
|
||||
|
||||
# creating backgroundscanner - not active by default
|
||||
self.bluetooth_scanner = BluetoothScanner(self.update_from_scanner)
|
||||
|
@ -110,6 +112,7 @@ class BluetoothPanel(gtk.VBox):
|
|||
self.visible_state_cbtn.set_active(True)
|
||||
self.update_btn.set_active(True)
|
||||
self.list_store1.append(("Scanning for ", "Peers", False))
|
||||
self.pand_state_cbtn.set_active(self.get_pand_state())
|
||||
self.update_infos()
|
||||
else:
|
||||
self.power_state_cbtn.set_active(False)
|
||||
|
@ -123,7 +126,7 @@ class BluetoothPanel(gtk.VBox):
|
|||
## Power State of Bluetooth Module
|
||||
cell_frame = gtk.Frame("Bluetooth State")
|
||||
upper_box = gtk.HBox()
|
||||
upper_box.set_border_width(15)
|
||||
upper_box.set_border_width(10)
|
||||
|
||||
# power
|
||||
self.power_state_cbtn = gtk.CheckButton("Powered")
|
||||
|
@ -156,9 +159,12 @@ class BluetoothPanel(gtk.VBox):
|
|||
## Info on BT state
|
||||
info_frame = gtk.Frame("Bluetooth Informations")
|
||||
info_box = gtk.VBox()
|
||||
info_box.set_border_width(15)
|
||||
self.address_label = gtk.Label("Bluetooth Address: %s" % self.get_address())
|
||||
self.ip_address_label = gtk.Label("IP Address: %s" % self.get_ip_address())
|
||||
info_box.set_border_width(10)
|
||||
|
||||
self.name_label = gtk.Label("Visible Name: %s" % self.get_name())
|
||||
self.address_label = gtk.Label("Address: %s" % self.get_address())
|
||||
self.ip_address_label = gtk.Label("IP: %s" % self.get_ip_address())
|
||||
info_box.add(self.name_label)
|
||||
info_box.add(self.address_label)
|
||||
info_box.add(self.ip_address_label)
|
||||
info_frame.add(info_box)
|
||||
|
@ -167,10 +173,10 @@ class BluetoothPanel(gtk.VBox):
|
|||
|
||||
scan_frame = gtk.Frame("Devices in range")
|
||||
scan_frame_box = gtk.VBox()
|
||||
scan_frame_box.set_border_width(15)
|
||||
scan_frame_box.set_border_width(10)
|
||||
(scroll_win, self.tree_view1, self.list_store1) = \
|
||||
self.make_list_view(3, \
|
||||
["Name", "Address", "PAN Link"], \
|
||||
["Name", "Address", "Link"], \
|
||||
["text", "text", "toggle"])
|
||||
scan_frame_box.pack_start(scroll_win, True, True, 0)
|
||||
|
||||
|
@ -233,6 +239,8 @@ class BluetoothPanel(gtk.VBox):
|
|||
if not self.async_updated: # to be handled in critical section!
|
||||
self.update_ui_condition.release() # -> critical section
|
||||
return True # Do nothing, keep going
|
||||
else:
|
||||
self.async_updated = False
|
||||
|
||||
self.list_store1.clear()
|
||||
# access the peer_list (which is written to by the scan thread)
|
||||
|
@ -249,13 +257,23 @@ class BluetoothPanel(gtk.VBox):
|
|||
def update_from_scanner(self, data):
|
||||
(visible_peers, connected_peers) = data
|
||||
|
||||
## this does not need synchronisation yet - only one thread calling
|
||||
## find out if anything has changed since last update
|
||||
if self.visible_peers_backup == visible_peers and \
|
||||
self.connected_peers_backup == connected_peers:
|
||||
return ## nothing to be done
|
||||
|
||||
self.visible_peers_backup = visible_peers
|
||||
self.connected_peers_backup = connected_peers
|
||||
|
||||
|
||||
self.update_ui_condition.acquire() # <- critical section
|
||||
self.peer_list = [] # to be handled in critical section!
|
||||
|
||||
for entry in visible_peers:
|
||||
## see if entry can be found in conneced list
|
||||
found = False
|
||||
for conneted in connected_peers:
|
||||
for connected in connected_peers:
|
||||
print "."
|
||||
if entry[1] == connected:
|
||||
found = True
|
||||
|
@ -298,6 +316,13 @@ class BluetoothPanel(gtk.VBox):
|
|||
|
||||
def toggle_listen_pand(self, event):
|
||||
if self.pand_state_cbtn.get_active():
|
||||
|
||||
# IP_address = "%s.%s" % (BLUETOOTH_IP_MASK, \
|
||||
# int(self.address.split(":")[-1], 16))
|
||||
# print "setting IP address to [%s]" % IP_address
|
||||
|
||||
|
||||
|
||||
print "Starting pand [pand -s]"
|
||||
os.system("pand -s")
|
||||
else:
|
||||
|
@ -321,6 +346,13 @@ class BluetoothPanel(gtk.VBox):
|
|||
return False
|
||||
|
||||
|
||||
def get_pand_state(self):
|
||||
if process_running("pand\0-s") or process_running("pand\0--listen"):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def connect_to_peer(self, event):
|
||||
|
||||
def call_cmd(string):
|
||||
|
@ -335,15 +367,11 @@ class BluetoothPanel(gtk.VBox):
|
|||
name = model.get_value(model_iter, 0) # column is first (name)
|
||||
addr = model.get_value(model_iter, 1) # column is second (adr)
|
||||
call_cmd("pand -c %s" % addr)
|
||||
time.sleep(1) ## time needed to create bnap device
|
||||
## convert last number of addr to decimal and user as last ip number
|
||||
call_cmd("ip a add 10.0.0.%s/24 dev bnep0" % \
|
||||
int(self.address.split(":")[-1], 16))
|
||||
## set main ip of bnep0 (in case a different ip was set)
|
||||
call_cmd("ifconfig bnep0 10.0.0.%s" % \
|
||||
int(self.address.split(":")[-1], 16))
|
||||
## set 10.0.0.1 to default GW - won't work if GW is set already
|
||||
call_cmd("ip r add default via 10.0.0.1")
|
||||
time.sleep(1)
|
||||
call_cmd("ifconfig bnep0 %s%s" % (BLUETOOTH_IP_MASK, \
|
||||
int(self.address.split(":")[-1], 16)))
|
||||
time.sleep(1) ## time needed to set ip
|
||||
self.update_infos()
|
||||
|
||||
|
||||
|
@ -359,53 +387,33 @@ class BluetoothPanel(gtk.VBox):
|
|||
found = True ## we've had no exception
|
||||
except:
|
||||
found = False
|
||||
print ("append: [%s,%s,%s]" % (string.strip().split("\t")[1], \
|
||||
string.strip().split("\t")[0], found))
|
||||
|
||||
self.list_store1.append((string.strip().split("\t")[1], \
|
||||
string.strip().split("\t")[0], found))
|
||||
|
||||
def ip_address_changed(self, string):
|
||||
# print "output of get_ip_address: [%s]" % string
|
||||
if len(string.split("inet addr:")) > 1:
|
||||
self.address_label.set_text("Bluetooth Address: %s" % \
|
||||
string.split("inet addr:")[1].split(" ")[0].strip())
|
||||
|
||||
|
||||
def bt_address_changed(self, string):
|
||||
# print "output of get_address: [%s]" % string
|
||||
if string.find("BD Address: "):
|
||||
if len(string.split("BD Address: ")) > 1 and \
|
||||
len(string.split("BD Address: ")[1].split(" ")) > 1:
|
||||
self.address = string.split("BD Address: ")[1].split(" ")[0]
|
||||
self.ip_address_label.set_text("Address: %s" % \
|
||||
string.split("BD Address: ")[1].split(" ")[0])
|
||||
else:
|
||||
self.ip_address_label.set_text("Address: offline")
|
||||
self.ip_address_label.set_text("Address: unknown")
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
####################### Interface to bluez tools ###############################
|
||||
################################################################################
|
||||
def update_infos(self):
|
||||
self.address_label.set_text("Bluetooth Address: %s" % self.get_address())
|
||||
self.ip_address_label = gtk.Label("IP Address: %s" % self.get_ip_address())
|
||||
self.name_label.set_text("Visible Name: %s" % self.get_name())
|
||||
self.address_label.set_text("Address: %s" % self.get_address())
|
||||
self.ip_address_label.set_text("IP: %s" % self.get_ip_address())
|
||||
|
||||
def get_name(self):
|
||||
hciconfig = ProcessInterface("hciconfig hci0 name")
|
||||
while not hciconfig.process_finished():
|
||||
time.sleep(0.1) ## wait for command to compute
|
||||
output = hciconfig.read_from_process()
|
||||
if output.find("Name:") >= 0:
|
||||
return output.split("Name:")[1].split("'")[1]
|
||||
return "down"
|
||||
|
||||
def get_ip_address(self):
|
||||
if len(self.address) <= 0:
|
||||
return "none"
|
||||
else: ## todo mind more than one device
|
||||
ifconfig = ProcessInterface("ifconfig bnep0")
|
||||
time.sleep(1) ## wait for command to compute
|
||||
output = ifconfig.read_from_process()
|
||||
# print "output of get_ip_address: [%s]" % output
|
||||
if len(output.split("inet addr:")) > 1:
|
||||
return output.split("inet addr:")[1].split(" ")[0].strip()
|
||||
|
||||
def get_address(self):
|
||||
hciconfig = ProcessInterface("%s %s" % (HCICONFIG_CMD, BLUETOOTH_DEVICE))
|
||||
time.sleep(1) ## wait for command to compute
|
||||
while not hciconfig.process_finished():
|
||||
time.sleep(0.1) ## wait for command to compute
|
||||
output = hciconfig.read_from_process()
|
||||
|
||||
# print "output of get_address: [%s]" % output
|
||||
|
@ -419,6 +427,19 @@ class BluetoothPanel(gtk.VBox):
|
|||
return "offline"
|
||||
return "unknown"
|
||||
|
||||
|
||||
def get_ip_address(self):
|
||||
if len(self.address) <= 0:
|
||||
return "none"
|
||||
else: ## todo mind more than one device
|
||||
ifconfig = ProcessInterface("ifconfig bnep0")
|
||||
while not ifconfig.process_finished():
|
||||
time.sleep(0.1) ## wait for command to compute
|
||||
output = ifconfig.read_from_process()
|
||||
# print "output of get_ip_address: [%s]" % output
|
||||
if len(output.split("inet addr:")) > 1:
|
||||
return output.split("inet addr:")[1].split(" ")[0].strip()
|
||||
|
||||
def get_features(self):
|
||||
"""using the hciconfig tool to get the list of supported features"""
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ HCICONFIG_CMD = "hciconfig" ## using $PATH
|
|||
HCITOOL_CMD = "hcitool" ## using $PATH
|
||||
BLUETOOTH_DEVICE = "hci0"
|
||||
BLUETOOTH_UPDATE_INTERVAL = 10 ## scan for Bluetooth Peers every 3 secs
|
||||
BLUETOOTH_IP_MASK = "10.0.0." ## last number will be added from BT-MAC
|
||||
|
||||
|
||||
################################################################################
|
||||
|
|
Loading…
Reference in a new issue