Functiongencontrol refactor (#68)

* Add struct definition for functionGenControl channel data

* Add member variables for channel data to functionGenControl, deprecate old variables

* fix a typo

* Transition to new functionGenControl cahnnel data variables. Remove old ones.

* refactor genericUsbDriver::setFunctionGen to use the new ChannelData struct.

* functionGenControl: free(NULL) is safe

* Eliminate duplication of functionGenControl::waveformName_CH* fuctions by putting common things into a private template function

* get rid of comments added during refactor

* Move function gen channel data to use std::vector. algorithmify some code on genericUsbDriver::setFunctionGen

* various formatting changes, remove irrelevant comments

* functionGenControl::waveformName: always use utf8 and 16 byte buffers. Remove template

* fix typo introduced by last-second indentation change

* genericUsbDrive::setFunctionGen: shrink samples to fit

* functionGenControl::waveformName: clean up file path manipulation, clean up formatting

* change the two channel objects to an array of two elements. Add common implementations for all methods of functionGenControl. Fix a massive bug introduced earlier in the refactor. Formatting.
This commit is contained in:
Sebastián Mestre 2019-03-04 06:02:19 -03:00 committed by Chris Esposito
parent 4cd2a03b01
commit a144105b23
4 changed files with 199 additions and 380 deletions

View File

@ -5,127 +5,54 @@
functionGenControl::functionGenControl(QWidget *parent) : QLabel(parent)
{
this->hide();
samples_CH1 = (unsigned char *) malloc(0);
samples_CH2 = (unsigned char *) malloc(0);
}
void functionGenControl::waveformName_CH1(QString newName)
{
qDebug() << "newName = " << newName;
newName.append(".tlw");
//QDir *dir = new QDir();
//QString directory = dir->currentPath();
#ifdef PLATFORM_ANDROID
QString waveformFilePath("assets:/waveforms/");
waveformFilePath.append(newName);
QFile fptr(waveformFilePath);
bool success = fptr.open(QIODevice::ReadOnly);
QByteArray line;
char lengthString[16];
char divisibilityString[16];
line = fptr.readLine();
strcpy(lengthString, line.data());
sscanf(lengthString, "%d", &length_CH1);
qDebug() << "lengthString" << lengthString;
line = fptr.readLine();
strcpy(divisibilityString, line.data());
sscanf(divisibilityString, "%d", &divisibility_CH1);
qDebug() << "divisibilityString" << divisibilityString;
qDebug() << "Length = " << length_CH1;
qDebug() << "Divisibility = " << divisibility_CH1;
QByteArray remainingData = fptr.readAll();
char *dataString = remainingData.data();
free(samples_CH1);
samples_CH1 = (unsigned char *) malloc(length_CH1);
int dummy;
char *dataStringCurrent = dataString;
for (int i=0;i<length_CH1;i++){
sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
samples_CH1[i] = (unsigned char) dummy;
}
#else
QString directory = QCoreApplication::applicationDirPath();
directory.append("/waveforms/");
directory.append(newName);
QByteArray temp = directory.toLocal8Bit();
char *fileName = temp.data();
qDebug() << "opening" << fileName;
FILE *fptr = fopen(fileName, "r");
if (fptr==NULL){
qFatal("%s could not be opened!", fileName);
}
char lengthString[6];
fgets(lengthString, 5, fptr);
qDebug() << lengthString;
sscanf(lengthString, "%d", &length_CH1);
char divisibilityString[6];
//Bit of bullshit to deal with CRLF line endings on Mac.
do fgets(divisibilityString, 5, fptr);
while ((divisibilityString[0] == '\r') || (divisibilityString[0] == '\n'));
sscanf(divisibilityString, "%d", &divisibility_CH1);
qDebug() << "Length = " << length_CH1;
qDebug() << "Divisibility = " << divisibility_CH1;
free(samples_CH1);
samples_CH1 = (unsigned char *) malloc(length_CH1);
char *dataString = (char *) malloc(length_CH1*5+1);
fgets(dataString, length_CH1*5+1, fptr);
int dummy;
char *dataStringCurrent = dataString;
for (int i=0;i<length_CH1;i++){
sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
samples_CH1[i] = (unsigned char) dummy;
}
free(dataString);
fclose(fptr);
#endif
setMaxFreq_CH1(DAC_SPS/(length_CH1>>(divisibility_CH1-1)));
setMinFreq_CH1((double) CLOCK_FREQ/1024/65535/length_CH1);
functionGenToUpdate(0, this);
waveformName(newName, 0);
}
void functionGenControl::freqUpdate_CH1(double newFreq){
qDebug() << "newFreq = " << newFreq;
freq_CH1 = newFreq;
functionGenToUpdate(0, this);
void functionGenControl::freqUpdate_CH1(double newFreq)
{
freqUpdate(newFreq, 0);
}
void functionGenControl::amplitudeUpdate_CH1(double newAmplitude){
qDebug() << "newAmplitude = " << newAmplitude;
amplitude_CH1 = newAmplitude;
functionGenToUpdate(0, this);
void functionGenControl::amplitudeUpdate_CH1(double newAmplitude)
{
amplitudeUpdate(newAmplitude, 0);
}
void functionGenControl::offsetUpdate_CH1(double newOffset){
qDebug() << "newOffset = " << newOffset;
offset_CH1 = newOffset;
functionGenToUpdate(0, this);
void functionGenControl::offsetUpdate_CH1(double newOffset)
{
offsetUpdate(newOffset, 0);
}
void functionGenControl::waveformName_CH2(QString newName)
{
waveformName(newName, 1);
}
void functionGenControl::freqUpdate_CH2(double newFreq)
{
freqUpdate(newFreq, 1);
}
void functionGenControl::amplitudeUpdate_CH2(double newAmplitude)
{
amplitudeUpdate(newAmplitude, 1);
}
void functionGenControl::offsetUpdate_CH2(double newOffset)
{
offsetUpdate(newOffset, 1);
}
void functionGenControl::waveformName(QString newName, int channelID)
{
ChannelData& channel = channels[channelID];
qDebug() << "newName = " << newName;
newName.append(".tlw");
@ -142,93 +69,117 @@ void functionGenControl::waveformName_CH2(QString newName)
line = fptr.readLine();
strcpy(lengthString, line.data());
sscanf(lengthString, "%d", &length_CH2);
sscanf(lengthString, "%d", &channel.length);
qDebug() << "lengthString" << lengthString;
line = fptr.readLine();
strcpy(divisibilityString, line.data());
sscanf(divisibilityString, "%d", &divisibility_CH2);
sscanf(divisibilityString, "%d", &channel.divisibility);
qDebug() << "divisibilityString" << divisibilityString;
qDebug() << "Length = " << length_CH2;
qDebug() << "Divisibility = " << divisibility_CH2;
qDebug() << "Length = " << channel.length;
qDebug() << "Divisibility = " << channel.divisibility;
QByteArray remainingData = fptr.readAll();
char *dataString = remainingData.data();
free(samples_CH2);
samples_CH2 = (unsigned char *) malloc(length_CH2);
channel.samples.resize(channel.length);
int dummy;
char *dataStringCurrent = dataString;
for (int i=0;i<length_CH2;i++){
for (int i = 0; i < channel.length; i++)
{
sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
samples_CH2[i] = (unsigned char) dummy;
channel.samples[i] = uint8_t(dummy);
}
#else
QString directory = QCoreApplication::applicationDirPath();
directory.append("/waveforms/");
directory.append(newName);
QByteArray temp = directory.toLatin1();
char *fileName = temp.data();
QByteArray filePath = QCoreApplication::applicationDirPath()
.append("/waveforms/").append(newName).toUtf8();
qDebug() << "opening" << fileName;
FILE *fptr = fopen(fileName, "r");
if (fptr==NULL){
qFatal("%s could not be opened!", fileName);
}
qDebug() << "opening" << filePath;
char lengthString[5];
FILE *fptr = fopen(filePath.constData(), "r");
if (fptr == NULL)
qFatal("%s could not be opened!", filePath.constData());
char lengthString[16];
fgets(lengthString, 5, fptr);
sscanf(lengthString, "%d", &length_CH2);
sscanf(lengthString, "%d", &channel.length);
char divisibilityString[5];
char divisibilityString[16];
//Bit of bullshit to deal with CRLF line endings on Mac.
do fgets(divisibilityString, 5, fptr);
while ((divisibilityString[0] == '\r') || (divisibilityString[0] == '\n'));
sscanf(divisibilityString, "%d", &divisibility_CH2);
do
{
fgets(divisibilityString, 5, fptr);
}
while ((divisibilityString[0] == '\r') || (divisibilityString[0] == '\n'));
qDebug() << "Length = " << length_CH2;
qDebug() << "Divisibility = " << divisibility_CH2;
sscanf(divisibilityString, "%d", &channel.divisibility);
free(samples_CH2);
samples_CH2 = (unsigned char *) malloc(length_CH2);
qDebug() << "Length = " << channel.length;
qDebug() << "Divisibility = " << channel.divisibility;
char *dataString = (char *) malloc(length_CH2*5+1);
fgets(dataString, length_CH2*5+1, fptr);
channel.samples.resize(channel.length);
char *dataString = (char *) malloc(channel.length*5+1);
fgets(dataString, channel.length*5+1, fptr);
int dummy;
char *dataStringCurrent = dataString;
for (int i=0;i<length_CH2;i++){
for (int i = 0; i < channel.length; i++)
{
sscanf(dataStringCurrent, "%d", &dummy);
dataStringCurrent += strcspn(dataStringCurrent, "\t") + 1;
samples_CH2[i] = (unsigned char) dummy;
channel.samples[i] = uint8_t(dummy);
}
free(dataString);
fclose(fptr);
#endif
setMaxFreq_CH2(DAC_SPS/(length_CH2>>(divisibility_CH2-1)));
setMinFreq_CH2((double) CLOCK_FREQ/1024/65535/length_CH2);
functionGenToUpdate(1, this);
double newMaxFreq = DAC_SPS / (channel.length >> (channel.divisibility - 1));
double newMinFreq = double(CLOCK_FREQ) / 1024.0 / 65535.0 / channel.length;
// NOTE: Not very clean... Not sure what to do about it.
// I guess the "right thing" would be to have a Channel QObject class with its
// own signals and slots, or have a single setMaxFreq signal with channelID as
// an argument. Either solution would require changes in other places in the
// codebase so this will have to do for now.
if (channelID == 0)
{
setMaxFreq_CH1(newMaxFreq);
setMinFreq_CH1(newMinFreq);
}
else
{
setMaxFreq_CH2(newMaxFreq);
setMinFreq_CH2(newMinFreq);
}
functionGenToUpdate(channelID, this);
}
void functionGenControl::freqUpdate_CH2(double newFreq){
qDebug() << "newFreq2 = " << newFreq;
freq_CH2 = newFreq;
functionGenToUpdate(1, this);
void functionGenControl::freqUpdate(double newFreq, int channelID)
{
qDebug() << "newFreq" << channelID << " = " << newFreq;
channels[channelID].freq = newFreq;
functionGenToUpdate(channelID, this);
}
void functionGenControl::amplitudeUpdate_CH2(double newAmplitude){
qDebug() << "newAmplitude2 = " << newAmplitude;
amplitude_CH2 = newAmplitude;
functionGenToUpdate(1, this);
void functionGenControl::amplitudeUpdate(double newAmplitude, int channelID)
{
qDebug() << "newAmplitude" << channelID << " = " << newAmplitude;
channels[channelID].amplitude = newAmplitude;
functionGenToUpdate(channelID, this);
}
void functionGenControl::offsetUpdate_CH2(double newOffset){
qDebug() << "newOffset2 = " << newOffset;
offset_CH2 = newOffset;
functionGenToUpdate(1, this);
void functionGenControl::offsetUpdate(double newOffset, int channelID)
{
qDebug() << "newOffset" << channelID << " = " << newOffset;
channels[channelID].offset = newOffset;
functionGenToUpdate(channelID, this);
}

View File

@ -1,6 +1,8 @@
#ifndef FUNCTIONGENCONTROL_H
#define FUNCTIONGENCONTROL_H
#include <vector>
#include <QWidget>
#include <QLabel>
#include <QDebug>
@ -15,10 +17,30 @@ class functionGenControl : public QLabel
{
Q_OBJECT
public:
struct ChannelData
{
std::vector<uint8_t> samples;
// TODO: get rid of length member. samples:std::vector already has this information
int length;
int divisibility;
double freq = 1000.0;
double amplitude = 0.0;
double offset = 0.0;
};
explicit functionGenControl(QWidget *parent = 0);
unsigned char *samples_CH1, *samples_CH2;
int length_CH1, divisibility_CH1, length_CH2, divisibility_CH2;
double freq_CH1 = 1000, amplitude_CH1 = 0, offset_CH1 = 0, freq_CH2 = 1000, amplitude_CH2 = 0, offset_CH2 = 0;
ChannelData channels[2];
private:
// NOTE: An enum instead of a plain int would probably be better here
void waveformName(QString newName, int channelID);
void freqUpdate(double newFreq, int channelID);
void amplitudeUpdate(double newAmplitude, int channelID);
void offsetUpdate(double newOffset, int channelID);
signals:
void functionGenToUpdate(int channel, functionGenControl *fGenControl);
void setMaxFreq_CH1(double maxFreq);

View File

@ -1,5 +1,8 @@
#include "genericusbdriver.h"
#include <vector>
#include <algorithm>
#ifndef LIBRADOR_LIBRARY
#include "platformspecific.h"
#endif
@ -72,7 +75,8 @@ void genericUsbDriver::setPsu(double voltage){
qDebug() << "Going to send value " << dutyPsu;
}
void genericUsbDriver::setFunctionGen(int channel, functionGenControl *fGenControl){
void genericUsbDriver::setFunctionGen(int channelID, functionGenControl *fGenControl)
{
////////////////////////////
////NO RESIZING (YET)!!!////
////////////////////////////
@ -81,54 +85,37 @@ void genericUsbDriver::setFunctionGen(int channel, functionGenControl *fGenContr
//// CH1 is AUX!! CH2 is "MAIN"!!////
//////////////////////////////////////
int length, maxLength, numDivides, maxDivides;
double freq, amplitude, offset;
unsigned char *samples;
//For recalling on crash.
if (channel == 0) fGenPtr_CH1 = fGenControl;
else fGenPtr_CH2 = fGenControl;
if (channelID == 0)
fGenPtr_CH1 = fGenControl;
else
fGenPtr_CH2 = fGenControl;
//Reading in data
if (channel == 0){
length = fGenControl->length_CH1;
freq = fGenControl->freq_CH1;
amplitude = fGenControl->amplitude_CH1;
offset = fGenControl->offset_CH1;
samples = (unsigned char *) malloc(length);
memcpy(samples, fGenControl->samples_CH1, (unsigned int) length);
numDivides = fGenControl->divisibility_CH1;
}
else if(channel == 1){
length = fGenControl->length_CH2;
freq = fGenControl->freq_CH2;
amplitude = fGenControl->amplitude_CH2;
offset = fGenControl->offset_CH2;
samples = (unsigned char *) malloc(length);
memcpy(samples, fGenControl->samples_CH2, (unsigned int) length);
numDivides = fGenControl->divisibility_CH2;
}
functionGenControl::ChannelData channelData = fGenControl->channels[channelID];
//Triple mode
if ((amplitude+offset) > FGEN_LIMIT){
amplitude = amplitude / 3;
offset = offset / 3;
fGenTriple |= ((unsigned char) !channel + 1);
if ((channelData.amplitude + channelData.offset) > FGEN_LIMIT)
{
channelData.amplitude /= 3.0;
channelData.offset /= 3.0;
fGenTriple |= uint8_t(!channelID + 1);
}
else fGenTriple &= ((unsigned char) (254 - !channel));
//qDebug() << "fGenTriple = " << fGenTriple << "fGenControl = " << fGenControl << "length = " << length << "freq = " << freq << "amplitude = " << amplitude << "offset = " << offset << "samples = " << samples;
else
{
fGenTriple &= uint8_t(254 - !channelID);
}
//Waveform scaling in V
double tempDouble;
amplitude = (amplitude * 255) / FGEN_LIMIT;
offset = (offset * 255) / FGEN_LIMIT;
if (offset<FGEN_OFFSET){
if (amplitude>5)
amplitude -= FGEN_OFFSET;
channelData.amplitude = (channelData.amplitude * 255) / FGEN_LIMIT;
channelData.offset = (channelData.offset * 255) / FGEN_LIMIT;
if (channelData.offset < FGEN_OFFSET)
{
if (channelData.amplitude > 5)
channelData.amplitude -= FGEN_OFFSET;
else
amplitude = 0;
offset = FGEN_OFFSET;
channelData.amplitude = 0;
channelData.offset = FGEN_OFFSET;
}
#ifdef INVERT_TRIPLE
@ -140,67 +127,63 @@ void genericUsbDriver::setFunctionGen(int channel, functionGenControl *fGenContr
usbSendControl(0x40, 0xa4, fGenTriple, 0, 0, NULL);
#endif
//Applying amplitude and offset to all samples.
for (int i=0;i<length;i++){
tempDouble = (double) samples[i];
tempDouble *= amplitude;
tempDouble /= 255;
tempDouble += offset;
samples[i] = (unsigned char) tempDouble;
}
auto applyAmplitudeAndOffset = [=](unsigned char sample) -> unsigned char
{
return sample / 255.0 * channelData.amplitude + channelData.offset;
};
std::transform(channelData.samples.begin(), channelData.samples.end(),
channelData.samples.begin(), // transform in place
applyAmplitudeAndOffset);
//Need to increase size of wave if its freq too high, or too low!
maxDivides = numDivides;
bool loop_entered = false;
unsigned char *tempSamples = (unsigned char *) malloc(0);
{
int shift = 0;
while(length * freq > DAC_SPS){
loop_entered = true;
numDivides--;
if (numDivides==0){
qDebug("numDivides = 0 - in T-stretching of genericUsbDriver:: setFunctionGen");
}
while ((channelData.length >> shift) * channelData.freq > DAC_SPS)
shift++;
int shiftTemp = (maxDivides - numDivides);
length = length >> 1;
if (shift != 0)
{
channelData.divisibility -= shift;
channelData.length >>= shift;
free(tempSamples);
tempSamples = (unsigned char *) malloc(length);
for (int i=0; i<length;i++){
tempSamples[i] = samples[i<<shiftTemp];
}
}
if(loop_entered){
samples = tempSamples;
}
for (int i = 0; i < channelData.length; ++i)
channelData.samples[i] = channelData.samples[i << shift];
//Scaling in t here:
// Something something maxLength something
channelData.samples.resize(channelData.length);
channelData.samples.shrink_to_fit();
//Timer Setup
if (channelData.divisibility <= 0)
qDebug("genericUsbDriver::setFunctionGen: channel divisibility <= 0 after T-stretching");
}
}
// Timer Setup
int validClockDivs[7] = {1, 2, 4, 8, 64, 256, 1024};
auto period = [=](int division) -> int
{
return CLOCK_FREQ / (division * channelData.length * channelData.freq);
};
int clkSetting;
for(clkSetting = 0; clkSetting<7; clkSetting++){
if ( (CLOCK_FREQ / (length * validClockDivs[clkSetting] * freq)) < 65535 )
break;
}
int timerPeriod = CLOCK_FREQ / (length * freq * validClockDivs[clkSetting]);
int* clkSettingIt = std::find_if(std::begin(validClockDivs), std::end(validClockDivs),
[&](int division) -> bool { return period(division) < 65535; });
clkSetting++; // Change from [0:n] to [1:n]
int timerPeriod = period(*clkSettingIt);
if(deviceMode == 5){
// +1 to change from [0:n) to [1:n]
int clkSetting = std::distance(std::begin(validClockDivs), clkSettingIt) + 1;
if(deviceMode == 5)
qDebug("DEVICE IS IN MODE 5");
}
//qDebug() << "First three samples:" << samples[0] << samples[1] << samples[2];
if (channelID)
usbSendControl(0x40, 0xa1, timerPeriod, clkSetting, channelData.length, channelData.samples.data());
else
usbSendControl(0x40, 0xa2, timerPeriod, clkSetting, channelData.length, channelData.samples.data());
if(channel){
usbSendControl(0x40, 0xa1, timerPeriod, clkSetting, length, samples);
}
else usbSendControl(0x40, 0xa2, timerPeriod, clkSetting, length, samples);
free(tempSamples);
return;
}

View File

@ -1,137 +0,0 @@
/****************************************************************************
** Resource object code
**
** Created by: The Resource Compiler for Qt version 5.9.4
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
static const unsigned char qt_resource_data[] = {
// /home/esposch/git/labrador/Desktop_Interface/buffer_0.bmp
0x0,0x0,0x0,0x8d,
0x0,
0x0,0x28,0xb6,0x78,0x9c,0xed,0xd0,0xb1,0xd,0xc2,0x30,0x0,0x45,0xc1,0xb0,0x45,
0x6,0xa0,0xc8,0x4,0xc,0x90,0x3e,0x3b,0x30,0xa,0x53,0xb1,0x1e,0x98,0x28,0x5,
0xd5,0xd5,0x2e,0xde,0x49,0x5f,0xb2,0xec,0xc6,0x7a,0xfb,0xf1,0xde,0x96,0xd3,0x63,
0xec,0x77,0x7c,0x8e,0xdd,0xc7,0x6e,0xcb,0x7a,0xde,0xbf,0xae,0xf7,0x7f,0x9f,0x69,
0x4c,0xfb,0xb1,0x49,0xd4,0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,
0x1f,0xab,0x8f,0xd5,0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,
0xab,0x8f,0xd5,0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,
0x8f,0xd5,0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,0x8f,
0xd5,0xc7,0xea,0x63,0x73,0xf6,0xf9,0x2,0xf4,0x4,0x42,0xe7,
// /home/esposch/git/labrador/Desktop_Interface/buffer_2.bmp
0x0,0x0,0x0,0x7b,
0x0,
0x0,0x28,0xb6,0x78,0x9c,0xed,0xd0,0x31,0xd,0x80,0x30,0x14,0x45,0xd1,0xe2,0x82,
0x81,0xb1,0x3,0xa,0x10,0xc0,0x8e,0x7,0xa4,0xa0,0xa,0x57,0x78,0xa0,0x34,0xc,
0x95,0xf0,0x86,0xf3,0x73,0x7f,0xd2,0xb4,0x4b,0x73,0xf6,0xe3,0x5e,0x4b,0x9f,0xad,
0xed,0x77,0x3c,0xdb,0xd6,0xb6,0x53,0x99,0xfb,0xfd,0xf5,0xbf,0x8f,0x53,0x97,0x27,
0xa4,0xd8,0x8f,0x85,0xc4,0x87,0xf,0x1f,0x3e,0x7c,0x32,0xe3,0xc3,0x87,0xf,0x1f,
0x3e,0x99,0xf1,0xe1,0xc3,0x87,0xf,0x9f,0xcc,0xf8,0xf0,0xe1,0xc3,0x87,0x4f,0x66,
0x7c,0xf8,0xf0,0xe1,0xc3,0x27,0x33,0x3e,0x7c,0xf8,0xf0,0xe1,0x93,0x19,0x1f,0x3e,
0x7c,0xf8,0xf0,0x19,0x7b,0x1,0x6d,0x5a,0xf,0xce,
// /home/esposch/git/labrador/Desktop_Interface/buffer_1.bmp
0x0,0x0,0x0,0x97,
0x0,
0x0,0x28,0xb6,0x78,0x9c,0xed,0xd0,0xb1,0xd,0xc2,0x30,0x10,0x40,0xd1,0xb0,0x5,
0x5,0x65,0xa,0x26,0x60,0x0,0x7a,0x76,0x60,0x14,0xa6,0x62,0x2b,0x66,0x0,0x27,
0x42,0x2,0x51,0xbc,0x96,0x14,0xff,0xc9,0x27,0x9d,0xec,0xc6,0xfa,0xe7,0xcb,0xfd,
0x38,0xad,0x4e,0x63,0x96,0xf5,0x3a,0x66,0x1e,0xb3,0x9b,0xf6,0xeb,0xfd,0xed,0xfd,
0xfe,0xed,0xb9,0x19,0x3f,0x1f,0x9b,0xf,0x8f,0x2d,0x9c,0x7f,0x57,0xf9,0xa8,0x8f,
0xd5,0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,0x8f,0xd5,
0xc7,0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,0x8f,0xd5,0xc7,
0xea,0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,0x8f,0xd5,0xc7,0xea,
0x63,0xf5,0xb1,0xfa,0x58,0x7d,0xac,0x3e,0x56,0x1f,0xab,0x8f,0xd5,0xc7,0xb6,0xd9,
0xe7,0x5,0x35,0x2d,0xc9,0xf3,
};
static const unsigned char qt_resource_name[] = {
// bitmap
0x0,0x6,
0x6,0x90,0xb3,0x80,
0x0,0x62,
0x0,0x69,0x0,0x74,0x0,0x6d,0x0,0x61,0x0,0x70,
// buffer_0.bmp
0x0,0xc,
0xd,0x14,0xd0,0xc0,
0x0,0x62,
0x0,0x75,0x0,0x66,0x0,0x66,0x0,0x65,0x0,0x72,0x0,0x5f,0x0,0x30,0x0,0x2e,0x0,0x62,0x0,0x6d,0x0,0x70,
// buffer_2.bmp
0x0,0xc,
0xd,0x12,0xd0,0xc0,
0x0,0x62,
0x0,0x75,0x0,0x66,0x0,0x66,0x0,0x65,0x0,0x72,0x0,0x5f,0x0,0x32,0x0,0x2e,0x0,0x62,0x0,0x6d,0x0,0x70,
// buffer_1.bmp
0x0,0xc,
0xd,0x17,0xd0,0xc0,
0x0,0x62,
0x0,0x75,0x0,0x66,0x0,0x66,0x0,0x65,0x0,0x72,0x0,0x5f,0x0,0x31,0x0,0x2e,0x0,0x62,0x0,0x6d,0x0,0x70,
};
static const unsigned char qt_resource_struct[] = {
// :
0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
// :/bitmap
0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
// :/bitmap/buffer_2.bmp
0x0,0x0,0x0,0x30,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x91,
0x0,0x0,0x1,0x66,0xe3,0x22,0x5,0x34,
// :/bitmap/buffer_0.bmp
0x0,0x0,0x0,0x12,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,
0x0,0x0,0x1,0x66,0xe3,0x22,0x5,0x34,
// :/bitmap/buffer_1.bmp
0x0,0x0,0x0,0x4e,0x0,0x1,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x10,
0x0,0x0,0x1,0x66,0xe3,0x22,0x5,0x34,
};
#ifdef QT_NAMESPACE
# define QT_RCC_PREPEND_NAMESPACE(name) ::QT_NAMESPACE::name
# define QT_RCC_MANGLE_NAMESPACE0(x) x
# define QT_RCC_MANGLE_NAMESPACE1(a, b) a##_##b
# define QT_RCC_MANGLE_NAMESPACE2(a, b) QT_RCC_MANGLE_NAMESPACE1(a,b)
# define QT_RCC_MANGLE_NAMESPACE(name) QT_RCC_MANGLE_NAMESPACE2( \
QT_RCC_MANGLE_NAMESPACE0(name), QT_RCC_MANGLE_NAMESPACE0(QT_NAMESPACE))
#else
# define QT_RCC_PREPEND_NAMESPACE(name) name
# define QT_RCC_MANGLE_NAMESPACE(name) name
#endif
#ifdef QT_NAMESPACE
namespace QT_NAMESPACE {
#endif
bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
#ifdef QT_NAMESPACE
}
#endif
int QT_RCC_MANGLE_NAMESPACE(qInitResources_resources)();
int QT_RCC_MANGLE_NAMESPACE(qInitResources_resources)()
{
QT_RCC_PREPEND_NAMESPACE(qRegisterResourceData)
(0x2, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_resources)();
int QT_RCC_MANGLE_NAMESPACE(qCleanupResources_resources)()
{
QT_RCC_PREPEND_NAMESPACE(qUnregisterResourceData)
(0x2, qt_resource_struct, qt_resource_name, qt_resource_data);
return 1;
}
namespace {
struct initializer {
initializer() { QT_RCC_MANGLE_NAMESPACE(qInitResources_resources)(); }
~initializer() { QT_RCC_MANGLE_NAMESPACE(qCleanupResources_resources)(); }
} dummy;
}