#include "clusterstack.h" clusterStack::clusterStack(int firstPacketIndex, ADC_ns::bitDepth bitDepth, QList *channelsConfig, int channelOffset, QList * slaves, QObject *parent) : QObject{parent}, _bitDepth(bitDepth), _channelsCount(0), _tachoOffset(0), _bytesInSample(2), _firstPacketIndex(firstPacketIndex) { double __baseFactor = 0; if (bitDepth == ADC_ns::bitDepth::BIT16) { __baseFactor = (double)12500/32768; _bytesInSample = 2; } else if (bitDepth == ADC_ns::bitDepth::BIT24) { __baseFactor = (double)12500/8388608; _bytesInSample = 3; } for (int i=0; icount(); i++) { _channelFactors[0][i] = __baseFactor * channelsConfig->at(i)->getFactor() / 1000; // mV -> V } for (int __slaveIndex = 0; __slaveIndex < slaves->count(); __slaveIndex++) { QList * __channelsConfig = slaves->at(__slaveIndex)->getChannelsConfig(); for (int i=0; i<__channelsConfig->count(); i++) { _channelFactors[__slaveIndex + 1][i] = __baseFactor * __channelsConfig->at(i)->getFactor() / 1000; // mV -> V } } _tachoOffset = _bytesInSample * channelOffset * channelsConfig->count() + DATA_OFFSET; _channelsCount = channelsConfig->count(); } void clusterStack::insert(int adcIndex, int packetIndex, QByteArray packet) { _packets[adcIndex][packetIndex] = packet; } double clusterStack::getValue(int adcIndex, int packetIndex, uint8_t channel, int sampleNo) { trans_ns::bytes2word __point; trans_ns::bytes2long __longPoint; int __pointOffset = (channel + _channelsCount * sampleNo) * _bytesInSample + DATA_OFFSET; if (__pointOffset < 0) { #ifdef CLUSTER_DEBUG qDebug() << "(!) pointOffset: " << __pointOffset; qDebug() << "(!) channel: " << channel; qDebug() << "(!) channelsCount: " << _channelsCount; qDebug() << "(!) sampleNo: " << sampleNo; qDebug() << "(!) bytesInSample: " << _bytesInSample; #endif return (double)0; } if (_packets[adcIndex][packetIndex].size() < __pointOffset + _bytesInSample) { return (double)0; } else { if (_bytesInSample == 2) { __point.bytes.L = _packets[adcIndex][packetIndex][__pointOffset]; __point.bytes.H = _packets[adcIndex][packetIndex][__pointOffset + 1]; return (double)((int16_t)__point.word * _channelFactors[adcIndex][channel]); } else if (_bytesInSample == 3) { __longPoint.bytes.LL = _packets[adcIndex][packetIndex][__pointOffset]; __longPoint.bytes.LH = _packets[adcIndex][packetIndex][__pointOffset + 1]; __longPoint.bytes.HL = _packets[adcIndex][packetIndex][__pointOffset + 2]; if (__longPoint.bytes.HL > 127) { __longPoint.bytes.HH = 0xFF; } else { __longPoint.bytes.HH = 0x00; } return (double)((int32_t)__longPoint.twinWord * _channelFactors[adcIndex][channel]); } else return (double)0; } } bool clusterStack::getTachoValue(int adcIndex, int packetIndex, int sampleNo) { trans_ns::byte2bits __byte; int __byteOffset = _tachoOffset + (int)(sampleNo / 8); int __bitOffset = sampleNo % 8; if (_packets[adcIndex][packetIndex].size() < __byteOffset + 1) { return false; } else { __byte.byte = _packets[adcIndex][packetIndex][__byteOffset]; switch (__bitOffset) { case 0: return __byte.bits.a0 == 1; break; case 1: return __byte.bits.a1 == 1; break; case 2: return __byte.bits.a2 == 1; break; case 3: return __byte.bits.a3 == 1; break; case 4: return __byte.bits.a4 == 1; break; case 5: return __byte.bits.a5 == 1; break; case 6: return __byte.bits.a6 == 1; break; case 7: return __byte.bits.a7 == 1; break; default: return false; } } }