2013-11-28 7 views
2

UPDATE: переписать код, но до сих пор не работаетПроблемы преобразования сценарий Python для Node.js

Новый код ниже еще копирует функциональность сценария питона, однако пытается упростить вещи (также используя другую библиотеку https://npmjs.org/package/rpi-gpio) Проблема в том, что всегда получается аналогичное чтение, поэтому, очевидно, не используется обратная связь от контактов GPIO.

var gpio = require('rpi-gpio'); 

var pin = 12, 
    delay = 0.0005, 
    startTime, 
    endTime, 
    duration, 
    distance; 

function on(){ 
    setTimeout(gpio.write(pin,1,off),delay); 
} 

function off(){ 
    setTimeout(gpio.write(pin,0,listen),delay); 
} 

function listen(){ 
    gpio.setup(pin, gpio.DIR_IN); 
    startTime = Date.now(); 
    console.log('Start: ' + String(startTime)); 
    return; 
} 

gpio.on('change', function(channel, value) { 
    endTime = Date.now(); 
    console.log('End: ' + String(endTime)); 
    duration = endTime - startTime; 
    console.log('Duration: ' + String(duration)); 
    distance = ((duration/100) * 3400)/2; 
    console.log(distance); 
    return process.exit(0); 
}); 
gpio.setup(pin, gpio.DIR_OUT, on); 

ОРИГИНАЛЬНЫЙ ПОСТ

Я пытаюсь преобразовать рабочий питон скрипт как часть моего проекта развития RPI в Node.js, чтобы избежать необходимости использовать WebSockets.

Это рабочий сценарий Python:

import time 
import RPi.GPIO as GPIO 
import websocket 

for x in range(0, 10): 

    GPIO.setmode(GPIO.BOARD) 
    GPIO.setup(12, GPIO.OUT) 

    #cleanup output 
    GPIO.output(12, 0) 

    time.sleep(0.000002) 

    #send signal 
    GPIO.output(12, 1) 

    time.sleep(0.000005) 

    GPIO.output(12, 0) 

    GPIO.setup(12, GPIO.IN) 

    while GPIO.input(12)==0: 
      starttime=time.time() 

    while GPIO.input(12)==1: 
      endtime=time.time() 

    duration=endtime-starttime 
    distance=duration*34000/2 

    print str(x + 1) + ": " + str(distance) 

    time.sleep(1) 

Функцией этого сценария является использование присоединенного датчика приближения для измерения расстояния.

Мой текущий (грязный) переписан для Node.js (с использованием https://github.com/rakeshpai/pi-gpio для частей GPIO):

var gpio = require("pi-gpio"); 

function rightPingOn() { 
gpio.write(12, 1, function(err){ 
    //if(err) throw err; 
    console.log("Sent 1"); 
});   // Set pin 12 high 
} 

function rightPingOff() { 
gpio.write(12, 0, function(err){ 
    //if(err) throw err; 
    console.log("Sent 0"); 
});   // Set pin 12 low 
} 

function setRightListen() { 
gpio.setDirection(12, "input"); // Open pin 16 for input 
} 

function setRightOutput(){ 
gpio.setDirection(12, "output"); // Open pin 12 for output 
} 

function right_listen(){ 
gpio.read(12, function(err, value){ 
    //if(err) throw err; 
    console.log("Listened"); 
    return value; 
}); 
} 

gpio.open(12); 
setRightOutput(); 
rightPingOff(); 
setTimeout(rightPingOn, 0.5); 
setTimeout(rightPingOff, 0.5); 
setRightListen(); 

while (right_listen == 0){ 
var startTime = getTime(); 
} 

while (right_listen == 1){ 
var endTime = getTime(); 
} 

gpio.close(12); 

var duration = endTime - startTime; 
var distance = duration * 3400/2 

console.log(distance); 

Все, что я в настоящее время в качестве выхода из этого сценария:

NaN 
Sent 0 
Sent 1 
Sent 0 

Любой помощь будет оценена!

ответ

0

oh man. Я думаю, вам будет трудно с этим справиться. Я предполагаю, что интерфейс GPIO python синхронный?

Для начала опроса, как это:

while (right_listen == 0){ 
    var startTime = getTime(); 
} 

while (right_listen == 1){ 
    var endTime = getTime(); 
} 

, вероятно, приведет к бесконечному циклу, поскольку обратные вызовы, которые должны быть изменения значения right_listen никогда не собираются, чтобы получить шанс бежать. Если в следующем разделе предполагается, произойдет в установленном порядке:

gpio.open(12); 
setRightOutput(); 
rightPingOff(); 
setTimeout(rightPingOn, 0.5); 
setTimeout(rightPingOff, 0.5); 
setRightListen(); 

и те вызовы действительно являются асинхронными, вы будете иметь в цепи их вместе в явном виде.

Редактировать: обратите внимание, что это только руководство по тому, как код может выглядеть.

(1) Уведомление Я не обрабатываю ошибки. (2) Эта глубокая вложенность часто называется «callback hell», такие модули, как async, могут сделать код намного приятнее (3) Здесь могут быть небольшие ошибки.

gpio.open(12, function(error) { 
    gpio.setDirection(12, "output", function(error) { 
     gpio.write(12, 0, function(error) { 
      setTimeout(function() { 
       var started = getTime(); 
       gpio.setDirection(12, "input", function(error, value) { 
        console.log("received:", value, "after:", getTime()-started); 
       }) 
      }, 500) 
     }) 
    }) 
}) 
+0

Это очень много! Похоже, много работы, чтобы избавиться от сокетов python ... Есть ли у вас какие-либо предложения, чтобы заставить его работать? Или я должен смотреть на лучший способ вызова скрипта python из node.js? – Oliver

+0

@ user3047558, это приложение действительно может быть хорошим вариантом использования для Node.js, если ваш код будет реагировать на события, созданные из GPIO, и отправлять команды, которые могут не получить немедленных ответов. Если у вас очень сложные последовательности событий, я могу изучить использование асинхронной библиотеки, чтобы предотвратить глубокое вложение. – Cyclone

Смежные вопросы