MythTV master
zmserver.h
Go to the documentation of this file.
1/* Definition of the ZMServer class.
2 * ============================================================
3 * This program is free software; you can redistribute it
4 * and/or modify it under the terms of the GNU General
5 * Public License as published bythe Free Software Foundation;
6 * either version 2, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * ============================================================ */
15
16#ifndef ZMSERVER_H
17#define ZMSERVER_H
18
19#include <chrono>
20#include <cstdint>
21#include <map>
22#include <mysql/mysql.h>
23#include <sstream>
24#include <string>
25#include <unistd.h>
26#include <vector>
27using namespace std::chrono_literals;
28using Clock = std::chrono::system_clock;
29using TimePoint = std::chrono::time_point<Clock>;
30
31// the maximum image size we are ever likely to get from ZM
32static constexpr size_t MAX_IMAGE_SIZE { static_cast<size_t>(2048) * 1536 * 3 };
33using FrameData = std::array<uint8_t,MAX_IMAGE_SIZE>;
34
35extern bool checkVersion(int major, int minor, int revision);
36extern void loadZMConfig(const std::string &configfile);
37extern void connectToDatabase(void);
38extern void kickDatabase(bool debug);
39
40// these are shared by all ZMServer's
41extern MYSQL g_dbConn;
42extern std::string g_zmversion;
43extern std::string g_password;
44extern std::string g_server;
45extern std::string g_database;
46extern std::string g_webPath;
47extern std::string g_user;
48extern std::string g_webUser;
49extern std::string g_binPath;
50extern int g_majorVersion;
51extern int g_minorVersion;
52extern int g_revisionVersion;
53
54static constexpr std::chrono::seconds DB_CHECK_TIME { 60s };
56
57const std::string FUNCTION_MONITOR = "Monitor";
58const std::string FUNCTION_MODECT = "Modect";
59const std::string FUNCTION_NODECT = "Nodect";
60const std::string FUNCTION_RECORD = "Record";
61const std::string FUNCTION_MOCORD = "Mocord";
62const std::string FUNCTION_NONE = "None";
63
64const std::string RESTART = "restart";
65const std::string RELOAD = "reload";
66const std::string RUNNING = "running";
67
68enum State : std::uint8_t
69{
74 TAPE
75};
76
77// Prevent clang-tidy modernize-avoid-c-arrays warnings in these
78// library structures
79extern "C" {
80
81// shared data for ZM version 1.24.x and 1.25.x
83{
84 int size;
85 bool valid;
86 bool active;
87 bool signal;
94 int action;
96 int hue;
97 int colour;
101 char control_state[256];
102};
103
104// shared data for ZM version 1.26.x
106{
107 uint32_t size;
110 uint32_t state;
111 uint32_t last_event;
112 uint32_t action;
113 int32_t brightness;
114 int32_t hue;
115 int32_t colour;
116 int32_t contrast;
117 int32_t alarm_x;
118 int32_t alarm_y;
119 uint8_t valid;
120 uint8_t active;
121 uint8_t signal;
122 uint8_t format;
123 uint32_t imagesize;
124 uint32_t epadding1;
125 uint32_t epadding2;
126 union {
128 uint64_t extrapad1;
129 };
130 union {
132 uint64_t extrapad2;
133 };
134 uint8_t control_state[256];
135};
136
137// shared data for ZM version 1.32.x
139{
140 uint32_t size;
143 uint32_t state;
144 uint64_t last_event;
145 uint32_t action;
146 int32_t brightness;
147 int32_t hue;
148 int32_t colour;
149 int32_t contrast;
150 int32_t alarm_x;
151 int32_t alarm_y;
152 uint8_t valid;
153 uint8_t active;
154 uint8_t signal;
155 uint8_t format;
156 uint32_t imagesize;
157 uint32_t epadding1;
158 union {
160 uint64_t extrapad1;
161 };
162 union {
164 uint64_t extrapad2;
165 };
166 union {
168 uint64_t extrapad3;
169 };
170 uint8_t control_state[256];
171
172 char alarm_cause[256];
173};
174
175// shared data for ZM version 1.34.x
177{
178 uint32_t size;
181 uint32_t state;
182 uint64_t last_event;
183 uint32_t action;
184 int32_t brightness;
185 int32_t hue;
186 int32_t colour;
187 int32_t contrast;
188 int32_t alarm_x;
189 int32_t alarm_y;
190 uint8_t valid;
191 uint8_t active;
192 uint8_t signal;
193 uint8_t format;
194 uint32_t imagesize;
195 uint32_t epadding1;
196 union {
198 uint64_t extrapad1;
199 };
200 union { /* +72 */
201 time_t zmc_heartbeat_time; /* Constantly updated by zmc. Used to determine if the process is alive or hung or dead */
202 uint64_t extrapad2;
203 };
204 union { /* +80 */
205 time_t zma_heartbeat_time; /* Constantly updated by zma. Used to determine if the process is alive or hung or dead */
206 uint64_t extrapad3;
207 };
208 union {
210 uint64_t extrapad4;
211 };
212 union {
214 uint64_t extrapad5;
215 };
216 uint8_t control_state[256];
217
218 char alarm_cause[256];
219};
220
221
222
224
225// Triggerdata for ZM version 1.24.x and 1.25.x
227{
228 int size;
232 char trigger_text[256];
234};
235
236// Triggerdata for ZM version 1.26.x , 1.32.x and 1.34.x
238{
239 uint32_t size;
242 uint32_t padding;
244 char trigger_text[256];
246};
247
248// VideoStoreData for ZM version 1.32.x and 1.34.x
250{
251 uint32_t size;
253 char event_file[4096];
254 timeval recording;
255};
256
257// end of library structures.
258};
259
261{
262 public:
263 MONITOR() = default;
264
265 void initMonitor(bool debug, const std::string &mmapPath, int shmKey);
266
267 bool isValid(void);
268
269 std::string getIdStr(void);
270 int getLastWriteIndex(void);
271 int getSubpixelOrder(void);
272 int getState(void);
273 int getFrameSize(void);
274
275 std::string m_name;
276 std::string m_type;
277 std::string m_function;
278 int m_enabled {0};
279 std::string m_device;
280 std::string m_host;
282 int m_width {0};
283 int m_height {0};
285 int m_monId {0};
286 unsigned char *m_sharedImages {nullptr};
287 int m_lastRead {0};
288 std::string m_status;
289 int m_palette {0};
292 int m_mapFile {-1};
293 void *m_shmPtr {nullptr};
294 private:
299 std::string m_id;
300};
301
303{
304 public:
305 ZMServer(int sock, bool debug);
306 ~ZMServer();
307
308 bool processRequest(char* buf, int nbytes);
309
310 private:
311 std::string getZMSetting(const std::string &setting) const;
312 bool send(const std::string &s) const;
313 bool send(const std::string &s, const unsigned char *buffer, int dataLen) const;
314 void sendError(const std::string &error);
315 void getMonitorList(void);
316 static int getFrame(FrameData &buffer, MONITOR *monitor);
317 static long long getDiskSpace(const std::string &filename, long long &total, long long &used);
318 static void tokenize(const std::string &command, std::vector<std::string> &tokens);
319 void handleHello(void);
320 static std::string runCommand(const std::string& command);
321 static void getMonitorStatus(const std::string &id, const std::string &type,
322 const std::string &device, const std::string &host,
323 const std::string &channel, const std::string &function,
324 std::string &zmcStatus, std::string &zmaStatus,
325 const std::string &enabled);
326 void handleGetServerStatus(void);
327 void handleGetMonitorStatus(void);
328 void handleGetAlarmStates(void);
329 void handleGetMonitorList(void);
330 void handleGetCameraList(void);
331 void handleGetEventList(std::vector<std::string> tokens);
332 void handleGetEventFrame(std::vector<std::string> tokens);
333 void handleGetAnalysisFrame(std::vector<std::string> tokens);
334 void handleGetLiveFrame(std::vector<std::string> tokens);
335 void handleGetFrameList(std::vector<std::string> tokens);
336 void handleDeleteEvent(std::vector<std::string> tokens);
337 void handleDeleteEventList(std::vector<std::string> tokens);
338 void handleGetEventDates(std::vector<std::string> tokens);
339 void handleRunZMAudit(void);
340 void handleSetMonitorFunction(std::vector<std::string> tokens);
341 void zmcControl(MONITOR *monitor, const std::string &mode);
342 void zmaControl(MONITOR *monitor, const std::string &mode);
343
344 bool m_debug {false};
345 int m_sock {-1};
346 std::vector<MONITOR *> m_monitors;
347 std::map<int, MONITOR *> m_monitorMap;
348 bool m_useDeepStorage {false};
350 std::string m_eventFileFormat;
352 key_t m_shmKey;
353 std::string m_mmapPath;
354};
355
356
357#endif
int getSubpixelOrder(void)
Definition: zmserver.cpp:475
SharedData * m_sharedData
Definition: zmserver.h:295
void initMonitor(bool debug, const std::string &mmapPath, int shmKey)
Definition: zmserver.cpp:233
int m_imageBufferCount
Definition: zmserver.h:281
int m_monId
Definition: zmserver.h:285
std::string m_name
Definition: zmserver.h:275
int m_trackMotion
Definition: zmserver.h:291
std::string m_device
Definition: zmserver.h:279
std::string getIdStr(void)
Definition: zmserver.cpp:430
bool isValid(void)
Definition: zmserver.cpp:414
std::string m_host
Definition: zmserver.h:280
int m_controllable
Definition: zmserver.h:290
SharedData32 * m_sharedData32
Definition: zmserver.h:297
int m_bytesPerPixel
Definition: zmserver.h:284
int m_lastRead
Definition: zmserver.h:287
SharedData26 * m_sharedData26
Definition: zmserver.h:296
int getLastWriteIndex(void)
Definition: zmserver.cpp:441
int m_enabled
Definition: zmserver.h:278
std::string m_function
Definition: zmserver.h:277
int m_mapFile
Definition: zmserver.h:292
std::string m_status
Definition: zmserver.h:288
SharedData34 * m_sharedData34
Definition: zmserver.h:298
int m_height
Definition: zmserver.h:283
int getFrameSize(void)
Definition: zmserver.cpp:496
std::string m_id
Definition: zmserver.h:299
MONITOR()=default
int getState(void)
Definition: zmserver.cpp:458
void * m_shmPtr
Definition: zmserver.h:293
int m_palette
Definition: zmserver.h:289
std::string m_type
Definition: zmserver.h:276
int m_width
Definition: zmserver.h:282
unsigned char * m_sharedImages
Definition: zmserver.h:286
bool m_debug
Definition: zmserver.h:344
void handleHello(void)
Definition: zmserver.cpp:735
std::vector< MONITOR * > m_monitors
Definition: zmserver.h:346
static std::string runCommand(const std::string &command)
Definition: zmserver.cpp:1078
void zmaControl(MONITOR *monitor, const std::string &mode)
Definition: zmserver.cpp:2104
void handleGetAlarmStates(void)
Definition: zmserver.cpp:808
key_t m_shmKey
Definition: zmserver.h:352
static long long getDiskSpace(const std::string &filename, long long &total, long long &used)
Definition: zmserver.cpp:745
void zmcControl(MONITOR *monitor, const std::string &mode)
Definition: zmserver.cpp:2059
void handleGetMonitorStatus(void)
Definition: zmserver.cpp:985
std::string getZMSetting(const std::string &setting) const
Definition: zmserver.cpp:1920
void handleGetEventDates(std::vector< std::string > tokens)
Definition: zmserver.cpp:921
std::string m_eventFileFormat
Definition: zmserver.h:350
void handleGetEventList(std::vector< std::string > tokens)
Definition: zmserver.cpp:828
static void tokenize(const std::string &command, std::vector< std::string > &tokens)
Definition: zmserver.cpp:611
bool m_useDeepStorage
Definition: zmserver.h:348
void handleSetMonitorFunction(std::vector< std::string > tokens)
Definition: zmserver.cpp:1952
void handleGetServerStatus(void)
Definition: zmserver.cpp:774
void handleGetMonitorList(void)
Definition: zmserver.cpp:1590
bool processRequest(char *buf, int nbytes)
Definition: zmserver.cpp:634
std::string m_mmapPath
Definition: zmserver.h:353
static int getFrame(FrameData &buffer, MONITOR *monitor)
Definition: zmserver.cpp:1787
void getMonitorList(void)
Definition: zmserver.cpp:1715
std::map< int, MONITOR * > m_monitorMap
Definition: zmserver.h:347
bool m_useAnalysisImages
Definition: zmserver.h:349
void handleGetAnalysisFrame(std::vector< std::string > tokens)
Definition: zmserver.cpp:1226
void handleGetEventFrame(std::vector< std::string > tokens)
Definition: zmserver.cpp:1143
void handleGetLiveFrame(std::vector< std::string > tokens)
Definition: zmserver.cpp:1398
void handleDeleteEvent(std::vector< std::string > tokens)
Definition: zmserver.cpp:1625
bool send(const std::string &s) const
Definition: zmserver.cpp:695
void handleRunZMAudit(void)
Definition: zmserver.cpp:1697
void sendError(const std::string &error)
Definition: zmserver.cpp:728
int m_sock
Definition: zmserver.h:345
ZMServer(int sock, bool debug)
Definition: zmserver.cpp:515
void handleGetFrameList(std::vector< std::string > tokens)
Definition: zmserver.cpp:1466
void handleDeleteEventList(std::vector< std::string > tokens)
Definition: zmserver.cpp:1662
static void getMonitorStatus(const std::string &id, const std::string &type, const std::string &device, const std::string &host, const std::string &channel, const std::string &function, std::string &zmcStatus, std::string &zmaStatus, const std::string &enabled)
Definition: zmserver.cpp:1092
std::string m_analysisFileFormat
Definition: zmserver.h:351
void handleGetCameraList(void)
Definition: zmserver.cpp:1574
#define minor(X)
Definition: compat.h:74
def error(message)
Definition: smolt.py:409
uint32_t last_event
Definition: zmserver.h:111
uint32_t last_read_index
Definition: zmserver.h:109
int32_t hue
Definition: zmserver.h:114
uint64_t extrapad2
Definition: zmserver.h:132
uint32_t state
Definition: zmserver.h:110
uint8_t valid
Definition: zmserver.h:119
int32_t alarm_y
Definition: zmserver.h:118
uint32_t size
Definition: zmserver.h:107
int32_t contrast
Definition: zmserver.h:116
int32_t alarm_x
Definition: zmserver.h:117
uint8_t signal
Definition: zmserver.h:121
uint8_t format
Definition: zmserver.h:122
uint32_t last_write_index
Definition: zmserver.h:108
int32_t brightness
Definition: zmserver.h:113
uint32_t epadding1
Definition: zmserver.h:124
uint64_t extrapad1
Definition: zmserver.h:128
int32_t colour
Definition: zmserver.h:115
uint32_t epadding2
Definition: zmserver.h:125
time_t last_write_time
Definition: zmserver.h:127
time_t last_read_time
Definition: zmserver.h:131
uint8_t control_state[256]
Definition: zmserver.h:134
uint32_t imagesize
Definition: zmserver.h:123
uint8_t active
Definition: zmserver.h:120
uint32_t action
Definition: zmserver.h:112
int32_t contrast
Definition: zmserver.h:149
time_t last_read_time
Definition: zmserver.h:167
uint8_t control_state[256]
Definition: zmserver.h:170
int32_t alarm_y
Definition: zmserver.h:151
uint64_t extrapad1
Definition: zmserver.h:160
uint8_t active
Definition: zmserver.h:153
uint32_t last_read_index
Definition: zmserver.h:142
uint64_t extrapad2
Definition: zmserver.h:164
uint32_t state
Definition: zmserver.h:143
time_t last_write_time
Definition: zmserver.h:163
uint32_t imagesize
Definition: zmserver.h:156
int32_t brightness
Definition: zmserver.h:146
time_t startup_time
Definition: zmserver.h:159
uint64_t last_event
Definition: zmserver.h:144
uint32_t size
Definition: zmserver.h:140
char alarm_cause[256]
Definition: zmserver.h:172
int32_t alarm_x
Definition: zmserver.h:150
uint8_t valid
Definition: zmserver.h:152
uint32_t last_write_index
Definition: zmserver.h:141
uint64_t extrapad3
Definition: zmserver.h:168
uint8_t format
Definition: zmserver.h:155
int32_t hue
Definition: zmserver.h:147
uint32_t epadding1
Definition: zmserver.h:157
int32_t colour
Definition: zmserver.h:148
uint8_t signal
Definition: zmserver.h:154
uint32_t action
Definition: zmserver.h:145
int32_t alarm_x
Definition: zmserver.h:188
uint32_t size
Definition: zmserver.h:178
time_t last_write_time
Definition: zmserver.h:209
uint64_t extrapad1
Definition: zmserver.h:198
uint32_t action
Definition: zmserver.h:183
uint32_t epadding1
Definition: zmserver.h:195
uint32_t imagesize
Definition: zmserver.h:194
int32_t brightness
Definition: zmserver.h:184
uint8_t valid
Definition: zmserver.h:190
time_t startup_time
Definition: zmserver.h:197
uint8_t format
Definition: zmserver.h:193
uint64_t extrapad4
Definition: zmserver.h:210
time_t zmc_heartbeat_time
Definition: zmserver.h:201
uint8_t signal
Definition: zmserver.h:192
uint64_t last_event
Definition: zmserver.h:182
int32_t contrast
Definition: zmserver.h:187
uint8_t control_state[256]
Definition: zmserver.h:216
time_t last_read_time
Definition: zmserver.h:213
uint32_t last_write_index
Definition: zmserver.h:179
uint64_t extrapad2
Definition: zmserver.h:202
uint8_t active
Definition: zmserver.h:191
uint64_t extrapad3
Definition: zmserver.h:206
char alarm_cause[256]
Definition: zmserver.h:218
uint32_t state
Definition: zmserver.h:181
time_t zma_heartbeat_time
Definition: zmserver.h:205
uint64_t extrapad5
Definition: zmserver.h:214
int32_t colour
Definition: zmserver.h:186
int32_t alarm_y
Definition: zmserver.h:189
uint32_t last_read_index
Definition: zmserver.h:180
int32_t hue
Definition: zmserver.h:185
bool valid
Definition: zmserver.h:85
bool active
Definition: zmserver.h:86
char control_state[256]
Definition: zmserver.h:101
bool signal
Definition: zmserver.h:87
int contrast
Definition: zmserver.h:98
int size
Definition: zmserver.h:84
int last_write_index
Definition: zmserver.h:89
int hue
Definition: zmserver.h:96
int colour
Definition: zmserver.h:97
int last_event
Definition: zmserver.h:93
int alarm_y
Definition: zmserver.h:100
time_t last_read_time
Definition: zmserver.h:92
int action
Definition: zmserver.h:94
int alarm_x
Definition: zmserver.h:99
int last_read_index
Definition: zmserver.h:90
int brightness
Definition: zmserver.h:95
time_t last_write_time
Definition: zmserver.h:91
State state
Definition: zmserver.h:88
uint32_t trigger_state
Definition: zmserver.h:240
char trigger_text[256]
Definition: zmserver.h:244
char trigger_cause[32]
Definition: zmserver.h:243
uint32_t padding
Definition: zmserver.h:242
uint32_t size
Definition: zmserver.h:239
char trigger_showtext[256]
Definition: zmserver.h:245
uint32_t trigger_score
Definition: zmserver.h:241
char trigger_text[256]
Definition: zmserver.h:232
TriggerState trigger_state
Definition: zmserver.h:229
char trigger_cause[32]
Definition: zmserver.h:231
int trigger_score
Definition: zmserver.h:230
char trigger_showtext[256]
Definition: zmserver.h:233
timeval recording
Definition: zmserver.h:254
uint32_t size
Definition: zmserver.h:251
char event_file[4096]
Definition: zmserver.h:253
uint64_t current_event
Definition: zmserver.h:252
VERBOSE_PREAMBLE Most debug(nodatabase, notimestamp, noextra)") VERBOSE_MAP(VB_GENERAL
void loadZMConfig(const std::string &configfile)
Definition: zmserver.cpp:109
const std::string FUNCTION_NODECT
Definition: zmserver.h:59
State
Definition: zmserver.h:69
@ TAPE
Definition: zmserver.h:74
@ ALERT
Definition: zmserver.h:73
@ ALARM
Definition: zmserver.h:72
@ PREALARM
Definition: zmserver.h:71
@ IDLE
Definition: zmserver.h:70
TimePoint g_lastDBKick
Definition: zmserver.cpp:99
const std::string RELOAD
Definition: zmserver.h:65
std::array< uint8_t, MAX_IMAGE_SIZE > FrameData
Definition: zmserver.h:33
const std::string RUNNING
Definition: zmserver.h:66
bool checkVersion(int major, int minor, int revision)
Definition: zmserver.cpp:102
std::string g_server
Definition: zmserver.cpp:87
const std::string FUNCTION_MONITOR
Definition: zmserver.h:57
int g_revisionVersion
Definition: zmserver.cpp:97
std::chrono::system_clock Clock
Definition: zmserver.h:28
const std::string FUNCTION_MODECT
Definition: zmserver.h:58
TriggerState
Definition: zmserver.h:223
@ TRIGGER_ON
Definition: zmserver.h:223
@ TRIGGER_OFF
Definition: zmserver.h:223
@ TRIGGER_CANCEL
Definition: zmserver.h:223
static constexpr size_t MAX_IMAGE_SIZE
Definition: zmserver.h:32
const std::string FUNCTION_RECORD
Definition: zmserver.h:60
std::string g_user
Definition: zmserver.cpp:90
std::chrono::time_point< Clock > TimePoint
Definition: zmserver.h:29
std::string g_database
Definition: zmserver.cpp:88
int g_majorVersion
Definition: zmserver.cpp:95
std::string g_webUser
Definition: zmserver.cpp:91
void kickDatabase(bool debug)
Definition: zmserver.cpp:206
const std::string FUNCTION_MOCORD
Definition: zmserver.h:61
int g_minorVersion
Definition: zmserver.cpp:96
std::string g_zmversion
Definition: zmserver.cpp:85
const std::string FUNCTION_NONE
Definition: zmserver.h:62
MYSQL g_dbConn
Definition: zmserver.cpp:84
std::string g_password
Definition: zmserver.cpp:86
std::string g_webPath
Definition: zmserver.cpp:89
void connectToDatabase(void)
Definition: zmserver.cpp:181
const std::string RESTART
Definition: zmserver.h:64
std::string g_binPath
Definition: zmserver.cpp:92
static constexpr std::chrono::seconds DB_CHECK_TIME
Definition: zmserver.h:54