correct code.
This commit is contained in:
parent
5e24a831ae
commit
c7c24e9388
@ -43,8 +43,6 @@ Application::Application(int &argc, char **argv) : m_app(std::make_shared<QAppli
|
|||||||
});
|
});
|
||||||
|
|
||||||
m_videoFrameProvider = new VideoFrameProvider();
|
m_videoFrameProvider = new VideoFrameProvider();
|
||||||
|
|
||||||
qmlRegisterSingletonInstance("Analyser", 1, 0, "App", this);
|
|
||||||
if (!std::filesystem::exists(JpgPath)) {
|
if (!std::filesystem::exists(JpgPath)) {
|
||||||
std::filesystem::create_directory(JpgPath);
|
std::filesystem::create_directory(JpgPath);
|
||||||
}
|
}
|
||||||
@ -91,6 +89,18 @@ int Application::exec() {
|
|||||||
return m_app->exec();
|
return m_app->exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Application *Application::create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) {
|
||||||
|
Application *ret = nullptr;
|
||||||
|
auto app = Amass::Singleton<Application>::instance();
|
||||||
|
if (app) {
|
||||||
|
ret = app.get();
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
QJSEngine::setObjectOwnership(ret, QJSEngine::CppOwnership);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
QStringList Application::availableSerialPorts() const {
|
QStringList Application::availableSerialPorts() const {
|
||||||
QStringList ret;
|
QStringList ret;
|
||||||
auto ports = QSerialPortInfo::availablePorts();
|
auto ports = QSerialPortInfo::availablePorts();
|
||||||
@ -368,7 +378,7 @@ void Application::onNewImageSliceData(const std::vector<uint8_t> &data) {
|
|||||||
oss.str("");
|
oss.str("");
|
||||||
oss << JpgPath << "/" << username << "_" << m_palmId << "_" << way << "_"
|
oss << JpgPath << "/" << username << "_" << m_palmId << "_" << way << "_"
|
||||||
<< DateTime::toString(std::chrono::system_clock::now(), "%Y%m%d%H%M%S") << ".jpg";
|
<< DateTime::toString(std::chrono::system_clock::now(), "%Y%m%d%H%M%S") << ".jpg";
|
||||||
image.save(QString::fromStdString(oss.str()), "jpg", 100);
|
image.save(QString::fromStdString(oss.str()), "jpg", 80);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,8 @@ class CdcUpdater;
|
|||||||
|
|
||||||
class Application : public QObject {
|
class Application : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
QML_ELEMENT
|
QML_NAMED_ELEMENT(App)
|
||||||
|
QML_SINGLETON
|
||||||
Q_PROPERTY(ModuleCommunication *module READ module NOTIFY connectedChanged)
|
Q_PROPERTY(ModuleCommunication *module READ module NOTIFY connectedChanged)
|
||||||
Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
|
Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
|
||||||
Q_PROPERTY(bool uvcOpened READ uvcOpened NOTIFY uvcOpenedChanged)
|
Q_PROPERTY(bool uvcOpened READ uvcOpened NOTIFY uvcOpenedChanged)
|
||||||
@ -41,6 +42,7 @@ public:
|
|||||||
|
|
||||||
void initializeLogger();
|
void initializeLogger();
|
||||||
int exec();
|
int exec();
|
||||||
|
static Application *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine);
|
||||||
Q_INVOKABLE QStringList availableSerialPorts() const;
|
Q_INVOKABLE QStringList availableSerialPorts() const;
|
||||||
Q_INVOKABLE QStringList availableUsbVideoCameras() const;
|
Q_INVOKABLE QStringList availableUsbVideoCameras() const;
|
||||||
Q_INVOKABLE bool open(const QString &portName, int baudRate);
|
Q_INVOKABLE bool open(const QString &portName, int baudRate);
|
||||||
|
@ -10,31 +10,50 @@ std::optional<ImageDecoder::Image> ImageDecoder::extractJpegYComponent(const std
|
|||||||
jpeg_create_decompress(&cinfo);
|
jpeg_create_decompress(&cinfo);
|
||||||
|
|
||||||
FILE *infile = fopen(filename.c_str(), "rb");
|
FILE *infile = fopen(filename.c_str(), "rb");
|
||||||
if (infile == NULL) {
|
if (infile == nullptr) {
|
||||||
LOG(error) << "cannot open " << filename;
|
LOG(error) << "cannot open " << filename;
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
ImageDecoder::Image ret;
|
ImageDecoder::Image ret;
|
||||||
jpeg_stdio_src(&cinfo, infile);
|
jpeg_stdio_src(&cinfo, infile);
|
||||||
jpeg_read_header(&cinfo, TRUE);
|
jpeg_read_header(&cinfo, TRUE); // 1
|
||||||
cinfo.out_color_space = JCS_YCbCr; // We want YCbCr color space
|
LOG(info) << "jpeg color space: " << cinfo.jpeg_color_space;
|
||||||
jpeg_start_decompress(&cinfo);
|
if (cinfo.jpeg_color_space == JCS_YCbCr) {
|
||||||
|
cinfo.out_color_space = JCS_YCbCr; // We want YCbCr color space
|
||||||
|
jpeg_start_decompress(&cinfo);
|
||||||
|
|
||||||
int row_stride = cinfo.output_width * cinfo.output_components;
|
int row_stride = cinfo.output_width * cinfo.output_components;
|
||||||
JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
|
JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
|
||||||
|
|
||||||
ret.width = cinfo.output_width;
|
ret.width = cinfo.output_width;
|
||||||
ret.height = cinfo.output_height;
|
ret.height = cinfo.output_height;
|
||||||
ret.data.resize(ret.width * ret.height);
|
ret.data.resize(ret.width * ret.height);
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
while (cinfo.output_scanline < cinfo.output_height) {
|
||||||
jpeg_read_scanlines(&cinfo, buffer, 1);
|
jpeg_read_scanlines(&cinfo, buffer, 1);
|
||||||
for (unsigned int i = 0; i < cinfo.output_width; ++i) {
|
for (unsigned int i = 0; i < cinfo.output_width; ++i) {
|
||||||
ret.data[(cinfo.output_scanline - 1) * cinfo.output_width + i] =
|
ret.data[(cinfo.output_scanline - 1) * cinfo.output_width + i] =
|
||||||
buffer[0][i * 3]; // Y component is the first byte in YCbCr
|
buffer[0][i * 3]; // Y component is the first byte in YCbCr
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
jpeg_finish_decompress(&cinfo);
|
||||||
|
} else if (cinfo.jpeg_color_space == JCS_GRAYSCALE) {
|
||||||
|
cinfo.out_color_space = JCS_GRAYSCALE; // We want grayscale color space
|
||||||
|
jpeg_start_decompress(&cinfo);
|
||||||
|
int row_stride = cinfo.output_width * cinfo.output_components;
|
||||||
|
JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
|
||||||
|
|
||||||
|
ret.width = cinfo.output_width;
|
||||||
|
ret.height = cinfo.output_height;
|
||||||
|
ret.data.resize(ret.width * ret.height);
|
||||||
|
while (cinfo.output_scanline < cinfo.output_height) {
|
||||||
|
(void)jpeg_read_scanlines(&cinfo, buffer, 1);
|
||||||
|
memcpy(ret.data.data() + (cinfo.output_scanline - 1) * row_stride, buffer[0], row_stride);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG(warning) << "jpeg color space(" << cinfo.jpeg_color_space << ") not supported.";
|
||||||
}
|
}
|
||||||
|
|
||||||
jpeg_finish_decompress(&cinfo);
|
|
||||||
jpeg_destroy_decompress(&cinfo);
|
jpeg_destroy_decompress(&cinfo);
|
||||||
fclose(infile);
|
fclose(infile);
|
||||||
return std::make_optional(ret);
|
return std::make_optional(ret);
|
||||||
|
@ -80,13 +80,13 @@ void ModuleCommunication::enroll(const std::string &username, bool persistence,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ModuleCommunication::enrollExtended(const std::string &username, bool persistence, uint8_t timeout) {
|
void ModuleCommunication::enrollExtended(const std::string &username, bool persistence, uint8_t timeout) {
|
||||||
EnrollData data = {0};
|
EnrollData data = {};
|
||||||
data.timeout = timeout;
|
data.timeout = timeout;
|
||||||
data.skipSave = persistence ? 0 : 1;
|
data.skipSave = persistence ? 0 : 1;
|
||||||
strncpy(reinterpret_cast<char *>(data.username), username.c_str(), sizeof(data.username));
|
strncpy(reinterpret_cast<char *>(data.username), username.c_str(), sizeof(data.username));
|
||||||
auto [frameData, frameSize] = generateFrame(EnrollExtended, reinterpret_cast<const uint8_t *>(&data), sizeof(data));
|
auto [frameData, frameSize] = generateFrame(EnrollExtended, reinterpret_cast<const uint8_t *>(&data), sizeof(data));
|
||||||
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
|
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
|
||||||
|
setCurrentMessageIdStatus(EnrollExtended);
|
||||||
LOG_CAT(info, GUI) << "发送获取注册照片指令: " << protocolDataFormatString(frameData, frameSize);
|
LOG_CAT(info, GUI) << "发送获取注册照片指令: " << protocolDataFormatString(frameData, frameSize);
|
||||||
LOG_CAT(info, GUI) << "用户名: " << username << ", 超时时间: " << static_cast<int>(timeout) << "s";
|
LOG_CAT(info, GUI) << "用户名: " << username << ", 超时时间: " << static_cast<int>(timeout) << "s";
|
||||||
LOG_CAT(info, GUI) << Separator;
|
LOG_CAT(info, GUI) << Separator;
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
class ModuleCommunication : public QObject {
|
class ModuleCommunication : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
QML_ELEMENT
|
QML_ELEMENT
|
||||||
|
QML_UNCREATABLE("Only created in C++...")
|
||||||
static constexpr uint32_t UsernameSize = 32;
|
static constexpr uint32_t UsernameSize = 32;
|
||||||
static constexpr uint32_t VersionSize = 32;
|
static constexpr uint32_t VersionSize = 32;
|
||||||
static constexpr const char *Separator = "----------";
|
static constexpr const char *Separator = "----------";
|
||||||
|
@ -64,7 +64,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
property bool enrolling: App.module ? (App.module.currentMessageId === 0x1d) || (App.module.currentMessageId === 0x1e) : false
|
property bool enrolling: App.module ? (App.module.currentMessageId === ModuleCommunication.EnrollSingle) || (App.module.currentMessageId === ModuleCommunication.EnrollExtended) : false
|
||||||
text: enrolling ? "取消" : "注册"
|
text: enrolling ? "取消" : "注册"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (enrolling) {
|
if (enrolling) {
|
||||||
|
@ -115,7 +115,6 @@ Window {
|
|||||||
} else if (level === 2) {
|
} else if (level === 2) {
|
||||||
resultBrowser.append(tip)
|
resultBrowser.append(tip)
|
||||||
}
|
}
|
||||||
console.log(level, Application.Info)
|
|
||||||
}
|
}
|
||||||
function onNewVideoFrame() {
|
function onNewVideoFrame() {
|
||||||
image.source = ""
|
image.source = ""
|
||||||
|
Loading…
Reference in New Issue
Block a user