2023-11-14 09:32:56 +01:00
|
|
|
// written by Thomas Sax, Jan.2022
|
|
|
|
#include "datei.h"
|
|
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
// ------------------------------------------------------ create csv file -------------------------------
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
QByteArray datei_writeArray, datei_tempArray;
|
|
|
|
|
|
|
|
void csv_startCreatingFile(void)
|
|
|
|
{
|
|
|
|
datei_writeArray.clear();
|
|
|
|
datei_tempArray.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void csv_addTextToFile(QString myText)
|
|
|
|
{
|
|
|
|
datei_writeArray.append(myText.toLatin1());
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
}
|
|
|
|
|
|
|
|
void csv_addIntToFile(int myValue)
|
|
|
|
{
|
|
|
|
//qulonglong ullt=12345678901234567890; // max 1,844 x10^19
|
|
|
|
datei_tempArray.setNum(myValue,10); // accepted types: short, ushort, int, uint,
|
|
|
|
// qlonglong, qulonglong, float, double
|
|
|
|
// numerbase can be 2...36(!),10=dec
|
|
|
|
|
|
|
|
datei_writeArray.append(datei_tempArray);
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
}
|
|
|
|
|
|
|
|
void csv_addUintToFile(uint myValue)
|
|
|
|
{
|
|
|
|
datei_tempArray.setNum(myValue,10);
|
|
|
|
datei_writeArray.append(datei_tempArray);
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void csv_addLongvalToFile(qlonglong myValue)
|
|
|
|
{
|
|
|
|
datei_tempArray.setNum(myValue,10);
|
|
|
|
datei_writeArray.append(datei_tempArray);
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
}
|
|
|
|
|
|
|
|
void csv_addUlongvalToFile(qulonglong myValue)
|
|
|
|
{
|
|
|
|
datei_tempArray.setNum(myValue,10);
|
|
|
|
datei_writeArray.append(datei_tempArray);
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
void csv_addCurrentTimeToFile(void)
|
|
|
|
{
|
|
|
|
uint8_t hour, minute, sec, ui8buf[20];
|
|
|
|
char buf[20];
|
|
|
|
|
|
|
|
config_getSysTime(&hour, &minute, &sec);
|
|
|
|
GetTimeString(hour, minute, sec, 0, 1, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<20; nn++)
|
|
|
|
buf[nn]=char(ui8buf[nn]);
|
|
|
|
datei_writeArray.append(buf,8); // time string
|
|
|
|
datei_writeArray.append(FILESEPERATOR);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void csv_addCurrentDateToFile(void)
|
|
|
|
{
|
|
|
|
uint16_t year;
|
|
|
|
uint8_t month, day, ui8buf[20];
|
|
|
|
char buf[20];
|
|
|
|
|
|
|
|
config_getSystemDate(&year, &month, &day);
|
|
|
|
//qDebug()<<"date year: "<<year;
|
|
|
|
GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<20; nn++)
|
|
|
|
buf[nn]=char(ui8buf[nn]);
|
|
|
|
datei_writeArray.append(buf, 10); // date string
|
|
|
|
datei_writeArray.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
void csv_addNewlineToFile(void)
|
|
|
|
{
|
|
|
|
datei_writeArray.chop(1); // Komma weg
|
|
|
|
datei_writeArray.append(NEWLINEINFILE);
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray csv_readbackArray(void)
|
|
|
|
{
|
|
|
|
return datei_writeArray;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
QByteArray csv_writeContent_testValues(void)
|
|
|
|
{
|
|
|
|
QByteArray myBA, tmpBA;
|
|
|
|
uint8_t modCount=5, modAddr=23;
|
|
|
|
uint8_t hour, minute, sec, month, day, ui8buf[20];
|
|
|
|
uint16_t year, modType=45678;
|
|
|
|
char buf[20];
|
|
|
|
uint32_t modNrDIs=1234567890;
|
|
|
|
uint8_t modNrAIs=4, modNrCtr=2, modNrDOs=8;
|
|
|
|
int modNrAOs=-2;
|
|
|
|
|
|
|
|
myBA.clear();
|
|
|
|
tmpBA.clear();
|
|
|
|
myBA.append("scan time");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
|
|
|
|
datei_getSysTime(&hour, &minute, &sec);
|
|
|
|
GetTimeString(hour, minute, sec, 0, 1, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<20; nn++)
|
|
|
|
buf[nn]=char(ui8buf[nn]);
|
|
|
|
myBA.append(buf,8); // time string
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
|
|
|
|
datei_getSystemDate(&year, &month, &day);
|
|
|
|
//qDebug()<<"date year: "<<year;
|
|
|
|
GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<20; nn++)
|
|
|
|
buf[nn]=char(ui8buf[nn]);
|
|
|
|
myBA.append(buf, 10); // date string
|
|
|
|
myBA.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
myBA.append("number of modules");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modCount,10); //2nd para = number base 2, 8, 10 or 16 (bin, oct, dec, hex)
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
myBA.append("busaddr");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("type");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("NrOfDI");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("NrOfAI");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("NrOfCtrIn");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("NrOfDO");
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
myBA.append("NrOfAO");
|
|
|
|
myBA.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
tmpBA.setNum(modAddr,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modType,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modNrDIs,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modNrAIs,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modNrCtr,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modNrDOs,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(FILESEPERATOR);
|
|
|
|
tmpBA.setNum(modNrAOs,10);
|
|
|
|
myBA.append(tmpBA);
|
|
|
|
myBA.append(NEWLINEINFILE);
|
|
|
|
return myBA;
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
// ------------------------------------------------------ parse csv file -------------------------------
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// first: QByteArray datei_readFromFile(QString filename);
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t csv_nrOfEntriesInFile(QByteArray readFromFile)
|
|
|
|
{
|
|
|
|
// count sequences between FILESEPERATOR and NEWLINEINFILE
|
|
|
|
uint32_t filSize=0, pp=0;
|
|
|
|
char oneByt=0;
|
|
|
|
|
|
|
|
int filLen=readFromFile.size();
|
|
|
|
if(filLen>1)
|
|
|
|
filSize=uint32_t(filLen);
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
// 1) find position of seperators
|
|
|
|
for (uint32_t ii=0; ii<filSize; ii++)
|
|
|
|
{
|
|
|
|
oneByt=readFromFile[ii];
|
|
|
|
if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
|
|
|
|
pp++;
|
|
|
|
}
|
|
|
|
// now: pp = number of seperators
|
|
|
|
// oneByt = last byte in file. If it's not a seperator then
|
|
|
|
// there's one more entry (last entry without termination)
|
|
|
|
if (oneByt !=FILESEP1 && oneByt !=FILESEP2 && oneByt !=NEWLINEINFILE)
|
|
|
|
pp++;
|
|
|
|
//qDebug()<<"csv: nr of sequences="<< pp;
|
|
|
|
return pp;
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray csv_getOneFileSequence(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
// seperate file content in single sequences between FILESEPERATOR and NEWLINEINFILE
|
|
|
|
// and return "entryNr" - entry
|
|
|
|
// for this first step leave data type QByteArray
|
|
|
|
// 2nd step can change in numbers and strings
|
|
|
|
QByteArray sequence;
|
|
|
|
uint32_t sepPos[MAXNUMBEROFSEQUENCES];
|
|
|
|
uint32_t filSize=0, pp=0, ii, start=0, ende=0;
|
|
|
|
char oneByt;
|
|
|
|
int filLen, mm;
|
|
|
|
|
|
|
|
filLen=sourceFile.size();
|
|
|
|
//qDebug()<<"fillen="<< filLen;
|
|
|
|
if(filLen<10)
|
|
|
|
return "";
|
|
|
|
filSize=uint32_t(filLen);
|
|
|
|
|
|
|
|
if (sequNr>MAXNUMBEROFSEQUENCES)
|
|
|
|
return "";
|
|
|
|
|
|
|
|
// 1) find position of seperators
|
|
|
|
for (ii=0; ii<filSize; ii++)
|
|
|
|
{
|
|
|
|
oneByt=sourceFile[ii];
|
|
|
|
if (oneByt==FILESEP1 || oneByt==FILESEP2 || oneByt==NEWLINEINFILE)
|
|
|
|
{
|
|
|
|
sepPos[pp++]=ii;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// now: pp = number of entries
|
|
|
|
//qDebug()<<"nr of seperators="<< pp;
|
|
|
|
|
|
|
|
if (sequNr>=pp)
|
|
|
|
return "";
|
|
|
|
|
|
|
|
// 2) get sequence
|
|
|
|
if (sequNr==0)
|
|
|
|
{
|
|
|
|
start=0;
|
|
|
|
ende=sepPos[sequNr];
|
|
|
|
} else
|
|
|
|
if (sequNr>0)
|
|
|
|
{
|
|
|
|
start=sepPos[sequNr-1]+1;
|
|
|
|
ende=sepPos[sequNr];
|
|
|
|
}
|
|
|
|
|
|
|
|
//qDebug()<<"datei getOneFileSequence start/ende: "<<start << " " << ende;
|
|
|
|
if (start>=ende)
|
|
|
|
return "";
|
|
|
|
//return "-err3-";
|
|
|
|
sequence.clear();
|
|
|
|
//batmp.clear();
|
|
|
|
pp=0;
|
|
|
|
for (ii=start; ii<ende; ii++)
|
|
|
|
{
|
|
|
|
mm=int(ii);
|
|
|
|
if (mm>=int(filSize))
|
|
|
|
mm=0;
|
|
|
|
oneByt=sourceFile.at(mm);
|
|
|
|
sequence.append(oneByt);
|
|
|
|
}
|
|
|
|
return sequence;
|
|
|
|
}
|
|
|
|
|
|
|
|
int csv_getEntryAsInt(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA, myVA;
|
|
|
|
int entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
myVA.clear();
|
|
|
|
myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
//qDebug()<<"datei getEntryAsInt, sequence: " << myBA;
|
|
|
|
|
|
|
|
entry=myBA.toInt(&ok,16);
|
|
|
|
if (ok)
|
|
|
|
{
|
|
|
|
//qDebug()<<"datei getEntryAsInt, number: " << entry;
|
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
//qDebug()<<"datei getEntryAsInt, error " << myBA;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t csv_getEntryAsLong(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
long entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
entry=myBA.toLong(&ok,10);
|
|
|
|
if (ok)
|
|
|
|
return entry;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t csv_getEntryAsUshort(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
uint8_t entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
entry=uint8_t(myBA.toUShort(&ok,10));
|
|
|
|
if (ok)
|
|
|
|
return entry;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t csv_getEntryAsUint(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
uint16_t entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
entry=uint16_t(myBA.toUInt(&ok,10));
|
|
|
|
if (ok)
|
|
|
|
return entry;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t csv_getEntryAsUlong(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
uint32_t entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
entry=myBA.toULong(&ok,10);
|
|
|
|
if (ok)
|
|
|
|
return entry;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t csv_getEntryAs2Ulong(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
uint64_t entry=0;
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
entry=myBA.toULongLong(&ok,10);
|
|
|
|
if (ok)
|
|
|
|
return entry;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString csv_getEntryAsString(QByteArray sourceFile, uint32_t sequNr)
|
|
|
|
{
|
|
|
|
QByteArray myBA = csv_getOneFileSequence(sourceFile, sequNr);
|
|
|
|
QString entry;
|
|
|
|
|
|
|
|
//qDebug()<<"datei getEntryAsString, sequence: " << myBA;
|
|
|
|
entry=myBA.toStdString().c_str();
|
|
|
|
return entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
// ------------------------------------------------------ create Json file -------------------------------
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/*
|
|
|
|
example
|
|
|
|
QString str = "{"
|
|
|
|
" \"Herausgeber\": \"Xema\","
|
|
|
|
" \"Nummer\": \"1234-5678-9012-3456\","
|
|
|
|
" \"Deckung\": 2e+6,"
|
|
|
|
" \"Währung\": \"EURO\","
|
|
|
|
" \"Inhaber\": {"
|
|
|
|
" \"Name\": \"Mustermann\","
|
|
|
|
" \"Vorname\": \"Max\","
|
|
|
|
" \"männlich\": true,"
|
|
|
|
" \"Hobbys\": [ \"Reiten\", \"Golfen\", \"Lesen\" ],"
|
|
|
|
" \"Alter\": 42,"
|
|
|
|
" \"Kinder\": [],"
|
|
|
|
" \"Partner\": null"
|
|
|
|
" }"
|
|
|
|
"}";
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
QString myJsonCon;
|
|
|
|
QString tmpStr;
|
|
|
|
|
|
|
|
void json_startRecord(void)
|
|
|
|
{
|
|
|
|
myJsonCon.clear();
|
|
|
|
tmpStr.clear();
|
|
|
|
myJsonCon.append('{');
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_enterIntToRecord(QString attribute, ulong i_value)
|
|
|
|
{
|
|
|
|
tmpStr.clear();
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
tmpStr.setNum(i_value);
|
|
|
|
myJsonCon.append(tmpStr);
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_enterTextToRecord(QString attribute, QString txt_value)
|
|
|
|
{
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(txt_value);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
void json_addCurrentTimeToRecord(QString attribute)
|
|
|
|
{
|
|
|
|
uint8_t hour, minute, sec, ui8buf[20];
|
|
|
|
//char buf[20];
|
|
|
|
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
myJsonCon.append('"');
|
|
|
|
|
|
|
|
datei_getSysTime(&hour, &minute, &sec);
|
|
|
|
GetTimeString(hour, minute, sec, 0, 1, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<8; nn++)
|
|
|
|
myJsonCon.append(ui8buf[nn]);
|
|
|
|
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_addCurrentDateToRecord(QString attribute)
|
|
|
|
{
|
|
|
|
uint16_t year;
|
|
|
|
uint8_t month, day, ui8buf[20];
|
|
|
|
//char buf[20];
|
|
|
|
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
myJsonCon.append('"');
|
|
|
|
|
|
|
|
datei_getSystemDate(&year, &month, &day);
|
|
|
|
GetDateString(day, month, 0x20, uint8_t(year%100), 0, 0, ui8buf);
|
|
|
|
for (uint8_t nn=0; nn<10; nn++)
|
|
|
|
myJsonCon.append(ui8buf[nn]);
|
|
|
|
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
void json_enterArrayToRecord(QString attribute, uint8_t *buf, ulong nrofVals)
|
|
|
|
{
|
|
|
|
// add array of numbers with "nrofVals" elements
|
|
|
|
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
myJsonCon.append('['); // eckig!!!
|
|
|
|
for (ulong ul=0; ul<nrofVals; ul++)
|
|
|
|
{
|
|
|
|
tmpStr.setNum(buf[ul]);
|
|
|
|
myJsonCon.append(tmpStr);
|
|
|
|
myJsonCon.append(',');
|
|
|
|
}
|
|
|
|
myJsonCon.chop(1); // Komma weg
|
|
|
|
myJsonCon.append(']'); // eckig!!!
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_enterStructToRecord(QString attribute)
|
|
|
|
{
|
|
|
|
// every call must be concluded with "json_finishFile()"
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(attribute);
|
|
|
|
myJsonCon.append('"');
|
|
|
|
myJsonCon.append(':');
|
|
|
|
myJsonCon.append('{'); // geschweift!!
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_finishStruct(void)
|
|
|
|
{
|
|
|
|
myJsonCon.chop(2); // remove , and \r from the end
|
|
|
|
myJsonCon.append('}');
|
|
|
|
myJsonCon.append(',');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void json_finishRecord(void)
|
|
|
|
{
|
|
|
|
myJsonCon.chop(2); // remove , and \r from the end
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
myJsonCon.append('}');
|
|
|
|
myJsonCon.append(NEWLINEINFILE);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QString json_readbackRecordStr(void)
|
|
|
|
{
|
|
|
|
return myJsonCon;
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray json_readbackRecordBa(void)
|
|
|
|
{
|
|
|
|
return myJsonCon.toLatin1();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
// ------------------------------------------------------ parse Json file -------------------------------
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
/*
|
|
|
|
example Json File:
|
|
|
|
{"temperature":28,
|
|
|
|
"snow":"no",
|
|
|
|
"Zeit":"16_21_45",
|
|
|
|
"sunny":"12h",
|
|
|
|
"humidity":75,
|
|
|
|
"wann ":"24.01.2022",
|
|
|
|
"unterstruktur":{
|
|
|
|
"day of week":"tuesday",
|
|
|
|
"year":22,
|
|
|
|
"month":1,
|
|
|
|
"day":24},
|
|
|
|
"fast am":"Ende",
|
|
|
|
"Puffer":[8,3,9,2,10]
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
// first: QByteArray datei_readFromFile(QString filename);
|
|
|
|
|
|
|
|
|
|
|
|
int json_nrOfPairsInFile(QByteArray filename)
|
|
|
|
{
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
// key value pair consisting of key (unique string) and value (QJsonValue)
|
|
|
|
int nrOfPairs=jobj.size();
|
|
|
|
|
|
|
|
qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";
|
|
|
|
return nrOfPairs;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_exists(QByteArray filename, QString searchForKey)
|
|
|
|
{
|
|
|
|
// look for "searchForKey" =name of the pair (left of : )
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchForKey))
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_remove(QByteArray filename, QString searchFor)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and remove the record from file
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchFor))
|
|
|
|
{
|
|
|
|
jobj.remove(searchFor);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString json_searchForStringInFile(QByteArray filename, QString searchFor)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchFor))
|
|
|
|
{
|
|
|
|
return jobj[searchFor].toString(); // toObject(); toArray();
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "pairname not found in Json file";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int json_searchForIntInFile(QByteArray filename, QString searchFor)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchFor))
|
|
|
|
{
|
|
|
|
return jobj[searchFor].toInt(); // toObject(); toArray();
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "number not found in Json file";
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_searchForObjectInFile(QByteArray filename, QString searchFor, QJsonObject *oneObject)
|
|
|
|
{
|
|
|
|
// return an object from the json file
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchFor))
|
|
|
|
{
|
|
|
|
*oneObject = jobj[searchFor].toObject();
|
|
|
|
return true;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "Object not found in Json file";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int json_nrOfPairsInObject(QJsonObject objname)
|
|
|
|
{
|
|
|
|
int nrOfPairs=objname.size();
|
|
|
|
qDebug() << "my Json Object has got: " << nrOfPairs<< "pairs";
|
|
|
|
return nrOfPairs;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString json_searchForStringInObject(QJsonObject objname, QString searchFor)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
|
|
|
|
|
|
|
|
if (objname.contains(searchFor))
|
|
|
|
{
|
|
|
|
return objname[searchFor].toString();
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "string not found in Json object";
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int json_searchForIntInObject(QJsonObject objname, QString searchFor)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
|
|
|
|
|
|
|
|
if (objname.contains(searchFor))
|
|
|
|
{
|
|
|
|
return objname[searchFor].toInt();
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "number not found in Json file";
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool json_searchForArrayInFile(QByteArray filename, QString searchFor, QJsonArray *oneArray)
|
|
|
|
{
|
|
|
|
// look for "searchFor" =name of the pair (left of : ) and return value of this pair (right of : ) as String
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(filename);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
|
|
|
|
if (jobj.contains(searchFor))
|
|
|
|
{
|
|
|
|
*oneArray = jobj[searchFor].toArray();
|
|
|
|
return true;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug() << "Array not found in Json file";
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int json_nrOfValuesInArray(QJsonArray arrayname)
|
|
|
|
{
|
|
|
|
int nrOfPairs=arrayname.size();
|
|
|
|
qDebug() << "my Json Array has got: " << nrOfPairs<< "values";
|
|
|
|
return nrOfPairs;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool json_getValuesOfArray(QJsonArray arrayname, int *buf, int MaxBufferSize)
|
|
|
|
{
|
|
|
|
// assuming that the array consists of integers
|
|
|
|
|
|
|
|
/* copy to local buffer:
|
|
|
|
#define MAXNROFARRAYVALUES 100
|
|
|
|
int buf[MAXNROFARRAYVALUES], ii;
|
|
|
|
int nrOfPairs=arrayname.size();
|
|
|
|
|
|
|
|
if (nrOfPairs>MAXNROFARRAYVALUES)
|
|
|
|
nrOfPairs=MAXNROFARRAYVALUES;
|
|
|
|
|
|
|
|
for (ii=0; ii<nrOfPairs; ii++)
|
|
|
|
buf[ii]=arrayname[ii].toInt();
|
|
|
|
*/
|
|
|
|
// copy to host buffer:
|
|
|
|
bool ok=true;
|
|
|
|
int nrOfPairs=arrayname.size();
|
|
|
|
|
|
|
|
if (nrOfPairs>MaxBufferSize)
|
|
|
|
{
|
|
|
|
ok=false; // got not all
|
|
|
|
nrOfPairs=MaxBufferSize;
|
|
|
|
}
|
|
|
|
for (int ii=0; ii<nrOfPairs; ii++)
|
|
|
|
buf[ii]=arrayname[ii].toInt();
|
|
|
|
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
void datei_json_readTestFile(QString filename)
|
|
|
|
{
|
|
|
|
QByteArray my2Ba;
|
|
|
|
QString my2Str;
|
|
|
|
|
|
|
|
my2Str.clear();
|
|
|
|
my2Ba=datei_readFromFile(filename);
|
|
|
|
|
|
|
|
QJsonDocument jdoc = QJsonDocument::fromJson(my2Ba);
|
|
|
|
QJsonObject jobj = jdoc.object();
|
|
|
|
//QJsonParseError jerror;
|
|
|
|
QJsonObject myObj;
|
|
|
|
QJsonArray myArray;
|
|
|
|
|
|
|
|
// key value pair consisting of key (unique string) and value (QJsonValue)
|
|
|
|
int nrOfPairs=jobj.size();
|
|
|
|
qDebug() << "my Json file has got: " << nrOfPairs<< "pairs";
|
|
|
|
|
|
|
|
if (jobj.contains("Zeit"))
|
|
|
|
qDebug() << "my Json file: " << jobj["Zeit"].toString(); // toObject(); toArray();
|
|
|
|
else
|
|
|
|
qDebug() << "my Json file contains no Zeit";
|
|
|
|
|
|
|
|
if (jobj.contains("Humidity"))
|
|
|
|
qDebug() << "my Json file: " << jobj["humidity"].toInt();
|
|
|
|
else
|
|
|
|
qDebug() << "my Json file contains no Humidity";
|
|
|
|
|
|
|
|
if (jobj.contains("month"))
|
|
|
|
qDebug() << "my Json file: " << jobj["month"].toObject(); // anzeige QJsonObject()
|
|
|
|
else
|
|
|
|
qDebug() << "my Json file contains no month";
|
|
|
|
|
|
|
|
|
|
|
|
myObj=jobj["unterstruktur"].toObject();
|
|
|
|
qDebug() << "my unterstruktur: " << myObj["month"].toInt();
|
|
|
|
qDebug() << "my unterstruktur: " << myObj["day of week"].toString();
|
|
|
|
//if (jerror.error == QJsonParseError::NoError)
|
|
|
|
// qDebug() << "no error";
|
|
|
|
|
|
|
|
qDebug() << "my Month: " << myObj["Month"].toInt();
|
|
|
|
//if (myObj["Month"] == QJsonValue::Undefined)
|
|
|
|
// qDebug() << "no found"; geht nicht
|
|
|
|
|
|
|
|
//if (jerror.error != QJsonParseError::NoError)
|
|
|
|
// qDebug() << "no found";
|
|
|
|
|
|
|
|
myArray=jobj["Puffer"].toArray();
|
|
|
|
qDebug() << "my array " <<myArray[2].toInt();
|
|
|
|
//if (jerror.error != QJsonParseError::NoError)
|
|
|
|
// qDebug() << "no found";
|
|
|
|
|
|
|
|
if ( !jobj.contains("Puffer"))
|
|
|
|
qDebug() << "no Puffer found";
|
|
|
|
|
|
|
|
if ( !myArray.contains(20))
|
|
|
|
qDebug() << "no entry found";
|
|
|
|
} */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
// ------------------------------------------------------ read, write, copy files -------------------
|
|
|
|
// -------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void datei_closeFile(QString filename)
|
|
|
|
{
|
|
|
|
QFile file(filename);
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
|
|
|
|
QByteArray datei_readFromFile(QString filename)
|
|
|
|
{
|
|
|
|
//QFile file("/own/H2B/dc2.hex");
|
|
|
|
//QFile file(FILENAME_STRUCTURE);
|
|
|
|
QFile file;
|
|
|
|
|
|
|
|
file.setFileName(filename);
|
|
|
|
QByteArray myBA;
|
|
|
|
|
|
|
|
myBA.clear();
|
|
|
|
if (!file.exists())
|
|
|
|
{
|
|
|
|
qDebug()<<"file not exists";
|
|
|
|
return myBA;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
if (!file.open(QIODevice::ReadOnly) )
|
|
|
|
{
|
|
|
|
qDebug()<<"cannot open";
|
|
|
|
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//qDebug()<<"loading file with " << file.size() <<"byte";
|
|
|
|
myBA = file.readAll();
|
|
|
|
//qDebug()<<"datei read: " << myBA;
|
|
|
|
file.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return myBA;
|
|
|
|
}
|
|
|
|
|
2024-06-05 10:41:15 +02:00
|
|
|
/*
|
|
|
|
* deprecated - use QFileInfo
|
|
|
|
*/
|
2023-11-14 09:32:56 +01:00
|
|
|
bool datei_ifFileExists(QString filename)
|
|
|
|
{
|
|
|
|
|
|
|
|
QFile file;
|
|
|
|
file.setFileName(filename);
|
|
|
|
|
|
|
|
if (file.exists())
|
|
|
|
return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
char datei_writeToFile(QString filename, QByteArray content)
|
|
|
|
{
|
|
|
|
// retval=0 if successful 1: no write access allowed 2:cannot open to append 3:cannot create new file
|
|
|
|
QFile file(filename);
|
|
|
|
QFileInfo myFI(filename);
|
|
|
|
|
|
|
|
//if (!myFI.isWritable()) //geht nur bei NTFS, weg.
|
|
|
|
//{
|
|
|
|
//file.setPermissions(filename, QFile::WriteOther); geht nicht :(
|
|
|
|
// qDebug()<<"datei_writeToFile: writing not allowed. set attributes first!";
|
|
|
|
// return 1;
|
|
|
|
//}
|
|
|
|
|
|
|
|
if (file.exists())
|
|
|
|
{
|
|
|
|
if (!file.open(QIODevice::Append))
|
|
|
|
{
|
|
|
|
qDebug()<<"datei_writeToFile cannot open to append";
|
|
|
|
return 2;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
// add new object to the end of the file
|
|
|
|
file.write(content);
|
|
|
|
file.close();
|
|
|
|
return 0; // OK
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
if (!file.open(QIODevice::WriteOnly))
|
|
|
|
{
|
|
|
|
qDebug()<<"datei_writeToFile cannot open new";
|
|
|
|
return 3;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
qDebug()<<"create new file";
|
|
|
|
// write first lines into file
|
|
|
|
file.write(content);
|
|
|
|
file.close();
|
|
|
|
return 0; // OK
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool datei_copyFile(QString currentFileName, QString newFileName)
|
|
|
|
{
|
|
|
|
// retval=true if successful
|
|
|
|
QFile file;
|
|
|
|
file.setFileName(currentFileName);
|
|
|
|
return file.copy(newFileName);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool datei_clearFile(QString filename)
|
|
|
|
{
|
|
|
|
// retval=true if successful
|
|
|
|
QFile file;
|
|
|
|
file.setFileName(filename);
|
|
|
|
|
|
|
|
file.remove(); // 3.2.22 erst ganz löschen wegen Schreibrechten
|
|
|
|
if (!file.open(QIODevice::WriteOnly))
|
|
|
|
{
|
|
|
|
qDebug()<<"datei_clearFile cannot open file to delete";
|
|
|
|
return false;
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
file.write(0);
|
|
|
|
file.close();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|