2012年1月31日火曜日

libusb with pyUSB

pythonでUSBを使わなければならなかったので、試行錯誤の結果をメモ。
必要なもの。
1. libusb
2. pyUSB
3. SnoopyPo

ターゲットはUSB接続のA/D、D/Aモジュール。windows XPまでしかサポートされていないがwindows 7で使いたい。
1)開発環境はUbuntuなのでlibusbとpyUSBはapt-getでinstall
2)SnoopyPoでUSB通信を傍受。使い方は同梱のsnnopy_pro.txtに書いてある。xmlにexportしてBULK_OR_INTERRUPT_TRANSFERのendpointとpayloadbytesに注目
例えば今回の8bitD/A出力だと
    <urb    sequence="13">
        <function>
            BULK_OR_INTERRUPT_TRANSFER
        </function>
        <endpoint>
            -1
        </endpoint>
        <packetcount>
            1
        </packetcount>
        <payload    packet="0">
            <payloadcount>
                4
            </payloadcount>
            <payloadbytes>
                29033300
            </payloadbytes>
        </payload>
    </urb>
 となっている。
3)pyUSBの基礎は他を当たってね。
4)2)の情報からD/A出力は
usb_dev.handle.interruptWrite(usb_dev.endpoints[0].address, [0x29, 0x03, 0xff, 0x34], timeout)

追記:

http://www.jespersaur.com/drupal/book/export/html/21
http://www.cs.indiana.edu/~bpisupat/work/usb.html
http://www.ladyada.net/learn/diykinect/
http://www.linuxjournal.com/article/7353
http://tali.admingilde.org/linux-docbook/writing_usb_driver.pdf
http://www.reactivated.net/weblog-content/20050806-reverse-0.2.txt
http://matthias.vallentin.net/blog/2007/04/writing-a-linux-kernel-driver-for-an-unknown-usb-device/

2012年1月28日土曜日

linuxでUSB vender ID

$lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 058f:6377 Alcor Micro Corp. Multimedia Card Reader
Bus 003 Device 003: ID 0bd5:0120 

2012年1月24日火曜日

HttpResponseRedirectにcontextを渡す。

あるページにリダイレクトして、リダイレクト元のページに戻るれるようボタンを表示したい。

    request.session['send_page'] = reverse('send_page')
    return HttpResponseRedirect(u'page_send_to')

リダイレクト先のテンプレートで
        {% if request.session.send_paget %}
            <a href="{{ request.session.send_page }}"><img src="{{ MEDIA_URL }}path2img/back.png" alt="Back to Tree" /></a>
        {% endif %}

2012年1月23日月曜日

DjangoでformのForeignKey選択設定

Djangoでmodelを与えてformを作成すると、勝手にForeignKeyはselectionをoptionで用意してくれる
tutorialの
class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField() 
 なら、pollはclass Select(Widget)でoptionに選択可能なqueryの結果が表示される。
でもここではその中でも特定の要素を持つものに絞りたい。
form.fields['poll'].queryset = Poll.objects.filter(hoge=fuga) 
 
さらに、特定の値をデフォルトにするには、 
form.fields['poll'].initial = Poll.objects.get(pk=fuga) 

2012年1月10日火曜日

matplotlibで日本語

ここを参考にさせて頂きました。knaka20blueさんありがとうございます。
前の投稿分に日本語でタイトル追加。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')

import wx
import wx.aui
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx
import matplotlib.font_manager as fm

class Plot(wx.Panel):
    def __init__(self, parent, id = -1, dpi = None, **kwargs):
        wx.Panel.__init__(self, parent, id=id, **kwargs)

        self.figure = matplotlib.figure.Figure(dpi=dpi, figsize=(2,2))
        self.canvas = FigureCanvasWxAgg(self, -1, self.figure)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.EXPAND)
        self.SetSizer(sizer)

    def get_figure(self):
        return self.figure

def demo():
    app = wx.PySimpleApp()
    frame = wx.Frame(None, -1, 'Plotter')

    plot = Plot(frame)
    sizer = wx.BoxSizer()
    sizer.Add(plot, 1, wx.EXPAND)
    frame.SetSizer(sizer)

    axes = plot.get_figure().gca()
    axes.plot([1, 2, 3, 4, ],[2, 1, 4, 1, ])
    prop = fm.FontProperties(fname='/usr/share/fonts/opentype/ipafont/ipag.ttf')
    plot.get_figure().gca(kwargs='title').set_title(u'グラフだぴょーん', size='24', fontproperties=prop)

    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    demo()

matplotlibでグラフ

GL220を使って取り込んだデーターをグラフ化したい。
探してきたのは「matplotlib
wxWidgetsともバインドできるらしい。という事でサンプルを見てみたが、手が込んでいて猿脳にはわからない。ということで最小限化してみた。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')

import wx
import wx.aui
import matplotlib
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx

class Plot(wx.Panel):
    def __init__(self, parent, id = -1, dpi = None, **kwargs):
        wx.Panel.__init__(self, parent, id=id, **kwargs)

        self.figure = matplotlib.figure.Figure(dpi=dpi, figsize=(2,2))
        self.canvas = FigureCanvasWxAgg(self, -1, self.figure)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.canvas, 1, wx.EXPAND)
        self.SetSizer(sizer)

    def get_figure(self):
        return self.figure

def demo():
    app = wx.PySimpleApp()
    frame = wx.Frame(None, -1, 'Plotter')

    plot = Plot(frame)
    sizer = wx.BoxSizer()
    sizer.Add(plot, 1, wx.EXPAND)
    frame.SetSizer(sizer)

    axes = plot.get_figure().gca()
    axes.plot([1, 2, 3, 4, ],[2, 1, 4, 1, ])

    frame.Show()
    app.MainLoop()

if __name__ == "__main__":
    demo()
もとは、embedding_in_wx5.py 。wxPanel上にFigureCanvasWxAggを重ねて、そのパネルをwxFrameにwxBoxSizerで貼りつけた。