digitalread in una classe ritorna sempre HIGH

ciao, allora sto lavorando a una classe che gestica il PPM in modo "asincrono" su più pin. per ora voglio fare una semplice lettura, però qualcosa non mi torna: una digitalRead fatta in una classe ritorna sempre HIGH, mentre da quella fatta nel loop funziona tutto. Idee??

posto il codice:
InputPin.h

#ifndef InputPin_h
#define InputPin_h

#include "WProgram.h"

class InputPin{
  
  public:
    InputPin(int pinNumber);
    InputPin(int pinNumber, bool startingSignal);
    void update();
    unsigned long getDuration();
    bool getDurationTipe();
    bool lastRead;
  private:
    bool signal;
    int pin;
    unsigned long signalStart;
    unsigned long signalLenght;

};

#endif

InputPin.cpp

#include "WProgram.h"
#include "InputPin.h"

#define MAXUNSIGNEDLONGCVALUE 4294967295

InputPin::InputPin(int pinNumber){
  InputPin(pinNumber, false);
}

InputPin::InputPin(int pinNumber, bool startingSignal){
  pin = pinNumber;
  signal = startingSignal;
  signalLenght=0;
  signalStart = micros();
  pinMode(pin, INPUT);
  lastRead=false;
}
  
void InputPin::update(){
  lastRead=digitalRead(pin);
  if ( ( lastRead==LOW && signal ) || ( lastRead==HIGH && !signal ) ){ //quì era if ( lastRead != signal ) ma l'ho cambiato per sicurezza
    unsigned long t = micros();
    if (t > signalStart){
      signalLenght = t-signalStart;
    }else{
      signalLenght = MAXUNSIGNEDLONGCVALUE-(signalStart-t);
    }
    signal=!signal;
    signalStart=t;
  }
}

bool InputPin::getDurationTipe(){
  return signal;
}

unsigned long InputPin::getDuration(){
  return signalLenght;
}

main

#include "InputPin.h"

InputPin classe(2);
void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT);
}

unsigned long time = micros(); //calcola la durata del loop
int io = 0; //srcive una volta su 1000 vi seriale, altrimenti il loop diventa troppo lento
void loop(){
  
  classe.update();
  io++;
  if (io%1000==0 || classe.lastRead==LOW){
    Serial.print( digitalRead(2) );
  Serial.print(" TIME:");
  Serial.print( (micros()-time) );
  time = micros();
  Serial.print(" ");
  Serial.print("Signal status: ");
  Serial.print( classe.lastRead );
  Serial.print(" ");
  Serial.print( classe.getDurationTipe() );
  Serial.print(" ");
  Serial.println( classe.getDuration() );
  io =0;
  
  }
}

a chi interessa, ho risolto leggendo direttamente i registri, così posso fare 8 letture in contemporanea dei pin digitali 0-7 (se togliamo tx e rx vengono giusto 6 letture, quelle che mi servivano!)
Se a qualcuno interessa più avanti posterò anche una classe per scrivere, sempre sullo stesso concetto di chiamate non bloccanti.
Ah, essendo PPM la parte "importante" del segnale è la durata di HIGH, che viene restituita in microsecondi (già gestito il caso overflow del timer).
La duarata di un ciclo di update (che aggiorna 8 valori digitali) è di circa 34 microsecondi, contro i 24 micros che impiega la digital read per 8 valori (ma non rileva la durata di segnale alto e basso)

p.s. mamma mia che brutta roba il c++ by un javista :wink:

InputPin.h

#include "WProgram.h"

class InputPin{
  
  public:
    InputPin();
    void update();
    unsigned long getDuration(byte i);
  private:
    unsigned long signalStart[8];
    unsigned long signalLenght[8];
    bool channel[8];

};

InputPin.cpp

#include "InputPin.h"

#define MAXUNSIGNEDLONGCVALUE 4294967295

InputPin::InputPin(){
  byte i;
  unsigned long t = micros();
  for (i=0;i<8;i++){
    channel[i]=false;
    signalLenght[i]=0;
    signalStart[i] = t;
  }

}

void InputPin::update(){
  byte mask;
  unsigned long t=micros();
  byte data=0;
  data |= PIND;
  int i=0;
  for (mask = 00000001; mask>0; mask <<= 1) { //iterate through bit mask
    if (data & mask){ // if bitwise AND resolves to true
      if ( !channel[i] ){
        signalStart[i]=t;
        channel[i]=true;
      }
    }else{ //if bitwise and resolves to false
      if ( channel[i] ){
        if (t > signalStart[i]){ //handle overflow
          signalLenght[i] = t-signalStart[i];
        }else{
          signalLenght[i] = MAXUNSIGNEDLONGCVALUE-(signalStart[i]-t);
        }
        channel[i]=false;
      }
      
    }
    i++;
  }
}

unsigned long InputPin::getDuration(byte i){
  return signalLenght[i];
}

test.pde

#include "InputPin.h"

InputPin classe;
void setup(){
  Serial.begin(9600);
}

unsigned long time = micros();
int io = 0;
void loop(){
  classe.update();
  io++;
  if (io%1000==0){
    unsigned long tempTime=(micros()-time)/1000;
    //Serial.print( digitalRead(7) );
    Serial.print("TIME fastRead: ");
    Serial.println( tempTime );
    
    int i;    
    time = micros();
    for (i=0;i<1000;i++){
      digitalRead(7);
    }
    tempTime=(micros()-time)/1000;
    Serial.print("TIME digitalRead: ");
    Serial.println( tempTime );
    

    for (i=1;i<8;i++){
      Serial.print(" pin ");
      Serial.print( i+1 );
      Serial.print(" ");
      Serial.println( classe.getDuration(i) );
    }
    io =0;
    time = micros();
  }
}