Files
IRIS_FODIS/Source/GPS/BD357Ctrl.cpp
zhangzhuo 3ce267dccf 1.修改了海阳光学光谱仪派生类,以支持暗像素信息的获取。
2.针对FLAME设备添加了新的实时暗背景扣除函数。
3.修改了部分系统执行逻辑,以支持FLAME的正确运行。
2023-07-17 11:26:56 +08:00

268 lines
6.2 KiB
C++

#include "BD357Ctrl.h"
#include "MainGrabber.h"
#include "lwgps.h"
#include "lwrb.h"
#include "time.h"
BD357Controller::BD357Controller(QObject* parent /*= nullptr*/)
{
m_iFlagIsGPSValid = 0;
m_iFlagIsContinuousUpdating = 0;
m_pSerialPort = NULL;
//connect(m_pSerialPort, &QSerialPort::readyRead, this, &BD357Controller::HandleReadyRead);
connect(this, &BD357Controller::Signal_InitSelf, this, &BD357Controller::Slot_InitSelf);
//connect(m_pMainGrabber,&CMainGrabber::Signal_InitFinished,this, &BD357Controller::Slot_SyncDateOnce);
}
BD357Controller::~BD357Controller()
{
if (m_pSerialPort != NULL)
{
m_pSerialPort->close();
delete m_pSerialPort;
}
}
int BD357Controller::SetContext(CMainGrabber& pMainGrabber)
{
m_pMainGrabber = &pMainGrabber;
return 0;
}
int BD357Controller::SetupMessagePipeline()
{
connect(m_pMainGrabber, &CMainGrabber::Signal_InitFinished, this, &BD357Controller::Slot_SyncDateOnce);
return 0;
}
int BD357Controller::SyncDateOnce()
{
using namespace ZZ_MISCDEF;
//bool bFlagFinish = 1;
bool bFlagFinish = false;
size_t uiCount = 0;
//ZZ_U8 u8Rx,u8Tx;
while (!bFlagFinish)
{
m_qbReadData.clear();
while (m_qbReadData.size()< 1000)
{
m_pSerialPort->waitForReadyRead(1000);
m_qbReadData.append(m_pSerialPort->readAll());
qDebug() << "waiting for gps data..." << m_qbReadData.size();
}
qDebug() << m_qbReadData.size() << endl;
lwgps_process(&m_hLWGPS, m_qbReadData, m_qbReadData.size());
m_qbReadData.clear();
if (uiCount<2)
{
uiCount++;
continue;
}
else
{
/*if (m_hLWGPS.is_valid)
{
bFlagFinish = 1;
}*/
}
//need to disable
//qDebug() << "one status :"<< m_hLWGPS.is_valid << m_hLWGPS .sats_in_use<< m_hLWGPS .year<<"-" << m_hLWGPS .month<<"-" << m_hLWGPS.date << "-" << m_hLWGPS.hours << ":" << m_hLWGPS.minutes << ":" << m_hLWGPS.seconds << ":" << endl;
int iRes = ZZ_FormatTime(m_hLWGPS.year, m_hLWGPS.month, m_hLWGPS.date, m_hLWGPS.hours, m_hLWGPS.minutes, m_hLWGPS.seconds);
if (iRes != 0)
{
continue;
}
else
{
bFlagFinish = 1;
time_t stdtime = m_qdtDateTime.toTime_t();
time_t stdtimeUTC = m_qdtDateTimeUTC.toTime_t();
#ifdef WIN32
#else
stime(&stdtimeUTC);
#endif
system("gpio write 4 1");
qDebug() << "system(gpio write 4 1)";
//
//m_qdtDateTime.currentMSecsSinceEpoch
//m_qdtDateTime.currentMSecsSinceEpoch();
}
//bFlagFinish = 1;
}
qDebug() << "Signal_StartCapture emitted.";
emit Signal_StartCapture();
return 0;
}
int BD357Controller::StartContinuousUpdating()
{
m_iFlagIsContinuousUpdating = 1;
while (m_iFlagIsContinuousUpdating)
{
m_qbReadData.clear();
while (m_qbReadData.size() < 1000)
{
m_pSerialPort->waitForReadyRead(1000);
m_qbReadData.append(m_pSerialPort->readAll());
}
//qDebug() << m_qbReadData.size() << endl;
lwgps_process(&m_hLWGPS, m_qbReadData, m_qbReadData.size());
if (m_hLWGPS.is_valid&&(!m_iFlagIsGPSValid))
{
emit Signal_UpdateStatus(1);
}
if ((!m_hLWGPS.is_valid)&& m_iFlagIsGPSValid)
{
emit Signal_UpdateStatus(0);
}
m_qbReadData.clear();
}
return 0;
}
int BD357Controller::Initialize(GPSInfo &struGPSI)
{
m_struGPSInfo = struGPSI;
emit Signal_InitSelf();
return 0;
}
int BD357Controller::ZZ_FormatTime(ZZ_U8 u8Year, ZZ_U8 u8Month, ZZ_U8 u8Day, ZZ_U8 u8Hour, ZZ_U8 u8Minute, ZZ_U8 u8Second)
{
int iYear = u8Year + 2000;
QDateTime qdtTestDate(QDate(iYear, u8Month, u8Day), QTime(u8Hour, u8Minute, u8Second));
if (qdtTestDate.isValid())
{
qDebug() << qdtTestDate;
m_qdtDateTime = qdtTestDate;
m_qdtDateTimeUTC = qdtTestDate;
//UTC+0 to UTC+8
m_qdtDateTime.addSecs(3600 * 8);
return 0;
}
else
{
return -1;
}
return -2;
//bool b1 = startDate.isValid();
//QString end = startDate.toString("yyyy.MM.dd hh:mm:ss");
//qDebug() << end;
//QString qstrSyncDate = QString("%1-%2-%3-%4-%5-%6").arg(iYear, 4, 10, QLatin1Char('0')).arg(u8Month, 2, 10, QLatin1Char('0'))
// .arg(u8Day, 2, 10, QLatin1Char('0')).arg(u8Hour, 2, 10, QLatin1Char('0'))
// .arg(u8Minute, 2, 10, QLatin1Char('0')).arg(u8Second, 2, 10, QLatin1Char('0'));
//
//m_qdtDateTime.fromString(qstrSyncDate, "yyyy-MM-dd-hh-mm-ss");
//qDebug() << qstrSyncDate;
//bool b = m_qdtDateTime.isValid();
//QString begin = m_qdtDateTime.toString("yyyy.MM.dd hh:mm:ss");
//qDebug() << begin;
/*qstrSyncDate = "20" + QString::number(m_hLWGPS.year) + "-"
+ QString::number(m_hLWGPS.month) + "-"
+ QString::number(m_hLWGPS.date) + "-"
+ QString::number(m_hLWGPS.hours) + "-"
+ QString::number(m_hLWGPS.minutes) + "-"
+ QString::number(m_hLWGPS.seconds);
qdtSync.fromString(qstrSyncDate, "yyyy-MM-dd-hh-mm-ss");
qDebug() << qstrSyncDate;
bool b = qdtSync.isValid();
QString begin = qdtSync.toString("yyyy.MM.dd hh:mm:ss");
std::string strtime = begin.toStdString();
qDebug() << begin;*/
}
int BD357Controller::Slot_InitSelf()
{
m_qbReadData.clear();
//QString qstrPortName = struGPSI.qstrInterfaceName;
if (m_pSerialPort != NULL)
{
m_pSerialPort->close();
delete m_pSerialPort;
}
m_pSerialPort = new QSerialPort;
m_pSerialPort->setPortName(m_struGPSInfo.qstrInterfaceName);
//m_pSerialPort->setReadBufferSize(512); in this project 0 seems a better param.
bool bRes = m_pSerialPort->setBaudRate(m_struGPSInfo.iBaud);
if (!bRes)
{
//qDebug() << "Err:setBaudRate Failed.Exit Code:1";
printf("Err:setBaudRate Failed.Exit Code:1");
//std::cout << "Err.setBaudRate Failed" << std::endl;
return 1;
}
bRes = m_pSerialPort->open(QIODevice::ReadWrite);
if (!bRes)
{
//qDebug() << "Err:open Failed.Exit Code:2";
printf("Err:open Failed.Exit Code:2");
//std::cout << "Err.open Failed" << std::endl;
return 2;
}
/////
lwgps_init(&m_hLWGPS);
lwrb_init(&m_hlwrbBuffer, m_u8GPSDataBuffer, sizeof(m_u8GPSDataBuffer));
return 0;
}
int BD357Controller::Slot_SyncDateOnce()
{
//emit Signal_StartCapture();
SyncDateOnce();
return 0;
}
//
// int BD357Controller::HandleReadyRead()
// {
// size_t uiSize = 0;
// m_qbReadData.append(m_pSerialPort->readAll());
// if (m_qbReadData.size()<2048)
// {
// lwrb_write(&m_hlwrbBuffer, &m_qbReadData, m_qbReadData.size());
// m_qbReadData.clear();
// }
// else
// {
// m_qbReadData.clear();
// }
//
// return 0;
// }