add aci function
This commit is contained in:
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* Application Communication Interface - Full Version
|
||||||
|
* Copyright (c) 2022-2032 UnknownObject
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#pragma warning(disable : 26812)
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <thread>
|
||||||
|
#include <sstream>
|
||||||
|
#include <json/json.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <webcc/logger.h>
|
||||||
|
#include <webcc/server.h>
|
||||||
|
#include <webcc/response_builder.h>
|
||||||
|
|
||||||
|
constexpr auto ACI_UA = "libcurl/7.68.0 (Windows NT 10.0; Win64; x64) UnknownNetworkService/2.01 (Application Communication Interface; Localhost-Only)";
|
||||||
|
|
||||||
|
//Common types
|
||||||
|
using JsonValue = Json::Value;
|
||||||
|
using JsonReader = Json::Reader;
|
||||||
|
//Client-only types
|
||||||
|
using ClientCallback = void(*)(JsonValue);
|
||||||
|
using ClientDataGroup = std::vector<std::string>;
|
||||||
|
using ClientDataPair = std::pair<std::string, std::string>;
|
||||||
|
template<typename T> using ClassClientCallback = void(T::*)(JsonValue);
|
||||||
|
//Server-only types
|
||||||
|
using ServerInputCallback = void(*)(JsonValue);
|
||||||
|
using ServerDataQueue = std::vector<std::string>;
|
||||||
|
using ResponseFunction = std::string(*)(std::string);
|
||||||
|
using StaticDataResponder = std::map<std::string, std::string>;
|
||||||
|
using DynamicDataResponder = std::map<std::string, ResponseFunction>;
|
||||||
|
|
||||||
|
//Common classes
|
||||||
|
class JsonUnicodeWriter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Json::StreamWriterBuilder jswb;
|
||||||
|
public:
|
||||||
|
JsonUnicodeWriter();
|
||||||
|
public:
|
||||||
|
std::string write(JsonValue root);
|
||||||
|
};
|
||||||
|
|
||||||
|
//------------------------------------------Client Classes------------------------------------------
|
||||||
|
class ClientDataEncoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static std::string Encode(std::string item, std::string data);
|
||||||
|
static std::string Encode(std::string item);
|
||||||
|
static JsonValue Decode(std::string str);
|
||||||
|
static ClientDataPair Decode(JsonValue root);
|
||||||
|
static ClientDataGroup DecodeGroup(JsonValue root);
|
||||||
|
};
|
||||||
|
|
||||||
|
class ACIClient
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
CURL* curl;
|
||||||
|
int ServerPort;
|
||||||
|
private:
|
||||||
|
static size_t process_data(void* buffer, size_t size, size_t nmemb, void* user_p);
|
||||||
|
public:
|
||||||
|
ACIClient(int server_port = 10000);
|
||||||
|
~ACIClient();
|
||||||
|
public:
|
||||||
|
bool SendData(std::string item, std::string data, ClientCallback cb_func = nullptr);
|
||||||
|
template<typename T> bool SendData(std::string item, std::string data, ClassClientCallback<T> cb_func, T* class_pointer);
|
||||||
|
bool RequestData(std::string item, std::string data, ClientCallback cb_func = nullptr);
|
||||||
|
template<typename T> bool RequestData(std::string item, std::string data, ClassClientCallback<T> cb_func, T* class_pointer);
|
||||||
|
bool RequestData(std::string item, ClientCallback cb_func = nullptr);
|
||||||
|
template<typename T> bool RequestData(std::string item, ClassClientCallback<T> cb_func, T* class_pointer);
|
||||||
|
bool RequestQuquedData(ClientCallback cb_func = nullptr);
|
||||||
|
template<typename T> bool RequestQuquedData(ClassClientCallback<T> cb_func, T* class_pointer);
|
||||||
|
};
|
||||||
|
//----------------------------------------Client Classes End----------------------------------------
|
||||||
|
|
||||||
|
//------------------------------------------Server Classes------------------------------------------
|
||||||
|
class ServerDataEncoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static std::string Encode(std::string item, std::string data);
|
||||||
|
static JsonValue Decode(std::string str);
|
||||||
|
static std::string EncodeResponse(std::string error, ServerDataQueue data = ServerDataQueue());
|
||||||
|
};
|
||||||
|
|
||||||
|
class ServerDataStorage
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static ServerDataQueue DataQueue;
|
||||||
|
static StaticDataResponder SDR_Input;
|
||||||
|
static StaticDataResponder SDR_Output;
|
||||||
|
static DynamicDataResponder DDR_Output;
|
||||||
|
public:
|
||||||
|
static void GlobalClear();
|
||||||
|
static void DataQueueClear();
|
||||||
|
static void SDR_InputClear();
|
||||||
|
static void SDR_OutputClear();
|
||||||
|
static void DDR_OutputClear();
|
||||||
|
static void DataQueueAdd(std::string data);
|
||||||
|
static void SDRInputAdd(std::string item, std::string resp);
|
||||||
|
static void SDROutputAdd(std::string item, std::string resp);
|
||||||
|
static void DDROutputAdd(std::string item, ResponseFunction resfunc);
|
||||||
|
static ServerDataQueue GetDataQueue();
|
||||||
|
static StaticDataResponder GetSDR_Input();
|
||||||
|
static StaticDataResponder GetSDR_Output();
|
||||||
|
static DynamicDataResponder GetDDR_Output();
|
||||||
|
static bool SDRInputExist(std::string item);
|
||||||
|
static bool SDROutputExist(std::string item);
|
||||||
|
static bool DDROutputExist(std::string item);
|
||||||
|
static std::string SDRInputGetValue(std::string item);
|
||||||
|
static std::string SDROutputGetValue(std::string item);
|
||||||
|
static ResponseFunction DDROutputGetValue(std::string item);
|
||||||
|
};
|
||||||
|
|
||||||
|
class ServerInputHandler : public webcc::View
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
ServerInputCallback InputCallback;
|
||||||
|
public:
|
||||||
|
ServerInputHandler(ServerInputCallback cb_input = nullptr);
|
||||||
|
public:
|
||||||
|
webcc::ResponsePtr Handle(webcc::RequestPtr request) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ServerOutputHandler : public webcc::View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
webcc::ResponsePtr Handle(webcc::RequestPtr request) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ServerSideOutputHandler : public webcc::View
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
webcc::ResponsePtr Handle(webcc::RequestPtr request) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ACIServer
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool CallbackEnabled;
|
||||||
|
webcc::Server* ccServer;
|
||||||
|
std::thread ServerThread;
|
||||||
|
ServerInputCallback InputCallback;
|
||||||
|
const webcc::Strings methods = { "GET","POST","PUT","HEAD","DELETE" };
|
||||||
|
private:
|
||||||
|
static void ServerThreadFunction(webcc::Server* server, int worker_thread, int loop_thread);
|
||||||
|
public:
|
||||||
|
ACIServer(int port = 10000, bool enable_callback = false, ServerInputCallback cb_func = nullptr);
|
||||||
|
~ACIServer();
|
||||||
|
public:
|
||||||
|
void Run(int worker_thread = 1, int loop_thread = 1);
|
||||||
|
void ThreadRun(int worker_thread = 1, int loop_thread = 1);
|
||||||
|
void Stop();
|
||||||
|
bool EnableCallback(ServerInputCallback cb_func = nullptr);
|
||||||
|
bool SetCallbackFunction(ServerInputCallback cb_func);
|
||||||
|
bool DisableCallback();
|
||||||
|
void OutputQueueAdd(std::string content);
|
||||||
|
void OutputQueueClear();
|
||||||
|
};
|
||||||
|
//----------------------------------------Server Classes End----------------------------------------
|
||||||
|
|
||||||
|
#ifndef _DEBUG
|
||||||
|
#pragma comment(lib, "ACIFullVersion.lib")
|
||||||
|
#else
|
||||||
|
#pragma comment(lib, "ACIFullVersiond.lib")
|
||||||
|
#endif
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,96 @@
|
|||||||
|
#include "ACIMode.h"
|
||||||
|
|
||||||
|
ACIMode::ACIMode(QWidget* parent) : QMainWindow(parent)
|
||||||
|
{
|
||||||
|
client = nullptr;
|
||||||
|
server = nullptr;
|
||||||
|
OperationMode = -3;
|
||||||
|
ui.setupUi(this);
|
||||||
|
ui.Workmode_Client->setChecked(true);
|
||||||
|
ui.Workmode_Server->setChecked(false);
|
||||||
|
ui.PortNumber->setPlainText("23456");
|
||||||
|
connect(ui.BtnStart, &QCommandLinkButton::clicked, this, &ACIMode::StartACISystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
ACIMode::~ACIMode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int ACIMode::ProcessRadio(bool client, bool server)
|
||||||
|
{
|
||||||
|
if (client && server)
|
||||||
|
return -1;
|
||||||
|
else if ((!client) && (!server))
|
||||||
|
return -2;
|
||||||
|
else if (client)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACIMode::CleanUp()
|
||||||
|
{
|
||||||
|
if (client != nullptr)
|
||||||
|
{
|
||||||
|
delete client;
|
||||||
|
client = nullptr;
|
||||||
|
}
|
||||||
|
if (server != nullptr)
|
||||||
|
{
|
||||||
|
server->Stop();
|
||||||
|
delete server;
|
||||||
|
server = nullptr;
|
||||||
|
}
|
||||||
|
OperationMode = -3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACIMode::StartACISystem()
|
||||||
|
{
|
||||||
|
CleanUp();
|
||||||
|
OperationMode = ProcessRadio(ui.Workmode_Client->isChecked(), ui.Workmode_Server->isChecked());
|
||||||
|
switch (OperationMode)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
client = new ACIClient(ui.PortNumber->toPlainText().toInt());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
server = new ACIServer(ui.PortNumber->toPlainText().toInt());
|
||||||
|
ServerDataStorage::DDROutputAdd("start-timer", RequestedTimerStart);
|
||||||
|
server->ThreadRun();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
MessageBox(NULL, L"通信参数错误", L"错误", MB_OK | MB_ICONERROR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (OperationMode == 0)
|
||||||
|
this->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ACIMode::GetOperationMode()
|
||||||
|
{
|
||||||
|
return OperationMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACIMode::RequestRemoteTimer()
|
||||||
|
{
|
||||||
|
if (client != nullptr)
|
||||||
|
client->RequestData("start-timer");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ACIMode::closeEvent(QCloseEvent* event)
|
||||||
|
{
|
||||||
|
this->hide();
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string RequestedTimerStart(std::string json)
|
||||||
|
{
|
||||||
|
GlobalVari::ServerRequested = true;
|
||||||
|
return "successed";
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "ACIFullVersion.h"
|
||||||
|
#include <QtWidgets/QMainWindow>
|
||||||
|
#include "ui_ACIMode.h"
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QCloseEvent>
|
||||||
|
#include <Windows.h>
|
||||||
|
#include "GlobalVari.h"
|
||||||
|
|
||||||
|
class ACIMode : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ACIMode(QWidget* parent = nullptr);
|
||||||
|
~ACIMode();
|
||||||
|
|
||||||
|
public:
|
||||||
|
int ProcessRadio(bool client, bool server);
|
||||||
|
void CleanUp();
|
||||||
|
void StartACISystem();
|
||||||
|
int GetOperationMode();
|
||||||
|
void RequestRemoteTimer();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int OperationMode;
|
||||||
|
ACIClient* client;
|
||||||
|
ACIServer* server;
|
||||||
|
Ui::ACIModeWindow ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::string RequestedTimerStart(std::string json);
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ACIModeWindow</class>
|
||||||
|
<widget class="QMainWindow" name="ACIModeWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>262</width>
|
||||||
|
<height>241</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>通信模式设置</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralwidget">
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>10</y>
|
||||||
|
<width>241</width>
|
||||||
|
<height>171</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>通信设置</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QPlainTextEdit" name="PortNumber">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>70</x>
|
||||||
|
<y>30</y>
|
||||||
|
<width>161</width>
|
||||||
|
<height>31</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="centerOnScroll">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>20</x>
|
||||||
|
<y>30</y>
|
||||||
|
<width>41</width>
|
||||||
|
<height>31</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>端口号</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QGroupBox" name="groupBox_2">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>80</y>
|
||||||
|
<width>221</width>
|
||||||
|
<height>71</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>工作模式</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QRadioButton" name="Workmode_Client">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>20</x>
|
||||||
|
<y>19</y>
|
||||||
|
<width>61</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>客户端</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QRadioButton" name="Workmode_Server">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>140</x>
|
||||||
|
<y>19</y>
|
||||||
|
<width>61</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>服务端</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<widget class="QCommandLinkButton" name="BtnStart">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>60</x>
|
||||||
|
<y>190</y>
|
||||||
|
<width>141</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>启动通信系统</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
+125
-83
@@ -2,21 +2,24 @@
|
|||||||
|
|
||||||
ClockCounter::ClockCounter(QWidget *parent) : QMainWindow(parent)
|
ClockCounter::ClockCounter(QWidget *parent) : QMainWindow(parent)
|
||||||
{
|
{
|
||||||
ui.setupUi(this);
|
ui.setupUi(this);
|
||||||
PreClickCount = 0;
|
PreClickCount = 0;
|
||||||
PreClickPosition = QPoint(0, 0);
|
PreClickPosition = QPoint(0, 0);
|
||||||
ui.SpliterHourMinute->Init(UDateTimeSpliter::Type::Time);
|
ui.SpliterHourMinute->Init(UDateTimeSpliter::Type::Time);
|
||||||
ui.SpliterMinuteSecond->Init(UDateTimeSpliter::Type::Time);
|
ui.SpliterMinuteSecond->Init(UDateTimeSpliter::Type::Time);
|
||||||
ui.SpliterSecondMS->Init(UDateTimeSpliter::Type::Dots);
|
ui.SpliterSecondMS->Init(UDateTimeSpliter::Type::Dots);
|
||||||
connect(ui.BtnStartTimer, &QPushButton::clicked, this, &ClockCounter::StartTimer);
|
connect(ui.BtnStartTimer, &QPushButton::clicked, this, &ClockCounter::StartTimer);
|
||||||
connect(ui.BtnStopTimer, &QPushButton::clicked, this, &ClockCounter::StopTimer);
|
connect(ui.BtnStopTimer, &QPushButton::clicked, this, &ClockCounter::StopTimer);
|
||||||
connect(ui.BtnGetPreclickPos, &QPushButton::clicked, this, &ClockCounter::ShowPreClickWindow);
|
connect(ui.BtnGetPreclickPos, &QPushButton::clicked, this, &ClockCounter::ShowPreClickWindow);
|
||||||
connect(ui.BtnClearPreclickPos, &QPushButton::clicked, this, &ClockCounter::ClearPreClickInfo);
|
connect(ui.BtnGetPreclickPos, &UDBPushButton::rclicked, this, &ClockCounter::ShowACIModeWindow);
|
||||||
connect(&CountTimer, &QTimer::timeout, this, &ClockCounter::CountCallback);
|
connect(ui.BtnClearPreclickPos, &QPushButton::clicked, this, &ClockCounter::ClearPreClickInfo);
|
||||||
connect(&WindowUpdater, &QTimer::timeout, this, &ClockCounter::WindowUpdateCallback);
|
connect(&CountTimer, &QTimer::timeout, this, &ClockCounter::CountCallback);
|
||||||
CountTimer.setInterval(1);
|
connect(&WindowUpdater, &QTimer::timeout, this, &ClockCounter::WindowUpdateCallback);
|
||||||
WindowUpdater.setInterval(50);
|
connect(&ServerStatusChecker, &QTimer::timeout, this, &ClockCounter::ServerStatusCallback);
|
||||||
CountTime = 0;
|
CountTimer.setInterval(1);
|
||||||
|
WindowUpdater.setInterval(50);
|
||||||
|
ServerStatusChecker.setInterval(1);
|
||||||
|
CountTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ClockCounter::~ClockCounter()
|
ClockCounter::~ClockCounter()
|
||||||
@@ -25,96 +28,135 @@ ClockCounter::~ClockCounter()
|
|||||||
|
|
||||||
void ClockCounter::MouseClick(int cnt, QPoint point)
|
void ClockCounter::MouseClick(int cnt, QPoint point)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < cnt; i++)
|
for (int i = 0; i < cnt; i++)
|
||||||
{
|
{
|
||||||
this->setWindowTitle(QString::asprintf("软件执行计时器: 执行位于(%d, %d)的第%d次预点击", point.x(), point.y(), i));
|
this->setWindowTitle(QString::asprintf("软件执行计时器: 执行位于(%d, %d)的第%d次预点击", point.x(), point.y(), i));
|
||||||
SetCursorPos(point.x(), point.y());
|
SetCursorPos(point.x(), point.y());
|
||||||
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
|
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
|
||||||
Sleep(500);
|
Sleep(500);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::StartTimer()
|
void ClockCounter::StartTimer()
|
||||||
{
|
{
|
||||||
if (CountTime != 0)
|
if (CountTime != 0)
|
||||||
{
|
{
|
||||||
ui.BtnStartTimer->setText("开始计时");
|
ui.BtnStartTimer->setText("开始计时");
|
||||||
CountTime = -1;
|
CountTime = -1;
|
||||||
CountCallback();
|
CountCallback();
|
||||||
if(PreClickCount!=0)
|
if (PreClickCount != 0)
|
||||||
this->setWindowTitle("软件执行计时器: 预点击指令已激活");
|
this->setWindowTitle("软件执行计时器: 预点击指令已激活");
|
||||||
else
|
else
|
||||||
this->setWindowTitle("软件执行计时器");
|
this->setWindowTitle("软件执行计时器");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (PreClickCount > 0)
|
if (PreClickCount > 0)
|
||||||
MouseClick(PreClickCount, PreClickPosition);
|
{
|
||||||
CountTimer.start();
|
MouseClick(PreClickCount, PreClickPosition);
|
||||||
this->setWindowTitle("软件执行计时器: 正在计时");
|
if (aci_mode_window.GetOperationMode() == 0)
|
||||||
}
|
aci_mode_window.RequestRemoteTimer();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CountTimer.start();
|
||||||
|
this->setWindowTitle("软件执行计时器: 正在计时");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::StopTimer()
|
void ClockCounter::StopTimer()
|
||||||
{
|
{
|
||||||
CountTimer.stop();
|
CountTimer.stop();
|
||||||
ui.BtnStartTimer->setText("重置计时器");
|
ui.BtnStartTimer->setText("重置计时器");
|
||||||
this->setWindowTitle("软件执行计时器: 计时已停止");
|
this->setWindowTitle("软件执行计时器: 计时已停止");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClockCounter::ShowACIModeWindow()
|
||||||
|
{
|
||||||
|
if (!aci_mode_window.isActiveWindow())
|
||||||
|
{
|
||||||
|
aci_mode_window.show();
|
||||||
|
aci_mode_window.activateWindow();
|
||||||
|
aci_mode_window.setWindowState((aci_mode_window.windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
||||||
|
ServerStatusChecker.start();
|
||||||
|
/*this->hide();
|
||||||
|
WindowUpdater.start();*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::ShowPreClickWindow()
|
void ClockCounter::ShowPreClickWindow()
|
||||||
{
|
{
|
||||||
if (!pre_click_window.isActiveWindow())
|
if (!pre_click_window.isActiveWindow())
|
||||||
{
|
{
|
||||||
pre_click_window.show();
|
pre_click_window.show();
|
||||||
pre_click_window.activateWindow();
|
pre_click_window.activateWindow();
|
||||||
pre_click_window.setWindowState((pre_click_window.windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
pre_click_window.setWindowState((pre_click_window.windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
||||||
this->hide();
|
this->hide();
|
||||||
WindowUpdater.start();
|
WindowUpdater.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::ClearPreClickInfo()
|
void ClockCounter::ClearPreClickInfo()
|
||||||
{
|
{
|
||||||
PreClickCount = 0;
|
PreClickCount = 0;
|
||||||
PreClickPosition = QPoint(0, 0);
|
PreClickPosition = QPoint(0, 0);
|
||||||
this->setWindowTitle("软件执行计时器");
|
aci_mode_window.CleanUp();
|
||||||
MessageBox(NULL, L"预点击坐标已清空", L"提示", MB_OK | MB_ICONINFORMATION);
|
this->setWindowTitle("软件执行计时器");
|
||||||
|
MessageBox(NULL, L"预点击坐标已清空", L"提示", MB_OK | MB_ICONINFORMATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::CountCallback()
|
void ClockCounter::CountCallback()
|
||||||
{
|
{
|
||||||
CountTime++;
|
CountTime++;
|
||||||
int hour = (CountTime / 1000) / 3600;
|
int hour = (CountTime / 1000) / 3600;
|
||||||
int minute = ((CountTime / 1000) / 60) - (hour * 60);
|
int minute = ((CountTime / 1000) / 60) - (hour * 60);
|
||||||
int second = (CountTime / 1000) - (hour * 3600) - (minute * 60);
|
int second = (CountTime / 1000) - (hour * 3600) - (minute * 60);
|
||||||
int millsecond = CountTime - (hour * 3600 * 1000) - (minute * 60 * 1000) - (second * 1000);
|
int millsecond = CountTime - (hour * 3600 * 1000) - (minute * 60 * 1000) - (second * 1000);
|
||||||
ui.NumHour01->setNumber(hour / 10);
|
ui.NumHour01->setNumber(hour / 10);
|
||||||
ui.NumHour02->setNumber(hour % 10);
|
ui.NumHour02->setNumber(hour % 10);
|
||||||
ui.NumMinute01->setNumber(minute / 10);
|
ui.NumMinute01->setNumber(minute / 10);
|
||||||
ui.NumMinute02->setNumber(minute % 10);
|
ui.NumMinute02->setNumber(minute % 10);
|
||||||
ui.NumSecond01->setNumber(second / 10);
|
ui.NumSecond01->setNumber(second / 10);
|
||||||
ui.NumSecond02->setNumber(second % 10);
|
ui.NumSecond02->setNumber(second % 10);
|
||||||
ui.NumMillSec01->setNumber(millsecond / 100);
|
ui.NumMillSec01->setNumber(millsecond / 100);
|
||||||
ui.NumMillSec02->setNumber((millsecond / 10) % 10);
|
ui.NumMillSec02->setNumber((millsecond / 10) % 10);
|
||||||
ui.NumMillSec03->setNumber((millsecond % 100) % 10);
|
ui.NumMillSec03->setNumber((millsecond % 100) % 10);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClockCounter::WindowUpdateCallback()
|
void ClockCounter::WindowUpdateCallback()
|
||||||
{
|
{
|
||||||
if (!pre_click_window.isVisible())
|
if (!pre_click_window.isVisible())
|
||||||
{
|
{
|
||||||
WindowUpdater.stop();
|
WindowUpdater.stop();
|
||||||
this->show();
|
this->show();
|
||||||
this->activateWindow();
|
this->activateWindow();
|
||||||
this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
|
||||||
if (pre_click_window.GetWindowStatus())
|
if (pre_click_window.GetWindowStatus())
|
||||||
{
|
{
|
||||||
PreClickCount = pre_click_window.GetClickCount();
|
PreClickCount = pre_click_window.GetClickCount();
|
||||||
PreClickPosition = pre_click_window.GetCursorPosition();
|
PreClickPosition = pre_click_window.GetCursorPosition();
|
||||||
this->setWindowTitle("软件执行计时器: 预点击指令已激活");
|
this->setWindowTitle("软件执行计时器: 预点击指令已激活");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClockCounter::ServerStatusCallback()
|
||||||
|
{
|
||||||
|
if (aci_mode_window.GetOperationMode() == 0)
|
||||||
|
{
|
||||||
|
ServerStatusChecker.stop();
|
||||||
|
this->hide();
|
||||||
|
}
|
||||||
|
else if (aci_mode_window.GetOperationMode() == 1)
|
||||||
|
{
|
||||||
|
if (GlobalVari::ServerRequested)
|
||||||
|
{
|
||||||
|
CountTimer.start();
|
||||||
|
ServerStatusChecker.stop();
|
||||||
|
this->setWindowTitle("软件执行计时器: 正在计时");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "ACIMode.h"
|
||||||
#include <QtWidgets/QMainWindow>
|
#include <QtWidgets/QMainWindow>
|
||||||
#include "ui_ClockCounter.h"
|
#include "ui_ClockCounter.h"
|
||||||
#include "PreClick.h"
|
#include "PreClick.h"
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QTime>
|
#include <QTime>
|
||||||
|
#include "GlobalVari.h"
|
||||||
|
|
||||||
class ClockCounter : public QMainWindow
|
class ClockCounter : public QMainWindow
|
||||||
{
|
{
|
||||||
@@ -20,10 +22,12 @@ public:
|
|||||||
public slots:
|
public slots:
|
||||||
void StartTimer();
|
void StartTimer();
|
||||||
void StopTimer();
|
void StopTimer();
|
||||||
|
void ShowACIModeWindow();
|
||||||
void ShowPreClickWindow();
|
void ShowPreClickWindow();
|
||||||
void ClearPreClickInfo();
|
void ClearPreClickInfo();
|
||||||
void CountCallback();
|
void CountCallback();
|
||||||
void WindowUpdateCallback();
|
void WindowUpdateCallback();
|
||||||
|
void ServerStatusCallback();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
time_t CountTime;
|
time_t CountTime;
|
||||||
@@ -31,6 +35,8 @@ private:
|
|||||||
QTimer CountTimer;
|
QTimer CountTimer;
|
||||||
QTimer WindowUpdater;
|
QTimer WindowUpdater;
|
||||||
QPoint PreClickPosition;
|
QPoint PreClickPosition;
|
||||||
|
ACIMode aci_mode_window;
|
||||||
Ui::ClockCounterClass ui;
|
Ui::ClockCounterClass ui;
|
||||||
PreClick pre_click_window;
|
PreClick pre_click_window;
|
||||||
|
QTimer ServerStatusChecker;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -166,7 +166,7 @@
|
|||||||
<string>停止计时</string>
|
<string>停止计时</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QPushButton" name="BtnGetPreclickPos">
|
<widget class="UDBPushButton" name="BtnGetPreclickPos">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>540</x>
|
<x>540</x>
|
||||||
@@ -207,6 +207,11 @@
|
|||||||
<header>udatetimespliter.h</header>
|
<header>udatetimespliter.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>UDBPushButton</class>
|
||||||
|
<extends>QPushButton</extends>
|
||||||
|
<header>udbpushbutton.h</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="ClockCounter.qrc"/>
|
<include location="ClockCounter.qrc"/>
|
||||||
|
|||||||
@@ -92,9 +92,13 @@
|
|||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="ACIMode.cpp" />
|
||||||
|
<ClCompile Include="GlobalVari.cpp" />
|
||||||
<ClCompile Include="PreClick.cpp" />
|
<ClCompile Include="PreClick.cpp" />
|
||||||
<ClCompile Include="UDateTimeSpliter.cpp" />
|
<ClCompile Include="UDateTimeSpliter.cpp" />
|
||||||
|
<ClCompile Include="UDBPushButton.cpp" />
|
||||||
<QtRcc Include="ClockCounter.qrc" />
|
<QtRcc Include="ClockCounter.qrc" />
|
||||||
|
<QtUic Include="ACIMode.ui" />
|
||||||
<QtUic Include="ClockCounter.ui" />
|
<QtUic Include="ClockCounter.ui" />
|
||||||
<QtMoc Include="ClockCounter.h" />
|
<QtMoc Include="ClockCounter.h" />
|
||||||
<ClCompile Include="ClockCounter.cpp" />
|
<ClCompile Include="ClockCounter.cpp" />
|
||||||
@@ -107,6 +111,12 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtMoc Include="UDateTimeSpliter.h" />
|
<QtMoc Include="UDateTimeSpliter.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="ACIFullVersion.h" />
|
||||||
|
<ClInclude Include="GlobalVari.h" />
|
||||||
|
<QtMoc Include="UDBPushButton.h" />
|
||||||
|
<QtMoc Include="ACIMode.h" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
|
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">
|
||||||
<Import Project="$(QtMsBuild)\qt.targets" />
|
<Import Project="$(QtMsBuild)\qt.targets" />
|
||||||
|
|||||||
@@ -46,11 +46,23 @@
|
|||||||
<ClCompile Include="UDateTimeSpliter.cpp">
|
<ClCompile Include="UDateTimeSpliter.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="ACIMode.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="UDBPushButton.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="GlobalVari.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtUic Include="PreClick.ui">
|
<QtUic Include="PreClick.ui">
|
||||||
<Filter>Form Files</Filter>
|
<Filter>Form Files</Filter>
|
||||||
</QtUic>
|
</QtUic>
|
||||||
|
<QtUic Include="ACIMode.ui">
|
||||||
|
<Filter>Form Files</Filter>
|
||||||
|
</QtUic>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<QtMoc Include="PreClick.h">
|
<QtMoc Include="PreClick.h">
|
||||||
@@ -59,5 +71,19 @@
|
|||||||
<QtMoc Include="UDateTimeSpliter.h">
|
<QtMoc Include="UDateTimeSpliter.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</QtMoc>
|
</QtMoc>
|
||||||
|
<QtMoc Include="ACIMode.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
|
<QtMoc Include="UDBPushButton.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</QtMoc>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="GlobalVari.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ACIFullVersion.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#include "GlobalVari.h"
|
||||||
|
|
||||||
|
bool GlobalVari::ServerRequested = false;
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace GlobalVari
|
||||||
|
{
|
||||||
|
extern bool ServerRequested;
|
||||||
|
};
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#include "UDBPushButton.h"
|
||||||
|
|
||||||
|
UDBPushButton::UDBPushButton(QWidget* parent) : QPushButton(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
UDBPushButton::~UDBPushButton()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void UDBPushButton::mouseDoubleClickEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (event->button() == Qt::LeftButton)
|
||||||
|
emit db_clicked();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UDBPushButton::mousePressEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
if (event->button() == Qt::LeftButton)
|
||||||
|
emit clicked();
|
||||||
|
else if (event->button() == Qt::RightButton)
|
||||||
|
emit rclicked();
|
||||||
|
else if (event->button() == Qt::MiddleButton)
|
||||||
|
emit center_clicked();
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
|
||||||
|
class UDBPushButton : public QPushButton
|
||||||
|
{
|
||||||
|
Q_OBJECT;
|
||||||
|
|
||||||
|
public:
|
||||||
|
UDBPushButton(QWidget* parent);
|
||||||
|
~UDBPushButton();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent* event) override;
|
||||||
|
void mousePressEvent(QMouseEvent* event) override;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void db_clicked();
|
||||||
|
void rclicked();
|
||||||
|
void center_clicked();
|
||||||
|
};
|
||||||
|
|
||||||
Reference in New Issue
Block a user