#ifndef HELPERS_H
#define HELPERS_H

#include <QString>
#include <QStringList>
#include <QSettings>
#include <QTimer>
#include <QCoreApplication>
#include <QThread>
#include <QList>
#include <QVector>
#include <QFile>
#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
#define SHORT2BYTES(sh,by)  {by[0] = (sh>>8) & 0xFF; by[1] = sh & 0xFF;}
#define LO(x)               (x & 0xFF)
#define HI(x)               ((x>>8) & 0xFF)
#define BYTES2SHORT(by)     ( ((unsigned short)(unsigned char)((by)[0]) << 8) | ((unsigned short)(unsigned char)((by)[1])) )    //safe way
#define BYTES2SIGNSHORT(by)     ( *((signed short*)by) )                                          //faster
#define BYTES2SIGNEDSHORT(by) \
    ( \
        (static_cast<short>(static_cast<unsigned char>((by)[0])) << 8) | \
        (static_cast<short>(static_cast<unsigned char>((by)[1]))) \
        )
    //convert textual representation of IP to array of numbers and/or well-formatted string
#define BYTES2INT(by) \
    ( \
        (static_cast<unsigned char>((by)[0]) << 24) | \
        (static_cast<unsigned char>((by)[1]) << 16) | \
        (static_cast<unsigned char>((by)[2]) << 8) | \
        (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);

    //go to the main branch of settings
void top (QSettings* settings);

    //copy settings table
void copyQSettings(QSettings* from, QSettings* to);

    //sleep with processing queues
void msleep2(unsigned int ms, unsigned int resolution = 10);

    //Save data in form of CSV file. The three tables should have the same number of rows. They will be concatenated. Sensormean and sensorstd will be interlaced.
void saveCsvFile(QString filename, QList<QVector<double>> params, QList<QVector<double>> sensormean, QList<QVector<double>> sensorstd, QString delimiter = QString(","));

#endif // HELPERS_H

