修改该了关于info信息为json内部管理 该项目只适用于windows或linux 修改了c++及相应的rust代码 不适用于arm

This commit is contained in:
xin
2025-06-17 17:02:35 +08:00
parent a500813e45
commit ae30c24a8f
10 changed files with 464 additions and 218 deletions

View File

@ -21,13 +21,13 @@ uint64_t get_Sepctral_Info_to_Byte(Sepctral_Info_Section_Data_Struct *sepctralin
}
for (size_t i = 0; i < number_of_spectral_info; i++)
{
json j;
std::string SensorId=sepctralinfo->SepctralInfoAddressList[i].SensorId;
j["SensorId"] =SensorId;
j["WaveCoeff"]["a1"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[0];
j["WaveCoeff"]["a2"] =sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[1];
j["WaveCoeff"]["a3"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[2];
j["WaveCoeff"]["a4"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[3];
json j=sepctralinfo->SepctralInfoAddressList[i].Info;
// std::string SensorId=sepctralinfo->SepctralInfoAddressList[i].SensorId;
// j["SensorId"] =SensorId;
// j["WaveCoeff"]["a1"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[0];
// j["WaveCoeff"]["a2"] =sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[1];
// j["WaveCoeff"]["a3"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[2];
// j["WaveCoeff"]["a4"] = sepctralinfo->SepctralInfoAddressList[i].WaveCoeff[3];
std::string json_str = j.dump();
uint16_t json_length = strlen(json_str.c_str())+1;
@ -83,9 +83,9 @@ uint64_t get_Other_Info_to_Byte(Other_Info_Section_Data_Struct *otherdata,uint8_
}
for (size_t i = 0; i < number_of_spectral_info; i++)
{
json j;
uint8_t Type=otherdata->OtherInfoAddressList[i].Type;
j["Type"] =Type;
json j=otherdata->OtherInfoAddressList[i].Info;
// uint8_t Type=otherdata->OtherInfoAddressList[i].Type;
// j["Type"] =Type;
// j["WaveCoeff"]["a1"] = otherdata->SepctralInfoAddressList[i].WaveCoeff[0];
// j["WaveCoeff"]["a2"] =otherdata->SepctralInfoAddressList[i].WaveCoeff[1];
// j["WaveCoeff"]["a3"] = otherdata->SepctralInfoAddressList[i].WaveCoeff[2];
@ -126,16 +126,83 @@ uint64_t get_Other_Info_to_Byte(Other_Info_Section_Data_Struct *otherdata,uint8_
}
One_Spectral_Info_Struct Get_spectral_info_from_byte(uint8_t *buffer, size_t length) {
One_Spectral_Info_Struct retstruct;
One_Spectral_Info_Struct *Get_spectral_info_from_byte(uint8_t *buffer, size_t length,int &spectral_info_number) {
One_Spectral_Info_Struct *retstruct=nullptr;
std::string json_str(reinterpret_cast<char*>(buffer), length-1);
json j = json::parse(json_str, nullptr, false);
std::string sensor_id = j["SensorId"].get<std::string>();
strcpy(retstruct.SensorId,sensor_id.c_str() );
retstruct.WaveCoeff[0] = j["WaveCoeff"]["a1"].get<double>();
retstruct.WaveCoeff[1] = j["WaveCoeff"]["a2"].get<double>();
retstruct.WaveCoeff[2] = j["WaveCoeff"]["a3"].get<double>();
retstruct.WaveCoeff[3] = j["WaveCoeff"]["a4"].get<double>();
//打印json
// std::cout<<"Read JSON string: " << json_str << std::endl;
//std::cout << j.dump(4) << std::endl; // 打印JSON对象
/* {
"info_type": "infolist", // 0 for device info
"info_number":3,
"info_list": [
{
"info_type": "devinfo", // 0 for device info
"sensor_id": "is30002",
"bandnum": 2048,
"wave_coeff": {
"a1": 0.0,
"a2": 0.0,
"a3": 400,
"a4": 1.0
}
},
{
"info_type": "environment", // 1 for gain info
"date": "2000-01-00 00:00:00",
//下面可选
"humidity":90.0,
"temperature":35.0 ,
"gps":{
"latitude":115.01,
"longitude": 39.01,
"altitude": 100.0
},
},
{
"info_type": "devinfo", // 0 for device info
"sensor_id": "is20001",
"bandnum": 512,
"wave_coeff": {
"a1": 0,
"a2": 0.0,
"a3":390,
"a4": 4
}
}
]
} */
//如果 info_type 为 infolist 则表示为光谱信息列表 需要一个一个处理
if (!j.is_object() || !j.contains("info_type")) {
spectral_info_number=0;
return nullptr; // 返回空指针表示解析失败
}
if (j["info_type"]=="infolist") {
int info_number = j["info_number"].get<int>();
spectral_info_number= info_number;
retstruct = new One_Spectral_Info_Struct[info_number];
for (int iii=0;iii<info_number;iii++) {
retstruct[iii].Info = j["info_list"][iii];
}
return retstruct;
}
retstruct=new One_Spectral_Info_Struct[1];
retstruct->Info=j;
spectral_info_number=1;
// std::string sensor_id = j["SensorId"].get<std::string>();
// strcpy(retstruct.SensorId,sensor_id.c_str() );
// retstruct.WaveCoeff[0] = j["WaveCoeff"]["a1"].get<double>();
// retstruct.WaveCoeff[1] = j["WaveCoeff"]["a2"].get<double>();
// retstruct.WaveCoeff[2] = j["WaveCoeff"]["a3"].get<double>();
// retstruct.WaveCoeff[3] = j["WaveCoeff"]["a4"].get<double>();
return retstruct;
}

View File

@ -94,29 +94,69 @@ void IRIS_DATA_example() {
strcpy(tempspectradata3.Name, "IS2_IRIS_Spectral_Data"); // 光谱数据名称
///光谱信息区域构造
mydata.SepctralInfoSection.SectionContent.SepctralInfoNumber = 3;
mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList = new One_Spectral_Info_Struct[3];
mydata.SepctralInfoSection.SectionContent.SepctralInfoNumber = 1;
mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList = new One_Spectral_Info_Struct[1];
//第一个光谱仪的信息
One_Spectral_Info_Struct &tempspectralinfo=mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList[0];
strcpy(tempspectralinfo.SensorId, "HH3_IRIS");
tempspectralinfo.WaveCoeff[0] = 0.1;
tempspectralinfo.WaveCoeff[1] = 0.2;
tempspectralinfo.WaveCoeff[2] = 0.3;
tempspectralinfo.WaveCoeff[3] = 0.4;
//第二个光谱仪的信息
One_Spectral_Info_Struct &tempspectralinfo1=mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList[1];
strcpy(tempspectralinfo1.SensorId, "IS3_IRIS");
tempspectralinfo1.WaveCoeff[0] = 0.5;
tempspectralinfo1.WaveCoeff[1] = 0.6;
tempspectralinfo1.WaveCoeff[2] = 0.7;
tempspectralinfo1.WaveCoeff[3] = 0.8;
//第三个光谱仪的信息
One_Spectral_Info_Struct &tempspectralinfo2=mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList[2];
strcpy(tempspectralinfo2.SensorId, "IS2_IRIS");
tempspectralinfo2.WaveCoeff[0] = 0.9;
tempspectralinfo2.WaveCoeff[1] = 1.0;
tempspectralinfo2.WaveCoeff[2] = 1.1;
tempspectralinfo2.WaveCoeff[3] = 1.2;
tempspectralinfo.Info = json::object(); // 初始化为一个空的JSON对象
tempspectralinfo.Info["info_type"] = "infolist"; // 设置info_type为infolist
tempspectralinfo.Info["info_number"] = 3; // 设置光谱信息数量
tempspectralinfo.Info["info_list"] = json::array(); // 初始化为一个空的JSON数组
// 添加光谱信息到info_list
tempspectralinfo.Info["info_list"].push_back({
{"info_type","devinfo"},
{"sensor_id", "HH3_IRIS"},
{"bandnum", 2000},
{"wave_coeff", {
{"a1", 0.1},
{"a2", 1230.2},
{"a3", 0.3},
{"a4", 0.4}
}}
});
tempspectralinfo.Info["info_list"].push_back({
{"info_type","devinfo"},
{"sensor_id", "IS3_IRIS"},
{"bandnum", 500},
{"wave_coeff", {
{"a1", 0.5},
{"a2", 0.6},
{"a3", 1230.7},
{"a4", 0.8}
}}
});
tempspectralinfo.Info["info_list"].push_back({
{"info_type","devinfo"},
{"sensor_id", "IS2_IRIS"},
{"bandnum", 500},
{"wave_coeff", {
{"a1", 0.9},
{"a2", 1.0},
{"a3", 1.1},
{"a4", 1.2}
}}
});
// //输出info
std::cout << tempspectralinfo.Info.dump(4) << std::endl; // 打印JSON对象
// strcpy(tempspectralinfo.SensorId, "HH3_IRIS");
// tempspectralinfo.WaveCoeff[0] = 0.1;
// tempspectralinfo.WaveCoeff[1] = 0.2;
// tempspectralinfo.WaveCoeff[2] = 0.3;
// tempspectralinfo.WaveCoeff[3] = 0.4;
// //第二个光谱仪的信息
// One_Spectral_Info_Struct &tempspectralinfo1=mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList[1];
// strcpy(tempspectralinfo1.SensorId, "IS3_IRIS");
// tempspectralinfo1.WaveCoeff[0] = 0.5;
// tempspectralinfo1.WaveCoeff[1] = 0.6;
// tempspectralinfo1.WaveCoeff[2] = 0.7;
// tempspectralinfo1.WaveCoeff[3] = 0.8;
// //第三个光谱仪的信息
// One_Spectral_Info_Struct &tempspectralinfo2=mydata.SepctralInfoSection.SectionContent.SepctralInfoAddressList[2];
// strcpy(tempspectralinfo2.SensorId, "IS2_IRIS");
// tempspectralinfo2.WaveCoeff[0] = 0.9;
// tempspectralinfo2.WaveCoeff[1] = 1.0;
// tempspectralinfo2.WaveCoeff[2] = 1.1;
// tempspectralinfo2.WaveCoeff[3] = 1.2;
///其他信息区域构造
@ -138,6 +178,11 @@ void IRIS_DATA_example() {
// 调用写入函数
write_IRIS_DATA_Struct_EMB(&mydata, "iris_data_example.iris", *File_control_ptr);
One_IRIS_DATA_Struct mydata2= Get_One_IRIS_DATA_From_File("iris_data_example.iris", *File_control_ptr);
int numberofspectralinfo = mydata2.SepctralInfoSection.SectionContent.SepctralInfoNumber;
// for (int iii=0;iii<numberofspectralinfo;iii++) {
// std::cout << mydata2.SepctralInfoSection.SectionContent.SepctralInfoAddressList[iii].Info.dump(4) << std::endl; // 打印JSON对象
// }
// delete [] mydata2.SepctralInfoSection.SectionContent.SepctralInfoAddressList;
Destroy_IRIS_DATA_Struct(mydata2);
Destroy_IRIS_DATA_Struct(mydata);
@ -440,8 +485,10 @@ One_IRIS_DATA_Struct Get_One_IRIS_DATA_From_File(std::string Filepath, MyfileCon
memcpy(&number_of_spectral_info, readbuffer, 2); // 读取光谱信息数量
spectral_info_content.SepctralInfoNumber= number_of_spectral_info; // 设置光谱信息数量
spectral_info_content.SepctralInfoAddressList= new One_Spectral_Info_Struct[number_of_spectral_info]; // 创建光谱信息数组
int indexofnowinfo=0;
int number_of_spectral_info_real=0; // Initialize the number of spectral info
for (int32_t j=0;j<number_of_spectral_info;j++) {
One_Spectral_Info_Struct &one_spectral_info = spectral_info_content.SepctralInfoAddressList[j];
One_Spectral_Info_Struct &one_spectral_info = spectral_info_content.SepctralInfoAddressList[indexofnowinfo];
uint16_t lenth_of_this_spectral_info=0;
uint8_t type_of_spectral_info=0;
lenth_in_section+= File_control.Read_data(&readbuffer, 3); // Read the spectral info section
@ -449,19 +496,66 @@ One_IRIS_DATA_Struct Get_One_IRIS_DATA_From_File(std::string Filepath, MyfileCon
type_of_spectral_info = readbuffer[2]; // 读取光谱信息类型
lenth_in_section+=File_control.Read_data(&readbuffer, lenth_of_this_spectral_info); // Read the spectral info section
if (type_of_spectral_info == 0x00) {
one_spectral_info= Get_spectral_info_from_byte(readbuffer,lenth_of_this_spectral_info);
int specnumber=0;
One_Spectral_Info_Struct *aaa= Get_spectral_info_from_byte(readbuffer,lenth_of_this_spectral_info,specnumber);
if (specnumber==0) {
}else {
if (specnumber==1) {
one_spectral_info=*aaa;
}
if (specnumber>1) {
One_Spectral_Info_Struct *temp_spectral_info=nullptr;
if (indexofnowinfo>0) {
temp_spectral_info=new One_Spectral_Info_Struct[indexofnowinfo];
for (int iii=0;iii<specnumber;iii++) {
temp_spectral_info[iii]=aaa[iii];
}
}
delete [] spectral_info_content.SepctralInfoAddressList; // Free the allocated array
number_of_spectral_info_real=number_of_spectral_info_real+specnumber-1; // Update the number of spectral info
spectral_info_content.SepctralInfoAddressList = new One_Spectral_Info_Struct[number_of_spectral_info_real+1]; // Reallocate the array
//
for (int iii=0;iii<indexofnowinfo;iii++) {
spectral_info_content.SepctralInfoAddressList[iii]=temp_spectral_info[iii];
}
for (int iii=0;iii<specnumber;iii++) {
spectral_info_content.SepctralInfoAddressList[iii+indexofnowinfo]=aaa[iii];
spectral_info_content.SepctralInfoAddressList[iii+indexofnowinfo].Info=aaa[iii].Info;
}
// delete[] spectral_info_content.SepctralInfoAddressList;
indexofnowinfo+=specnumber-1; // Update the index of current info
if (temp_spectral_info!=nullptr) {
delete [] temp_spectral_info; // Free the temporary array
}
}
}
if (aaa!=nullptr) {
delete []aaa;
}
}
delete [] readbuffer; // 释放之前的读取缓冲区
readbuffer = nullptr; // 释放后将指针设置为nullptr
indexofnowinfo++;
number_of_spectral_info_real++;
}
spectral_info_content.SepctralInfoNumber= number_of_spectral_info_real;
if (lenth_in_section!= SectionLength) {
// Handle error: not all data was read
delete[] spectral_info_content.SepctralInfoAddressList; // Free the allocated array
spectral_info_content.SepctralInfoAddressList = nullptr; // Reset the pointer to nullptr
return Create_IRIS_DATA_Struct(); // Return an empty struct
}
//delete[] spectral_info_content.SepctralInfoAddressList;
break;
}
case OTHER_SECTION: {
@ -538,7 +632,7 @@ One_IRIS_DATA_Struct Get_One_IRIS_DATA_From_File(std::string Filepath, MyfileCon
}
File_control.close_file(); // Close the file after reading all sections
// delete [] Retrun_Data.SepctralInfoSection.SectionContent.SepctralInfoAddressList;
return Retrun_Data; // Return the populated One_IRIS_DATA_Struct
}
@ -562,10 +656,19 @@ void Destroy_IRIS_DATA_Struct(One_IRIS_DATA_Struct &iris_data) {
if (iris_data.SepctralInfoSection.SectionContent.SepctralInfoNumber !=0) {
int16_t numberforclear = iris_data.SepctralInfoSection.SectionContent.SepctralInfoNumber;
for (int16_t i=0;i<numberforclear;i++) {
//打印info
// std::cout<< "Spectral Info " << i << ": " << std::endl;
// std::cout << iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList[i].Info.dump(4) << std::endl; // 打印JSON对象
//清空info
// iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList[i].Info.clear(); // 清空info
// No dynamic memory allocation in One_Spectral_Info_Struct, so no need to free anything
}
if (iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList!=nullptr)
delete[] iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList; // Free the spectral info address list
if (iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList!=nullptr) {
delete [] iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList; // Free the spectral info address list
}
// Free the spectral info address list
iris_data.SepctralInfoSection.SectionContent.SepctralInfoAddressList = nullptr; // Reset the pointer to nullptr
iris_data.SepctralInfoSection.SectionContent.SepctralInfoNumber=0;
iris_data.SepctralInfoSection.SectionLength=0;

View File

@ -1,10 +1,21 @@
#ifndef IRIS_DEFFINE_H
#define IRIS_DEFFINE_H
#define NOTARM
#ifdef NOTARM
#include"json/json.hpp"
using json = nlohmann::json;
#include "iostream"
#endif
#include <cstdint> // For uint8_t, uint16_t, uint32_t, uint64_t, int8_t
#include <stddef.h> // For size_t
#include <string> // For std::string
//结构体内存1字节对齐
#pragma pack(1)
@ -127,8 +138,7 @@ typedef struct Sepctral_Data_Section_Struct
// 下面结构体应通过转换成json在进行存储 读取时亦然
typedef struct One_Spectral_Info_Struct{
char SensorId[50]; // 传感器ID
double WaveCoeff[4]; // 波长系数
json Info; // 光谱信息内容
} One_Spectral_Info_Struct;
typedef struct Sepctral_Info_Section_Data_Struct
@ -146,7 +156,7 @@ typedef struct Sepctral_Info_Section_Struct
///////////////////////////////// 其他信息结构相关定义 /////////////////////////////////
typedef struct One_Other_Info_Struct{
uint8_t Type; // 信息类型; // 数据地址 (pointer to data)
json Info; // 信息类型; // 数据地址 (pointer to data)
} One_Other_Info_Struct;
typedef struct Other_Info_Section_Data_Struct
@ -215,6 +225,6 @@ uint64_t get_Sepctral_Info_to_Byte(Sepctral_Info_Section_Data_Struct *sepctralin
uint64_t get_Other_Info_to_Byte(Other_Info_Section_Data_Struct *otherdata,uint8_t **retbuffer);
One_IRIS_DATA_Struct Get_One_IRIS_DATA_From_File(std::string Filepath, MyfileControl_Struct File_control);
VSDLL_EXPORTS void IRIS_DATA_example();
One_Spectral_Info_Struct Get_spectral_info_from_byte(uint8_t *buffer, size_t length);
One_Spectral_Info_Struct *Get_spectral_info_from_byte(uint8_t *buffer, size_t length,int &spectral_info_number);
void Destroy_IRIS_DATA_Struct(One_IRIS_DATA_Struct &iris_data);
#endif // IRIS_DEFFINE_H