void Hardware::ADC_ReadData(unsigned int channel, unsigned char *signal, unsigned int int_count, bool invert) { channel--; // convert real channel number to logical channel volatile unsigned long* regAddr = (unsigned long *) RegADC[channel]; unsigned long *uint32_buffer; unsigned int read_out_cnt = int_count + 1; // because of below pre-decrement unsigned int *adc_offs = (unsigned int *) _ADC_Offset[channel]; // assign 32 bit integer pointer to offset bytes // delay compensation in fast acquisition TB (1 GSa/S) if(MainTimebase < 8) { signal += _ChannelDelay[channel]; // shift buffer address (1 byte = 1nS) } uint32_buffer = (unsigned long *) signal; // point with 32 bit integer to the signal buffer // The Signal comes head over heals -> so we have to invert it for correct // display. Therefor we only have to adjust the virtual zero in inverted mode. if (invert) { unsigned char adc_v_zero = _ADC_VirtualZero[channel] << 1; unsigned long adc_v_zero32 = 0; // shift 8 bit virtual ADC-zero byte for byte into 32 bit integer adc_v_zero32 = (int)adc_v_zero; adc_v_zero32 = adc_v_zero32 << 8; adc_v_zero32 = adc_v_zero32 | (int)adc_v_zero; adc_v_zero32 = adc_v_zero32 << 8; adc_v_zero32 = adc_v_zero32 | (int)adc_v_zero; adc_v_zero32 = adc_v_zero32 << 8; adc_v_zero32 = adc_v_zero32 | (int)adc_v_zero; if (MainTimebase < 11 || USTB_Mode != USTB_OFF) // Highspeed -> 16KB memory and all 4 ADC { // read byte data integer aligned from FPGA register while (--read_out_cnt) { *uint32_buffer++ = adc_v_zero32 + (*regAddr + *adc_offs); // make offset correction for all 4 bytes in one step } // and copy bytes integer aligned into the signal buffer } else // Lowspeed -> 4kB memory and only one ADC { // read byte data integer aligned from FPGA register while (--read_out_cnt) { *signal++ = adc_v_zero + (unsigned char)(*regAddr + *adc_offs); // make offset correction for all 4 bytes in one step } // and copy the first byte into the signal buffer } } else { if (MainTimebase < 11 || USTB_Mode != USTB_OFF) // Highspeed -> 16KB memory and all 4 ADC { // read byte data integer aligned from FPGA register while (--read_out_cnt) { *uint32_buffer++ = ~(*regAddr + *adc_offs ) + 0x02020202; // make offset correction for all 4 bytes in one step } // and copy bytes integer aligned into the signal buffer } else // Lowspeed -> 4kB memory and only one ADC { // read byte data integer aligned from FPGA register while (--read_out_cnt) { *signal++ = ~(unsigned char)(*regAddr + *adc_offs) + 2; // make offset correction for all 4 bytes in one step } // and copy the first byte into the signal buffer } } }