Compare commits

...

4 Commits

Author SHA1 Message Date
xin
c0f974fd4c 添加打包脚本 package.sh
用于构建项目并打包成 deb 文件
2026-03-04 15:08:52 +08:00
xin
c2cad64f17 M350b版本 2026-03-04 10:24:11 +08:00
xin
e7cd1e93a6 优化气体传感器数据解析和消息传递
- 使用union解析CO2/H2O数据,解决大小端问题
- 添加LINECOMMEND/LINEDATASHOW消息类型区分
- 添加WorkingState/SavingDate原子变量
- 修正气体传感器部分逻辑
2026-03-04 10:22:51 +08:00
xin
82608bfa0a 整合GPS同步并修复UI刷新bug
- 将InitSystemParams功能整合到SetupSubscriptions中
- 修复Widget_M300RTK运算符错误(&改为&&)
- 添加UI定时刷新功能Slot_flash_screen
- 添加密码保护功能(123456)
- WDA传感器添加结束符格式TODO注释
- 调整widget控件索引映射
2026-03-04 10:21:24 +08:00
14 changed files with 861 additions and 659 deletions

View File

@ -86,50 +86,114 @@ int IrisSensor_Gas_P0::RecvData_Chk(/*std::string sRecv*/)
return 0;
}
union Union16 {
short s16; // 有符号短整型 (处理正负)
unsigned short u16; // 无符号短整型
unsigned char b[2]; // 字节数组
};
// 用于处理4字节32位数据
union Union32 {
int s32; // 有符号长整型
unsigned int u32; // 无符号长整型
unsigned char b[4]; // 字节数组
};
int IrisSensor_Gas_P0::ParseMeasuredData_Chk()
{
if (m_sRecv.size()!=0x1f+4)
// 如果长度不匹配0x1f + 4 = 35
if (m_sRecv.size() != 35)
{
qDebug() << "Err:Sensor_Gas ParseData Failed,Incorrect Data Length.Exit Code:1";
qDebug() << "Err:Sensor_Gas ParseData Failed, Incorrect Data Length. Exit Code:1";
return 1;
}
else
{
unsigned char uc12, uc13, uc14, uc15, uc16,uc17,uc18,uc19,uc28,uc29,uc30,uc31,uc32, uc33;
char aaaa[34];
memcpy(aaaa,m_sRecv.c_str(),m_sRecv.size());
uc32 = m_sRecv[32];
uc33 = m_sRecv[33];
m_fTPTemperature = (uc32 * 256 + uc33) / 100;
Union16 u16;
Union32 u32;
uc30 = m_sRecv[30];
uc31 = m_sRecv[31];
m_fPB = (uc30 * 256 + uc31) / 10;
// 1. 解析温度 (Index 32, 33) - 假设是 short (16-bit)
// 大端转小端:高位 index[32] 放在 b[1],低位 index[33] 放在 b[0]
u16.b[1] = static_cast<unsigned char>(m_sRecv[32]);
u16.b[0] = static_cast<unsigned char>(m_sRecv[33]);
m_fTPTemperature = u16.s16 / 100.0f; // 直接使用 s16 即可自动处理正负
uc28 = m_sRecv[28];
uc29 = m_sRecv[29];
m_fPB = (uc28 * 256 + uc29) / 10;
// 2. 解析 PB (Index 30, 31)
u16.b[1] = static_cast<unsigned char>(m_sRecv[30]);
u16.b[0] = static_cast<unsigned char>(m_sRecv[31]);
// 注意:你原代码里这里和下面都赋值给了 m_fPB是否其中一个是别的变量
float fPB_1 = u16.s16 / 10.0f;
uc16 = m_sRecv[16];
uc17 = m_sRecv[17];
uc18 = m_sRecv[18];
uc19 = m_sRecv[19];
m_ulCO2 = uc16*256*256*256 + uc17*256*256 + uc18*256 + uc19;
// 3. 解析 PB (Index 28, 29)
u16.b[1] = static_cast<unsigned char>(m_sRecv[28]);
u16.b[0] = static_cast<unsigned char>(m_sRecv[29]);
m_fPB = u16.s16 / 10.0f;
uc12 = m_sRecv[12];
uc13 = m_sRecv[13];
uc14 = m_sRecv[14];
uc15 = m_sRecv[15];
m_ulH2O = uc12 * 256 * 256 * 256 + uc13 * 256 * 256 + uc14 * 256 + uc15;
// 4. 解析 CO2 (Index 16-19) - 32位
u32.b[3] = static_cast<unsigned char>(m_sRecv[16]);
u32.b[2] = static_cast<unsigned char>(m_sRecv[17]);
u32.b[1] = static_cast<unsigned char>(m_sRecv[18]);
u32.b[0] = static_cast<unsigned char>(m_sRecv[19]);
m_ulCO2 = u32.s32; // 如果 CO2 是正数s32 和 u32 一样如果有负数s32 会正确解释补码
return 0;
}
// 5. 解析 H2O (Index 12-15) - 32位
u32.b[3] = static_cast<unsigned char>(m_sRecv[12]);
u32.b[2] = static_cast<unsigned char>(m_sRecv[13]);
u32.b[1] = static_cast<unsigned char>(m_sRecv[14]);
u32.b[0] = static_cast<unsigned char>(m_sRecv[15]);
m_ulH2O = u32.s32;
return 0;
}
// int IrisSensor_Gas_P0::ParseMeasuredData_Chk()
// {
// if (m_sRecv.size()!=0x1f+4)
// {
// qDebug() << "Err:Sensor_Gas ParseData Failed,Incorrect Data Length.Exit Code:1";
// return 1;
// }
// else
// {
// unsigned char uc12, uc13, uc14, uc15, uc16,uc17,uc18,uc19,uc28,uc29,uc30,uc31,uc32, uc33;
// char aaaa[34];
// memcpy(aaaa,m_sRecv.c_str(),m_sRecv.size());
//
// uc32 = m_sRecv[32];
// uc33 = m_sRecv[33];
// m_fTPTemperature = (uc32 * 256 + uc33) / 100;
//
// uc30 = m_sRecv[30];
// uc31 = m_sRecv[31];
// m_fPB = (uc30 * 256 + uc31) / 10;
//
// uc28 = m_sRecv[28];
// uc29 = m_sRecv[29];
// m_fPB = (uc28 * 256 + uc29) / 10;
//
// uc16 = m_sRecv[16];
// uc17 = m_sRecv[17];
// uc18 = m_sRecv[18];
// uc19 = m_sRecv[19];
// m_ulCO2 = uc16*256*256*256 + uc17*256*256 + uc18*256 + uc19;
//
// uc12 = m_sRecv[12];
// uc13 = m_sRecv[13];
// uc14 = m_sRecv[14];
// uc15 = m_sRecv[15];
// m_ulH2O = uc12 * 256 * 256 * 256 + uc13 * 256 * 256 + uc14 * 256 + uc15;
//
//
// return 0;
// }
//
// return 0;
// }
int IrisSensor_Gas_P0::Initialize(std::string ucPortNumber)
{
QString qstrPortName = QString::fromStdString(ucPortNumber);
@ -167,7 +231,7 @@ int IrisSensor_Gas_P0::GetVersion()
return 0;
}// 02 01 09 F4
int IrisSensor_Gas_P0::GetMeasuredData(unsigned long &ulCO2, unsigned long &ulH2O, float &fTPTemperature, float &fPP, float &fPB)
int IrisSensor_Gas_P0::GetMeasuredData( double &ulCO2, double &ulH2O, float &fTPTemperature, float &fPP, float &fPB)
{
QByteArray qbSend;
qbSend.append(0x02);
@ -184,11 +248,13 @@ int IrisSensor_Gas_P0::GetMeasuredData(unsigned long &ulCO2, unsigned long &ulH2
ParseMeasuredData_Chk();
ulCO2 = m_ulCO2*1.0;
ulH2O = m_ulH2O*1.0;
ulCO2 = m_ulCO2*1.0/10;
ulH2O = m_ulH2O*1.0/10;
fTPTemperature = m_fTPTemperature;
fPP = m_fPP;
fPB = m_fPB;
ulCO2=ulCO2<0?0:ulCO2;
ulH2O=ulH2O<0?0:ulH2O;
return 0;
}
@ -275,7 +341,7 @@ int IrisSensor_Gas_P0::ResetCalibration(char cChannel)
qbSend.append(ucChksum);
SendData_Chk(qbSend.toStdString());
return 0;
}

View File

@ -13,7 +13,7 @@ private:
float m_fTPTemperature;
float m_fPP, m_fPB;
unsigned long m_ulCO2, m_ulH2O;
long m_ulCO2, m_ulH2O;
unsigned int uiSoftwareVersion, uiHardwareVersion;
public:
@ -25,7 +25,7 @@ private:
public:
int Initialize(std::string ucPortNumber);
int GetVersion();
int GetMeasuredData(unsigned long &ulCO2, unsigned long &ulH2O,float &fTPTemperature,float &fPP, float &fPB);
int GetMeasuredData(double &ulCO2, double &ulH2O,float &fTPTemperature,float &fPP, float &fPB);
int ZeroCalibration_N2();
int ZeroCalibration_Air();
int SpanCalibration(char cChannel, unsigned int uiPPM);

View File

@ -58,6 +58,7 @@ int IrisSensor_WDA_P0::RecvData_NChk(/*std::string sRecv*/)
}
iCounter = 0;
// TODO: 需要确认传感器输出结束符格式 (CRLF/CR/LF) - 当前逻辑可能需要调整
while ((char)(qbData[qbData.size()-2]) != 0x0D && (char)(qbData[qbData.size() - 2]) != 0x0A)
{
m_pSerialPort->waitForReadyRead(50);
@ -114,9 +115,18 @@ int IrisSensor_WDA_P0::ParseData_NChk()
QString dataPart = qstrTemp.mid(iEqualSignIndex + 1);
QStringList dataList = dataPart.split(',');
m_fWindSpeed = dataList[0].toFloat();
m_fWindDirection = dataList[1].toInt();
m_fWindTemp = dataList[5].toFloat();
if (dataList.size() >= 6)
{
m_fWindSpeed = dataList[0].toFloat();
m_fWindDirection = dataList[1].toInt();
m_fWindTemp = dataList[5].toFloat();
}
else
{
qDebug() << "Err:Sensor_WDA ParseData Failed, insufficient data fields:" << dataList.size();
return 1;
}
}
//////////////////////////////////////////////////////////////////////////
qDebug() << m_fWindSpeed;
qDebug() << m_fWindDirection;
@ -127,7 +137,7 @@ int IrisSensor_WDA_P0::ParseData_NChk()
}*/
//////////////////////////////////////////////////////////////////////////
}
return 0;
}

View File

@ -256,7 +256,7 @@ int VehicleController::SetupEnvironment_M300RTK()
qDebug() << "VehicleController: Func DjiPlatform_RegHalUartHandler. Register hal uart handler error";
throw std::runtime_error("Register hal uart handler error.");
}
//<2F><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>
returnCode = DjiPlatform_RegHalNetworkHandler(&networkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal network handler error");
@ -270,6 +270,17 @@ int VehicleController::SetupEnvironment_M300RTK()
return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
}
}else {
// returnCode = DjiPlatform_RegHalNetworkHandler(&networkHandler);
// if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// printf("register hal network handler error");
// return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
// }
// // //Attention: if you want to use camera stream view function, please uncomment it.
// returnCode = DjiPlatform_RegSocketHandler(&socketHandler);
// if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
// printf("register osal socket handler error");
// return DJI_ERROR_SYSTEM_MODULE_CODE_SYSTEM_ERROR;
// }
returnCode = DjiPlatform_RegHalUsbBulkHandler(&usbBulkHandler);
if (returnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
printf("register hal usb bulk handler error");
@ -363,15 +374,17 @@ int VehicleController::StartupPSDK_M300RTK()
USER_LOG_ERROR("power management init error");
}
osalHandler->TaskSleepMs(5000);
SetupWidget();//<2F>?<EFBFBD><C9BC>?<EFBFBD><DFBC><3E><><EFBFBD>
SetupWidget();//<2F>?<EFBFBD><C9BC>?<EFBFBD><DFBC><3E><><EFBFBD>
osalHandler->TaskSleepMs(5000);
SetupMessagePipe();//widget<65><74>vehicle
// SetupWaypointStatusCallback();
// InitSystemParams();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?<EFBFBD><E4A3AC><EFBFBD><EFBFBD>???<CDB3>??<E4A3AC><C8BB>?<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><C4A3><EFBFBD>?<EFBFBD>?<EFBFBD>??<CDAC><CAB1><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SetupSubscriptions();//?<><CAB5><EFBFBD><EFBFBD>?<EFBFBD>?<EFBFBD><C4B6>?<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><CCAB><EFBFBD><EFBFBD>
//InitSystemParams();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD>?<EFBFBD><E4A3AC><EFBFBD><EFBFBD>???<CDB3>??<E4A3AC><C8BB>?<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><C4A3><EFBFBD>?<EFBFBD>?<EFBFBD>??<CDAC><CAB1><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//?<><CAB5><EFBFBD><EFBFBD>?<EFBFBD>?<EFBFBD><C4B6>?<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>?<EFBFBD><CCAB><EFBFBD><EFBFBD>
qDebug()<<"M300RTK PSDK Channel Started.";
m_clsWidget.stratmessageflash();
SetupSubscriptions();
return 0;
}
@ -463,7 +476,10 @@ int VehicleController::GetOneDataFrame(M300RTKDataFrame& M300RTKDataFrame)
int VehicleController::SetupSubscriptions()
{
QString qstrInfo = QString("Waiting for airborn gps Time Valide");
emit Signal_UpdateVehicleMessage(qstrInfo, 0);
T_DjiReturnCode tDjiReturnCode;
QString qstrWBackPath("/home/data/Settings/MainSettings.ini");
tDjiReturnCode = DjiFcSubscription_Init();
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
@ -476,10 +492,39 @@ int VehicleController::SetupSubscriptions()
qDebug() << "init data subscription module finished.";
}
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, DjiTest_FcSubscriptionReceiveHeightCallback);
// Subscribe GPS related topics for time sync and homepoint altitude
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic GPS_SIGNAL_LEVEL error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic GPS_DATE error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic GPS_TIME error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic ALTITUDE_OF_HOMEPOINT error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
// Subscribe other flight data topics
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, DjiTest_FcSubscriptionReceiveHeightCallback);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_HEIGHT_FUSION error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
@ -487,7 +532,6 @@ int VehicleController::SetupSubscriptions()
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY, DJI_DATA_SUBSCRIPTION_TOPIC_5_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
@ -502,7 +546,6 @@ int VehicleController::SetupSubscriptions()
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION, DJI_DATA_SUBSCRIPTION_TOPIC_5_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_QUATERNION error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
@ -510,12 +553,89 @@ int VehicleController::SetupSubscriptions()
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_BAROMETER, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_BAROMETER error.";
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
// Wait for GPS signal and sync system time
T_DjiOsalHandler* osalHandler = DjiPlatform_GetOsalHandler();
bool bStop = false;
#ifdef ZZ_FLAG_TEST
bStop = 1;
#endif
T_DjiFcSubscriptionGpsSignalLevel tDjiGpsSignalLevel = { 0 };
T_DjiDataTimestamp tTimestamp = { 0 };
osalHandler->TaskSleepMs(5000);
QTime qtStart = QTime::currentTime();
int iRetryTime = 0;
while (!bStop)
{
if (iRetryTime > 60)
{
bStop = 1;
}
osalHandler->TaskSleepMs(2000);
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL, (uint8_t*)&tDjiGpsSignalLevel, sizeof(T_DjiFcSubscriptionGpsSignalLevel), &tTimestamp);
qDebug() << "GPS_SIGNAL_LEVEL:" << tDjiGpsSignalLevel;
QTime qtElapsed = QTime::currentTime();
if (tDjiGpsSignalLevel > 1)
{
bStop = 1;
}
else
{
QString qstrInfo = QString("Warning:Weak GPS signal, Waiting....GPS_SIGNAL_LEVEL:%1, Elapsed time:%2").arg(tDjiGpsSignalLevel).arg(qtStart.msecsTo(qtElapsed));
emit Signal_UpdateVehicleMessage(qstrInfo, 0);
}
iRetryTime++;
}
// Get GPS datetime and sync system time
T_DjiFcSubscriptionGpsDate tGpsDate = { 0 };
T_DjiFcSubscriptionGpsTime tGpsTime = { 0 };
T_DjiFcSubscriptionAltitudeOfHomePoint tAltOfHP = { 0 };
T_DjiFcSubscriptionGpsPosition tDjiGpsPosition = { 0 };
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE, (uint8_t*)&tGpsDate, sizeof(T_DjiFcSubscriptionGpsDate), &tTimestamp);
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME, (uint8_t*)&tGpsTime, sizeof(T_DjiFcSubscriptionGpsTime), &tTimestamp);
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT, (uint8_t*)&tAltOfHP, sizeof(T_DjiFcSubscriptionAltitudeOfHomePoint), &tTimestamp);
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION, (uint8_t*)&tDjiGpsPosition, sizeof(T_DjiFcSubscriptionGpsPosition), &tTimestamp);
// Save homepoint altitude to config
m_fHeightOfHomePoint_BM = tAltOfHP;
float fHeightOfHomePoint_GPS = tDjiGpsPosition.z;
QSettings qsMainSettings(qstrWBackPath, QSettings::Format::IniFormat);
qsMainSettings.setValue(QString("WBACK/HeightOfHomePoint_BM"), QString("%1").arg(m_fHeightOfHomePoint_BM));
qsMainSettings.setValue(QString("WBACK/HeightOfHomePoint_GPS"), QString("%1").arg(fHeightOfHomePoint_GPS));
qDebug() << "HeightOfHomePoint_BM:" << m_fHeightOfHomePoint_BM;
qDebug() << "HeightOfHomePoint_GPS:" << fHeightOfHomePoint_GPS;
// Sync system time from GPS
QDateTime qdtDateTime;
QString qstrDate = QString::number(tGpsDate);
QString qstrTime = QString::number(tGpsTime);
if (qstrTime.length() == 5)
{
qstrTime = "0" + qstrTime;
}
QString qstrDateTime = qstrDate + qstrTime;
qdtDateTime = QDateTime::fromString(qstrDateTime, "yyyyMMddhhmmss");
if (qdtDateTime.isValid())
{
QString command = "date -s \"" + qdtDateTime.toString("yyyy-MM-dd hh:mm:ss") + "\"";
system(command.toLatin1().data());
time_t stdTime = qdtDateTime.toTime_t();
stime(&stdTime);
qDebug() << "System time synced from GPS:" << qdtDateTime.toString("yyyy-MM-dd hh:mm:ss");
}
qstrInfo = QString("begin system");
emit Signal_UpdateVehicleMessage(qstrInfo, 0);
return 0;
}
@ -602,7 +722,7 @@ int VehicleController::SetupMessagePipe()
int VehicleController::SetupWidget()
{
m_clsWidget.SetUIFilePath("/home/DJI/Widget",100);
// m_clsWidget.SetUIFilePath("/home/pi/airborn/configfile/DJI/Widget",100);
//m_clsWidget.SetUIFilePath("/home/pi/airborn/configfile/DJI/Widget",100);
m_clsWidget.SetSettings(m_struUIConfig);
@ -611,251 +731,6 @@ int VehicleController::SetupWidget()
return 0;
}
int VehicleController::InitSystemParams()
{
T_DjiReturnCode tDjiReturnCode;
QString qstrWBackPath("/home/data/Settings/MainSettings.ini");
///Init
tDjiReturnCode = DjiFcSubscription_Init();
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "init data subscription module error.";
return 1;
}
else
{
qDebug() << "InitSystemDateTime started.";
}
///SubscribeTopic GPS_SIGNAL_LEVEL
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL error.";
return -1;
}
///SubscribeTopic GPS_DATE
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE error.";
return -2;
}
///SubscribeTopic GPS_TIME
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME error.";
return -3;
}
///SubscribeTopic ALTITUDE_OF_HOMEPOINT
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT error.";
return -4;
}
///SubscribeTopic DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION
tDjiReturnCode = DjiFcSubscription_SubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION, DJI_DATA_SUBSCRIPTION_TOPIC_1_HZ, NULL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "Subscribe topic DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION error.";
return -5;
}
///Make sure Gps avalible
T_DjiOsalHandler* osalHandler = DjiPlatform_GetOsalHandler();
bool bStop = false;
/////for test
#ifdef ZZ_FLAG_TEST
bStop = 1;
#endif
T_DjiFcSubscriptionGpsSignalLevel tDjiGpsSignalLevel = { 0 };
T_DjiDataTimestamp tTimestamp = { 0 };
osalHandler->TaskSleepMs(5000);
QTime qtStart = QTime::currentTime();
int iRetryTime = 0;
while (!bStop)
{
if (iRetryTime>60)
{
bStop = 1;
}
osalHandler->TaskSleepMs(2000);
DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL, (uint8_t*)&tDjiGpsSignalLevel, sizeof(T_DjiFcSubscriptionGpsSignalLevel), &tTimestamp);
qDebug() << "DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL" << tDjiGpsSignalLevel;
QTime qtElapsed = QTime::currentTime();
if (tDjiGpsSignalLevel>1)
{
bStop = 1;
//emit Signal_UpdatePSDKFloatMessage("");
}
else
{
QString qstrInfo = QString("Warning:Weak GPS signal, Waiting....GPS_SIGNAL_LEVEL:%1, Elapsed time:%2").arg(tDjiGpsSignalLevel).arg(qtStart.msecsTo(qtElapsed));
emit Signal_UpdateVehicleMessage(qstrInfo);
}
iRetryTime++;
}
//osalHandler->TaskSleepMs(2000);
///Get GPS Datetime
T_DjiFcSubscriptionGpsDate tGpsDate = { 0 };
T_DjiFcSubscriptionGpsTime tGpsTime = { 0 };
///Get Other
T_DjiFcSubscriptionAltitudeOfHomePoint tAltOfHP = { 0 };
T_DjiFcSubscriptionGpsPosition tDjiGpsPosition = { 0 };
tDjiReturnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE, (uint8_t*)&tGpsDate, sizeof(T_DjiFcSubscriptionGpsDate), &tTimestamp);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_GetLatestValueOfTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE.";
return -1;
}
tDjiReturnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME, (uint8_t*)&tGpsTime, sizeof(T_DjiFcSubscriptionGpsTime), &tTimestamp);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_GetLatestValueOfTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE.";
return -2;
}
tDjiReturnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT, (uint8_t*)&tAltOfHP, sizeof(T_DjiFcSubscriptionAltitudeOfHomePoint), &tTimestamp);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_GetLatestValueOfTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT.";
return -3;
}
tDjiReturnCode = DjiFcSubscription_GetLatestValueOfTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION, (uint8_t*)&tDjiGpsPosition, sizeof(T_DjiFcSubscriptionGpsPosition), &tTimestamp);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_GetLatestValueOfTopic error.DJI_FC_SUBSCRIPTION_TOPIC_VELOCITY";
return -4;
}
m_fHeightOfHomePoint_BM = tAltOfHP;
float fHeightOfHomePoint_GPS= tDjiGpsPosition.z;
QString qstrHeightOfHomePoint_BM = QString("%1").arg(m_fHeightOfHomePoint_BM);
QString qstrHeightOfHomePoint_GPS = QString("%1").arg(tDjiGpsPosition.z);
//////////////////////////////////////////////////////////////////////////write back AOHP
QSettings qsMainSettings(qstrWBackPath, QSettings::Format::IniFormat);
qsMainSettings.setValue(QString("WBACK/HeightOfHomePoint_BM"), qstrHeightOfHomePoint_BM);
qsMainSettings.setValue(QString("WBACK/HeightOfHomePoint_GPS"), qstrHeightOfHomePoint_GPS);
qDebug() << qstrHeightOfHomePoint_BM << m_fHeightOfHomePoint_BM;
qDebug() << qstrHeightOfHomePoint_GPS << tDjiGpsPosition.z;
//////////////////////////////////////////////////////////////////////////
//qDebug() << "Date" << tGpsDate << "Time" << tGpsTime;
QDateTime qdtDateTime;
QString qstrDate, qstrTime,qstrDateTime;
qstrDate = QString::number(tGpsDate);
qstrTime = QString::number(tGpsTime);
if (qstrTime.length()==5)
{
qstrTime = "0" + qstrTime/*+"000"*/;
}
// else
// {
// qstrTime= qstrTime + "000";
// }
// QDate qd;
// qd = QDate::fromString("20121022", "yyyyMMdd");
// QTime qt;
// qt.fromString(qstrTime,"hhmmsszzz");
qstrDateTime = qstrDate + qstrTime;
qdtDateTime = QDateTime::fromString(qstrDateTime, "yyyyMMddhhmmss");
QString command="date -s \""+qdtDateTime.toString("yyyy-MM-dd hh:mm:ss")+"\"";
system(command.toLatin1().data());
time_t stdTime = qdtDateTime.toTime_t();
if (qdtDateTime.isValid())
{
stime(&stdTime);
}
#ifndef ZZ_FLAG_TEST
//stime(&stdTime);
#else
#endif
// qDebug() << qstrDate;
// qDebug() << qstrTime;
// qDebug() << qd.isValid();
// qDebug() << qd.toString("yyyyMMdd");
// qDebug() << qt.isValid();
// qDebug() << qt;
qDebug() <<"[GPS Time Check]" << qdtDateTime.isValid();
qDebug() <<"[GPS Time:]" << qstrDateTime << "####" << qdtDateTime.toString("yyyyMMddhhmmsszzz");
///UnSubscribeTopic
/*tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL.";
return -11;
}*/
tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_SIGNAL_LEVEL.";
return -11;
}
tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_DATE.";
return -12;
}
tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_GPS_TIME.";
return -13;
}
tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT.";
return -14;
}
tDjiReturnCode = DjiFcSubscription_UnSubscribeTopic(DJI_FC_SUBSCRIPTION_TOPIC_GPS_POSITION);
if (tDjiReturnCode != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "DjiFcSubscription_UnSubscribeTopic module error,DJI_FC_SUBSCRIPTION_TOPIC_ALTITUDE_OF_HOMEPOINT.";
return -15;
}
return 0;
}
int VehicleController::Slot_OnChangeCaptureMode(char cMode)
{
//ZZ_Widget_M300RTK* test = qobject_cast<ZZ_Widget_M300RTK*>(sender());

View File

@ -70,7 +70,7 @@ private:
int SetupWidget();
///
public:///for test
int InitSystemParams();
// int InitSystemParams();
int SetupSubscriptions();
///
public:///for test
@ -84,7 +84,7 @@ signals:
int Signal_StartCapture();
int Signal_StopCapture();
void Signal_UpdateVehicleMessage(QString qstrMessage);
void Signal_UpdateVehicleMessage(QString qstrMessage,int lineid);
public slots:
int Slot_OnChangeCaptureMode(char cMode);
///for test

View File

@ -1,391 +1,455 @@
#include "Widget_M300RTK.h"
enum AireType
{
Aire_Aire = 1,
Aire_N2=0,
#define RLX_LINENUMBER 0
enum AireType {
Aire_Aire = 1,
Aire_N2 = 0,
Aire_NONE=2,
};
enum Target_Gas {
Target_CO2 = 0,
Target_H2O = 1,
Target_CO2 = 0,
Target_H2O = 1,
Target_NONE=2,
};
int32_t CuttrentGasValue = 0;
int32_t passwordforsetting = 0;
int32_t ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = 0;
int32_t ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode = 1;
int32_t ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode = 1;
int32_t ZZ_Widget_M300RTK::m_siDjiWidgetValueList_DecisionHeight = 1;
int32_t ZZ_Widget_M300RTK::m_siDjiWidgetValueList_SamplingRate = 0;
AireType CurrentAireType = Aire_Aire;
Target_Gas CurrentTargetGas = Target_CO2;
AireType CurrentAireType = Aire_NONE;
Target_Gas CurrentTargetGas = Target_NONE;
float NowTempreature = 0;
bool isnowsystemWorking = false;
QStringList Strforshow;
QStringList StrforshowCurrent;
QStringList StrforshowLast;
vector<int> indexforshow;
ZZ_Widget_M300RTK::ZZ_Widget_M300RTK(QObject* parent /*= nullptr*/)
{
m_iFlagIsVehicleCapturing = 0;
ZZ_Widget_M300RTK::ZZ_Widget_M300RTK(QObject *parent /*= nullptr*/) {
m_iFlagIsVehicleCapturing = 0;
Strforshow.append("");
Strforshow.append("");
Strforshow.append("");
Strforshow.append("");
Strforshow.append("");
// Strforshow.append("");
// Strforshow.append("");
StrforshowCurrent = Strforshow;
StrforshowLast = Strforshow;
indexforshow.resize(Strforshow.size());
for (int i = 0; i < indexforshow.size(); i++) {
indexforshow[i] = 0;
}
connect(&m_TimerForflash, &QTimer::timeout, this, &ZZ_Widget_M300RTK::Slot_flash_screen);
connect(this,&ZZ_Widget_M300RTK::Signal_UpdatePSDKFloatMessage,this,&ZZ_Widget_M300RTK::Slot_UpdatePSDKFloatMessage);
connect(this, &ZZ_Widget_M300RTK::Signal_UpdatePSDKFloatMessage, this,
&ZZ_Widget_M300RTK::Slot_UpdatePSDKFloatMessage);
m_bIsFlashOn = false;
}
ZZ_Widget_M300RTK::~ZZ_Widget_M300RTK()
{
ZZ_Widget_M300RTK::~ZZ_Widget_M300RTK() {
}
int ZZ_Widget_M300RTK::InitParam()
{
return 0;
int ZZ_Widget_M300RTK::InitParam() {
return 0;
}
int ZZ_Widget_M300RTK::SetUIFilePath(char* pcUIFilePath, uint16_t uiLength)
{
if (uiLength>=256)
{
qDebug() << "ZZ_Widget_M300RTK: Func SetUIFilePath. File path is too long";
return 1;
}
int ZZ_Widget_M300RTK::SetUIFilePath(char *pcUIFilePath, uint16_t uiLength) {
if (uiLength >= 256) {
qDebug() << "ZZ_Widget_M300RTK: Func SetUIFilePath. File path is too long";
return 1;
}
QByteArray qbaTemp(pcUIFilePath);
m_qstrFilePath = qbaTemp;
QByteArray qbaTemp(pcUIFilePath);
m_qstrFilePath = qbaTemp;
return 0;
return 0;
}
int ZZ_Widget_M300RTK::UpdateCaptureStatus(int iStatus)
{
m_iFlagIsVehicleCapturing = iStatus;
int ZZ_Widget_M300RTK::UpdateCaptureStatus(int iStatus) {
m_iFlagIsVehicleCapturing = iStatus;
}
int ZZ_Widget_M300RTK::GetSettings(UIConfig &struUIConfig)
{
struUIConfig.sDecisionHeight = m_siDjiWidgetValueList_DecisionHeight;
struUIConfig.sCaptureMode = m_siDjiWidgetValueList_CaptureMode;
struUIConfig.sSamplingRate = m_siDjiWidgetValueList_SamplingRate;
return 0;
int ZZ_Widget_M300RTK::GetSettings(UIConfig &struUIConfig) {
struUIConfig.sDecisionHeight = m_siDjiWidgetValueList_DecisionHeight;
struUIConfig.sCaptureMode = m_siDjiWidgetValueList_CaptureMode;
struUIConfig.sSamplingRate = m_siDjiWidgetValueList_SamplingRate;
return 0;
}
int ZZ_Widget_M300RTK::SetSettings(UIConfig struUIConfig)
{
m_struUIConfig = struUIConfig;
m_siDjiWidgetValueList_CaptureMode = struUIConfig.sCaptureMode;
m_siDjiWidgetValueList_DecisionHeight = struUIConfig.sDecisionHeight;
m_siDjiWidgetValueList_SamplingRate = struUIConfig.sSamplingRate;
return 0;
int ZZ_Widget_M300RTK::SetSettings(UIConfig struUIConfig) {
m_struUIConfig = struUIConfig;
m_siDjiWidgetValueList_CaptureMode = struUIConfig.sCaptureMode;
m_siDjiWidgetValueList_DecisionHeight = struUIConfig.sDecisionHeight;
m_siDjiWidgetValueList_SamplingRate = struUIConfig.sSamplingRate;
return 0;
}
int ZZ_Widget_M300RTK::PreparteEnvironment()
{
void ZZ_Widget_M300RTK::stratmessageflash() {
T_DjiReturnCode djiStat;
static const T_DjiWidgetHandlerListItem s_DjiWidgetHandlerList[] =
{
{0, DJI_WIDGET_TYPE_SWITCH, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{1, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{2, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{3, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{4, DJI_WIDGET_TYPE_INT_INPUT_BOX, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{5, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{6, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{7, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{8, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{9, DJI_WIDGET_TYPE_INT_INPUT_BOX, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{10, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this}
};
djiStat = DjiWidget_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "ZZ_Widget_M300RTK: Func DjiWidget_Init. Dji widget init error"<< djiStat;
//return djiStat;
}
djiStat = DjiWidget_RegDefaultUiConfigByDirPath(m_qstrFilePath.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << m_qstrFilePath.toLatin1();
qDebug() << "ZZ_Widget_M300RTK: Func DjiWidget_RegDefaultUiConfigByDirPath.Add default widget ui config error";
return djiStat;
}
djiStat = DjiWidget_RegHandlerList(s_DjiWidgetHandlerList, sizeof(s_DjiWidgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem));
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() <<"ZZ_Widget_M300RTK: Func DjiWidget_RegHandlerList.Set widget handler list error";
return djiStat;
}
return 0;
m_TimerForflash.start(5000);
m_bIsFlashOn = true;
}
int ZZ_Widget_M300RTK::UploadResources()
int ZZ_Widget_M300RTK::PreparteEnvironment() {
T_DjiReturnCode djiStat;
static const T_DjiWidgetHandlerListItem s_DjiWidgetHandlerList[] =
{
{0, DJI_WIDGET_TYPE_SWITCH, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{1, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{2, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{3, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{
return 0;
4, DJI_WIDGET_TYPE_INT_INPUT_BOX, ZZ_Widget_M300RTK::OnUpdateWidgetValue,
ZZ_Widget_M300RTK::OnLoadWidgetValue, this
},
{
5, DJI_WIDGET_TYPE_INT_INPUT_BOX, ZZ_Widget_M300RTK::OnUpdateWidgetValue,
ZZ_Widget_M300RTK::OnLoadWidgetValue, this
},
{6, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{7, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{8, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{9, DJI_WIDGET_TYPE_LIST, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this},
{
10, DJI_WIDGET_TYPE_INT_INPUT_BOX, ZZ_Widget_M300RTK::OnUpdateWidgetValue,
ZZ_Widget_M300RTK::OnLoadWidgetValue, this
},
{11, DJI_WIDGET_TYPE_BUTTON, ZZ_Widget_M300RTK::OnUpdateWidgetValue, ZZ_Widget_M300RTK::OnLoadWidgetValue, this}
};
djiStat = DjiWidget_Init();
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
qDebug() << "ZZ_Widget_M300RTK: Func DjiWidget_Init. Dji widget init error" << djiStat;
//return djiStat;
}
djiStat = DjiWidget_RegDefaultUiConfigByDirPath(m_qstrFilePath.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
qDebug() << m_qstrFilePath.toLatin1();
qDebug() << "ZZ_Widget_M300RTK: Func DjiWidget_RegDefaultUiConfigByDirPath.Add default widget ui config error";
return djiStat;
}
djiStat = DjiWidget_RegHandlerList(s_DjiWidgetHandlerList,
sizeof(s_DjiWidgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem));
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
qDebug() << "ZZ_Widget_M300RTK: Func DjiWidget_RegHandlerList.Set widget handler list error";
return djiStat;
}
return 0;
}
int ZZ_Widget_M300RTK::test_UpdatePSDKFloatMessage(QString qstrMessage)
{
T_DjiReturnCode djiStat;
djiStat = DjiWidgetFloatingWindow_ShowMessage(qstrMessage.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "ZZ_Widget_M300RTK: Func test_UpdatePSDKFloatMessage.Floating window show message error";
}
return 0;
int ZZ_Widget_M300RTK::UploadResources() {
return 0;
}
T_DjiReturnCode ZZ_Widget_M300RTK::OnUpdateWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value, void* userData)
{
ZZ_Widget_M300RTK* pCaller = (ZZ_Widget_M300RTK*)userData;
int ZZ_Widget_M300RTK::test_UpdatePSDKFloatMessage(QString qstrMessage) {
T_DjiReturnCode djiStat;
djiStat = DjiWidgetFloatingWindow_ShowMessage(qstrMessage.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
qDebug() << "ZZ_Widget_M300RTK: Func test_UpdatePSDKFloatMessage.Floating window show message error";
}
return 0;
}
T_DjiReturnCode ZZ_Widget_M300RTK::OnUpdateWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,
void *userData) {
ZZ_Widget_M300RTK *pCaller = (ZZ_Widget_M300RTK *) userData;
if (pCaller->m_iFlagIsVehicleCapturing)
{
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
if (widgetType == DJI_WIDGET_TYPE_INT_INPUT_BOX) {
if (index == 4)
{
qDebug()<<"now tempreatrue is "<<value;
NowTempreature=value;
}
if (index == 9)
{
qDebug() << "now gas value is " << value;
CuttrentGasValue = value;
}
}
if (widgetType== DJI_WIDGET_TYPE_BUTTON) {
if (index==5)
{
//qDebug()<<"now value is "<<value;
if (pCaller->m_iFlagIsVehicleCapturing) {
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
if (widgetType == DJI_WIDGET_TYPE_INT_INPUT_BOX) {
if (index == 5) {
qDebug() << "now tempreatrue is " << value;
NowTempreature = value;
}
if (index == 10) {
qDebug() << "now gas value is " << value;
CuttrentGasValue = value;
}
if (index==4) {
passwordforsetting = value;
qDebug() << "now password is " << passwordforsetting;
}
}
if (widgetType == DJI_WIDGET_TYPE_BUTTON) {
if (passwordforsetting!=123456) {
pCaller->emit Signal_UpdatePSDKFloatMessage("wrong password",RLX_LINENUMBER);
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
if (index == 6) {
//qDebug()<<"now value is "<<value;
if (value==1)
{
if (isnowsystemWorking==true) return 0;
if (NowTempreature==0) {
pCaller->emit Signal_UpdatePSDKFloatMessage("please set correct temperature first");
if (value == 1) {
if (isnowsystemWorking == true) return 0;
if (NowTempreature == 0) {
pCaller->emit Signal_UpdatePSDKFloatMessage("please set correct temperature first",RLX_LINENUMBER);
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
isnowsystemWorking = true;
pCaller->emit Signal_UpdatePSDKFloatMessage(
"calibrating wind Sensor temperature:" + QString::number(NowTempreature * 1.0 / 10),RLX_LINENUMBER);
//qt 消息队列执行
pCaller->emit SendCommand("WDA", "StartCalibrate#" + QString::number(NowTempreature * 1.0 / 10));
}
}
if (index == 8) {
if (value == 1) {
if (isnowsystemWorking == true) return 0;
isnowsystemWorking = true;
QString AiretypeStr;
if (CurrentAireType == Aire_Aire) {
AiretypeStr = "Air";
} else if (CurrentAireType == Aire_N2) {
AiretypeStr = "N2";
}
else {
pCaller->emit Signal_UpdatePSDKFloatMessage("please select correct aire type first",RLX_LINENUMBER);
isnowsystemWorking = false;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
qDebug() << "start gas sensor zero calibrate with " + AiretypeStr;
pCaller->emit Signal_UpdatePSDKFloatMessage("ZeroCalibrate with " + AiretypeStr,RLX_LINENUMBER);
QCoreApplication::processEvents();
pCaller->emit SendCommand("GAS", "ZeroCalibrate#" + AiretypeStr);
qDebug() << "---------------------------------------------";
}
}
if (index == 11) {
if (value == 1) {
if (isnowsystemWorking == true) return 0;
isnowsystemWorking = true;
QString TargetGasStr;
if (CurrentTargetGas == Target_CO2) {
TargetGasStr = "CO2";
} else if (CurrentTargetGas==Target_H2O) {
TargetGasStr = "H2O";
}
else {
pCaller->emit Signal_UpdatePSDKFloatMessage("please select correct target gas first",RLX_LINENUMBER);
isnowsystemWorking = false;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
isnowsystemWorking= true;
pCaller->emit Signal_UpdatePSDKFloatMessage("calibrating wind Sensor temperature:"+QString::number(NowTempreature*1.0/10));
pCaller->emit SendCommand("WDA", "StartCalibrate#"+QString::number(NowTempreature*1.0/10));
}
//确保当前气体值不为0
if (CuttrentGasValue == 0) {
pCaller->emit Signal_UpdatePSDKFloatMessage("please set correct gas value first",RLX_LINENUMBER);
isnowsystemWorking = false;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
}
}
if (index==7) {
if (value==1)
{
if (isnowsystemWorking==true) return 0;
isnowsystemWorking= true;
QString AiretypeStr;
if (CurrentAireType==Aire_Aire) {
AiretypeStr="Air";
}
else {
AiretypeStr="N2";
}
qDebug()<<"start gas sensor zero calibrate with "+AiretypeStr;
pCaller->emit Signal_UpdatePSDKFloatMessage("ZeroCalibrate with "+AiretypeStr);
pCaller->emit SendCommand("GAS", "ZeroCalibrate#"+AiretypeStr);
}
}
if (index==10) {
if (value==1)
{
if (isnowsystemWorking==true) return 0;
isnowsystemWorking= true;
QString TargetGasStr;
if (CurrentTargetGas==Target_CO2) {
TargetGasStr="CO2";
}
else {
TargetGasStr="H2O";
}
//确保当前气体值不为0
if (CuttrentGasValue==0) {
pCaller->emit Signal_UpdatePSDKFloatMessage("please set correct gas value first");
isnowsystemWorking=false;
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
qDebug()<<"start gas sensor span calibrate with "+TargetGasStr+" value is "+QString::number(CuttrentGasValue);
pCaller->emit Signal_UpdatePSDKFloatMessage(TargetGasStr+" Span Calibrating gas value is "+QString::number(CuttrentGasValue));
pCaller->emit SendCommand("GAS", "SpanCalibrate#"+TargetGasStr+"#"+QString::number(CuttrentGasValue));
}
}
qDebug() << "start gas sensor span calibrate with " + TargetGasStr + " value is " + QString::number(
CuttrentGasValue);
pCaller->emit Signal_UpdatePSDKFloatMessage(
TargetGasStr + " Span Calibrating gas value is " + QString::number(CuttrentGasValue),
RLX_LINENUMBER);
pCaller->emit SendCommand(
"GAS", "SpanCalibrate#" + TargetGasStr + "#" + QString::number(CuttrentGasValue));
}
}
}
if (widgetType == DJI_WIDGET_TYPE_SWITCH) {
if (ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode == 0) {
pCaller->emit Signal_UpdatePSDKFloatMessage("Automatic capture mode.Please don't use this function",
RLX_LINENUMBER);
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
} else {
if (value == 1) {
if (isnowsystemWorking == true) {
// ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = !value;
return 0;
}
}
isnowsystemWorking = true;
pCaller->emit Signal_UpdatePSDKFloatMessage("start capture",RLX_LINENUMBER);
pCaller->emit Signal_StartCapture();
} else {
if (isnowsystemWorking == false) {
// ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = !value;
return 0;
}
isnowsystemWorking = false;
pCaller->emit Signal_UpdatePSDKFloatMessage("capture stopped",RLX_LINENUMBER);
pCaller->emit Signal_StopCapture();
}
}
ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = value;
///for test
QString qstrTest;
qDebug() << "OnUpdateWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
qstrTest = QString("index:%1,value:%2").arg(index, value);
//pCaller->test_UpdatePSDKFloatMessage(qstrTest);
//qstrTest = "12345";
//pCaller->emit Signal_UpdatePSDKFloatMessage(qstrTest);
}
if (widgetType == DJI_WIDGET_TYPE_SWITCH )
{
if (ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode==0)
{
pCaller->emit Signal_UpdatePSDKFloatMessage("Automatic capture mode.Please don't use this function");
return DJI_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
else
{
if (value==1)
{
if (isnowsystemWorking==true) {
// ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = !value;
return 0;
}
isnowsystemWorking= true;
pCaller->emit Signal_UpdatePSDKFloatMessage("start capture");
pCaller->emit Signal_StartCapture();
}
else
{
if (isnowsystemWorking==false) {
// ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = !value;
return 0;
}
isnowsystemWorking= false;
pCaller->emit Signal_UpdatePSDKFloatMessage("capture stopped");
pCaller->emit Signal_StopCapture();
}
}
ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn = value;
///for test
QString qstrTest;
qDebug() << "OnUpdateWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
qstrTest = QString("index:%1,value:%2").arg(index, value);
//pCaller->test_UpdatePSDKFloatMessage(qstrTest);
//qstrTest = "12345";
//pCaller->emit Signal_UpdatePSDKFloatMessage(qstrTest);
}
if (widgetType == DJI_WIDGET_TYPE_LIST )
{
if (index==1)
{
pCaller->emit Signal_UpdateCaptureMode((char)value);
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode = value;
}
else if (index == 2)
{
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_DecisionHeight = value;
}
else if (index == 3)
{
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_SamplingRate = value;
}
else if (index==6)
{
CurrentAireType = (AireType)value;
}
else if (index==8)
{
CurrentTargetGas = (Target_Gas)value;
}
if (widgetType == DJI_WIDGET_TYPE_LIST) {
if (index == 1) {
pCaller->emit Signal_UpdateCaptureMode((char) value);
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode = value;
} else if (index == 2) {
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_DecisionHeight = value;
} else if (index == 3) {
ZZ_Widget_M300RTK::m_siDjiWidgetValueList_SamplingRate = value;
} else if (index == 7) {
CurrentAireType = (AireType) value;
} else if (index == 9) {
CurrentTargetGas = (Target_Gas) value;
}
#ifdef ZZ_FLAG_TEST
qDebug() << "OnUpdateWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
qDebug() << "OnUpdateWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
#endif
}
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_DjiReturnCode ZZ_Widget_M300RTK::OnLoadWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t* value, void* userData)
{
T_DjiReturnCode ZZ_Widget_M300RTK::OnLoadWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t *value,
void *userData) {
if (widgetType == DJI_WIDGET_TYPE_SWITCH) {
//qDebug() << "OnLoadWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
if (widgetType == DJI_WIDGET_TYPE_SWITCH)
{
//qDebug() << "OnLoadWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn;
}
*value= ZZ_Widget_M300RTK::m_siDjiWidgetValueBtn;
}
if (widgetType == DJI_WIDGET_TYPE_LIST)
{
//qDebug() << "OnLoadWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
if (index == 1)
{
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode;
if (widgetType == DJI_WIDGET_TYPE_LIST) {
//qDebug() << "OnLoadWidgetValue " << "widgetType " << widgetType << "index " << index << "value " << value;
if (index == 1) {
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_CaptureMode;
} else if (index == 2) {
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_DecisionHeight;
} else if (index == 3) {
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_SamplingRate;
} else if (index == 7) {
*value = (int32_t) CurrentAireType;
} else if (index == 9) {
*value = (int32_t) CurrentTargetGas;
}
}
if (widgetType == DJI_WIDGET_TYPE_INT_INPUT_BOX) {
if (index==4) {
*value = passwordforsetting;
}
else if (index == 2)
{
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_DecisionHeight;
}
else if (index == 3)
{
*value = ZZ_Widget_M300RTK::m_siDjiWidgetValueList_SamplingRate;
}
else if (index == 6)
{
*value = (int32_t)CurrentAireType;
} else if (index == 8)
{
*value = (int32_t)CurrentTargetGas;
}
}
if (widgetType==DJI_WIDGET_TYPE_INT_INPUT_BOX)
{
if (index == 4)
{
*value = NowTempreature;
}
if (index == 9)
{
*value = CuttrentGasValue;
}
}
if (index == 5) {
*value = NowTempreature;
}
if (index == 10) {
*value = CuttrentGasValue;
}
}
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int ZZ_Widget_M300RTK::Slot_UpdatePSDKFloatMessage(QString qstrMessage)
{
T_DjiReturnCode djiStat;
int ZZ_Widget_M300RTK::Slot_UpdatePSDKFloatMessage(QString qstrMessage, int lineid) {
T_DjiReturnCode djiStat;
Strforshow[lineid] = qstrMessage;
// qDebug() << "float message line " << lineid << " : " << qstrMessage;
Slot_flash_screen();
//
// QString strinone="";
// for (int i = 0; i < Strforshow.size(); i++) {
// strinone+=Strforshow[i]+"\r\n";
// }
// djiStat = DjiWidgetFloatingWindow_ShowMessage(strinone.toLatin1());
// if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
// {
// qDebug() << "ZZ_Widget_M300RTK: Func test_UpdatePSDKFloatMessage.Floating window show message error";
// }
djiStat = DjiWidgetFloatingWindow_ShowMessage(qstrMessage.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
qDebug() << "ZZ_Widget_M300RTK: Func test_UpdatePSDKFloatMessage.Floating window show message error";
}
return 0;
return 0;
}
void ZZ_Widget_M300RTK::BackCommand(QString Worker, QString Command) {
if (Worker=="WDA") {
if (Command=="Finish") {
isnowsystemWorking= false;
qDebug()<<"wind calibrate finished";
emit Signal_UpdatePSDKFloatMessage("wind calibrate finished");
}
}
else if (Worker == "GAS") {
if (Command == "Finish") {
isnowsystemWorking = false;
qDebug() << "gas zero calibrate finished";
emit Signal_UpdatePSDKFloatMessage("gas zero calibrate finished");
}
}
if (Worker == "WDA") {
if (Command == "Finish") {
isnowsystemWorking = false;
qDebug() << "wind calibrate finished";
emit Signal_UpdatePSDKFloatMessage("wind calibrate finished",RLX_LINENUMBER);
}
} else if (Worker == "GAS") {
if (Command == "Finish") {
isnowsystemWorking = false;
qDebug() << "gas zero calibrate finished";
emit Signal_UpdatePSDKFloatMessage("gas zero calibrate finished",RLX_LINENUMBER);
}
}
}
void ZZ_Widget_M300RTK::Slot_flash_screen() {
QString strinone = "";
// 获取当前日期时间
QDateTime QDateTime= QDateTime::currentDateTime();
Strforshow[Strforshow.size()-1]=QDateTime.toString("yyyy-MM-dd hh:mm:ss");
;
// QTime currentTime = QTime::currentTime();
// Strforshow.at(Strforshow.length())=currentTime.toString("hh:mm:ss");
// qDebug() << "Slot_flash_screen time:" << currentTime;
StrforshowCurrent = Strforshow;
//
QStringList strforsend;
if (StrforshowCurrent==StrforshowLast&&StrforshowCurrent.at(0).size()<25) {
//没有变化不需要更新
return;
}
for (int i = 0; i < StrforshowCurrent.size(); i++) {
if (i==0) {
if (StrforshowCurrent.at(i) != StrforshowLast.at(i)) {
indexforshow[i] = 0;
}
if (StrforshowCurrent.at(i).size() < 25 || i >= 1) {
//只有第一行需要滚动显示
strforsend.append(StrforshowCurrent.at(i));
indexforshow[i] = 0;
} else {
QString doublestr = StrforshowCurrent.at(i) + StrforshowCurrent.at(i);
QString strtemp = doublestr.mid(indexforshow[i], 30);
strforsend.append(strtemp);
if (indexforshow[i] >= StrforshowCurrent.at(i).size()) {
indexforshow[i] = 0;
} else
indexforshow[i]++;
}
}else {
strforsend.append(StrforshowCurrent.at(i));
}
}
for (int i = 0; i < strforsend.size(); i++) {
strinone += strforsend[i] + "\r\n";
}
T_DjiReturnCode djiStat = DjiWidgetFloatingWindow_ShowMessage(strinone.toLatin1());
if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
qDebug() << "ZZ_Widget_M300RTK: Func test_UpdatePSDKFloatMessage.Floating window show message error";
}
StrforshowLast = StrforshowCurrent;
}

View File

@ -17,11 +17,13 @@ public:
public:
private:
QTimer m_TimerForflash;
int m_iFlagIsVehicleCapturing;
UIConfig m_struUIConfig;
short m_sFlagCaptureMode;
QString m_qstrFilePath;
static int32_t m_siDjiWidgetValueBtn, m_siDjiWidgetValueList_CaptureMode, m_siDjiWidgetValueList_SamplingRate, m_siDjiWidgetValueList_DecisionHeight;
bool m_bIsFlashOn;
public:
int PreparteEnvironment();
int SetUIFilePath(char* pcUIFilePath, uint16_t uiLength);
@ -29,20 +31,23 @@ public:
int GetSettings(UIConfig &struUIConfig);
int SetSettings(UIConfig struUIConfig);
void stratmessageflash();
//int UpdateCaptureStatus(int iStatus);
private:
int InitParam();
int UploadResources();
int test_UpdatePSDKFloatMessage(QString qstrMessage);
public:
static T_DjiReturnCode OnUpdateWidgetValue(E_DjiWidgetType widgetType, uint32_t index, int32_t value,void* userData);
static T_DjiReturnCode OnLoadWidgetValue (E_DjiWidgetType widgetType, uint32_t index, int32_t* value,void* userData);
public slots:
int Slot_UpdatePSDKFloatMessage(QString qstrMessage);
int Slot_UpdatePSDKFloatMessage(QString qstrMessage,int lineid);
void BackCommand(QString Worker, QString Command);
void Slot_flash_screen();
signals:
void Signal_UpdatePSDKFloatMessage(QString qstrMessage);
void Signal_UpdatePSDKFloatMessage(QString qstrMessage,int lineid);
///0:Auto 1:Manual
void Signal_UpdateCaptureMode(char cMode);

View File

@ -2,13 +2,18 @@
#include "unistd.h"
#include <cmath>
#include "hal_uart.h"
#define LINECOMMEND 0
#define LINEDATASHOW 1
std::atomic<int> WorkingState;
std::atomic<int> SavingDate;
CMainAcqThread::CMainAcqThread(QObject* parent /*= nullptr*/)
{
m_iFlagCaptureStatus = 0;
iFlagIsPathGenerated = false;
m_clsCapTimer.setTimerType(Qt::PreciseTimer);
WorkingState = 0;
SavingDate = 0;
#ifdef ZZ_FLAG_TEST
//connect(&m_clsCapTimer, &QTimer::timeout, this, &CMainAcqThread::OnTestTimer);
@ -52,15 +57,16 @@ int CMainAcqThread::StartUp()
m_ctrlVehicle.StartupPSDK_M300RTK();
QString qstrMessage = "Initializing sensors,Please wait...";
emit Signal_UpdateVehicleMessage(qstrMessage);
emit Signal_UpdateVehicleMessage(qstrMessage,LINECOMMEND);
int iRes = m_ctrlGasSensor.Initialize(m_struSensorPort.qstrGasSensorPort.toStdString());
if (iRes!=0)
{
qstrMessage.clear();
qstrMessage.append("Fatal Error!!! Gas sensor not connected.Please check.");
//qstrMessage = "Fatal Error!!! Gas sensor not connected.Please check.";
emit Signal_UpdateVehicleMessage(qstrMessage);
qstrMessage = "Fatal Error!!! Gas sensor not connected.Please check.";
emit Signal_UpdateVehicleMessage(qstrMessage,LINECOMMEND);
qDebug() << qstrMessage;
//return 1;
}
@ -69,28 +75,30 @@ int CMainAcqThread::StartUp()
if (iRes != 0)
{
qstrMessage.append("Fatal Error!!! Wind sensor not connected.Please check.");
//qstrMessage = "Fatal Error!!! Wind sensor not connected.Please check.";
emit Signal_UpdateVehicleMessage(qstrMessage);
qstrMessage = "Fatal Error!!! Wind sensor not connected.Please check.";
emit Signal_UpdateVehicleMessage(qstrMessage,LINECOMMEND);
qDebug() << qstrMessage;
//return 2;
}
qstrMessage.append("System ready.Waiting for signals");
//qstrMessage = "System ready.Waiting for signals";
emit Signal_UpdateVehicleMessage(qstrMessage);
// qstrMessage = "System ready.Waiting for signals";
// qstrMessage="123456789123456789123456789123456789123456789123456789123456789";
emit Signal_UpdateVehicleMessage(qstrMessage,LINECOMMEND);
return 0;
}
int CMainAcqThread::SetupMessagePipe()
{
connect(&m_ctrlVehicle, &VehicleController::Signal_StartCapture, this, &CMainAcqThread::Slot_StartCapture);
connect(&m_ctrlVehicle.m_clsWidget,&ZZ_Widget_M300RTK::SendCommand,this,&CMainAcqThread::GetCommand);
connect(&m_ctrlVehicle.m_clsWidget,&ZZ_Widget_M300RTK::SendCommand,this,&CMainAcqThread::GetCommand,Qt::QueuedConnection);
connect(this, &CMainAcqThread::SendCommand, &m_ctrlVehicle.m_clsWidget, &ZZ_Widget_M300RTK::BackCommand);
connect(&m_ctrlVehicle, &VehicleController::Signal_StopCapture, this, &CMainAcqThread::Slot_StopCapture);
connect(this, &CMainAcqThread::Signal_UpdateVehicleMessage, &m_ctrlVehicle, &VehicleController::Signal_UpdateVehicleMessage);
connect(&m_clsCapTimer, &QTimer::timeout, this, &CMainAcqThread::OnTimerCapture);
m_clsCapTimer.start(1000);
return 0;
}
@ -146,10 +154,21 @@ int CMainAcqThread::FormFixedWindData()
m_fTempFixedWindVecY = m_fTempFixedWindVecY - m_struM300RTKDataFrame.stVelocity.y;
m_fTempFixedWindVecZ = m_fTempFixedWindVecZ - m_struM300RTKDataFrame.stVelocity.z;
double dDotProduct = m_fTempFixedWindVecX; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dVectorLength = sqrt(m_fTempFixedWindVecX * m_fTempFixedWindVecX + m_fTempFixedWindVecY * m_fTempFixedWindVecY + m_fTempFixedWindVecZ * m_fTempFixedWindVecZ); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
double dAngleInRadians = acos(dDotProduct / dVectorLength); // <20><><EFBFBD><EFBFBD>нǵĻ<C7B5><C4BB><EFBFBD>ֵ
double angleInDegrees = dAngleInRadians * (180.0 / M_PI); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
double dVectorLength = sqrt(m_fTempFixedWindVecX * m_fTempFixedWindVecX + m_fTempFixedWindVecY * m_fTempFixedWindVecY + m_fTempFixedWindVecZ * m_fTempFixedWindVecZ);
if (dVectorLength < 0.0001)
{
m_struUASDataFrame.fFixedWindDirection = 0;
m_struUASDataFrame.fFixedWindSpeed = 0;
return 0;
}
double dDotProduct = m_fTempFixedWindVecX;
double dCosAngle = dDotProduct / dVectorLength;
if (dCosAngle > 1.0) dCosAngle = 1.0;
if (dCosAngle < -1.0) dCosAngle = -1.0;
double dAngleInRadians = acos(dCosAngle);
double angleInDegrees = dAngleInRadians * (180.0 / M_PI);
m_struUASDataFrame.fFixedWindDirection = angleInDegrees;
m_struUASDataFrame.fFixedWindSpeed = dVectorLength;
@ -188,7 +207,7 @@ void CMainAcqThread::OnTestTimer()
int CMainAcqThread::GetData()
{
unsigned long ulCO2=0, ulH2O=0;
double ulCO2=0, ulH2O=0;
float fGasTemp=-1,fPP=-1,fPB=-1;
m_ctrlGasSensor.GetMeasuredData(ulCO2, ulH2O, fGasTemp, fPP, fPB);
m_struGSDataFrame.ulCO2 = ulCO2;
@ -207,10 +226,14 @@ int CMainAcqThread::GetData()
m_ctrlVehicle.GetOneDataFrame(m_struM300RTKDataFrame);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// #define ZZ_FLAG_TEST
int CMainAcqThread::OnTimerCapture()
{
if (m_iFlagCaptureStatus >1)
{
return 0;
}
#ifdef ZZ_FLAG_TEST
qDebug() << "OnTimerCapture entering time:" << QTime::currentTime();
#endif
@ -227,14 +250,23 @@ int CMainAcqThread::OnTimerCapture()
QString qstrMessage;
qstrMessage = QString("CO2: %1ppm, H20: %2ppm\r\nFixed Wind Speed: %3m/s\r\nFixed Wind Direction: %4deg").arg(m_struGSDataFrame.ulCO2).arg(m_struGSDataFrame.ulH2O)
.arg(m_struUASDataFrame.fFixedWindSpeed).arg(m_struUASDataFrame.fFixedWindDirection);
emit Signal_UpdateVehicleMessage(qstrMessage);
emit Signal_UpdateVehicleMessage("CO2:"+QString::number(m_struGSDataFrame.ulCO2,'f',1)+"\t H2O:"+QString::number(m_struGSDataFrame.ulH2O,'f',1),LINEDATASHOW);
emit Signal_UpdateVehicleMessage("WS:"+QString::number(m_struUASDataFrame.fFixedWindSpeed,'f',2)+"\t D:"+QString::number(m_struUASDataFrame.fFixedWindDirection,'f',2)+"",LINEDATASHOW+1);
// emit Signal_UpdateVehicleMessage("PP:"+QString::number(m_struGSDataFrame.fPP,'f',2)+"\t PB:"+QString::number(m_struGSDataFrame.fPB,'f',2)+"",LINEDATASHOW+2);
emit Signal_UpdateVehicleMessage("T:"+QString::number(m_struGSDataFrame.fTemp,'f',2)+"\t PB:"+QString::number(m_struGSDataFrame.fPB,'f',2),LINEDATASHOW+2);
// emit Signal_UpdateVehicleMessage(qstrMessage);
//////////////////////////////////////////////////////////////////////////
#ifdef ZZ_FLAG_TEST
qDebug() << m_struM300RTKDataFrame.stGPSPosition.x << m_struM300RTKDataFrame.stGPSPosition.y << m_struM300RTKDataFrame.stGPSPosition.z
<< m_struM300RTKDataFrame.stVelocity.x << m_struM300RTKDataFrame.stVelocity.y << m_struM300RTKDataFrame.stVelocity.z;
#endif
if (SavingDate==1)
{
m_ctrlData.WriteData(m_struM300RTKDataFrame, m_struGSDataFrame, m_struUASDataFrame);
}
m_ctrlData.WriteData(m_struM300RTKDataFrame, m_struGSDataFrame, m_struUASDataFrame);
#ifdef ZZ_FLAG_TEST
@ -258,12 +290,13 @@ int CMainAcqThread::Slot_StartCapture()
m_ctrlData.GenerateFile();
m_clsCapTimer.start(1000);
// m_clsCapTimer.start(1000);
#ifdef ZZ_FLAG_TEST
qDebug() << "CMainAcqThread Test Cap Started";
#endif // ZZ_FLAG_TEST
m_iFlagCaptureStatus = 1;
SavingDate = 1;
return 0;
}
@ -275,7 +308,8 @@ int CMainAcqThread::Slot_StopCapture()
iFlagIsPathGenerated = false;
m_clsCapTimer.stop();
SavingDate=0;
//m_clsCapTimer.stop();
m_ctrlData.CloseData();
#ifdef ZZ_FLAG_TEST
@ -283,7 +317,7 @@ int CMainAcqThread::Slot_StopCapture()
#endif // ZZ_FLAG_TEST
QString qstrMessage = QString("Capture Stopped.");
emit Signal_UpdateVehicleMessage(qstrMessage);
emit Signal_UpdateVehicleMessage(qstrMessage,LINECOMMEND);
return 0;
}
@ -296,20 +330,26 @@ void CMainAcqThread::GetCommand(QString Worker, QString Command) {
int waitetime=10;
qDebug()<<"GetCommand Worker:"<<Worker<<" Command:"<<Command;
if (Worker=="WDA") {
m_iFlagCaptureStatus=WADCALI;
QThread::msleep(1100);
//#分割字符comman
QStringList arc=Command.split("#");
if (arc[0]=="StartCalibrate") {
if (arc.length()<2) {
emit SendCommand("WDA","Finish");
m_iFlagCaptureStatus=NORMAL;
return;
}
m_ctrlWindSensor.CalibrateWDA(arc[1].toDouble());
emit SendCommand("WDA","Finish");
m_iFlagCaptureStatus=NORMAL;
}
}
else if (Worker == "GAS") {
m_iFlagCaptureStatus = GASGALI;
QStringList arc = Command.split("#");
qDebug()<<"arc is"<<arc;
if (arc[0] == "ZeroCalibrate") {
@ -349,7 +389,7 @@ void CMainAcqThread::GetCommand(QString Worker, QString Command) {
if (arc.size()<3) {
emit SendCommand("GAS", "Finish");
m_iFlagCaptureStatus=NORMAL;
return;
}
char cChannel=0;
@ -360,7 +400,7 @@ void CMainAcqThread::GetCommand(QString Worker, QString Command) {
}
else {
emit SendCommand("GAS", "Finish");
m_iFlagCaptureStatus=NORMAL;
return;
}
unsigned int uiPPM=arc[2].toUInt();
@ -376,6 +416,6 @@ void CMainAcqThread::GetCommand(QString Worker, QString Command) {
}
m_iFlagCaptureStatus=NORMAL;
}
}

View File

@ -17,6 +17,9 @@ using namespace ZZ_DATA_DEF::DJI;
using namespace ZZ_DATA_DEF::CO2_GAS_SENSOR;
using namespace ZZ_DATA_DEF::UA_SENSOR;
using namespace ZZ_DATA_DEF::MainConfig;
#define WADCALI 2;
#define GASGALI 3;
#define NORMAL 1;
class CMainAcqThread :public QObject
{
@ -28,7 +31,7 @@ public:
private:
QTime lastTime;
QTimer m_clsCapTimer;
std::atomic<int> m_WorkingState;
int iFlagIsPathGenerated;
MiscControls m_struMiscCtrls;
@ -65,7 +68,7 @@ private:
int RotateWindVec();
int FormFixedWindData();
signals:
void Signal_UpdateVehicleMessage(QString qstrMessage);
void Signal_UpdateVehicleMessage(QString qstrMessage,int linid);
void SendCommand(QString Worker, QString Command);
public slots:
void OnTestTimer();

View File

@ -117,8 +117,8 @@ namespace ZZ_DATA_DEF
{
// unsigned long ulCO2;
// unsigned long ulH2O;
float ulCO2;
float ulH2O;
double ulCO2;
double ulH2O;
float fTemp;
float fPB;
float fPP;

View File

@ -1,6 +1,6 @@
[DJI]
USER_APP_NAME=Project_Grixis
USER_APP_ID=126401
USER_APP_KEY=a313e3617b16c56a11502bd91a61d6f
USER_APP_LICENSE=BNrpsD+UJ2lj8kmVgN4GnXg+AZiQwaxSuf/WvA072DFdLy2h+NCQizf+nR+WcjEEKeTknSzPbfqlvAc/WSJwrtqV/gYXSVPtSlK0AaV61SeKBvZQpogoyaZy07fWNCZrha3OAQsHj18TtU5RjOn6gYapzGDAPQVG6Q/At/H/9GSPQr5uwxI20fVWUTOkymYLM/04CNQGsToPD+fZwixExjjjHjdD9K7R0D4EgyvbqMpMLlkspBLR/9h6/oVxefOyaHJIi+pk+IdLFFC3omnrh7U3/4b95LA3t22J1GJvqvO2cyphjrSXsaDdctvtj6EjE8WhEXQCvmYm0VIHWz/0Qw==
USER_DEVELOPER_ACCOUNT=1033584732@qq.com
USER_APP_NAME=M400device
USER_APP_ID=176035
USER_APP_KEY=4889bbeb0092089889b4f3180167202
USER_APP_LICENSE=VVfdaxQA6j5aX6zy/C6S2PFoSUqdcj5PeQ1GG8aRMuy+SegA1y9iYtQLOLu7CprNwwBN6X6wdwzSn8lOHJuXb6TfvRsakVCsXQ6A9qWmBB8IKzAKcQ60EJlZ71h5cLthXzNNq1ERQpBM5w9b+FebKF29XzozZCF2ZYWSgoGb/nEWxlm23Gp0EB3ZwbP31yRyLQUCY3iDdLYByOe3xSGLtJOlu3OJuujzY80T3eqWonwYsl4Hb4hWJODXJYWzLGFA1irjVJdle//7WZ0F17fEo/xGgPb7W36twDU80QFfpwagEqtacoo6bp+qij6Db10wF9Z8VWlAkY+59lLbyV3gnw==
USER_DEVELOPER_ACCOUNT=rlxlixin1@163.com

View File

@ -33,20 +33,26 @@
{
"widget_list":
[
{
"widget_index": 4,
"widget_type": "int_input_box",
"widget_name": "防误触密码",
"int_input_box_hint": "123456"
},
{
"widget_index": 5,
"widget_type": "int_input_box",
"widget_name": "当前温度--风速标定",
"int_input_box_hint": "*0.1°C"
},
{
"widget_index": 5,
"widget_index": 6,
"widget_type": "button",
"widget_name": "风速标定"
},
{
"widget_index": 6,
"widget_index": 7,
"widget_type": "list",
"widget_name": "标气类型--零位校正",
"list_item": [
@ -55,16 +61,19 @@
},
{
"item_name": "AIR(空气)"
}
},
{
"item_name": "请选择"
}
]
},
{
"widget_index": 7,
"widget_index": 8,
"widget_type": "button",
"widget_name": "零位校正"
},
{
"widget_index": 8,
"widget_index": 9,
"widget_type": "list",
"widget_name": "目标气体类型--步长校正",
"list_item": [
@ -73,17 +82,20 @@
},
{
"item_name": "H2O(水蒸气)"
},
{
"item_name": "请选择"
}
]
},
{
"widget_index": 9,
"widget_index": 10,
"widget_type": "int_input_box",
"widget_name": "标气浓度值--步长校正",
"int_input_box_hint": "ppm"
},
{
"widget_index": 10,
"widget_index": 11,
"widget_type": "button",
"widget_name": "步长校正"
},

126
package.sh Executable file
View File

@ -0,0 +1,126 @@
#!/bin/bash
# Airborne CO2 项目打包脚本
# 打包成 Debian 包
VERSION=1.0.0
PROJECT_NAME="AirborneCO2"
PACKAGE_NAME="${PROJECT_NAME}_V${VERSION}.deb"
BUILD_DIR="build"
DEB_DIR="DebpackAirborneCO2"
# 检查是否在正确目录
if [ ! -f "CMakeLists.txt" ]; then
echo "错误:请在项目根目录运行此脚本"
exit 1
fi
echo "========================================="
echo "Airborne CO2 打包脚本 v${VERSION}"
echo "========================================="
# 1. 构建项目
echo ""
echo "[1/5] 开始构建项目..."
# 清理旧的 build 目录并重新创建
#rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
cd $BUILD_DIR
cmake ..
#if [ $? -ne 0 ]; then
# echo "错误cmake 配置失败"
# exit 1
#fi
# 执行 make
make -j$(nproc)
if [ $? -ne 0 ]; then
echo "错误:构建失败"
exit 1
fi
cd ..
# 检查构建产物
if [ ! -f "${BUILD_DIR}/Project_Grixis" ]; then
echo "错误:构建产物不存在"
exit 1
fi
echo "构建完成"
# 2. 创建打包目录
echo ""
echo "[2/5] 创建打包目录..."
rm -rf $DEB_DIR
mkdir -p $DEB_DIR
# 3. 复制可执行文件和脚本文件
echo ""
echo "[3/5] 复制文件..."
mkdir -p ${DEB_DIR}/home/pi/bin
cp ${BUILD_DIR}/Project_Grixis ${DEB_DIR}/home/pi/bin/
chmod +x ${DEB_DIR}/home/pi/bin/Project_Grixis
# 复制脚本文件到 /home/pi/bin/
for script in rasp.sh raspusb.sh mountdjirndis.sh mountdjirndism400.sh mountrndis.sh usbbulk.sh choosescript.sh; do
if [ -f "$script" ]; then
cp "$script" ${DEB_DIR}/home/pi/bin/
chmod +x ${DEB_DIR}/home/pi/bin/"$script"
fi
done
# 5. 创建 DEBIAN 目录和配置文件
echo ""
echo "[4/5] 创建 DEBIAN 配置..."
mkdir -p ${DEB_DIR}/DEBIAN
# 创建 control 文件
cat > ${DEB_DIR}/DEBIAN/control <<EOF
Package: AirborneCO2
Version: ${VERSION}
Architecture: armhf
Maintainer: AirborneCO2 Team
Description: Airborne CO2 monitoring application
EOF
# 创建 postinst 脚本(安装后执行)
cat > ${DEB_DIR}/DEBIAN/postinst <<EOF
#!/bin/bash
echo "AirborneCO2 v${VERSION} installed"
echo "V${VERSION}" > /home/data/version
chmod +x /home/pi/bin/Project_Grixis
exit 0
EOF
# 创建 prerm 脚本(删除前执行)
cat > ${DEB_DIR}/DEBIAN/prerm <<EOF
#!/bin/bash
exit 0
EOF
chmod +x ${DEB_DIR}/DEBIAN/postinst
chmod +x ${DEB_DIR}/DEBIAN/prerm
# 6. 打包
echo ""
echo "[5/5] 打包成 deb 文件..."
sudo dpkg -b $DEB_DIR $PACKAGE_NAME
if [ $? -eq 0 ]; then
echo ""
echo "========================================="
echo "打包成功: ${PACKAGE_NAME}"
echo "========================================="
# 移动到 DEB 目录
mkdir -p DEB
mv $PACKAGE_NAME DEB/
echo "已移动到: DEB/${PACKAGE_NAME}"
# 清理临时目录
rm -rf $DEB_DIR
else
echo "错误:打包失败"
exit 1
fi

View File

@ -46,8 +46,9 @@ if lsmod | grep -q g_ether; then
fi
rmmod g_mass_storage
sleep 1
rm -rf /sys/kernel/config/usb_gadget/pi4
if [ ! -d /sys/kernel/config/usb_gadget/pi4 ]; then
echo "Creating USB Gadget configuration..."
mkdir -p /sys/kernel/config/usb_gadget/pi4
cd /sys/kernel/config/usb_gadget/pi4
echo 0x2ca3 > idVendor # Linux Foundation