Compare commits

...

2 Commits

Author SHA1 Message Date
e3d5f52aa2 bug fix; cal/raw display 2025-04-14 18:20:52 +02:00
9c6a9a21a6 init Blake 2025-04-14 14:55:10 +02:00
11 changed files with 213 additions and 48 deletions

View File

@ -39,17 +39,32 @@ void DataReceiver::readData()
std::cout << "packet error. Got" << size_received_bytes << " bytes expected" << expected_size_bytes << std::endl; std::cout << "packet error. Got" << size_received_bytes << " bytes expected" << expected_size_bytes << std::endl;
continue; continue;
} }
else
{
// std::cout << "packet received. Got" << size_received_bytes << " bytes expected" << expected_size_bytes << std::endl;
}
for (int ethb = 0; ethb < ethBunch; ethb++) for (int ethb = 0; ethb < ethBunch; ethb++)
{ {
int baseaddr = ethb * (DATA_PACKET_HEADER_SIZE + DATA_SYNC_HEADER_SIZE + dmaBunch*DATA_BLOCK_SIZE + DATA_RMS_FRAME_SIZE); int baseaddr = ethb * (DATA_PACKET_HEADER_SIZE + DATA_SYNC_HEADER_SIZE + dmaBunch*DATA_BLOCK_SIZE + DATA_RMS_FRAME_SIZE);
//check the header //check the header
if (BYTES2SHORT(tmpBuffer+baseaddr+0) != 0x5555) if (BYTES2SHORT(tmpBuffer+baseaddr+0) != 0x5555){
// std::cerr << "header not found." << std::endl;
continue; continue;
if (BYTES2SHORT(tmpBuffer+baseaddr+2) != COMMAND_DATA_TRANSFER) }
//else { std::cerr << "header found." << std::endl; }
if (BYTES2SHORT(tmpBuffer+baseaddr+2) != COMMAND_DATA_TRANSFER){
// std::cerr << "transfer not found." << std::endl;
continue; continue;
if ((BYTES2SHORT(tmpBuffer+baseaddr+4)*2) != (DATA_SYNC_HEADER_SIZE + dmaBunch*DATA_BLOCK_SIZE)) }
//else { std::cerr << "transfer found." << std::endl; }
if ((BYTES2SHORT(tmpBuffer+baseaddr+4)*2) != (DATA_SYNC_HEADER_SIZE + dmaBunch*DATA_BLOCK_SIZE/2)){
//std::cerr << "sync header not found." << std::endl;
continue; continue;
}
//else { std::cerr << "sync header found." << std::endl; }
//read sync data; //read sync data;
SyncFrame sync; SyncFrame sync;
@ -66,14 +81,26 @@ void DataReceiver::readData()
framesReceived++; framesReceived++;
int baseaddr2 = baseaddr + dmab*DATA_BLOCK_SIZE; int baseaddr2 = baseaddr + dmab*DATA_BLOCK_SIZE;
if (outputEnabled) //if (outputEnabled)
{ {
BufferData data_to_push(sensorsPerBoard * DATA_SAMPLES_PER_SENSOR); BufferData data_to_push(sensorsPerBoard * DATA_SAMPLES_PER_SENSOR);
data_to_push.sync_frame = sync; data_to_push.sync_frame = sync;
int baseaddr3 = baseaddr2 + DATA_PACKET_HEADER_SIZE + DATA_SYNC_HEADER_SIZE; int baseaddr3 = baseaddr2 + DATA_PACKET_HEADER_SIZE + DATA_SYNC_HEADER_SIZE;
for (int s = 0; s < (sensorsPerBoard * DATA_SAMPLES_PER_SENSOR); s++) for (int s = 0; s < (sensorsPerBoard * DATA_SAMPLES_PER_SENSOR); s++)
data_to_push.sensor_data[s] = 65535 - BYTES2INT(tmpBuffer + baseaddr3 + DATA_BYTES_PER_SAMPLE*s); //2 bytes RMS + 2 bytes CAL per channel {
//uint64_t rawValue = BYTES2INT64(tmpBuffer + baseaddr3 + DATA_BYTES_PER_SAMPLE * s);
char * mybuffer= tmpBuffer + baseaddr3 + DATA_BYTES_PER_SAMPLE * s ;
BYTE2SD(mybuffer, data_to_push.sensorData[s]);
//data_to_push.sensorData[s].raw1 = static_cast<unsigned short>((rawValue << 0 ));
// data_to_push.sensorData[s].raw2 = static_cast<unsigned short>((rawValue << 16 ));
// For CAL values, adjust as needed based on your data format
// data_to_push.sensorData[s].cal1 = static_cast<short>((rawValue << 32));
//data_to_push.sensorData[s].cal2 = static_cast<short>((rawValue << 48));
//printBufferBits(mybuffer, sizeof(mybuffer));
//std::cerr << framesFromLastSig << " " << s << " " << data_to_push.sensorData[s].raw1 << " " <<data_to_push.sensorData[s].raw2 << " " << data_to_push.sensorData[s].cal1 << " " <<data_to_push.sensorData[s].cal2 << std::endl;
}
rms.mean = BYTES2SHORT(tmpBuffer+baseaddr+DATA_PACKET_HEADER_SIZE+DATA_SYNC_HEADER_SIZE+DATA_BLOCK_SIZE); rms.mean = BYTES2SHORT(tmpBuffer+baseaddr+DATA_PACKET_HEADER_SIZE+DATA_SYNC_HEADER_SIZE+DATA_BLOCK_SIZE);
rms.sigma = BYTES2SHORT(tmpBuffer+baseaddr+DATA_PACKET_HEADER_SIZE+DATA_SYNC_HEADER_SIZE+DATA_BLOCK_SIZE + 2); rms.sigma = BYTES2SHORT(tmpBuffer+baseaddr+DATA_PACKET_HEADER_SIZE+DATA_SYNC_HEADER_SIZE+DATA_BLOCK_SIZE + 2);

View File

@ -6,16 +6,17 @@
#include <QTimer> #include <QTimer>
#include <QThread> #include <QThread>
#include <QSemaphore> #include <QSemaphore>
#include <cstring> // For std::memcpy
#include "cbuffer.h" #include "cbuffer.h"
#define DATA_PACKET_HEADER_SIZE 6 #define DATA_PACKET_HEADER_SIZE 6
#define DATA_SYNC_HEADER_SIZE 6 #define DATA_SYNC_HEADER_SIZE 6
#define DATA_RMS_FRAME_SIZE 16 //8 unsigned short #define DATA_RMS_FRAME_SIZE 16 // 8 unsigned shorts
#define DATA_BYTES_PER_SAMPLE 4 //RMS + CAL streamed in data RMSCALRMSCALRMSCAL etc #define DATA_BYTES_PER_SAMPLE 8 // RAW1RAW2+CAL1+CAL2
#define DATA_SAMPLES_PER_SENSOR 64 #define DATA_SAMPLES_PER_SENSOR 32 //grab 2 channels per sample RAW1+RAW2
#define DATA_MAX_SENSORS_PER_BOARD 5 #define DATA_MAX_SENSORS_PER_BOARD 5
#define DATA_MAX_BUNCH 16 //max. product of dmaBunch * ethBunch #define DATA_MAX_BUNCH 16 // Max. product of dmaBunch * ethBunch
//#define DATA_BLOCK_SIZE (DATA_SENSORS_PER_BOARD * DATA_SAMPLES_PER_SENSOR * DATA_BYTES_PER_SAMPLE) //#define DATA_BLOCK_SIZE (DATA_SENSORS_PER_BOARD * DATA_SAMPLES_PER_SENSOR * DATA_BYTES_PER_SAMPLE)
#define DATA_BLOCK_SIZE (sensorsPerBoard * DATA_SAMPLES_PER_SENSOR * DATA_BYTES_PER_SAMPLE) #define DATA_BLOCK_SIZE (sensorsPerBoard * DATA_SAMPLES_PER_SENSOR * DATA_BYTES_PER_SAMPLE)
@ -35,8 +36,8 @@ typedef struct
unsigned short local_ctr; unsigned short local_ctr;
unsigned short global_ctr; unsigned short global_ctr;
unsigned short sma_state; unsigned short sma_state;
//these files are additional compared to STM side // These fields are additional compared to STM side
unsigned short dummy = 0xFFFF; //for nice structure packing unsigned short dummy = 0xFFFF; // For nice structure packing
int device_nr; int device_nr;
int data_ok; int data_ok;
} SyncFrame; } SyncFrame;
@ -55,11 +56,18 @@ public:
SyncFrame sync_frame; SyncFrame sync_frame;
RMSFrame rms_frame; RMSFrame rms_frame;
int buffer_size; int buffer_size;
int* sensor_data; //4 byte int for RAW + CAL instead of 2byte unsigned short for one
BufferData() : buffer_size(0), sensor_data(NULL) {} struct SensorData {
unsigned short raw1; // First 16-bit unsigned short
unsigned short raw2; // Second 16-bit unsigned short
signed short cal1; // First 16-bit signed short
signed short cal2; // Second 16-bit signed short
};
SensorData* sensorData; // Renamed from sensor_data
BufferData(int size) : buffer_size(0), sensor_data(NULL) BufferData() : buffer_size(0), sensorData(nullptr) {}
BufferData(int size) : buffer_size(0), sensorData(nullptr)
{ {
resize(size); resize(size);
} }
@ -67,33 +75,33 @@ public:
void resize(int size) void resize(int size)
{ {
if (size == buffer_size) if (size == buffer_size)
return; //no need to change return; // No need to change
if (sensor_data) if (sensorData)
{ {
delete[] sensor_data; delete[] sensorData;
sensor_data = NULL; sensorData = nullptr;
} }
buffer_size = size; buffer_size = size;
if (size) //do not allocate memory for an empty buffer if (size) // Do not allocate memory for an empty buffer
sensor_data = new int[size]; sensorData = new SensorData[size];
} }
BufferData(const BufferData& master) : buffer_size(0), sensor_data(NULL) BufferData(const BufferData& master) : buffer_size(0), sensorData(nullptr)
{ {
sync_frame = master.sync_frame; sync_frame = master.sync_frame;
rms_frame = master.rms_frame; rms_frame = master.rms_frame;
resize(master.buffer_size); resize(master.buffer_size);
memcpy(sensor_data, master.sensor_data, buffer_size*sizeof(int)); std::memcpy(sensorData, master.sensorData, buffer_size * sizeof(SensorData));
} }
BufferData& operator=(const BufferData& master) BufferData& operator=(const BufferData& master)
{ {
if (this == &master) if (this == &master)
return *this; //self-assignment return *this; // Self-assignment
sync_frame = master.sync_frame; sync_frame = master.sync_frame;
rms_frame = master.rms_frame; rms_frame = master.rms_frame;
resize(master.buffer_size); resize(master.buffer_size);
memcpy(sensor_data, master.sensor_data, buffer_size*sizeof(int)); std::memcpy(sensorData, master.sensorData, buffer_size * sizeof(SensorData));
return *this; return *this;
} }
@ -101,8 +109,6 @@ public:
{ {
resize(0); // :) resize(0); // :)
} }
//unsigned short sensor_data[DATA_SENSORS_PER_BOARD * DATA_SAMPLES_PER_SENSOR];
}; };
typedef CBuffer<BufferData> DataBuffer; typedef CBuffer<BufferData> DataBuffer;
@ -111,21 +117,19 @@ class DataReceiver : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit DataReceiver(QObject *parent = 0); explicit DataReceiver(QObject *parent = nullptr);
~DataReceiver(); ~DataReceiver();
void configureEthSettings(QHostAddress address_to_set, quint16 port_to_set); void configureEthSettings(QHostAddress address_to_set, quint16 port_to_set);
void configureBunchSize(int dma, int eth); void configureBunchSize(int dma, int eth);
void outputEnable(int en); void outputEnable(int en);
int frameRate = 0; int frameRate = 0;
int devNr = 0; int devNr = 0;
int sensorsPerBoard = 2; int sensorsPerBoard = 5;
DataBuffer dataBuffer; DataBuffer dataBuffer;
signals: signals:
void sigInit(); void sigInit();
void sigDeinit(); void sigDeinit();
@ -133,22 +137,22 @@ signals:
void sigDataReady(DataReceiver* ptr); void sigDataReady(DataReceiver* ptr);
public slots: public slots:
void onTimer(); void onTimer();
protected: protected:
void init(); void init();
void deinit(); void deinit();
QThread thread; QThread thread;
QSemaphore initSemaphore; QSemaphore initSemaphore;
QTimer* timer = NULL; QTimer* timer = nullptr;
QUdpSocket* dataSocket = NULL; QUdpSocket* dataSocket = nullptr;
QHostAddress address; QHostAddress address;
quint16 port; quint16 port;
int outputEnabled = 0; int outputEnabled = 0;
int dmaBunch = 1; int dmaBunch = 1;
int ethBunch = 1; int ethBunch = 1;
char tmpBuffer[DATA_MAX_PACKET_SIZE]; char tmpBuffer[DATA_MAX_PACKET_SIZE];
int framesReceived = 0; //to calculate frame rate int framesReceived = 0; // To calculate frame rate
int framesFromLastSig = 0; int framesFromLastSig = 0;
protected slots: protected slots:

View File

@ -39,6 +39,10 @@ BPMDisplay::BPMDisplay(QWidget *parent) :
// Gray out the buttons when they are disabled // Gray out the buttons when they are disabled
ui->pushButton_savecalib->setStyleSheet(expertModeEnabled ? "" : "background-color: gray;"); ui->pushButton_savecalib->setStyleSheet(expertModeEnabled ? "" : "background-color: gray;");
// Check if checkBox_toggleRawCal exists in UI
if (ui->checkBox_toggleRawCal) {
connect(ui->checkBox_toggleRawCal, &QCheckBox::stateChanged, this, &BPMDisplay::onDataToggleChanged);
}
} }
@ -465,3 +469,8 @@ void BPMDisplay::updateStatus(unsigned short value)
{ {
ui->lcdNumber_status->display((value)); ui->lcdNumber_status->display((value));
} }
void BPMDisplay::onDataToggleChanged(int state) {
showCalibrated = (state == Qt::Checked);
plot();
}

View File

@ -29,8 +29,9 @@ public:
void setTitle(QString title); void setTitle(QString title);
QVector<signed short> buffer; QVector<signed short> buffer; //unsigned short raw; signed short cal
QVector<signed short> rmsbuffer; QVector<signed short> rmsbuffer;
bool showCalibrated = false;
public slots: public slots:
@ -47,6 +48,7 @@ public slots:
void updateRms(unsigned short value); void updateRms(unsigned short value);
void updateMax(unsigned short value); void updateMax(unsigned short value);
void updateStatus(unsigned short value); void updateStatus(unsigned short value);
void onDataToggleChanged(int state);
@ -57,11 +59,16 @@ protected:
QVector<signed short> dataRMS; QVector<signed short> dataRMS;
private: private:
Ui::display *ui; Ui::display *ui;
QRadioButton *radioButtonFixedScale; // Pointer to the Fixed Scale radio button QRadioButton *radioButtonFixedScale; // Pointer to the Fixed Scale radio button
QRadioButton *radioButtonAutoscale; // Pointer to the Autoscale radio button QRadioButton *radioButtonAutoscale; // Pointer to the Autoscale radio button
QButtonGroup *buttonGroup; QButtonGroup *buttonGroup;
QCheckBox *checkBoxToggleRawCal; //for show raw or cal data
QMap<QString, QVector<signed short>> backgroundDataMap; // Map to store background data for each plane QMap<QString, QVector<signed short>> backgroundDataMap; // Map to store background data for each plane
bool subtractBackground = false; // Flag to track if background subtraction is enabled bool subtractBackground = false; // Flag to track if background subtraction is enabled

View File

@ -167,10 +167,9 @@
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QCheckBox" name="checkBox_expertmode"> <widget class="QCheckBox" name="checkBox_toggleRawCal">
<property name="text"> <property name="text">
<string>expert <string>Show caled</string>
mode</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -182,6 +181,14 @@ calibration</string>
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QCheckBox" name="checkBox_expertmode">
<property name="text">
<string>expert
mode</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="pushButton_loadcalib"> <widget class="QPushButton" name="pushButton_loadcalib">
<property name="text"> <property name="text">

View File

@ -1,4 +1,5 @@
#include "displayserver.h" #include "displayserver.h"
#include "helpers.h"
DisplayServer::DisplayServer(QObject *parent) : QObject(parent) DisplayServer::DisplayServer(QObject *parent) : QObject(parent)
{ {
@ -106,6 +107,10 @@ void DisplayServer::plot()
//fill with data //fill with data
int current_base = 0; int current_base = 0;
// Assuming 'sensor_data' is an array of ints and 'buffer' is a QVector<short>
BufferData::SensorData rawValue;
for (int dev_nr = 0; dev_nr < planeConfig[plane]->nr_devices; dev_nr++) for (int dev_nr = 0; dev_nr < planeConfig[plane]->nr_devices; dev_nr++)
{ {
int dev_id = planeConfig[plane]->devices[dev_nr]->deviceConfig.device_id; int dev_id = planeConfig[plane]->devices[dev_nr]->deviceConfig.device_id;
@ -113,8 +118,24 @@ void DisplayServer::plot()
if (nr_channels > lastFrame[dev_id].buffer_size) if (nr_channels > lastFrame[dev_id].buffer_size)
nr_channels = lastFrame[dev_id].buffer_size; //check if there's really some data in the buffer nr_channels = lastFrame[dev_id].buffer_size; //check if there's really some data in the buffer
//WARNING!!! Device order is not yet implemented!!! (probably) //WARNING!!! Device order is not yet implemented!!! (probably)
for (int i = 0; i < nr_channels; i++) for (int i = 0; i < planeConfig[plane]->nr_sensors * 64 / 2 ; i++){ //should be 32
displays[plane]->buffer[current_base+i] = lastFrame[dev_id].sensor_data[i]; //displays[plane]->buffer[current_base+i] = lastFrame[dev_id].sensor_data[i]; //old code
// Use RAW values (index 2*i) or CAL values (index 2*i + 1)
rawValue = lastFrame[dev_id].sensorData[i]; // Get int(RAW1+RAW2)
//std::cerr << i <<" " << rawValue.raw1 << " " << rawValue.raw2 << " " <<rawValue.cal1 << " " <<rawValue.cal2 << " " <<std::endl;
if (!displays[plane]->showCalibrated) //RAW1, RAW2, ...
{
displays[plane]->buffer[current_base + 2*i] = static_cast<short>(rawValue.raw1);
displays[plane]->buffer[current_base + 2*i + 1] = static_cast<short>(rawValue.raw2);
}
else //CAL1, CAL2
{
displays[plane]->buffer[current_base + 2*i] = static_cast<short>(rawValue.cal1);
displays[plane]->buffer[current_base + 2*i + 1] = static_cast<short>(rawValue.cal2);
}
}
current_base += nr_channels; current_base += nr_channels;
displays[plane]->rmsbuffer[0] = lastFrame[dev_id].rms_frame.mean; displays[plane]->rmsbuffer[0] = lastFrame[dev_id].rms_frame.mean;
displays[plane]->rmsbuffer[1] = lastFrame[dev_id].rms_frame.sigma; displays[plane]->rmsbuffer[1] = lastFrame[dev_id].rms_frame.sigma;

View File

@ -30,6 +30,9 @@ public:
int isActive(); int isActive();
~DisplayServer(); ~DisplayServer();
void unsetup(); void unsetup();
// New boolean flag to control display of RAW or CAL data
bool showRawData = true; // Default is to show RAW data // use displays[plane]->showCalibrated instead
signals: signals:
public slots: public slots:

View File

@ -34,7 +34,6 @@ EventBuilder::~EventBuilder()
//main processing slot //main processing slot
void EventBuilder::onNewData(DataReceiver* receiver) void EventBuilder::onNewData(DataReceiver* receiver)
{ {
short * newcopy_sensor_data = new short int[320];
while (checkBufferOccupancies()) while (checkBufferOccupancies())
{ {
//find lowest global sync value //find lowest global sync value
@ -206,7 +205,7 @@ void EventBuilder::logDataToFile()
for (int board = 0; board < totalBoards; board++) for (int board = 0; board < totalBoards; board++)
{ {
logFile.write((const char*)&(currentFrame[board].sync_frame), sizeof(SyncFrame)); logFile.write((const char*)&(currentFrame[board].sync_frame), sizeof(SyncFrame));
logFile.write((const char*)currentFrame[board].sensor_data, currentFrame[board].buffer_size*sizeof(unsigned short)); logFile.write((const char*)currentFrame[board].sensorData, currentFrame[board].buffer_size*sizeof(int));
logFile.write((const char*)&(currentFrame[board].rms_frame), sizeof(RMSFrame)); logFile.write((const char*)&(currentFrame[board].rms_frame), sizeof(RMSFrame));
} }

View File

@ -95,3 +95,67 @@ void saveCsvFile(QString filename, QList<QVector<double>> params, QList<QVector<
file.close(); file.close();
} }
uint8_t reverseBits(uint8_t byte) {
uint8_t reversedByte = 0;
for (int i = 0; i < 8; ++i) {
reversedByte = (reversedByte << 1) | (byte & 1);
byte >>= 1;
}
return reversedByte;
}
void invertBits(char* buffer, size_t size) {
if (buffer == nullptr) {
// Handle error: buffer is null
return;
}
for (size_t i = 0; i < size; ++i) {
buffer[i] = ~buffer[i]; // Perform bitwise NOT operation
}
}
void swapEndian(char* buffer, size_t size) {
for (size_t i = 0; i < size; i += 2) {
std::swap(buffer[i], buffer[i + 1]);
}
}
void BYTE2SD(char* mybuffer, BufferData::SensorData& data) {
// Ensure the buffer has at least 8 bytes
if (mybuffer == nullptr) {
// Handle error: buffer is null
return;
}
// // Reverse bits of each byte in the buffer
// for (size_t i = 0; i < 8; ++i) {
// mybuffer[i] = reverseBits(static_cast<uint8_t>(mybuffer[i]));
// }
// Invert bits of each byte in the buffer
invertBits(mybuffer, sizeof(mybuffer));
swapEndian(mybuffer, sizeof(mybuffer));
// Combine the first 4 bytes into raw1 and raw2
uint32_t raw_value;
std::memcpy(&raw_value, mybuffer, sizeof(raw_value));
data.raw1 = static_cast<uint16_t>(raw_value & 0xFFFF); // Lower 16 bits
data.raw2 = static_cast<uint16_t>((raw_value >> 16) & 0xFFFF); // Upper 16 bits
// Combine the next 4 bytes into cal1 and cal2
int32_t cal_value;
std::memcpy(&cal_value, mybuffer + 4, sizeof(cal_value));
data.cal1 = static_cast<int16_t>(cal_value & 0xFFFF); // Lower 16 bits
data.cal2 = static_cast<int16_t>((cal_value >> 16) & 0xFFFF); // Upper 16 bits
}
void printBufferBits(const char* buffer, size_t size) {
for (size_t i = 0; i < size; ++i) {
// Print each byte in binary
std::bitset<8> bits(static_cast<unsigned char>(buffer[i]));
std::cerr << bits << ' ';
}
std::cerr << std::endl;
}

View File

@ -11,6 +11,18 @@
#include <QVector> #include <QVector>
#include <QFile> #include <QFile>
#include <QTextStream> #include <QTextStream>
#include <cstdint>
#include <cstring> // for std::memcpy
#include "datareceiver.h"
#include <iostream>
#include <bitset>
void BYTE2SD(char* mybuffer, BufferData::SensorData& data);
void printBufferBits(const char* buffer, size_t size) ;
uint8_t reverseBits(uint8_t byte);
void invertBits(char* buffer, size_t size);
void swapEndian(char* buffer, size_t size);
//byte array <-> unsiged short conversion //byte array <-> unsiged short conversion
#define SHORT2BYTES(sh,by) {by[0] = (sh>>8) & 0xFF; by[1] = sh & 0xFF;} #define SHORT2BYTES(sh,by) {by[0] = (sh>>8) & 0xFF; by[1] = sh & 0xFF;}
@ -31,7 +43,17 @@
(static_cast<unsigned char>((by)[2]) << 8) | \ (static_cast<unsigned char>((by)[2]) << 8) | \
(static_cast<unsigned char>((by)[3]))\ (static_cast<unsigned char>((by)[3]))\
) )
#define BYTES2INT64(by) \
( \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[0])) << 56) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[1])) << 48) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[2])) << 40) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[3])) << 32) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[4])) << 24) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[5])) << 16) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[6])) << 8) | \
(static_cast<uint64_t>(static_cast<unsigned char>((by)[7])) ) \
)
QString ip2num(QString input, unsigned char* numbers = NULL); QString ip2num(QString input, unsigned char* numbers = NULL);
//go to the main branch of settings //go to the main branch of settings

View File

@ -33,4 +33,6 @@ protected:
}; };
#endif // HISTOGRAM_H #endif // HISTOGRAM_H