Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        [EMAIL PROTECTED]

You can reach the person managing the list at
        [EMAIL PROTECTED]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r4857 - developers/werner/ahrt/host/tmc/lib
      ([EMAIL PROTECTED])
   2. r4858 - in developers/erin_yueh: . bt
      ([EMAIL PROTECTED])
--- Begin Message ---
Author: werner
Date: 2008-12-08 13:23:16 +0100 (Mon, 08 Dec 2008)
New Revision: 4857

Modified:
   developers/werner/ahrt/host/tmc/lib/crc.py
   developers/werner/ahrt/host/tmc/lib/decode.py
   developers/werner/ahrt/host/tmc/lib/dxplore.py
   developers/werner/ahrt/host/tmc/lib/phosphor.py
   developers/werner/ahrt/host/tmc/lib/scope.py
   developers/werner/ahrt/host/tmc/lib/wave.py
Log:
Highlights:

- added basic USB decoding, a contribution from a non-Openmoko project

Details:

- lib/scope.py, lib/wave.py, lib/phosphor.py: use  hasattr(obj, "__iter__")
  instead of  isinstance(obj, list)
- lib/crc.py: added USB's CRC5
- lib/dxplore.py: split decoding into a pre-decode phase where the bits are
  collected and the actual decode phase. This facilitates the construction of
  multi-channel decoders.
- lib/decode.py: added decoding of the USB NRZI bitstream, bit-stuffing, and
  packet header and content (transfers are not yet decoded)



Modified: developers/werner/ahrt/host/tmc/lib/crc.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/crc.py  2008-12-08 10:18:26 UTC (rev 
4856)
+++ developers/werner/ahrt/host/tmc/lib/crc.py  2008-12-08 12:23:16 UTC (rev 
4857)
@@ -46,6 +46,8 @@
       0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31,
       0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 )
 
+    # Table for CRC-16 (polynomial x^16 + x^15 + x^2 + 1)
+
     crc16_syndrome = (
       0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
       0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
@@ -80,6 +82,28 @@
       0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
       0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 )
 
+    #
+    # USB CRC5 (x^4 + x^3)
+    #
+    # According to http://www.usb.org/developers/whitepapers/crcdes.pdf
+    #
+    # To obtain the USB CRC5, crc = crc5(0x1f, data, 11) ^ 0x1f
+    #
+
+    def crc5(self, crc, value, bits):
+       #
+       # polynomial is 0x05 reversed, then shifted one position to the left
+       # original 00101
+       # reverse  10100
+       # shift   101000
+       #
+       poly = 0x28
+       for b in range(0, bits):
+           if ((value >> b) & 1) != (crc & 1):
+               crc ^= poly
+           crc >>= 1
+       return crc & 0x1f
+       
     def crc7(self, crc, bytes):
        for b in bytes:
            crc = self.crc7_syndrome[(crc << 1) ^ b]

Modified: developers/werner/ahrt/host/tmc/lib/decode.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/decode.py       2008-12-08 10:18:26 UTC 
(rev 4856)
+++ developers/werner/ahrt/host/tmc/lib/decode.py       2008-12-08 12:23:16 UTC 
(rev 4857)
@@ -31,6 +31,9 @@
 g_crc = tmc.crc.crc()
 
 
+d_table = {}
+
+
 def d_bits(bits):
     s = ""
     for b in bits:
@@ -327,6 +330,248 @@
     return s
 
 
+def usb_field(raw, bits):
+    bit = 0
+    got = 0
+    byte = 0
+    while bit != len(raw):
+       if raw[bit] == "S":
+           bit += 1
+           continue
+       if raw[bit] == "X":
+           return None
+       elif raw[bit]:
+           byte |= 1 << got
+       got += 1
+       bit += 1
+       if got == bits:
+           del raw[0:bit]
+           return byte
+    return None
+
+
+def usb_token(raw):
+    addr = usb_field(raw, 7)
+    if addr is None:
+       return ""
+    s = "%d" % addr
+
+    ep = usb_field(raw, 4)
+    if ep is None:
+       return s
+    s += "/%d" % ep
+
+    expect = g_crc.crc5(0x1f, ep << 7 | addr, 11) ^ 0x1f
+
+    crc = usb_field(raw, 5)
+    if crc is None:
+       return s
+
+    if crc == expect and len(raw) == 0:
+       return s
+
+    s += ",CRC%02X" % crc
+    if crc != expect:
+       s += "/%02X" % expect
+
+    return s
+
+
+def usb_sof(raw):
+    frame = usb_field(raw, 11)
+    if frame is None:
+       return ""
+    s = "%03X" % frame
+
+    expect = g_crc.crc5(frame, 11) ^ 0x1f
+
+    crc = usb_field(raw, 5)
+    if crc is None:
+       return s
+
+    if crc == expect and len(raw) == 0:
+       return s
+
+    s += ",CRC%02X" % crc
+    if crc != expect:
+       s += "/%02X" % expect
+
+    return s
+
+
+def usb_data(raw):
+    bytes = []
+    while True:
+       byte = usb_field(raw, 8)
+       if byte is None:
+           break
+       bytes.append(byte)
+
+    s = ""
+    if len(bytes) < 2:
+       crc = None
+    else:
+       crc = (bytes[-2], bytes[-1])
+       del bytes[-1]
+       del bytes[-1]
+       expect = g_crc.crc16(0xffff, bytes) ^ 0xffff
+
+    for b in bytes:
+       if s:
+           s += "."
+       else:
+           s += ":"
+       s += "%02X" % b
+
+    if crc is None:
+       return s
+
+    crc = crc[0] | crc[1] << 8
+    if crc == expect and len(raw) == 0:
+       return s
+
+    if s:
+       s += ","
+    else:
+       s += ":"
+    s += "CRC%04X" % crc
+    if crc != expect:
+       s += "/%04X" % expect
+
+    return s
+
+
+def usb_handshake(raw):
+    return ""
+
+
+def usb_packet(raw):
+    sync = usb_field(raw, 8)
+    if sync is None:
+       return ""
+    if sync != 0x80:
+       return "%02X?" % sync
+
+    pid = usb_field(raw, 8)
+    if pid is None:
+       return "SYNC"
+
+    if pid == 0xe1:
+       return "OUT"+usb_token(raw)
+    if pid == 0x69:
+       return "IN"+usb_token(raw)
+    if pid == 0xa5:
+       return "SOF"+usb_sof(raw)
+    if pid == 0x2d:
+       return "SETUP"+usb_token(raw)
+
+    if pid == 0xc3:
+       return "DATA0"+usb_data(raw)
+    if pid == 0x4b:
+       return "DATA1"+usb_data(raw)
+    if pid == 0x87:
+       return "DATA2"+usb_data(raw)
+    if pid == 0x0f:
+       return "MDATA"+usb_data(raw)
+
+    if pid == 0xd2:
+       return "ACK"
+    if pid == 0x5a:
+       return "NAK"
+    if pid == 0x1e:
+       return "STALL"
+
+    # we don't decode NYET and special packets
+
+    return "SYNC"
+
+
+def d_usb(bits):
+    if bits[0]:
+       s = "~"
+    else:
+       s = ""
+
+    while len(bits) and bits[0]:
+       del bits[0]
+
+    raw = []
+    last = 1
+    ones = 0
+    for b in bits:
+       if b == "X":
+           raw.append("X")
+       elif b == last:
+           raw.append(1)
+           ones += 1
+       else:
+           if ones == 6:
+               raw.append("S")
+           else:
+               raw.append(0)
+           ones = 0
+       last = b
+
+    s += usb_packet(raw)
+
+    if len(raw):
+       s += "|"
+       for b in raw:
+           s += str(b)
+
+    return s
+
+
+def d_usb_dp(bits):
+    if d_usb_dm not in d_table:
+       return d_usb(bits)
+
+    dp = bits
+    dm = d_table[d_usb_dm]
+    s = ""
+
+    packet = []
+    while len(dp):
+       if dp[0] == "X" or dm[0] == "X":
+           packet.append("X")
+       elif not dp[0] and not dm[0]:
+           if len(packet):
+               s += "["+d_usb(packet)+"]"
+           packet = []
+       elif dp[0] and dm[0]:
+           if len(packet):
+               s += "["+d_usb(packet)+"+"
+           packet = []
+           s += "SE1"
+       else:
+           packet.append(dp[0])
+       del dp[0]
+       del dm[0]
+
+    if len(packet):
+       s += "["+d_usb(packet)+"+"
+
+    return s
+
+
+def d_usb_dm(bits):
+    if d_usb_dp in d_table:
+       return ""
+    inverted = []
+    for b in bits:
+       if b == "X":
+           inverted.append(b)
+       else:
+           inverted.append(1-b)
+    return d_usb(inverted)
+
+
+def d_set_table(table):
+    global d_table
+
+    d_table = table
+
+
 decoders = [
     #  0123456789abcdef -- maximum length is 16 characters
     ( "LSB->MSB",              d_byte_lsb ),
@@ -335,4 +580,6 @@
     ( "SDIO RESP (SD)",                d_sdio_resp_sd ),
     ( "SDIO RESP (SPI)",       d_sdio_resp_spi ),
     ( "SDIO R5 (SPI)",         d_sdio_r5_spi ),
+    ( "USB D+",                        d_usb_dp ),
+    ( "USB D-",                        d_usb_dm ),
 ]

Modified: developers/werner/ahrt/host/tmc/lib/dxplore.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/dxplore.py      2008-12-08 10:18:26 UTC 
(rev 4856)
+++ developers/werner/ahrt/host/tmc/lib/dxplore.py      2008-12-08 12:23:16 UTC 
(rev 4857)
@@ -148,6 +148,12 @@
        self.main.w.tag_raise("d_bg_"+self.tag)
        self.main.w.tag_raise("d_fg_"+self.tag)
 
+    def pre_decode(self, selected, bits):
+       global d_table
+
+       if not selected:
+           d_table[self.decoder] = bits
+
     def decode(self, selected, bits):
        y = self.y(0)
        x0 = self.x(self.main.decode_from)
@@ -706,12 +712,17 @@
        self.decode()
 
     def decode(self):
+       global d_table
+
        self.meas_start.show(self.cur.pos-self.decode_from)
        if self.cur.pos < self.decode_from:
            return
        x0 = self.ch[0].x(self.decode_from)
        x1 = self.ch[0].x(self.cur.pos+1)
        self.w.coords("selection", x0, 0, x1, self.yres)
+
+       d_table = {}
+       by_ch = {}
        for ch in self.ch:
            bits = []
            i = self.decode_from
@@ -723,8 +734,14 @@
                    else:
                        bits.append("X")
                i += 1
-           ch.decode(ch is self.selected, bits)
+           by_ch[ch] = bits
+           ch.pre_decode(ch is self.selected, bits)
 
+       d_set_table(d_table)
+
+       for ch in self.ch:
+           ch.decode(ch is self.selected, by_ch[ch])
+
     def end_decode(self):
        for ch in self.ch:
            ch.end_decode()

Modified: developers/werner/ahrt/host/tmc/lib/phosphor.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/phosphor.py     2008-12-08 10:18:26 UTC 
(rev 4856)
+++ developers/werner/ahrt/host/tmc/lib/phosphor.py     2008-12-08 12:23:16 UTC 
(rev 4857)
@@ -156,7 +156,7 @@
     def pnm(self, px = 1, py = 1, colors = None, normalize = norm_linear):
        if colors is None:
            fn = self.color_default
-       elif isinstance(colors, list):
+       elif hasattr(colors, "__iter__"):
            fn = lambda v: colors[min(len(colors)-1, int(v*len(colors)))]
        else:
            fn = colors

Modified: developers/werner/ahrt/host/tmc/lib/scope.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/scope.py        2008-12-08 10:18:26 UTC 
(rev 4856)
+++ developers/werner/ahrt/host/tmc/lib/scope.py        2008-12-08 12:23:16 UTC 
(rev 4857)
@@ -381,7 +381,7 @@
        return rigol_to_ppm(self.query(":LCD:DATA?"))
 
     def wave(self, channels, start = None, end = None, step = None):
-       if not isinstance(channels, list):
+       if not hasattr(channels, "__iter__"):
            return self.wave([channels], start, end, step)[0]
        la = None
        res = waves()

Modified: developers/werner/ahrt/host/tmc/lib/wave.py
===================================================================
--- developers/werner/ahrt/host/tmc/lib/wave.py 2008-12-08 10:18:26 UTC (rev 
4856)
+++ developers/werner/ahrt/host/tmc/lib/wave.py 2008-12-08 12:23:16 UTC (rev 
4857)
@@ -97,7 +97,7 @@
        f.close()
 
     def get(self, t):
-       if isinstance(t, list):
+       if hasattr(t, "__iter__"):
            res = []
            for v in t:
                res.append(self.get_one(v))




--- End Message ---
--- Begin Message ---
Author: erin_yueh
Date: 2008-12-08 14:16:45 +0100 (Mon, 08 Dec 2008)
New Revision: 4858

Added:
   developers/erin_yueh/bt/
   developers/erin_yueh/bt/browse_device.py
   developers/erin_yueh/bt/bt_adapter.py
   developers/erin_yueh/bt/bt_main.py
   developers/erin_yueh/bt/pin.py
   developers/erin_yueh/bt/preferences.py
   developers/erin_yueh/bt/send_file.py
Log:
init bt manager 


Added: developers/erin_yueh/bt/browse_device.py
===================================================================
--- developers/erin_yueh/bt/browse_device.py                            (rev 0)
+++ developers/erin_yueh/bt/browse_device.py    2008-12-08 13:16:45 UTC (rev 
4858)
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+
+import pygtk
+pygtk.require('2.0')
+
+import gtk, gobject
+# Check for new pygtk: this is new class in PyGtk 2.4
+if gtk.pygtk_version < (2,3,90):
+   print "PyGtk 2.3.90 or later required for this example"
+   raise SystemExit
+
+import lightblue
+import bluetooth
+
+import bt_adapter
+DEVICE_TYPE = ('Miscellaneous','Computer','Phone','LAN/Network Access 
point','Audio/Video',
+    'Peripheral','Imaging','Wearable','Toy','Uncategorized')
+
+
+class BrowseDevice:
+
+    # close the window and quit
+    def delete_event(self, widget, event, data=None):
+        print 'delete_event:', widget,event
+        self.w.destroy()
+        #gtk.main_quit()
+        return False
+
+    def add_row(self, b):
+        
+        dev_list = lightblue.finddevices()
+        print dev_list
+        i0 = None
+        for dev in dev_list:
+            (addr, name, class_of_service) = dev
+            if addr not in self.lastseen:
+                name = self.adapter.getRemoteName(addr)
+                dev_type = self.adapter.getRemoteMajorClass(addr)
+                pincode = self.adapter.getPinCodeLength(addr)
+                row = (addr,name,dev_type,pincode)
+                i0 = self.w.sm.get_model().append(row)
+        # select the new row in each view
+        if i0:
+            sel = self.w.tv.get_selection()
+            i1 = self.w.sm.convert_child_iter_to_iter(None, i0)
+            sel.select_iter(i1)
+        
+    
+    def get_BT_adapter(self):
+        
+        self.bt_addr = self.adapter.getAddress()
+        self.bt_name = self.adapter.getName()
+        self.bt_currmode = self.adapter.getMode()
+        print 'bt_addr', self.bt_addr
+        # list currently connected remote devices.
+        self.lastseen = self.adapter.retrieve_names_fromFile()
+
+    def col1_toggled_cb( self, treeview, path, column ):
+        print 'toggle_cb'
+        model = treeview.get_model()
+        iter  = model.get_iter(path)
+        selected_addr = model.get_value(iter,0)
+        print selected_addr 
+        self.connect_to_dv(selected_addr)
+
+    def connect_to_dv(self,addr):
+        print 'connecting....', addr
+        self.adapter.createBonding(addr)
+
+    def __init__(self):
+        
+        # retrieve BT adapter info
+        self.adapter = bt_adapter.BluetoothAdapter()
+
+        self.get_BT_adapter()
+        #print self.lastseen_name,self.lastseen_class
+
+        # create a liststore with 2 columns
+        #self.liststore = 
gtk.ListStore(gtk.gdk.Pixbuf,str,str,str,gtk.gdk.Pixbuf)
+        # addr,name,type,security
+        self.liststore = gtk.ListStore(str,str,str,int)
+        # Create new windows
+        self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        win = self.w
+        win.set_title("Browse Devices")
+        win.set_size_request(220, 200)
+        win.connect("delete_event", self.delete_event)
+        
+        win.vbox = gtk.VBox()
+        win.add(win.vbox)
+        win.sw = gtk.ScrolledWindow()
+        win.sm = gtk.TreeModelSort(self.liststore)
+        # Set sort column
+        win.sm.set_sort_column_id(1, gtk.SORT_ASCENDING)
+        
+        win.tv = gtk.TreeView(win.sm)
+        win.tv.connect("row-activated", self.col1_toggled_cb)
+        win.vbox.pack_start(win.sw)
+        
+        win.b = gtk.Button('Start Searching...')
+        win.b.connect('clicked', self.add_row)
+        win.vbox.pack_start(win.b, False)
+        
+        win.sw.add(win.tv)
+        win.tv.column = [None]*2
+        win.tv.column[0] = gtk.TreeViewColumn('Name')
+        win.tv.column[1] = gtk.TreeViewColumn('Device Type')
+        win.tv.cell= [None]*2
+        win.tv.cell[0] = gtk.CellRendererText()
+        win.tv.cell[1] = gtk.CellRendererPixbuf()   
+        # 'icon name', 'icon type'
+        
+        win.tv.column[0].set_sort_column_id(1)
+        win.tv.column[0].pack_start(win.tv.cell[1], True)
+        win.tv.column[0].pack_start(win.tv.cell[0], True)
+        win.tv.column[0].set_attributes(win.tv.cell[1], stock_id=1)
+        win.tv.column[0].set_attributes(win.tv.cell[0], text=1)
+        win.tv.append_column(win.tv.column[0])
+        
+        win.tv.column[1].set_sort_column_id(2)
+        win.tv.column[1].pack_start(win.tv.cell[0], True)
+        win.tv.column[1].pack_start(win.tv.cell[1], True)
+        win.tv.column[1].set_attributes(win.tv.cell[0], text=2)
+        win.tv.column[1].set_attributes(win.tv.cell[1], stock_id=1)
+        win.tv.append_column(win.tv.column[1])
+        
+        
+        # display last seen devices
+        for addr in self.lastseen:
+            name = self.adapter.getRemoteName(addr)
+            dev_type = self.adapter.getRemoteMajorClass(addr)
+            pincode = self.adapter.getPinCodeLength(addr)
+            row = (addr,name,dev_type,pincode)
+            self.w.sm.get_model().append(row)
+
+        win.show_all()

Added: developers/erin_yueh/bt/bt_adapter.py
===================================================================
--- developers/erin_yueh/bt/bt_adapter.py                               (rev 0)
+++ developers/erin_yueh/bt/bt_adapter.py       2008-12-08 13:16:45 UTC (rev 
4858)
@@ -0,0 +1,329 @@
+#!/usr/bin/env python
+
+import gtk, gobject
+import dbus
+from dbus.mainloop.glib import DBusGMainLoop
+DBusGMainLoop(set_as_default=True)
+bus = dbus.SystemBus()
+
+class BluetoothAdapter(object):
+
+    def __init__(self):
+
+        #self.btObj = bus.get_object( "org.freesmartphone.odeviced", 
"/org/freesmartphone/Device/PowerControl/Bluetooth")
+        #self.btInf = dbus.Interface( self.btObj, 
"org.freesmartphone.Device.PowerControl" )
+
+        self.managerObj = bus.get_object('org.bluez', '/org/bluez')
+        self.managerInf = dbus.Interface(self.managerObj, 'org.bluez.Manager')
+        # /org/bluez/hci0
+        self.defaultadapter = self.managerInf.DefaultAdapter()
+
+        #self.adapterObj = bus.get_object('org.bluez', 
self.managerInf.DefaultAdapter())
+        self.adapterObj = bus.get_object('org.bluez', '/org/bluez/hci0')
+        self.adapterInf = dbus.Interface(self.adapterObj, 'org.bluez.Adapter')
+
+        bus.add_signal_receiver(self.bonding_created_signal, 'BondingCreated', 
'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        bus.add_signal_receiver(self.bonding_removed_signal, 'BondingRemoved', 
'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        
+        bus.add_signal_receiver(self.disc_started_signal, 'DiscoveryStarted', 
'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        bus.add_signal_receiver(self.disc_completed_signal, 
'DiscoveryCompleted', 'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        
+        bus.add_signal_receiver(self.rem_dev_connected_signal, 
'RemoteDeviceConnected', 'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        bus.add_signal_receiver(self.rem_dev_disconnected_signal, 
'RemoteDeviceDisconnected', 'org.bluez.Adapter', 'org.bluez', 
self.defaultadapter)
+        
+        
+        bus.add_signal_receiver(self.rem_dev_found_signal, 
'RemoteDeviceFound', 'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+        bus.add_signal_receiver(self.rem_dev_disappeared_signal, 
'RemoteDeviceDisappeared', 'org.bluez.Adapter', 'org.bluez', 
self.defaultadapter)
+        bus.add_signal_receiver(self.rem_dev_name_signal, 'RemoteNameUpdated', 
'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+
+        bus.add_signal_receiver(self.mode_changed_signal, 'ModeChanged', 
'org.bluez.Adapter', 'org.bluez', self.defaultadapter)
+
+        self.device_list = {}
+
+    def retrieve_names_fromFile(self):
+        # read last seen devices
+        adapter_address = self.getAddress()
+        self.fname = "/var/lib/bluetooth/"+adapter_address+"/names"
+        self.lastseen = []
+        try:
+            self.f = open(self.fname, 'r')
+            for line in self.f:
+                self.lastseen.append(line[0:17])
+            self.f.close()
+        except Exception:
+            print 'cannot find this file', self.fname
+        return self.lastseen
+
+    def bonding_created_signal(self,address):
+        print 'Signal: BondingCreated(%s)' % address
+
+    def bonding_removed_signal(self,address):
+        print 'Signal: BondingRemoved(%s)' % address
+
+    def disc_started_signal(self,):
+        print 'Signal: DiscoveryStarted()'
+        
+    def disc_completed_signal(self):
+        print 'Signal: DiscoveryCompleted()'
+
+    def rem_dev_disappeared_signal(self, address):
+        print 'Signal: RemoteDeviceDisappeared()', address
+        if address in self.device_list:
+            self.device_list.pop(address)
+        
+    def rem_dev_found_signal(self,address, cls, rssi):
+        #print 'Signal: RemoteDeviceFound(%s, %s, %s)' % (address, cls, rssi)
+        name = self.adapterInf.GetRemoteName(address)
+        _type = self.adapterInf.GetRemoteMajorClass(address)
+        security = self.getPinCodeLength(address)
+        self.device_list[address] = (name,_type,security)
+        
+    def rem_dev_name_signal(self,address, name):
+        print 'Signal: RemoteNameUpdated(%s, %s)' % (address, name)
+
+    def rem_dev_connected_signal(self,address):
+        print 'Signal: RemoteDeviceConnected(%s)' % address
+
+    def rem_dev_disconnected_signal(self,address):
+        print 'Signal: RemoteDeviceDisconnected(%s)' % address
+        
+    def mode_changed_signal(self,mode):
+        print 'Signal: ModeChanged(%s)' % mode
+
+    def getPower(self):
+        
+        return self.btInf.GetPower()
+        try:
+            self.btPower = self.btInf.GetPower()
+            return self.btPower
+        except Exception:
+            print 'getPower error'
+            return None
+
+    def setPower(self,status):
+        try:
+            self.btInf.SetPower(status)
+        except Exception:
+            print 'setPower error', status
+
+    def getInfo(self):
+        try:
+            self.Info = self.adapterInf.GetInfo()
+            return self.Info
+        except Exception:
+            print 'getInfo error'
+            return None
+
+    def getAddress(self):
+        try:
+            self.Address = self.adapterInf.GetAddress()
+            return self.Address
+        except Exception:
+            print 'getAddress error'
+            return None
+        
+    def getName(self):
+        try:
+            self.Name = self.adapterInf.GetName()
+            return self.Name
+        except Exception:
+            print 'getName error'
+            return None
+
+    def getMode(self):
+        try:
+            self.Mode = self.adapterInf.GetMode()
+            return self.Mode
+        except Exception:
+            print 'getMode error'
+            return None
+            
+    def getMajorClass(self):
+        try:
+            self.MajorClass = self.adapterInf.GetMajorClass()
+            return self.MajorClass
+        except Exception:
+            print 'getMajorClass error'
+            return None        
+
+    def setName(self,name):
+        try:
+            self.adapterInf.SetName(str(name))
+        except Exception:
+            print 'setName error', name
+
+    def setMode(self,mode):
+        try:
+            self.adapterInf.SetMode(str(mode))
+        except Exception:
+            print 'setMode error', Mode
+
+    def getDiscoverableTimeout(self):
+        try:
+            self.DiscoverableTimeout = self.adapterInf.GetDiscoverableTimeout()
+            return self.DiscoverableTimeout
+        except Exception:
+            print 'getDiscoverableTimeout error'
+            return None        
+        
+    def setDiscoverableTimeout(self,second):
+        try:
+            self.adapterInf.SetDiscoverableTimeout(second)
+        except Exception:
+            print 'setDiscoverableTimeout error', second
+
+    def getServiceClasses(self):
+        try:
+            self.ServiceClasses = self.adapterInf.GetServiceClasses()
+            return self.ServiceClasses
+        except Exception:
+            print 'getServiceClasses error'
+            return None  
+
+    def listBondings(self):
+        
+        return self.adapterInf.ListBondings()
+
+    def listConnections(self):
+        
+        return self.adapterInf.ListConnections()
+    
+    def hasBonding(self,addr):
+        try:
+            self.hasBonding = self.adapterInf.HasBonding(addr)
+            return self.hasBonding
+        except dbus.exceptions.DBusException,e:
+            print 'hasBonding error: ',addr,e        
+            return None
+
+    def createBonding(self,addr):
+        print 'createBonding', addr
+        try:
+            self.adapterInf.CreateBonding(addr)
+        except dbus.exceptions.DBusException,e:
+            print 'createBonding error: ',addr,e
+
+    def removeBonding(self,addr):
+        try:
+            self.adapterInf.RemoveBonding(addr)
+        except dbus.exceptions.DBusException,e:
+            print 'removeBonding error: ',addr,e
+            
+    def getPinCodeLength(self,addr):
+        try:
+            self.PinCodeLength = self.adapterInf.GetPinCodeLength(addr)
+            return self.PinCodeLength
+        except Exception:
+            return 0
+
+    def setTrusted(self,addr):
+        try:
+            self.adapterInf.SetTrusted(addr)
+        except Exception:
+            print 'setTrusted error', addr
+
+    def isTrusted(self,addr):
+        try:
+            self.isTrusted = self.adapterInf.IsTrusted(addr)
+            return self.isTrusted
+        except dbus.exceptions.DBusException,e:
+            print 'isTrusted error: ',addr,e        
+            return None
+            
+    def removeTrust(self,addr):
+        try:
+            self.adapterInf.RemoveTrust(addr)
+        except Exception:
+            print 'removeTrust error', addr
+            
+    def getEncryptionKeySize(self,addr):
+        try:
+            self.EncryptionKeySize = self.adapterInf.GetEncryptionKeySize(addr)
+            return self.EncryptionKeySize
+        except Exception:
+            return None
+
+    def listTrusts(self):
+        
+        return self.adapterInf.ListTrusts()
+
+    def getRemoteInfo(self,addr):
+        try:
+            self.RemoteInfo = self.adapterInf.GetRemoteInfo(addr)
+            return self.RemoteInfo
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteInfo: ',addr,e
+            return None
+    
+    def getRemoteClass(self,addr):
+        try:
+            self.RemoteClass = self.adapterInf.GetRemoteClass(addr)
+            return self.RemoteClass
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteClass: ',addr,e
+            return None
+            
+    def getRemoteName(self,addr):
+        try:
+            self.RemoteName = self.adapterInf.GetRemoteName(addr)
+            return self.RemoteName
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteName: ',addr,e
+            return None
+
+
+    def getRemoteMajorClass(self,addr):
+        try:
+            self.RemoteMajorClass = self.adapterInf.GetRemoteMajorClass(addr)
+            return self.RemoteMajorClass
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteMajorClass: ',addr,e
+            return None
+            
+    def getRemoteServiceClasses(self,addr):
+        try:
+            self.RemoteServiceClasses = 
self.adapterInf.GetRemoteServiceClasses(addr)
+            return self.RemoteServiceClasses
+        except dbus.exceptions.DBusException,e:
+            print 'GetRemoteServiceClasses: ',addr,e
+            return None
+            
+    def getRemoteServiceHandles(self,addr,match):
+        try:
+            print addr,match
+            self.RemoteServiceHandles = 
self.adapterInf.GetRemoteServiceHandles(addr,match)
+            return self.RemoteServiceHandles
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteServiceHandles: ',addr,match,e
+            return None
+
+    def getRemoteServiceRecord(self,addr,handle):
+        try:
+            self.RemoteServiceRecord = 
self.adapterInf.GetRemoteServiceRecord(addr,handle)
+            return self.RemoteServiceRecord
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteServiceRecordAsXML: ',addr,handle,e
+            return None
+
+    def getRemoteServiceRecordAsXML(self,addr,handle):
+        try:
+            self.RemoteServiceRecordAsXML = 
self.adapterInf.GetRemoteServiceRecordAsXML(addr,handle)
+            return self.RemoteServiceRecordAsXML
+        except dbus.exceptions.DBusException,e:
+            print 'getRemoteServiceRecordAsXML: ',addr,handle,e
+            return None
+
+
+    def listRemoteDevices(self):
+        try:
+            self.ListRemoteDevices = self.adapterInf.ListRemoteDevices()
+            return self.ListRemoteDevices
+        except dbus.exceptions.DBusException,e:
+            print 'ListRemoteDevices: ',e
+            return None
+
+    def discoverDevices(self):
+        try:
+            self.ListRemoteDevices = self.adapterInf.DiscoverDevices()
+        except dbus.exceptions.DBusException,e:
+            print 'discoverDevices: ',e

Added: developers/erin_yueh/bt/bt_main.py
===================================================================
--- developers/erin_yueh/bt/bt_main.py                          (rev 0)
+++ developers/erin_yueh/bt/bt_main.py  2008-12-08 13:16:45 UTC (rev 4858)
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+
+import gtk, gobject
+import dbus
+import browse_device, pin, send_file, bt_adapter
+
+POWER_STATE = ('OFF', 'ON')
+
+
+
+class bt_main(object):
+    
+    def power_status_cb(self,widget):
+        print 'power_status_cb', widget
+        '''
+        curr_status = bluetooth_adapter.getPower()
+        if curr_status == 1:
+            bluetooth_adapter.setPower(False)
+            button.set_label("OFF")
+            print 'set Power OFF'
+        elif curr_status == 0:
+            bluetooth_adapter.setPower(True)
+            button.set_label("ON")
+            print 'set Power ON'
+        '''
+    
+    def browse_device_cb(self,widget):
+        print 'browse_device_cb', widget
+        browse = browse_device.BrowseDevice()
+
+    def send_file_cb(self,widget):
+        print 'send_file_cb', widget
+        send_file.FileSelectionExample()
+
+    def preferences_cb(self,widget):
+        print 'send_preferences_cb', widget
+    
+    def __init__(self):
+        # build bluetooth adapter
+        self.bluetooth_adapter = bt_adapter.BluetoothAdapter()
+
+        # Create the user interface
+        win = gtk.Window()
+        win.connect('delete-event', gtk.main_quit)
+
+        vbox = gtk.VBox()
+        win.add (vbox)
+        hbox = gtk.HBox()
+        vbox.pack_start (hbox)
+
+        # Bluetooth Power
+        #status = bt_iface.GetPower()
+        status = 1
+        power_button = gtk.Button()
+        power_button.set_label('Power Status: '+ POWER_STATE[status])
+        power_button.connect ("clicked", self.power_status_cb)
+        vbox.pack_start (power_button)
+
+        # Browse Devices
+        device_button = gtk.Button()
+        device_button.set_label('Browse Devices')
+        device_button.connect ("clicked", self.browse_device_cb)
+        vbox.pack_start (device_button)
+    
+        # Send File
+        file_button = gtk.Button()
+        file_button.set_label('Send File')
+        file_button.connect ("clicked", self.send_file_cb)
+        vbox.pack_start (file_button)
+
+        # preferences
+        pref_button = gtk.Button()
+        pref_button.set_label('Perferences')
+        pref_button.connect ("clicked", self.preferences_cb)
+        vbox.pack_start (pref_button)
+    
+        '''
+        # PassKeyEvent
+
+        PATH = '/my/PasskeyAgent'
+        handler = pin.PasskeyAgent(PATH)
+        adapter = bus.get_object('org.bluez', '/org/bluez/hci0')
+        secuirty = dbus.Interface(adapter, 'org.bluez.Security')
+        secuirty.RegisterDefaultPasskeyAgent(PATH)
+        '''
+        # Show all widgets and start the main loop
+        win.show_all()
+
+def main():
+    gtk.main()
+
+if __name__ == "__main__":
+    bt_main()
+    main()
+

Added: developers/erin_yueh/bt/pin.py
===================================================================
--- developers/erin_yueh/bt/pin.py                              (rev 0)
+++ developers/erin_yueh/bt/pin.py      2008-12-08 13:16:45 UTC (rev 4858)
@@ -0,0 +1,77 @@
+import dbus
+import dbus.glib
+import dbus.service
+import gobject
+import sys
+import gtk
+
+
+def pin_entry(address):
+        # build dialog
+        dialog = gtk.Dialog("New bluetooth connection", None, gtk.DIALOG_MODAL,
+                        (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, 
gtk.RESPONSE_ACCEPT))
+        dialog.set_default_response(gtk.RESPONSE_ACCEPT)
+        dialog.set_position(gtk.WIN_POS_CENTER)
+
+        # tabulka
+        table = gtk.Table(2, 2, False)
+        dialog.vbox.pack_start(table)
+        table.show()
+
+        # entry
+        entry = gtk.Entry()
+        entry.set_activates_default(True)
+        table.attach(entry, 1, 2, 1, 2, gtk.EXPAND|gtk.FILL, 
gtk.EXPAND|gtk.FILL, 10, 2)
+        entry.show()
+
+        # icon
+        icon = gtk.Image()
+        icon.set_from_stock(gtk.STOCK_DIALOG_AUTHENTICATION, 
gtk.ICON_SIZE_DIALOG)
+        table.attach(icon, 0, 1, 0, 2, gtk.FILL, gtk.FILL, 12, 12)
+        icon.show()
+
+        # label
+        label = gtk.Label("New bluetooth connection to " + address + "\nPlease 
enter PIN:")
+        label.set_alignment(0, 1)
+        table.attach(label, 1, 2, 0, 1, gtk.EXPAND|gtk.FILL, 
gtk.EXPAND|gtk.FILL, 10, 2)
+        label.show()
+        
+        # run dialog
+        if dialog.run() == gtk.RESPONSE_ACCEPT:
+                pin = entry.get_text()
+        else:
+                pin = ""
+        dialog.destroy()
+        return pin
+
+
+class PasskeyAgent(dbus.service.Object):
+        def __init__(self, path):
+                dbus.service.Object.__init__(self, dbus.SystemBus(), path)
+
+        @dbus.service.method(dbus_interface='org.bluez.PasskeyAgent',
+                                                 in_signature='ssb', 
out_signature='s')
+
+        def Request(self, path, address, numeric):
+            
+            print 'Request pin code', path, address
+            try:
+                 pin = pin_entry(address)
+                 return pin
+            except:
+                 return ""
+
+        def Cancel(self,path,address,numeric):
+            print 'cancel'
+
+
+if __name__ == "__main__":
+        PATH = '/my/PasskeyAgent'
+        bus = dbus.SystemBus();
+        handler = PasskeyAgent(PATH)
+        adapter = bus.get_object('org.bluez', '/org/bluez/hci0')
+        sec = dbus.Interface(adapter, 'org.bluez.Security')
+        sec.RegisterDefaultPasskeyAgent(PATH)
+        main_loop = gobject.MainLoop()
+        main_loop.run()
+

Added: developers/erin_yueh/bt/preferences.py
===================================================================

Added: developers/erin_yueh/bt/send_file.py
===================================================================
--- developers/erin_yueh/bt/send_file.py                                (rev 0)
+++ developers/erin_yueh/bt/send_file.py        2008-12-08 13:16:45 UTC (rev 
4858)
@@ -0,0 +1,153 @@
+#!/usr/bin/env python
+
+import pygtk
+pygtk.require('2.0')
+
+import gtk, gobject
+# Check for new pygtk: this is new class in PyGtk 2.4
+if gtk.pygtk_version < (2,3,90):
+   print "PyGtk 2.3.90 or later required for this example"
+   raise SystemExit
+
+from xml.dom.minidom import parseString
+
+import lightblue
+import bt_adapter
+
+class FileSelectionExample:
+    # Get the selected filename and print it to the console
+    def file_ok_sel(self, w):
+        print "%s" % self.filew.get_filename()
+        dev = SelectDevice(self.filew.get_filename())
+        self.filew.destroy()
+        
+    def destroy(self, widget):
+        self.filew.destroy()
+
+    def __init__(self):
+        
+        # Create a new file selection widget
+        self.filew = gtk.FileSelection("File selection")
+
+        self.filew.connect("destroy", self.destroy)
+        # Connect the ok_button to file_ok_sel method
+        self.filew.ok_button.connect("clicked", self.file_ok_sel)
+    
+        # Connect the cancel_button to destroy the widget
+        self.filew.cancel_button.connect("clicked",
+                                         lambda w: self.filew.destroy())
+    
+        # Lets set the filename, as if this were a save dialog,
+        # and we are giving a default filename
+        self.filew.set_filename("penguin.png")
+    
+        self.filew.show()
+
+class SelectDevice:
+    
+    # close the window and quit
+    def delete_event(self, widget, event, data=None):
+        print 'delete_event:', widget,event
+        self.w.destroy()
+        return False
+        
+    def col1_toggled_cb( self, treeview, path, column ):
+        print 'toggle_cb'
+        model = treeview.get_model()
+        iter  = model.get_iter(path)
+        selected_dev_name = model.get_value(iter,0)
+        addr = self.dev_list[selected_dev_name]
+        print selected_dev_name,addr
+        self.prepare_to_send(addr)
+
+    def __browsexml(self, doc):
+        record=doc.documentElement
+        
+        for node in record.childNodes:
+            if node.nodeType == node.ELEMENT_NODE and node.getAttribute('id') 
== '0x0004':
+                val = node.getElementsByTagName('uint8')
+                return int(val[0].getAttribute('value'), 16)
+                   
+    def resolveService(self, addr, service='FTP' ):
+        
+        service_handle = self.adapter.getRemoteServiceHandles(addr,'FTP')
+        if service_handle:
+            xml= 
self.adapter.getRemoteServiceRecordAsXML(addr,service_handle[0])
+            doc=parseString(xml)
+            return self.__browsexml(doc)
+        else:
+            return None
+
+    def prepare_to_send(self,addr):
+        print 'prepare to send',addr,self.sendfname
+        channel = self.resolveService(addr)
+        if channel:
+            print 'sendfile', addr, channel,self.sendfname
+            try:
+                lightblue.obex.sendfile(addr,channel,self.sendfname)
+            except Exception,e:
+                print 'sendfile ERROR',e 
+        else:
+            print 'No FTP service'
+        
+        
+    def start_sending(self, widget):
+        print 'starting_sending'
+        
+    def __init__(self,name):
+        print 'SelectDevice: dev_list'
+        self.sendfname = name
+
+        # create a liststore with 2 columns
+        self.liststore = gtk.ListStore(str, str)
+        
+        # Create new windows
+        self.w = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        win = self.w
+        win.set_title("Select Device")
+        win.set_size_request(220, 200)
+        win.connect("delete_event", self.delete_event)
+        
+        win.vbox = gtk.VBox()
+        win.add(win.vbox)
+        win.sw = gtk.ScrolledWindow()
+        win.sm = gtk.TreeModelSort(self.liststore)
+        # Set sort column
+        win.sm.set_sort_column_id(1, gtk.SORT_ASCENDING)
+        
+        win.tv = gtk.TreeView(win.sm)
+        win.tv.connect("row-activated", self.col1_toggled_cb)
+        win.vbox.pack_start(win.sw)
+        
+        win.b = gtk.Button('Send File...')
+        win.b.connect('clicked', self.start_sending)
+        win.vbox.pack_start(win.b, False)
+        
+        win.sw.add(win.tv)
+        win.tv.column = [None]*2
+        win.tv.column[0] = gtk.TreeViewColumn('Name')
+        win.tv.column[1] = gtk.TreeViewColumn('Device Type')
+        win.tv.cell = [None]*2
+        
+        for i in range(2):
+            win.tv.cell[i] = gtk.CellRendererText()
+            win.tv.append_column(win.tv.column[i])
+            win.tv.column[i].set_sort_column_id(i)
+            win.tv.column[i].pack_start(win.tv.cell[i], True)
+            win.tv.column[i].set_attributes(win.tv.cell[i], text=i)
+
+        # display ListBondings
+        #self.obj = bus.get_object('org.bluez', '/org/bluez/hci0')
+        #self.adapter = dbus.Interface(self.obj, 'org.bluez.Adapter')
+        self.adapter = bt_adapter.BluetoothAdapter()
+        list_bonding = self.adapter.listBondings()
+        print list_bonding
+        self.dev_list = {}
+        
+        for addr in list_bonding:
+            name = self.adapter.getRemoteName(addr)
+            dtype = self.adapter.getRemoteMajorClass(addr)
+            self.w.sm.get_model().append([name,dtype])
+            self.dev_list[name] = addr
+
+        win.show_all()
\ No newline at end of file




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to