여러 개의 숫자를 사용하여 입력할 때 복도교 표지 문제가 발생한다

3579 단어 voodoospark

묘사

안녕, 크리스,
우선, 스파크 Core/Photon "voodoospark.cpp"펌웨어를 개발해 주셔서 감사합니다. 이것은 아름답고 우아한 코드입니다.
나는 복도교의 방주를 실시하고 있다.cpp와 내가 사용하는 것은 3개의 아두노판 + 2개의 광자판을 사용하고 여러 개의 센서(스위치, 버튼과 운동 센서)를 각 마이크로 컨트롤러에 연결한다.나는 펌웨어가 노드 응용 프로그램에 보고할 수 있도록 포트 값을 정확하게 계산하지 않았다는 것을 알아차렸다.
내가 구체적으로 말한 것은 #484줄:portValues[k]=(portValues[k]|pinValue)<나는 그것을 사용하지 않고:portValues[k]=portValues[k]+pinValue*factor를 사용했다.
이곳의 요소는 수학이다.포로(2,k)
여러 개의 숫자 입력에 '높음' 상태를 적용할 때마다 문제가 생겼다.나의 예에서 나는 세 개의 숫자를 입력했다.만약 내가 한 번에 하나의 숫자 입력에만 '높음' 을 적용한다면, 그것은 매우 잘 작동할 것이다. 그러나 내가 3개의 숫자 입력 단추를 눌렀을 때, 그것은 정확한 값을 계산하지 않을 것이다.나는 이것이 문서 교환 조작원과 관련이 있다고 생각한다(<<).그래서 펌웨어를 수정해서 여러분과 공유하기로 했습니다.
너는 이것을 조사해서 나에게 이것이 합리적인지 아닌지를 알려줄 수 있니?당신은 다른 사용자들도 비슷한 문제를 가지고 있다고 생각해 본 적이 있습니까?이것은 나로 하여금 일주일 동안 미치게 했다. 나는 내가 사용하고 있는 거의 모든 모듈 (Johnny Five, Socket IO, Ethernet Standard Firmata, Voodoospark) 을 디버깅해야만 했다.
여기다
알프레도 보레로

토론 #1

portValues[k] + pinValue * factor; Where Factor is Math.pow(2,k)


이것은 틀림없이 옳지 않은 것이지만, 복도교의 현재 운영 상황을 보면, 내가 실수를 한 것 같다.대신 다음과 같습니다.
portValues[k] = (portValues[k] | pinValue) << i;
다음과 같습니다.
portValues[k] = portValues[k] | (1 << i);
아니면 더 좋아...
portValues[k] |= 1 << i;
만약 D0, D1, D2, D3, D4가 모두 보고서에 있다고 가정하면 현재 모두 높은 위치에 있다.8바이트로 표시하면 0b00011111 처럼 보이고, 그 중 1-5바이트는 on이다.각 고인발에 대해 1을 그 위치로 옮긴다.
다음은 JS의 시뮬레이션입니다.
function digitalRead(pin) {
  // simulate HIGH on pins 0-4
  return pin < 5 ? 1 : 0;
}

var portValues_a = [ 0, 0 ]; // this will store my version
var portValues_b = [ 0, 0 ]; // this will store your version
var reporting = [1, 1, 1, 1, 1]; // reporting on D0, D1, D2, D3, & D4

for (var k = 0; k < 2; k++) {
  var shouldSend = false;

  portValues_a[k] = 0; 
  portValues_b[k] = 0;

  for (i = 0; i < 8; i++) {
    pin = (k * 10) + i;

    if (reporting[pin] == 1) {
      shouldSend = true;
      pinValue = digitalRead(pin);

      if (pinValue) {
        portValues_a[k] |= 1 << i;
        portValues_b[k] = portValues_b[k] + pinValue * Math.pow(2, k);
      }
    }
  }
}

console.log(portValues_a);  // [ 31, 0 ] 0b00011111
console.log(portValues_b);  // [ 5, 0 ]  0b00000101 <-- This would look like D0 and D2 are high, but no others. 
어쨌든 이것은 버그입니다. 2014년 11월에 버그가 발생했다는 것을 알게 되어 부끄럽습니다.내가 알고 있는 복도교 공원과 합작하고, 강니 5호와 입자 IO와 합작한 사람과 프로젝트의 수를 감안하면, 나는 이 일이 주의를 끌지 못한 것에 대해 더욱 놀랐다.
금방 고칠게요.

토론 #2

다음과 같은 방법으로 최신 펌웨어 변경 사항을 테스트할 수 있습니다.
고맙습니다, 점원. 이것은 우아한 해결 방안입니다.나는 나의 발전을 계속할 것이다...이것은 나를 일주일 동안 미치게 했다: -)
내 아이폰에서 보내기

On Mar 8, 2016, at 6:33 PM, Rick Waldron [email protected] wrote:

You can test the latest firmware changes with this:

var Particle = require("../lib/particle"); var board = new Particle({ token: process.env.PARTICLE_TOKEN, deviceId: process.env.PARTICLE_DEVICE_ID, });

board.on("ready", function() { var values = []; Array.from({length: 8}, (_, index) => { values.push(0); this.pinMode(D${index}, this.MODES.INPUT); this.digitalRead(D${index}, function(value) { values[index] = value; }); });

setInterval(function() { console.log(values.join("-")); }.bind(this), 100); }); — Reply to this email directly or view it on GitHub.

좋은 웹페이지 즐겨찾기