0

基本的なdjangoセットアップを実行していて、現在、シリアル接続にデータを書き込むためのdajaxice呼び出しを実装しています(RainbowDuinoはもう一方の端にあります)。

次のコードは機能しますが、Arduinoへのシリアル接続を確立するときは、Arduinoがリセットされるため、データを書き込む前に待機する必要があります。

from django.utils import simplejson
from dajaxice.decorators import dajaxice_register
import time, serial

def serialWrite(msg):
    try:
        ser = serial.Serial('/dev/ttyUSB0', 9600)
        time.sleep(1.5) #wait for arduino to reset
        ser.write(msg)
        return "Running Animation"
    except:
        return "Failed to communicate with cube"

@dajaxice_register
def animate(request, data):
    msg = serialWrite(str(data))
    return simplejson.dumps({'message':msg})

私はpythonとdjangoのすべてに慣れていないので、この環境でシリアル接続を使用できる永続オブジェクトを維持する方法がわかりません。私自身の読み取りとテストから、dajaxiceに登録されたメソッドは、対応するボタンのクリックを受信したときにのみ呼び出されることがわかります。

これは、アプリのビューを使用してシリアル接続をインスタンス化できる可能性がある場合ですか?そうであれば、接続をdajaxice呼び出しと共有するにはどうすればよいですか?

4

1 に答える 1

1

ランタイム環境が単純な場合は、ミドルウェアがオプションになる可能性があります。

// middleware/__init__.py
class ArduinoMiddleware:

    def __init__(self):
        self.serial = serial.Serial('/dev/ttyUSB0', 9600)
        time.sleep(1.5)

    def process_request(self, request):
        request.serialWrite = self.serialWrite

    def serialWrite(self, msg):
        try:
            self.serial.write(msg)
            return "Running Animation"
        except:
            return "Failed to communicate with cube"

// ajax.py
@dajaxice_register
def animate(request, data):
    msg = request.serialWrite(str(data))
    return simplejson.dumps({'message':msg})

// settings.py
...
MIDDLEWARE_CLASSES = (
  'middleware.ArduinoMiddleware',
  ...
)

manage.py runserverテストされていません。マルチスレッド環境(など)で実行している場合は、ロックが必要になる場合があります。

于 2013-03-06T18:01:11.480 に答える