2026-04-22 10:40:19 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include <string.h>
|
|
|
|
|
|
#include <ctime>
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
|
|
|
|
#include "cjson.h"
|
|
|
|
|
|
#include "PQDIF_classes.h"
|
|
|
|
|
|
#include "pqdif_ph.h"
|
|
|
|
|
|
|
|
|
|
|
|
typedef double DATE;
|
|
|
|
|
|
|
|
|
|
|
|
class CPQDIF_Element;
|
|
|
|
|
|
class CPQDIF_E_Collection;
|
|
|
|
|
|
class CPQDIF_E_Scalar;
|
|
|
|
|
|
class CPQDIF_E_Vector;
|
|
|
|
|
|
class CPQDIF_R_Observation;
|
|
|
|
|
|
class CPQDIF_R_DataSource;
|
|
|
|
|
|
class CPQDIF_R_Container;
|
|
|
|
|
|
class CPQDIF_R_Settings;
|
|
|
|
|
|
class CPQDIF_PC_FlatFile;
|
|
|
|
|
|
|
|
|
|
|
|
// ============================
|
|
|
|
|
|
// PQDIF ͨ<><CDA8><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>Ϣ
|
|
|
|
|
|
// <20><><EFBFBD>ã<EFBFBD><C3A3>ѱ<EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ<EFBFBD><C7A9>¶<EFBFBD><C2B6><EFBFBD>ϲ<EFBFBD>
|
|
|
|
|
|
// ============================
|
|
|
|
|
|
struct PqdifChannelInfoEx
|
|
|
|
|
|
{
|
|
|
|
|
|
std::string name; // ԭʼ tagChannelName
|
|
|
|
|
|
long countSeries = 0; // ͨ<><CDA8><EFBFBD>µ<EFBFBD> series <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
long phaseId = -1; // tagPhaseID
|
|
|
|
|
|
GUID quantityTypeId{}; // tagQuantityTypeID
|
|
|
|
|
|
long quantityMeasuredId = -1; // tagQuantityMeasuredID
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// ============================
|
|
|
|
|
|
// PQDIF ϵ<><CFB5><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>Ϣ
|
|
|
|
|
|
// <20><><EFBFBD>ã<EFBFBD><C3A3>ѱ<EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD>ϵ<EFBFBD>м<EFBFBD><D0BC><EFBFBD>ǩ<EFBFBD><C7A9>¶<EFBFBD><C2B6><EFBFBD>ϲ<EFBFBD>
|
|
|
|
|
|
// ============================
|
|
|
|
|
|
struct PqdifSeriesInfoEx
|
|
|
|
|
|
{
|
|
|
|
|
|
long quantityUnitsId = -1; // tagQuantityUnitsID
|
|
|
|
|
|
GUID quantityCharacteristicId{}; // tagQuantityCharacteristicID
|
|
|
|
|
|
GUID valueTypeId{}; // tagValueTypeID
|
|
|
|
|
|
|
|
|
|
|
|
long seriesBaseType = -1; // series <20>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
|
|
|
|
|
double scale = 1.0; // <20><><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
|
|
|
|
|
|
double offset = 0.0; // ƫ<><C6AB>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-04-29 13:35:49 +08:00
|
|
|
|
class CPQDIF
|
2026-04-22 10:40:19 +08:00
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CPQDIF();
|
|
|
|
|
|
~CPQDIF();
|
|
|
|
|
|
public:
|
|
|
|
|
|
void GetTime(DATE dt, time_t* tm);
|
|
|
|
|
|
void put_FlatFileName(string strFileName);
|
|
|
|
|
|
bool Read();
|
|
|
|
|
|
bool Close();
|
|
|
|
|
|
bool New();
|
|
|
|
|
|
long RecordGetCount();
|
|
|
|
|
|
bool RecordGetInfo
|
|
|
|
|
|
(
|
|
|
|
|
|
long index,
|
2026-04-29 13:35:49 +08:00
|
|
|
|
GUID* tagRecordType,
|
|
|
|
|
|
string& nameRecordType
|
2026-04-22 10:40:19 +08:00
|
|
|
|
);
|
2026-04-29 13:35:49 +08:00
|
|
|
|
bool RecordRequestRecord(long index, long* pRecord);
|
|
|
|
|
|
bool RecordRequestObservation(long index, long* pRecordObserv);
|
2026-04-22 10:40:19 +08:00
|
|
|
|
bool ObservationGetInfo(long pRecordObserv, DATE& timeStart, string& name, long& countChannels);
|
2026-04-29 13:35:49 +08:00
|
|
|
|
bool ObservationGetTriggerInfo(long pRecordObserv, long* idTriggerMethod, DATE* timeTriggered);
|
|
|
|
|
|
bool ObservationGetChannelInfo(long pRecordObserv, long idxChannel, string& name, long* countSeries);
|
|
|
|
|
|
bool ObservationGetSeriesInfo3(long pRecordObserv, long idxChannel, long idxSeries, long* idQuantityUnits, GUID* idQuantityCharacteristic, GUID* idValueType);
|
|
|
|
|
|
bool ObservationGetSeriesData(long pRecordObserv, long idxChannel, long idxSeries, double** values, long* varCount);
|
|
|
|
|
|
bool ObservationGetChannelFreq(long pRecObs, long idxChannel, double* freq);
|
|
|
|
|
|
bool ObservationGetChannelGroupID(long pRecObs, long idxChannel, int* GroupID);
|
|
|
|
|
|
bool ObservationGetSeriesPhasicType(long pRecordObserv, long idxChannel, long idxSeries, long* valuetypes);
|
|
|
|
|
|
bool ObservationGetSeriesScale(long pRecObs, long idxChannel, long idxSeries, double* scale, double* offset);
|
2026-04-22 10:40:19 +08:00
|
|
|
|
bool RecordReleaseObservation(long pRecordObserv);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ Observation <20><>ij<EFBFBD><C4B3>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>ǩ<EFBFBD><C7A9>Ϣ
|
|
|
|
|
|
bool ObservationGetChannelInfoEx(long pRecordObserv, long idxChannel, PqdifChannelInfoEx* out);
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡ Observation <20><>ij<EFBFBD><C4B3> series <20><><EFBFBD><EFBFBD>չ<EFBFBD><D5B9>ǩ<EFBFBD><C7A9>Ϣ
|
|
|
|
|
|
bool ObservationGetSeriesInfoEx(long pRecordObserv, long idxChannel, long idxSeries, PqdifSeriesInfoEx* out);
|
|
|
|
|
|
// Internal
|
|
|
|
|
|
protected:
|
2026-04-29 13:35:49 +08:00
|
|
|
|
CPQDIF_Element* ValidateElement(long pElement);
|
|
|
|
|
|
CPQDIF_E_Collection* ValidateCollection(long pElement);
|
|
|
|
|
|
CPQDIF_E_Scalar* ValidateScalar(long pElement);
|
|
|
|
|
|
CPQDIF_E_Vector* ValidateVector(long pElement);
|
|
|
|
|
|
CPQDIF_R_Observation* ValidateObservation(long pRecObserv);
|
|
|
|
|
|
CPQDIF_R_DataSource* ValidateDataSource(long pRecDS);
|
|
|
|
|
|
CPQDIF_R_Settings* ValidateSettings(long pRecSettings);
|
|
|
|
|
|
CPQDIF_R_Container* ValidateContainer(long pRecCon);
|
2026-04-22 10:40:19 +08:00
|
|
|
|
bool SetDateFromTimeStamp(DATE& date, const TIMESTAMPPQDIF& ts);
|
|
|
|
|
|
// Member data
|
|
|
|
|
|
private:
|
2026-04-29 13:35:49 +08:00
|
|
|
|
CPQDIF_PC_FlatFile* m_percont; // Persistence controller
|
2026-04-22 10:40:19 +08:00
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class CItem //<2F><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խṹ
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
string KeyName;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
string DateName;//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>
|
|
|
|
|
|
string Type;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MAX MIN AVG CP95 NULL
|
|
|
|
|
|
|
|
|
|
|
|
CItem(const string& kn, const string& dn, const string& tp)
|
|
|
|
|
|
: KeyName(kn), DateName(dn), Type(tp) {}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class CSeq //<2F><><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
string seq;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
string telemetryType;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|
|
|
|
|
string jsonname;//josn key<65><79><EFBFBD><EFBFBD>
|
|
|
|
|
|
list<CItem*> DateItemList;//<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
CSeq(const string& s, const string& tt, const string& tp)
|
|
|
|
|
|
: seq(s), telemetryType(tt), jsonname(tp) {}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
~CSeq() {
|
|
|
|
|
|
// <20>ͷ<EFBFBD>DateItemList<73>е<EFBFBD>CItem<65><6D><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (std::list<CItem*>::iterator it = DateItemList.begin(); it != DateItemList.end(); ++it) {
|
|
|
|
|
|
delete* it; // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
DateItemList.clear(); // <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>е<EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class CTable //Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
string TableName;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
list<CSeq*> DateSeqList;//<2F><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
CTable(const string& tn)
|
|
|
|
|
|
: TableName(tn) {}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
~CTable() {
|
|
|
|
|
|
// <20>ͷ<EFBFBD>DateSeqList<73>е<EFBFBD>CSeq<65><71><EFBFBD><EFBFBD>
|
|
|
|
|
|
for (std::list<CSeq*>::iterator it = DateSeqList.begin(); it != DateSeqList.end(); ++it) {
|
|
|
|
|
|
delete* it; // <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
DateSeqList.clear(); // <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>е<EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class CDeal //<2F><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
void clear();
|
|
|
|
|
|
void CheckDataTableList();//<2F><><EFBFBD><EFBFBD>DataTableList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void ResJsonCfg(char* json);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>json<6F>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|
|
|
|
|
char* AssJson(char* Id);//<2F><>װjson<6F>ַ<EFBFBD><D6B7><EFBFBD>
|
|
|
|
|
|
cJSON* cJSON_GetObjectItemCaseSensitive(cJSON* object, const char* string);//json<6F>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȡֵ
|
|
|
|
|
|
bool ExtractNumbersBetweenPercent(const std::string& str, int& start, int& end);
|
|
|
|
|
|
std::string convertToDateOnly(const std::string& dateTime);
|
2026-04-29 13:35:49 +08:00
|
|
|
|
int getCurrentGroup(const std::time_t& currentTime, int min);
|
2026-04-22 10:40:19 +08:00
|
|
|
|
std::time_t stringToTimeT(const std::string& dateTime);
|
|
|
|
|
|
|
|
|
|
|
|
std::list<CTable*> DataTableList;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::string MonitorId;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID
|
|
|
|
|
|
std::string dataDate;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
|
|
|
|
|
std::string dataDatePT;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
int ShortFlag = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
int LongFlag = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
int FluFlag = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
int aggCydeMin = 3;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ĭ<><C4AC>Ϊ3
|
|
|
|
|
|
int fluCydeMin = 10;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ĭ<><C4AC>Ϊ10
|
|
|
|
|
|
int aggCycleMinShort = 10;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ĭ<><C4AC>Ϊ10
|
|
|
|
|
|
int aggCycleMinLong = 120;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ĭ<><C4AC>Ϊ120
|
|
|
|
|
|
std::map< std::string, std::list<double> > AvgData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD><EFBFBD> avg<76><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::list<double> > MaxData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD><EFBFBD> Max<61><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::list<double> > MinData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD><EFBFBD> Min<69><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::list<double> > CP95Data;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD><EFBFBD> CP95<39><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::list<double> > ValData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD><EFBFBD> value<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::list<double> > TimeData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, std::string > DateData;//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD> <20><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
std::map< std::string, int > aggCydeMinList;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void testjson();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|