2013-03-06 3 views
0

У меня есть базовая установка django, и в настоящее время я выполняю вызовы dajaxice для записи некоторых данных в последовательное соединение (RainbowDuino находится на другом конце).Поддерживать постоянное последовательное соединение, которое могут использовать вызовы dajaxice?

Следующий код работает, однако, когда вы устанавливаете последовательное соединение с 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}) 

Я новичок на все вещи питона и Джанго, так что я не уверен, как поддерживать постоянный объект, который может использовать последовательное соединение в этой среде. Из моего собственного чтения и тестирования я вижу, что зарегистрированный метод dajaxice вызывается только при получении соответствующего нажатия кнопки.

Это случай, когда я могу потенциально использовать представление моего приложения для создания последовательного соединения, если да, то как я могу поделиться соединением с вызовом dajaxice?

+0

Возможно, это не идеальная настройка, но есть ли у вас конкретная причина для установки постоянного соединения? Могут быть другие способы, но они действительно зависят от вашей настройки времени выполнения (как вы фактически используете приложение Django). Другой подход может заключаться в том, чтобы запустить отдельный процесс, который устанавливает постоянное соединение с вашим Arduino и прослушивает команды, отправленные из Django (возможно, через Redis). – robertklep

+0

Честно говоря, это просто личное предпочтение, оно не выглядит великолепно, когда кубик 4x4 во главе выключается при перезагрузке. В настоящее время приложение django обслуживается от малины pi, это требование школьного проекта. Я буду исследовать Редиса, спасибо за это предложение. – Gybe

ответ

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).

+0

Спасибо, это выглядит так, как надо. Я обязательно отвечу, как только я получу тест с Ардуином завтра. – Gybe