|
@@ -10,7 +10,7 @@
|
|
|
#include <thread>
|
|
|
#include <mutex>
|
|
|
|
|
|
-namespace UsbTest
|
|
|
+namespace UsbTest namespace UsbTest
|
|
|
{
|
|
|
|
|
|
void saveImageFromData(unsigned char *data, int width, int height, const std::string &filename = "./output.png");
|
|
@@ -53,31 +53,31 @@ namespace UsbTest
|
|
|
std::chrono::high_resolution_clock::time_point end_time;
|
|
|
};
|
|
|
|
|
|
- class GlobalResolutionTimer: public HighResolutionTimer
|
|
|
+ class GlobalResolutionTimer : public HighResolutionTimer
|
|
|
{
|
|
|
- public:
|
|
|
- static GlobalResolutionTimer& getInstance()
|
|
|
- {
|
|
|
- static GlobalResolutionTimer instance;
|
|
|
- return instance;
|
|
|
- }
|
|
|
-
|
|
|
- void start()
|
|
|
- {
|
|
|
- start_time = std::chrono::high_resolution_clock::now();
|
|
|
- }
|
|
|
-
|
|
|
- std::string pressStopWatchString()
|
|
|
- {
|
|
|
- end_time = std::chrono::high_resolution_clock::now();
|
|
|
- return "Elapsed Time: " + std::to_string(elapsed_milliseconds()) + " ms";
|
|
|
- }
|
|
|
+ public:
|
|
|
+ static GlobalResolutionTimer &getInstance()
|
|
|
+ {
|
|
|
+ static GlobalResolutionTimer instance;
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ void start()
|
|
|
+ {
|
|
|
+ start_time = std::chrono::high_resolution_clock::now();
|
|
|
+ }
|
|
|
+
|
|
|
+ std::string pressStopWatchString()
|
|
|
+ {
|
|
|
+ end_time = std::chrono::high_resolution_clock::now();
|
|
|
+ return "Elapsed Time: " + std::to_string(elapsed_milliseconds()) + " ms";
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
class SimulateTrigger
|
|
|
{
|
|
|
public:
|
|
|
- static SimulateTrigger& getInstance()
|
|
|
+ static SimulateTrigger &getInstance()
|
|
|
{
|
|
|
static SimulateTrigger instance;
|
|
|
return instance;
|
|
@@ -89,9 +89,9 @@ namespace UsbTest
|
|
|
{
|
|
|
triggering = true;
|
|
|
triggerStatus.resize(3);
|
|
|
- triggerStatus[0]=false;
|
|
|
- triggerStatus[1]=false;
|
|
|
- triggerStatus[2]=false;
|
|
|
+ triggerStatus[0] = false;
|
|
|
+ triggerStatus[1] = false;
|
|
|
+ triggerStatus[2] = false;
|
|
|
triggerThread = std::thread(&SimulateTrigger::triggerLoop, this);
|
|
|
}
|
|
|
}
|
|
@@ -124,8 +124,8 @@ namespace UsbTest
|
|
|
}
|
|
|
|
|
|
// Delete copy constructor and assignment operator to prevent copying
|
|
|
- SimulateTrigger(const SimulateTrigger&) = delete;
|
|
|
- SimulateTrigger& operator=(const SimulateTrigger&) = delete;
|
|
|
+ SimulateTrigger(const SimulateTrigger &) = delete;
|
|
|
+ SimulateTrigger &operator=(const SimulateTrigger &) = delete;
|
|
|
|
|
|
void triggerLoop()
|
|
|
{
|
|
@@ -136,9 +136,9 @@ namespace UsbTest
|
|
|
{
|
|
|
// Simulate the trigger signal
|
|
|
std::lock_guard<std::mutex> lock(triggerMutex);
|
|
|
- triggerStatus[0]=true;
|
|
|
- triggerStatus[1]=true;
|
|
|
- triggerStatus[2]=true;
|
|
|
+ triggerStatus[0] = true;
|
|
|
+ triggerStatus[1] = true;
|
|
|
+ triggerStatus[2] = true;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -147,13 +147,108 @@ namespace UsbTest
|
|
|
std::thread triggerThread;
|
|
|
std::mutex triggerMutex;
|
|
|
std::vector<bool> triggerStatus;
|
|
|
+ };
|
|
|
+
|
|
|
+ class GlobalResolutionTimer : public HighResolutionTimer
|
|
|
+ {
|
|
|
+ public:
|
|
|
+ static GlobalResolutionTimer &getInstance()
|
|
|
+ {
|
|
|
+ static GlobalResolutionTimer instance;
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ void start()
|
|
|
+ {
|
|
|
+ start_time = std::chrono::high_resolution_clock::now();
|
|
|
+ }
|
|
|
|
|
|
+ std::string pressStopWatchString()
|
|
|
+ {
|
|
|
+ end_time = std::chrono::high_resolution_clock::now();
|
|
|
+ return "Elapsed Time: " + std::to_string(elapsed_milliseconds()) + " ms";
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ class SimulateTrigger
|
|
|
+ {
|
|
|
+ public:
|
|
|
+ static SimulateTrigger &getInstance()
|
|
|
+ {
|
|
|
+ static SimulateTrigger instance;
|
|
|
+ return instance;
|
|
|
+ }
|
|
|
+
|
|
|
+ void startTrigger()
|
|
|
+ {
|
|
|
+ if (!triggering)
|
|
|
+ {
|
|
|
+ triggering = true;
|
|
|
+ triggerStatus.resize(3);
|
|
|
+ triggerStatus[0] = false;
|
|
|
+ triggerStatus[1] = false;
|
|
|
+ triggerStatus[2] = false;
|
|
|
+ triggerThread = std::thread(&SimulateTrigger::triggerLoop, this);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void stopTrigger()
|
|
|
+ {
|
|
|
+ if (triggering)
|
|
|
+ {
|
|
|
+ triggering = false;
|
|
|
+ if (triggerThread.joinable())
|
|
|
+ {
|
|
|
+ triggerThread.join();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ bool isTriggering(int index)
|
|
|
+ {
|
|
|
+ bool status = triggerStatus[index];
|
|
|
+ std::lock_guard<std::mutex> lock(triggerMutex);
|
|
|
+ triggerStatus[index] = false;
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ private:
|
|
|
+ SimulateTrigger() : triggering(false) {}
|
|
|
+ ~SimulateTrigger()
|
|
|
+ {
|
|
|
+ stopTrigger();
|
|
|
+ }
|
|
|
+
|
|
|
+ // Delete copy constructor and assignment operator to prevent copying
|
|
|
+ SimulateTrigger(const SimulateTrigger &) = delete;
|
|
|
+ SimulateTrigger &operator=(const SimulateTrigger &) = delete;
|
|
|
+
|
|
|
+ void triggerLoop()
|
|
|
+ {
|
|
|
+ while (triggering)
|
|
|
+ {
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(188));
|
|
|
+ if (triggering)
|
|
|
+ {
|
|
|
+ // Simulate the trigger signal
|
|
|
+ std::lock_guard<std::mutex> lock(triggerMutex);
|
|
|
+ triggerStatus[0] = true;
|
|
|
+ triggerStatus[1] = true;
|
|
|
+ triggerStatus[2] = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ std::atomic<bool> triggering;
|
|
|
+ std::thread triggerThread;
|
|
|
+ std::mutex triggerMutex;
|
|
|
+ std::vector<bool> triggerStatus;
|
|
|
};
|
|
|
|
|
|
class TimeRecorder
|
|
|
{
|
|
|
public:
|
|
|
- static TimeRecorder& getInstance()
|
|
|
+ static TimeRecorder &getInstance()
|
|
|
{
|
|
|
static TimeRecorder instance;
|
|
|
return instance;
|
|
@@ -164,8 +259,6 @@ namespace UsbTest
|
|
|
log_file = std::fstream("TimeLog.txt", std::ios::app);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
void recordTime(std::string &message)
|
|
|
{
|
|
|
if (log_file.is_open())
|
|
@@ -185,9 +278,7 @@ namespace UsbTest
|
|
|
}
|
|
|
|
|
|
std::fstream log_file;
|
|
|
-
|
|
|
};
|
|
|
|
|
|
-
|
|
|
}
|
|
|
#endif // IMAGE_TEST_H
|