Motion Master
Loading...
Searching...
No Matches
global.h
Go to the documentation of this file.
1#pragma once
2
3#ifdef WINDOWS_BUILD
4#include <windows.h>
5#endif
6#include <atomic>
7#include <csignal>
8#include <filesystem>
9#include <iostream>
10#include <map>
11#include <mutex>
12#include <queue>
13#include <string>
14#include <thread>
15#include <unordered_map>
16#include <vector>
17
18#include "ethercat.h"
19#include "loguru.h"
21
22#ifndef M_PI
23#define M_PI 3.14159265358979323846
24#endif
25
27
28extern uint8 g_pIOmap[4096];
29
30// SIGINT or SIGTERM caught
31extern volatile sig_atomic_t g_sig_caught;
32
33extern std::string g_driver_name;
34
37
38extern uint16_t g_req_res_port;
39extern uint16_t g_pub_sub_port;
40
41extern std::atomic<int> g_slavecount;
42
43// Using SOEM
44extern std::string g_soem_mac_address;
45extern std::string g_soem_ifname;
46extern std::vector<std::recursive_mutex> g_soem_mailbox_mutexes;
47extern std::atomic<bool> g_pdo_mapping_in_progress;
48
50
51// Using Ethernet Master
52extern std::vector<std::string> g_ethernet_ip_addresses;
53extern std::string g_ethernet_pdo_mode;
54
55// Number of mocked devices
56extern size_t g_mock_devices;
57
58// Path to a directory holding the templates for mock devices
59extern std::string g_templates_path;
60
61// Root directory for persistent user data (OD cache, etc.)
62extern std::filesystem::path g_data_dir;
63
69 private:
70 static std::map<std::string, std::unique_ptr<InternalLogger>> self_map;
72 constexpr static std::uint32_t internal_log_size = 0x200000;
73 std::mutex internal_log_mutex;
75 uint32_t type;
76 std::string name;
77
78 public:
79 std::string g_internal_log;
82 std::vector<std::string> logPreVec;
84 std::vector<std::string> logMsgVec;
86 std::vector<std::string> logIndVec;
89 std::deque<std::string> assertEqStrQue;
90 std::deque<void*> assertEqUserDataQue;
92 bool m_pop;
94 void (*assertEqCallback)(const std::string& pre, const std::string& str1,
95 const std::string& str2, void* userData,
96 int& retval);
97
99 static InternalLogger* getInstance(const std::string& name) {
100 if (InternalLogger::self_map.find(name) == InternalLogger::self_map.end()) {
101 InternalLogger::self_map.insert(
102 {name, std::make_unique<InternalLogger>()});
103 InternalLogger::self_map.at(name).get()->name = name;
104 InternalLogger::self_map.at(name).get()->type = 0;
105 InternalLogger::self_map.at(name).get()->assertEqCallback = nullptr;
106 InternalLogger::self_map.at(name).get()->m_pop = true;
107 }
108 return InternalLogger::self_map.at(name).get();
109 }
110
111 static void setType(const std::string& name, uint32_t type) {
112 InternalLogger::self_map.at(name).get()->type = type;
113 }
114
125 void log(const loguru::Message& message) {
126 std::unique_lock<std::mutex> lk(internal_log_mutex);
127 if (type == 0) {
128 g_internal_log += message.preamble;
129 g_internal_log += message.indentation;
130 g_internal_log += message.message;
131 g_internal_log += "\n";
132 if (g_internal_log.size() > internal_log_size) {
133 // Erase the first 12.5% of the internal log
134 auto pos = g_internal_log.find_first_of('\n', internal_log_size >> 3u);
135 g_internal_log.erase(0, pos + 1);
136 }
137 } else if (type == 1) {
138 logPreVec.push_back(message.preamble);
139 logMsgVec.push_back(message.message);
140 logIndVec.push_back(message.indentation);
141 if (!assertEqStrQue.empty()) {
142 if (assertEqCallback != nullptr) {
143 size_t loopSize = assertEqStrQue.size();
144 for (size_t i = 0; i < loopSize; i++) {
145 int retval = 0;
146 (*assertEqCallback)(logPreVec.back(), logMsgVec.back(),
148 retval);
149 if (retval != 0) {
150 assertEqStrQue.clear();
151 assertEqUserDataQue.clear();
152 break;
153 }
154 if (m_pop) {
155 assertEqStrQue.pop_front();
156 assertEqUserDataQue.pop_front();
157 }
158 }
159 }
160 }
161 }
162 }
163
166 static std::string& get_log(const std::string& name) {
168 std::unique_lock<std::mutex> lk(pil->internal_log_mutex);
170 return pil->g_internal_log_copy;
171 }
172
174 static void log_to_internal_log(void* user_data,
175 const loguru::Message& message) {
176 reinterpret_cast<InternalLogger*>(user_data)->log(message);
177 }
178
180 void setAssertEqCallback(void (*func)(const std::string& pre,
181 const std::string& str1,
182 const std::string& str2, void* userData,
183 int& retval)) {
184 assertEqCallback = func;
185 }
186
188 void pushAssertEq(const std::string& str, void* userData = nullptr) {
189 assertEqStrQue.push_front(str);
190 assertEqUserDataQue.push_front(userData);
191 }
192
193 void setPop() { m_pop = true; }
194 void clearPop() { m_pop = false; }
195
196 void resetState() {
197 g_internal_log.clear();
198 g_internal_log_copy.clear();
199 logPreVec.clear();
200 logMsgVec.clear();
201 logIndVec.clear();
202 assertEqStrQue.clear();
203 assertEqUserDataQue.clear();
204 }
205};
206
207// Motion Master running in end of the line testing mode
208extern bool g_eol_mode;
Manages communication and control for an external autotuning process.
Definition standalone_autotuning.h:271
bool g_eol_mode
Definition global.cc:35
std::string g_driver_name
Definition global.cc:18
std::vector< std::recursive_mutex > g_soem_mailbox_mutexes
Definition global.cc:27
std::string g_soem_mac_address
Definition global.cc:25
uint16_t g_pub_sub_port
Definition global.cc:23
std::vector< std::string > g_ethernet_ip_addresses
Definition global.cc:49
uint8 g_pIOmap[4096]
Definition global.cc:14
size_t g_mock_devices
Definition global.cc:31
std::string g_templates_path
Definition global.cc:32
std::atomic< int > g_slavecount
Definition global.cc:28
std::filesystem::path g_data_dir
Definition global.cc:33
volatile sig_atomic_t g_sig_caught
Definition global.cc:16
std::atomic< bool > g_pdo_mapping_in_progress
Definition global.cc:29
std::string g_ethernet_pdo_mode
Definition global.cc:50
MasterType g_master_type
Definition global.cc:20
uint16_t g_req_res_port
Definition global.cc:22
std::string g_soem_ifname
Definition global.cc:26
MasterType
Definition global.h:35
@ kUnspecified
Definition global.h:35
@ kSoem
Definition global.h:35
@ kMock
Definition global.h:35
@ kSpoe
Definition global.h:35
void g_soem_update_slavecount()
Definition global.cc:39
StandaloneAutotuning g_standalone_autotuning
Logging class.
Definition global.h:68
void setAssertEqCallback(void(*func)(const std::string &pre, const std::string &str1, const std::string &str2, void *userData, int &retval))
Definition global.h:180
static void log_to_internal_log(void *user_data, const loguru::Message &message)
Definition global.h:174
bool m_pop
Definition global.h:92
void log(const loguru::Message &message)
Callback from loguru.
Definition global.h:125
void clearPop()
Definition global.h:194
std::deque< void * > assertEqUserDataQue
Definition global.h:90
std::vector< std::string > logPreVec
Definition global.h:82
std::deque< std::string > assertEqStrQue
Definition global.h:89
void resetState()
Definition global.h:196
std::string g_internal_log_copy
Definition global.h:80
static std::string & get_log(const std::string &name)
Definition global.h:166
static void setType(const std::string &name, uint32_t type)
Definition global.h:111
void(* assertEqCallback)(const std::string &pre, const std::string &str1, const std::string &str2, void *userData, int &retval)
Definition global.h:94
std::vector< std::string > logIndVec
Definition global.h:86
static InternalLogger * getInstance(const std::string &name)
Definition global.h:99
std::vector< std::string > logMsgVec
Definition global.h:84
std::string g_internal_log
Definition global.h:79
void setPop()
Definition global.h:193
void pushAssertEq(const std::string &str, void *userData=nullptr)
Definition global.h:188