2017-01-08 14 views
5

Jestem nowy dla nodejs i to, co zrobiłem, to połączyłem panel LCD i matrycę matrycy membranowej 4x4 z Raspberry Pi i zaprogramowałem je za pomocą Node.js. To, co chcę osiągnąć, to naciśnięcie klawisza, który powinien być natychmiast wyświetlony na panelu LCD, a kiedy naciśniesz # powinien przestać pobierać dane wejściowe.Funkcja asynchroniczna nie produkuje natychmiastowego wyniku wewnątrz pętli

Do tego użyłem pakiety LCD https://www.npmjs.com/package/lcd i RPIO https://github.com/jperkin/node-rpio a ponieważ mam do ciągłego sprawdzania danych wejściowych użytkownika Włożyłem kod do podejmowania wejście w pętli while & wewnątrz że napisałem oświadczenie druku i że jest gdzie problem nadchodzi. Panel LCD nie wyświetla żadnych znaków po naciśnięciu klawisza na klawiaturze, ale gdy naciśniesz #, program wychodzi i wszystkie znaki są wyświetlane na panelu LCD.

Kod, który napisałem jest następujący.

var rpio = require('rpio'); 
var Lcd = require('lcd'),//This is asynchronous function 
    lcd = new Lcd({ 
     rs: 18, 
     e: 23, 
     data: [24, 17, 27, 22], 
     cols: 8, 
     rows: 2 
    }); 
var matrix=[[1,2,3,'A'], 
      [4,5,6,'B'], 
      [7,8,9,'C'], 
      ['*',0,'#','D']] 
var row=[37,35,33,31]; 
var col=[29,23,40,38]; 
for (var i = 0; i < 4; i++) { 
    rpio.open(col[i], rpio.OUTPUT, rpio.HIGH); 
} 
for (var i = 0; i < 4; i++) { 
    rpio.open(row[i], rpio.INPUT, rpio.PULL_UP); 
} 
var code=""; 
var comeout=0; 
lcd.on('ready', function() { 
    lcd.setCursor(0, 0); 
    //start of keypad code 
    while(true){ 
     for (var j = 0; j < 4; j++) { 
      rpio.write(col[j],rpio.LOW); 
      for (var i = 0; i < 4; i++) { 
       if(rpio.read(row[i])==0){ 
        console.log(matrix[i][j]); 
        lcd.print(matrix[i][j]); 
        if(matrix[i][j]=='#'){ 
         comeout=1; 
         break; 
        } 
        while(rpio.read(row[i])==0); 
       } 
      } 
      if(comeout==1) 
       break; 
      else 
       rpio.write(col[j],rpio.HIGH); 
     } 
     if(comeout==1) 
      break; 
    } 
    //end of keypad code 
}); 

// If ctrl+c is hit, free resources and exit. 
process.on('SIGINT', function() { 
    lcd.clear(); 
    lcd.close(); 
    process.exit(); 
}); 

Każda pomoc będzie bardzo cenna. Dziękuję Ci.

+0

Proponuję złamać kod na małe kawałki i skupić się na problemie. – niry

+0

nie można używać pętli 'while (true)' w ten sposób w JS. Właśnie dlatego masz zdarzenia, które pozwolą Ci zauważyć, co się dzieje z klawiszami. Sprawdź 'rpio.poll()'. Ponieważ nie w pełni rozumiem, jak działają twoje pętle i 'rpio.write()' oraz 'rpio.read()', których tam używasz, nie jestem w stanie przepisać kodu – Thomas

+0

Zgaduję, że ' col' i 'row' zawierają trochę bit-masks !? – Thomas

Odpowiedz

0

Zgodnie z omówieniem z @Thomas powyżej, proponuję symulację pętli while(true) za pomocą wywołań setImediate, w której należy zażądać matrycy i wykonać LCD.print. Dzieje się tak, ponieważ LCD.print dodaje operacje do kolejki zdarzeń javascripts. Ale operacje kolejki zdarzeń są blokowane, dopóki faktyczna operacja nie zostanie zakończona. Nigdy nie zakończy się tak długo, jak długo jesteś w pętli while(true).

Musisz zakończyć aktywną operację i podać sterowanie pętli zdarzeń, które z kolei wykonuje polecenia drukowania. Ale jednocześnie musisz upewnić się, że skanujesz matrycę tak długo, jak długo nie naciskasz klawisza "#".

Oto przykład:

lcd.on('ready', function() 
{ 
    lcd.setCursor(0, 0); 
    setImediate(
    function scanMatrix() 
    { 
    for (var j = 0; j < 4; j++) 
    { 
     rpio.write(col[j],rpio.LOW); 
     for (var i = 0; i < 4; i++) 
     { 
     if(rpio.read(row[i])==0) 
     { 
      console.log(matrix[i][j]); 
      lcd.print(matrix[i][j]); 
      if(matrix[i][j]!='#') 
      { 
      setImmediate(scanMatrix); 
      } 
      while(rpio.read(row[i])==0); 
     } 
     } 
     rpio.write(col[j],rpio.HIGH); 
    } 
    }); 
}); 

Kod nie jest badana, ponieważ nie mam raspi tutaj. Powinien dać ci pomysł, jak rozwiązać problem.

Naprawdę fajne ;-) rozwiązaniem byłoby dodanie mikrokontrolera (MSP430, ...) do matrycy klawiszy. MC skanuje matrycę i przenosi naciśnięcia klawiszy na raspi przez SPI lub I2C. .... OK, ok, ok, nie bij mnie ;-)

Powiązane problemy