void SerialDecoderNode::inputsUpdated( qint64 pTimeStamp ) { if( mPinInputBits->isUpdated( pTimeStamp ) ) { QBitArray InpDat = variant( mPinInputBits ).toBitArray(); if( !InpDat.isEmpty() ) { QBitArray SrcDat; QByteArray DstDat; // Prepend any buffered data if( !mBitBuf.isEmpty() ) { int InpSze = InpDat.size(); int BufSze = mBitBuf.size(); SrcDat.resize( BufSze + InpSze ); for( int i = 0 ; i < BufSze ; i++ ) { SrcDat.setBit( i, mBitBuf.testBit( i ) ); } for( int i = 0 ; i < InpSze ; i++ ) { SrcDat.setBit( BufSze + i, InpDat.testBit( i ) ); } mBitBuf.clear(); } else { SrcDat.swap( InpDat ); } // Look for data // qDebug() << "R:" << SrcDat; int SrcOff; for( SrcOff = 0 ; SrcOff < SrcDat.size() - 9 ; ) { if( SrcDat.testBit( SrcOff ) || !SrcDat.testBit( SrcOff + 9 ) ) { SrcOff++; continue; } QBitArray T( 8 ); quint8 C = 0; for( int j = 0 ; j < 8 ; j++ ) { C |= ( SrcDat.testBit( SrcOff + 1 + j ) ? 0x01 : 0x00 ) << j; T.setBit( j, SrcDat.testBit( SrcOff + 1 + j ) ); } // qDebug() << SrcOff << T; DstDat.append( C ); SrcOff += 10; } if( SrcOff < SrcDat.size() ) { if( SrcOff > 0 ) { mBitBuf.resize( SrcDat.size() - SrcOff ); for( int i = 0 ; i < mBitBuf.size() ; i++ ) { mBitBuf.setBit( i, SrcDat.testBit( SrcOff + i ) ); } } else { SrcDat.swap( mBitBuf ); } // qDebug() << "B" << mBitBuf; } if( !DstDat.isEmpty() ) { mValOutputData->setVariant( DstDat ); pinUpdated( mPinOutputData ); } } } }