Subversion Repositories tpanel

Rev

Rev 458 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
446 andreas 1
/*
457 andreas 2
 * Copyright (C) 2020 to 2024 by Andreas Theofilu <andreas@theosys.at>
446 andreas 3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) 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
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
 
19
#ifndef __TPAGEMANAGER_H__
20
#define __TPAGEMANAGER_H__
21
 
22
#include <functional>
23
#include <thread>
24
#ifdef __ANDROID__
25
#include <jni.h>
26
#endif
27
#include <qglobal.h>
28
 
29
#include "tpagelist.h"
30
#include "tpage.h"
31
#include "tsubpage.h"
32
#include "tsettings.h"
33
#include "tpalette.h"
34
#include "tbutton.h"
35
#include "tfont.h"
36
#include "texternal.h"
37
#include "tamxnet.h"
38
#include "tamxcommands.h"
39
#include "tsystemdraw.h"
40
#include "tsipclient.h"
41
#include "tvector.h"
42
#include "tbitmap.h"
43
#include "tbuttonstates.h"
458 andreas 44
#include "tqintercom.h"
446 andreas 45
 
46
#define REG_CMD(func, name)     registerCommand(bind(&TPageManager::func, this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3),name)
47
 
48
class TIcons;
49
class TPageManager;
50
 
51
extern bool prg_stopped;
52
extern TIcons *gIcons;
53
extern TPrjResources *gPrjResources;
54
extern TPageManager *gPageManager;
55
 
56
#ifdef __ANDROID__
57
#define NETSTATE_WIFI   1
58
#define NETSTATE_CELL   2
59
#endif
60
 
61
/**
62
 * @brief PGSUBVIEWATOM_T
63
 * This struct contains the elements of an item inside a subview list.
64
 */
65
typedef struct PGSUBVIEWATOM_T
66
{
67
    ulong handle{0};
68
    ulong parent{0};
69
    int top{0};
70
    int left{0};
71
    int width{0};
72
    int height{0};
73
    int instance{0};
74
    TColor::COLOR_T bgcolor{0};
75
    TBitmap image;
76
    std::string bounding;
77
 
78
    void clear()
79
    {
80
        handle = parent = 0;
81
        top = left = width = height = instance = 0;
82
        bgcolor.alpha = bgcolor.blue = bgcolor.green = bgcolor.red = 0;
83
        image.clear();
84
        bounding.clear();
85
    }
86
}PGSUBVIEWATOM_T;
87
 
88
/**
89
 * @brief PGSUBVIEWITEM_T
90
 * This struct contains the overall dimensions and definition of an item of a
91
 * subview list. Each item may consist of one or more buttons. Each item is a
92
 * subpage of it's own.
93
 * All subpage together are the subview list.
94
 */
95
typedef struct PGSUBVIEWITEM_T
96
{
97
    ulong handle{0};
98
    ulong parent{0};
99
    int width{0};
100
    int height{0};
101
    bool scrollbar{false};
102
    int scrollbarOffset{0};
103
    Button::SUBVIEW_POSITION_t position{Button::SVP_CENTER};
104
    bool wrap{false};
105
    TColor::COLOR_T bgcolor;
106
    TBitmap image;
107
    std::string bounding;
108
    std::vector<PGSUBVIEWATOM_T> atoms;
109
 
110
    void clear()
111
    {
112
        handle = parent = 0;
113
        width = height = 0;
114
        bgcolor.alpha = bgcolor.blue = bgcolor.green = bgcolor.red = 0;
115
        scrollbar = wrap = false;
116
        scrollbarOffset = 0;
117
        position = Button::SVP_CENTER;
118
        image.clear();
119
        bounding.clear();
120
        atoms.clear();
121
    }
122
}PGSUBVIEWITEM_T;
123
 
124
class TPageManager : public TAmxCommands
125
{
126
    public:
127
        typedef enum J_ORIENTATION
128
        {
129
            O_UNDEFINED = -1,
130
            O_LANDSCAPE = 0,
131
            O_PORTRAIT = 1,
132
            O_REVERSE_LANDSCAPE = 8,
133
            O_REVERSE_PORTRAIT = 9,
134
            O_FACE_UP = 15,
135
            O_FACE_DOWN = 16
136
        }J_ORIENTATION;
137
 
138
        typedef enum SWIPES
139
        {
140
            SW_UNKNOWN,
141
            SW_LEFT,
142
            SW_RIGHT,
143
            SW_UP,
144
            SW_DOWN
145
        }SWIPES;
146
 
147
        TPageManager();
148
        ~TPageManager();
149
 
150
        bool readPages();                                   //!< Read all pages and subpages
151
        bool readPage(const std::string& name);             //!< Read the page with name \p name
152
        bool readPage(int ID);                              //!< Read the page with id \p ID
153
        bool readSubPage(const std::string& name);          //!< Read the subpage with name \p name
154
        bool readSubPage(int ID);                           //!< Read the subpage with ID \p ID
155
        void updateActualPage();                            //!< Updates all elements of the actual page
156
        void updateSubpage(int ID);                         //!< Updates all elements of a subpage
157
        void updateSubpage(const std::string& name);        //!< Updates all elements of a subpage
158
        std::vector<TSubPage *> createSubViewList(int id);  //!< Create a list of subview pages
159
        void showSubViewList(int id, Button::TButton *bt);  //!< Creates and displays a subview list
160
        void updateSubViewItem(Button::TButton *bt);        //!< Updates an existing subview item
161
 
162
        TPageList *getPageList() { return mPageList; }      //!< Get the list of all pages
163
        TSettings *getSettings() { return mTSettings; }     //!< Get the (system) settings of the panel
164
 
165
        TPage *getActualPage();                             //!< Get the actual page
166
        int getActualPageNumber() { return mActualPage; }   //!< Get the ID of the actual page
167
        int getPreviousPageNumber() { return mPreviousPage; }   //!< Get the ID of the previous page, if there was any.
168
        TSubPage *getFirstSubPage();
169
        TSubPage *getNextSubPage();
170
        TSubPage *getPrevSubPage();
171
        TSubPage *getLastSubPage();
172
        TSubPage *getFirstSubPageGroup(const std::string& group);
173
        TSubPage *getNextSubPageGroup();
174
        TSubPage *getNextSubPageGroup(const std::string& group, TSubPage *pg);
175
        TSubPage *getTopPage();
176
 
177
        TPage *getPage(int pageID);
178
        TPage *getPage(const std::string& name);
179
        bool setPage(int PageID, bool forget=false);
180
        bool setPage(const std::string& name, bool forget=false);
181
        TSubPage *getSubPage(int pageID);
182
        TSubPage *getSubPage(const std::string& name);
183
        TSubPage *deliverSubPage(const std::string& name, TPage **pg=nullptr);
184
        TSubPage *deliverSubPage(int number, TPage **pg=nullptr);
185
        bool havePage(const std::string& name);
186
        bool haveSubPage(const std::string& name);
187
        bool haveSubPage(int id);
188
        bool haveSubPage(const std::string& page, const std::string& name);
189
        bool haveSubPage(const std::string& page, int id);
190
        TFont *getFonts() { return mFonts; }
191
        Button::TButton *findButton(ulong handle);
192
        Button::TButton *findBargraph(int lp, int lv, ulong parent);
193
        void onSwipeEvent(SWIPES sw);
194
        double getDPI() { return mDPI; }
195
        void setDPI(const double dpi) { mDPI = dpi; }
196
 
197
        void registerCallbackDB(std::function<void(ulong handle, ulong parent, TBitmap buffer, int width, int height, int left, int top, bool passthrough, int marqtype, int marq)> displayButton) { _displayButton = displayButton; }
198
        void registerSetMarqueeText(std::function<void(Button::TButton *button)> marquee) { _setMarqueeText = marquee; }
199
        void registerDropButton(std::function<void(ulong hanlde)> dropButton) { _dropButton = dropButton; }
200
        void registerCBsetVisible(std::function<void(ulong handle, bool state)> setVisible) { _setVisible = setVisible; }
201
        void registerCallbackSP(std::function<void (ulong handle, int width, int height)> setPage) { _setPage = setPage; }
202
        void registerCallbackSSP(std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, ANIMATION_t animate, bool modal)> setSubPage) { _setSubPage = setSubPage; }
203
#ifdef _OPAQUE_SKIA_
204
        void registerCallbackSB(std::function<void (ulong handle, TBitmap image, int width, int height, ulong color)> setBackground) {_setBackground = setBackground; }
205
#else
206
        void registerCallbackSB(std::function<void (ulong handle, TBitmap image, int width, int height, ulong color, int opacity)> setBackground) {_setBackground = setBackground; }
207
#endif
208
        void deployCallbacks();
209
#ifdef __ANDROID__
210
        void initNetworkState();
211
        void stopNetworkState();
212
        void initBatteryState();
213
        void stopBatteryState();
214
        void initPhoneState();
215
        void informTPanelNetwork(jboolean conn, jint level, jint type);
216
        void informBatteryStatus(jint level, jboolean charging, jint chargeType);
217
        void informPhoneState(bool call, const std::string& pnumber);
218
        void initOrientation();
219
        void enterSetup();
220
#endif
221
#ifdef Q_OS_IOS
222
        void informBatteryStatus(int level, int state);
223
        void informTPanelNetwork(bool conn, int level, int type);
224
#endif
225
        void regCallDropPage(std::function<void (ulong handle)> callDropPage) { _callDropPage = callDropPage; }
226
        void regCallDropSubPage(std::function<void (ulong handle, ulong parent)> callDropSubPage) { _callDropSubPage = callDropSubPage; }
227
        void regCallPlayVideo(std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, const std::string& url, const std::string& user, const std::string& pw)> callPlayVideo) { _callPlayVideo = callPlayVideo; };
228
        void regCallInputText(std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> callInputText) { _callInputText = callInputText; }
229
        void regCallListBox(std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> callListBox) { _callListBox = callListBox; }
230
        void regCallbackKeyboard(std::function<void (const std::string& init, const std::string& prompt, bool priv)> callKeyboard) { _callKeyboard = callKeyboard; }
231
        void regCallbackKeypad(std::function<void (const std::string& init, const std::string& prompt, bool priv)> callKeypad) { _callKeypad = callKeypad; }
232
        void regCallResetKeyboard(std::function<void ()> callResetKeyboard) { _callResetKeyboard = callResetKeyboard; }
233
        void regCallShowSetup(std::function<void ()> callShowSetup) { _callShowSetup = callShowSetup; }
234
        void regCallbackNetState(std::function<void (int level)> callNetState, ulong handle);
235
        void unregCallbackNetState(ulong handle);
236
#ifdef Q_OS_ANDROID
237
        void regCallbackBatteryState(std::function<void (int level, bool charging, int chargeType)> callBatteryState, ulong handle);
238
#endif
239
#ifdef Q_OS_IOS
240
        void regCallbackBatteryState(std::function<void (int level, int state)> callBatteryState, ulong handle);
241
#endif
242
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
243
        void unregCallbackBatteryState(ulong handle);
244
#endif
245
        void regCallbackResetSurface(std::function<void ()> resetSurface) { _resetSurface = resetSurface; }
246
        void regCallbackShutdown(std::function<void ()> shutdown) { _shutdown = shutdown; }
247
        void regCallbackPlaySound(std::function<void (const std::string& file)> playSound) { _playSound = playSound; }
248
        void regCallbackStopSound(std::function<void ()> stopSound) { _stopSound = stopSound; }
249
        void regCallbackMuteSound(std::function<void (bool state)> muteSound) { _muteSound = muteSound; }
250
        void regCallbackSetVolume(std::function<void (int volume)> setVolume) { _setVolume = setVolume; }
251
        void regSendVirtualKeys(std::function<void (const std::string& str)> sendVirtualKeys) { _sendVirtualKeys = sendVirtualKeys; }
252
        void regShowPhoneDialog(std::function<void (bool state)> showPhoneDialog) { _showPhoneDialog = showPhoneDialog; }
253
        void regSetPhoneNumber(std::function<void (const std::string& number)> setPhoneNumber) { _setPhoneNumber = setPhoneNumber; }
254
        void regSetPhoneStatus(std::function<void (const std::string& msg)> setPhoneStatus) { _setPhoneStatus = setPhoneStatus; }
255
        void regSetPhoneState(std::function<void (int state, int id)> setPhoneState) { _setPhoneState = setPhoneState; }
256
        void regDisplayMessage(std::function<void (const std::string& msg, const std::string& title)> msg) { _displayMessage = msg; }
257
        void regAskPassword(std::function<void (ulong handle, const std::string& msg, const std::string& title, int x, int y)> pw) { _askPassword = pw; }
258
        void regFileDialogFunction(std::function<void (ulong handle, const std::string& path, const std::string& extension, const std::string& suffix)> fdlg) { _fileDialog = fdlg; }
259
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
260
        void regOnOrientationChange(std::function<void (int orientation)> orientationChange) { _onOrientationChange = orientationChange; }
261
        void regOnSettingsChanged(std::function<void (const std::string& oldNetlinx, int oldPort, int oldChannelID, const std::string& oldSurface, bool oldToolbarSuppress, bool oldToolbarForce)> settingsChanged) { _onSettingsChanged = settingsChanged; }
262
#endif
263
        void regRepaintWindows(std::function<void ()> repaintWindows) { _repaintWindows = repaintWindows; }
264
        void regToFront(std::function<void (ulong handle)> toFront) { _toFront = toFront; }
265
        void regSetMainWindowSize(std::function<void (int width, int height)> setSize) { _setMainWindowSize = setSize; }
266
        void regDownloadSurface(std::function<void (const std::string& file, size_t size)> dl) { _downloadSurface = dl; }
267
        void regStartWait(std::function<void (const std::string& text)> sw) { _startWait = sw; }
268
        void regStopWait(std::function<void ()> sw) { _stopWait = sw; }
269
        void regPageFinished(std::function<void (ulong handle)> pf) { _pageFinished = pf; }
270
        void regDisplayViewButton(std::function<void (ulong handle, ulong parent, bool vertical, TBitmap buffer, int width, int height, int left, int top, int space, TColor::COLOR_T)> dvb) { _displayViewButton = dvb; }
271
        void regAddViewButtonItem(std::function<void (Button::TButton& button, unsigned char *buffer, int pixline)> avbi) { _addViewButtonItem = avbi; }
272
        void regAddViewButtonItems(std::function<void (ulong parent, std::vector<PGSUBVIEWITEM_T> items)> abvi) { _addViewButtonItems = abvi; }
273
        void regUpdateViewButton(std::function<void (ulong handle, ulong parent, TBitmap buffer, TColor::COLOR_T fillColor)> uvb) { _updateViewButton = uvb; }
274
        void regUpdateViewButtonItem(std::function<void (PGSUBVIEWITEM_T& item, ulong parent)> uvb) { _updateViewButtonItem = uvb; }
275
        void regShowSubViewItem(std::function<void (ulong handle, ulong parent, int position, int timer)> ssvi) { _showSubViewItem = ssvi; }
276
        void regToggleSubViewItem(std::function<void (ulong handle, ulong parent, int position, int timer)> tsvi) { _toggleSubViewItem = tsvi; }
277
        void regHideAllSubViewItems(std::function<void (ulong handle)> hasvi) { _hideAllSubViewItems = hasvi; }
278
        void regHideSubViewItem(std::function<void (ulong handle, ulong parent)> hsvi) { _hideSubViewItem = hsvi; }
279
        void regSetSubViewPadding(std::function<void (ulong handle, int padding)> ssvp) { _setSubViewPadding = ssvp; }
458 andreas 280
        void regInitializeIntercom(std::function<void (INTERCOM_t ic)> intercom) { _initializeIntercom = intercom; }
281
        void regIntercomStart(std::function<void ()> start) { _intercomStart = start; }
282
        void regIntercomStop(std::function<void ()> stop) { _intercomStop = stop; }
283
        void regIntercomSpkLevel(std::function<void (int level)> spk) { _intercomSpkLevel = spk; }
284
        void regIntercomMicLevel(std::function<void (int level)> mic) { _intercomSpkLevel = mic; }
285
        void regIntercomMute(std::function<void (bool mute)> mute) { _intercomMute = mute; }
446 andreas 286
 
287
        /**
288
         * The following function must be called to start non graphics part
289
         * of the panel simulator. If everything worked well, it returns TRUE.
290
         * otherwise a FALSE is returned and the program should be terminated.
291
         */
292
        bool run();
293
        /**
294
         * Set an X value to add to the coordinated reported by the mouse catch
295
         * event. In case the X coordinate reported by the event is not the real
296
         * X coordinate, it's possible to set an X coordinate to translate the
297
         * internal used coordinates.
298
         *
299
         * @param x
300
         * The left most pixel which correspond to X = 0
301
         */
302
        void setFirstLeftPixel(int x) { mFirstLeftPixel = x; }
303
        /**
304
         * Set an Y value to add to the coordinated reported by the mouse catch
305
         * event. In case the Y coordinate reported by the event is not the real
306
         * Y coordinate, it's possible to set an Y coordinate to translate the
307
         * internal used coordinates.
308
         *
309
         * @param y
310
         * The top most pixel which correspond to Y = 0
311
         */
312
        void setFirstTopPixel(int y) { mFirstTopPixel = y; }
313
        /**
314
         * This function must be called from a GUI whenever the left mouse
315
         * button was pressed or released. Also if there was a touch event
316
         * this function must be called in the same way. It's up to any GUI
317
         * to handle the mouse and or touch events.
318
         *
319
         * @param x
320
         * the X coordinate of the mouse/touch event
321
         *
322
         * @param y
323
         * the y coordinate if the mouse/touch event
324
         *
325
         * @return
326
         * pressed TRUE = button was pressed; FALSE = button was released
327
         */
328
        void mouseEvent(int x, int y, bool pressed);
329
        /**
330
         * @brief mouseEvent
331
         * This function can be called from a GUI if the coordinates of the
332
         * mouse click are not available but the handle of an object who
333
         * received a mouse click.
334
         *
335
         * @param handle    The handle of an object
336
         * @param pressed   TRUE=The mouse button is pressed.
337
         */
338
        void mouseEvent(ulong handle, bool pressed);
339
        /**
340
         * @brief mouseMoveEvent - Moves bar on a bargraph
341
         * This method looks for an object which is a bargraph. If so it is
342
         * moved to the position of the mouse pointer. The behavior depends on
343
         * the settings.
344
         * This method just queues the event. For real handling of it look at
345
         * method _mouseEvent().
346
         *
347
         * @param x     The x coordinate of the mouse pointer
348
         * @param y     The y coordinate of the mouse pointer
349
         */
350
        void mouseMoveEvent(int x, int y);
351
        /**
352
         * Searches for a button with the handle \p handle and determines all
353
         * buttons with the same port and channel. Then it sets \p txt to all
354
         * found buttons.
355
         *
356
         * @param handle    The handle of a button.
357
         * @param txt       The text usualy comming from an input line.
358
         * @param redraw    If this is set to true the button is redrawn.
359
         */
360
        void setTextToButton(ulong handle, const std::string& txt, bool redraw=false);
361
        /**
362
         * Iterates through all active subpages of the active page and drops
363
         * them.
364
         */
365
        void dropAllSubPages();
366
        /**
367
         * Closes all subpages in the group \p group.
368
         *
369
         * @param group The name of the group.
370
         */
371
        void closeGroup(const std::string& group);
372
        /**
373
         * Displays the subpage \p name. If the subpage is part of a group
374
         * the open subpage in the group is closed, if there was one open. Then
375
         * the subpage is displayed. If the subpage is not already in the
376
         * internal buffer it's configuration file is read and the page is
377
         * created.
378
         *
379
         * @param name  The name of the subpage to display.
380
         */
381
        void showSubPage(const std::string& name);
382
        /**
383
         * Displays the subpage \p number. If the subpage is part of a group
384
         * the open subpage in the group is closed, if there was one open. Then
385
         * the subpage is displayed. If the subpage is not already in the
386
         * internal buffer it's configuration file is read and the page is
387
         * created.
388
         *
389
         * @param name  The name of the subpage to display.
390
         */
391
        void showSubPage(int number, bool force=false);
392
        /**
393
         * Hides the subpage \p name.
394
         *
395
         * @param name  The name of the subpage to hide.
396
         */
397
        void hideSubPage(const std::string& name);
398
        /**
399
         * This is called whenever an input button finished or changed it's
400
         * content. It is called indirectly out of the class TQEditLine.
401
         * The method writes the content into the text area of the button the
402
         * handle points to.
403
         *
404
         * @param handle   The handle of the button.
405
         * @param content  The content of the text area.
406
         */
407
        void inputButtonFinished(ulong handle, const std::string& content);
408
        void inputCursorPositionChanged(ulong handle, int oldPos, int newPos);
409
        void inputFocusChanged(ulong handle, bool in);
410
#ifdef _SCALE_SKIA_
411
        void setScaleFactor(double scale) { mScaleFactor = scale; }
412
        double getScaleFactor() { return mScaleFactor; }
413
        void setScaleFactorWidth(double scale) { mScaleFactorWidth = scale; }
414
        double getScaleFactorWidth() { return mScaleFactorWidth; }
415
        void setScaleFactorHeight(double scale) { mScaleFactorHeight = scale; }
416
        double getScaleFactorHeight() { return mScaleFactorHeight; }
417
#endif
418
        /**
419
         * This method handles some external buttons. Some original panels from
420
         * AMX have external hard buttons. TPanel simulates some of them like
421
         * the arrow keys, enter button and volume. The graphical surface may
422
         * display a toolbar on the right side (only if there is enough space
423
         * left) which offers this buttons. When such a button was pressed, this
424
         * method is called to send them to the controller.
425
         *
426
         * @param bt        The button who was pressed
427
         * @param checked   On button press this is TRUE, and on release it is FALSE.
428
         */
429
        void externalButton(extButtons_t bt, bool checked);
430
 
431
        void sendKeyboard(const std::string& text);
432
        void sendKeypad(const std::string& text);
433
        void sendString(uint handle, const std::string& text);
434
        void sendGlobalString(const std::string& text);
435
        void sendPHNcommand(const std::string& cmd);
436
        void sendKeyStroke(char key);
437
        void sendCommandString(int port, const std::string& cmd);
438
        void sendLevel(int lp, int lv, int level);
439
        void sendInternalLevel(int lp, int lv, int level);
440
        void callSetPassword(ulong handle, const std::string& pw, int x, int y);
441
        TButtonStates *addButtonState(BUTTONTYPE t, int rap, int rad, int rch, int rcp, int rlp, int rlv);
442
        TButtonStates *addButtonState(const TButtonStates& bs);
443
        TButtonStates *getButtonState(BUTTONTYPE t, int rap, int rad, int rch, int rcp, int rlp, int rlv);
444
        TButtonStates *getButtonState(uint32_t id);
445
        TButtonStates *getButtonState(BUTTONTYPE t, uint32_t id);
446
 
447
        /**
448
         * This starts the communication with the AMX controller. The method
449
         * registers the callbacks and starts a thread. This thread runs as
450
         * long as a valid communication is possible or until the communication
451
         * end by a command.
452
         */
453
        void startUp();
454
        /**
455
         * This starts a thread running the command loop. Each event from the
456
         * Netlinx is entered into a vector array (doCommand()) and this
457
         * method starts the event loop as a thread running as long as this
458
         * class exists.
459
         */
460
        void runCommands();
461
        /**
462
         * This method is the thread started by the command runCommands().
463
         */
464
        void commandLoop();
465
        /**
466
         * Callback function for the AMX controller part. This function must
467
         * be registered to the class TAmxNet and is called from this module
468
         * every time an event occured from the controller.
469
         * This method handles the commands comming from the controller and
470
         * draws the necessary elements before they are sent to the GUI.
471
         *
472
         * @param cmd
473
         * An ANET_COMMAND structure containing the received command.
474
         */
475
        void doCommand(const amx::ANET_COMMAND& cmd);
476
        /**
477
         * Activates the setup pages unless they are not visible already.
478
         */
479
        void showSetup();
480
        /**
481
         * Determines the page or subpage the handle points to and returns the
482
         * selected row of a list, if there is one.
483
         * The row index starts by 1!
484
         *
485
         * @param handle    The handle of the button.
486
         * @return If the button is a list and a row was selected then a number
487
         * grater than 0 is returned. Otherwise -1 is returned.
488
         */
489
        int getSelectedRow(ulong handle);
490
        /**
491
         * Finds the page or subpage and returns the selected item as a string.
492
         * If there was no list, or no items in the list, or nothing selected,
493
         * an empty string is returned.
494
         *
495
         * @param handle    The handle of the button
496
         * @return The string of the selected item or an empty string.
497
         */
498
        std::string getSelectedItem(ulong handle);
499
        /**
500
         * Finds the corresponding list and sets the selected row. The \b row
501
         * must be a value starting by 1. It must not be bigger that items in
502
         * the list.
503
         *
504
         * @param handle    The handle of the button
505
         * @param row       The number of the selected row.
506
         */
507
        void setSelectedRow(ulong handle, int row, const std::string& text);
508
        /**
509
         * @brief redrawObject - redraws an object
510
         * The method sends the last stored graphic to the surface where it is
511
         * drawn.
512
         * If the object is not visible, it is not redrawn.
513
         *
514
         * @param handle    The handle of the object.
515
         */
516
        void redrawObject(ulong handle);
517
#ifdef Q_OS_IOS
518
        void setBattery(int level, int state) { mLastBatteryLevel = level; mLastBatteryState = state; }
519
#endif
520
#ifdef _SCALE_SKIA_
521
        /**
522
         * Set the scale factor for the system setup pages. On a desktop this
523
         * factor is in relation to the size of the normal pages, if there any.
524
         * On a mobile device the factor is in relation to the resolution of
525
         * the display.
526
         * The scale factor is calculated in qtmain.cpp: MainWindow::calcScaleSetup()
527
         *
528
         * @param scale  The overall scale factor. This is used for calculations
529
         * and ensures that the ratio of the objects is maintained.
530
         * @param sw     The scale factor for the width.
531
         * @param sh     The scale factor for the height.
532
         */
533
        void setSetupScaleFactor(double scale, double sw, double sh);
534
#endif
535
        // Callbacks who will be registered by the graphical surface.
536
        std::function<void (ulong handle, ulong parent, TBitmap buffer, int width, int height, int left, int top, bool passthrough, int marqtype, int marq)> getCallbackDB() { return _displayButton; }
537
        std::function<void (Button::TButton *button)> getSetMarqueeText() { return _setMarqueeText; }
538
        std::function<void (ulong handle)> getCallDropButton() { return _dropButton; }
539
        std::function<void (ulong handle, bool state)> getVisible() { return _setVisible; };
540
#ifdef _OPAQUE_SKIA_
541
        std::function<void (ulong handle, TBitmap image, int width, int height, ulong color)> getCallbackBG() { return _setBackground; }
542
#else
543
        std::function<void (ulong handle, TBitmap image, int width, int height, ulong color, int opacity)> getCallbackBG() { return _setBackground; }
544
#endif
545
        std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, const std::string& url, const std::string& user, const std::string& pw)> getCallbackPV() { return _callPlayVideo; }
546
        std::function<void (ulong handle, int width, int height)> getCallbackSetPage() { return _setPage; }
547
        std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> getCallbackInputText() { return _callInputText; }
548
        std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> getCallbackListBox() { return _callListBox; }
549
        std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, ANIMATION_t animate, bool modal)> getCallbackSetSubPage() { return _setSubPage; }
550
        std::function<void (ulong handle)> getCallDropPage() { return _callDropPage; }
551
        std::function<void (ulong handle, ulong parent)> getCallDropSubPage() { return _callDropSubPage; }
552
        std::function<void (const std::string& file)> getCallPlaySound() { return _playSound; }
553
        std::function<void ()> getCallStopSound() { return _stopSound; }
554
        std::function<void (bool state)> getCallMuteSound() { return _muteSound; }
555
        std::function<void (int volume)> getCallSetVolume() { return _setVolume; }
556
        std::function<void (const std::string& str)> sendVirtualKeys() { return _sendVirtualKeys; }
557
        std::function<void (bool state)> getShowPhoneDialog() { return _showPhoneDialog; }
558
        std::function<void (const std::string& number)> getSetPhoneNumber() { return _setPhoneNumber; }
559
        std::function<void (const std::string& msg)> getSetPhoneStatus() { return _setPhoneStatus; }
560
        std::function<void (int state, int id)> getSetPhoneState() { return _setPhoneState; }
561
        std::function<void (ulong handle)> getToFront() { return _toFront; }
562
        std::function<void (int width, int height)> getMainWindowSizeFunc() { return _setMainWindowSize; }
563
        std::function<void (const std::string& file, size_t size)> getDownloadSurface() { return _downloadSurface; }
564
        std::function<void (const std::string& msg, const std::string& title)> getDisplayMessage() { return _displayMessage; }
565
        std::function<void (ulong handle, const std::string& msg, const std::string& title, int x, int y)> getAskPassword() { return _askPassword; }
566
        std::function<void (ulong handle, const std::string& path, const std::string& extension, const std::string& suffix)> getFileDialogFunction() { return _fileDialog; }
567
        std::function<void (const std::string& text)> getStartWait() { return _startWait; }
568
        std::function<void ()> getStopWait() { return _stopWait; }
569
        std::function<void (ulong handle)> getPageFinished() { return _pageFinished; }
570
        std::function<void (ulong handle, ulong parent, bool vertical, TBitmap buffer, int width, int height, int left, int top, int space, TColor::COLOR_T fillColor)> getDisplayViewButton() { return _displayViewButton; }
571
        std::function<void (Button::TButton& button, unsigned char *buffer, int pixline)> getAddViewButtonItem() { return _addViewButtonItem; }
572
        std::function<void (ulong parent, std::vector<PGSUBVIEWITEM_T> items)> getAddViewButtonItems() { return _addViewButtonItems; }
573
        std::function<void (ulong handle, ulong parent, TBitmap buffer, TColor::COLOR_T fillColor)> getUpdateViewButton() { return _updateViewButton; }
574
        std::function<void (PGSUBVIEWITEM_T& item, ulong parent)> getUpdateViewButtonItem() { return _updateViewButtonItem; }
575
        std::function<void (ulong handle, ulong parent, int position, int timer)> getShowSubViewItem() { return _showSubViewItem; }
576
        std::function<void (ulong handle, ulong parent, int position, int timer)> getToggleSubViewItem() { return _toggleSubViewItem; }
577
        std::function<void (ulong handle)> getHideAllSubViewItems() { return _hideAllSubViewItems; }
578
        std::function<void (ulong handle, ulong parent)> getHideSubViewItem() { return _hideSubViewItem; }
579
        std::function<void (ulong handle, int padding)> getSetSubViewPadding() { return _setSubViewPadding; }
458 andreas 580
        std::function<void (INTERCOM_t ic)> getInitializeIntercom() { return _initializeIntercom; }
446 andreas 581
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
582
        std::function<void (int orientation)> onOrientationChange() { return _onOrientationChange; }
583
        std::function<void (const std::string& oldNetlinx, int oldPort, int oldChannelID, const std::string& oldSurface, bool oldToolbarSuppress, bool oldToolbarForce)> onSettingsChanged() { return _onSettingsChanged; }
584
#endif
585
        bool getLevelSendState() { return mLevelSend; }
586
        bool getRxSendState() { return mRxOn; }
587
        std::function<void ()> getRepaintWindows() { return _repaintWindows; }
588
        int getOrientation() { return mOrientation; }
589
        void setOrientation(int ori) { mOrientation = ori; }
590
        bool getInformOrientation() { return mInformOrientation; }
591
        void sendOrientation();
592
        bool havePlaySound() { return _playSound != nullptr; }
593
        TSystemDraw *getSystemDraw() { return mSystemDraw; }
594
        void reset();
595
        bool getPassThrough() { return mPassThrough; }
596
        bool haveSetupPage() { return _callShowSetup != nullptr; }
597
        bool haveShutdown() { return _shutdown != nullptr; }
598
        void callSetupPage() { if (_callShowSetup) _callShowSetup(); }
599
        void callShutdown() { if (_shutdown) _shutdown(); }
600
#ifndef _NOSIP_
601
        bool getPHNautoanswer() { return mPHNautoanswer; }
602
        void sendPHN(std::vector<std::string>& cmds);
603
        void actPHN(std::vector<std::string>& cmds);
604
        void phonePickup(int id);
605
        void phoneHangup(int id);
606
#endif
607
        void addFtpSurface(const std::string& file, size_t size) { mFtpSurface.push_back(_FTP_SURFACE_t{file, size}); };
608
 
609
        inline size_t getFtpSurfaceSize(const std::string& file)
610
        {
611
            if (mFtpSurface.empty())
612
                return 0;
613
 
614
            std::vector<_FTP_SURFACE_t>::iterator iter;
615
 
616
            for (iter = mFtpSurface.begin(); iter != mFtpSurface.end(); ++iter)
617
            {
618
                if (iter->file == file)
619
                    return iter->size;
620
            }
621
 
622
            return 0;
623
        }
624
 
625
        void clearFtpSurface() { mFtpSurface.clear(); }
626
 
627
    protected:
628
        PAGELIST_T findPage(const std::string& name);
629
        PAGELIST_T findPage(int ID);
630
        SUBPAGELIST_T findSubPage(const std::string& name);
631
        SUBPAGELIST_T findSubPage(int ID);
632
 
633
        bool addPage(TPage *pg);
634
        bool addSubPage(TSubPage *pg);
635
        TSubPage *getCoordMatch(int x, int y);
636
        Button::TButton *getCoordMatchPage(int x, int y);
637
        void initialize();
638
        void dropAllPages();
639
        bool startComm();
640
 
641
    private:
642
        std::function<void (ulong handle, ulong parent, TBitmap image, int width, int height, int left, int top, bool passthrough, int marqtype, int marq)> _displayButton{nullptr};
643
        std::function<void (Button::TButton *button)> _setMarqueeText{nullptr};
644
        std::function<void (ulong handle)> _dropButton{nullptr};
645
        std::function<void (ulong handle, bool state)> _setVisible{nullptr};
646
        std::function<void (ulong handle, int width, int height)> _setPage{nullptr};
647
        std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, ANIMATION_t animate, bool modal)> _setSubPage{nullptr};
648
#ifdef _OPAQUE_SKIA_
649
        std::function<void (ulong handle, TBitmap image, int width, int height, ulong color)> _setBackground{nullptr};
650
#else
651
        std::function<void (ulong handle, TBitmap image, int width, int height, ulong color, int opacity)> _setBackground{nullptr};
652
#endif
479 andreas 653
        std::function<void (ulong handle, const std::string& text, const std::string& font, const std::string& family, int size, int x, int y, ulong color, ulong effectColor, FONT_STYLE style, Button::ORIENTATION ori, Button::TEXT_EFFECT effect, bool ww)> _setText{nullptr};
446 andreas 654
        std::function<void (ulong handle)> _callDropPage{nullptr};
655
        std::function<void (ulong handle, ulong parent)> _callDropSubPage{nullptr};
656
        std::function<void (ulong handle, ulong parent, int left, int top, int width, int height, const std::string& url, const std::string& user, const std::string& pw)> _callPlayVideo{nullptr};
657
        std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> _callInputText{nullptr};
658
        std::function<void (Button::TButton *button, Button::BITMAP_t& bm, int frame)> _callListBox{nullptr};
659
        std::function<void (const std::string& init, const std::string& prompt, bool priv)> _callKeyboard{nullptr};
660
        std::function<void (const std::string& init, const std::string& prompt, bool priv)> _callKeypad{nullptr};
661
        std::function<void ()> _callResetKeyboard{nullptr};
662
        std::function<void ()> _callShowSetup{nullptr};
663
        std::function<void ()> _resetSurface{nullptr};
664
        std::function<void ()> _shutdown{nullptr};
665
        std::function<void (const std::string& file)> _playSound{nullptr};
666
        std::function<void ()> _stopSound{nullptr};
667
        std::function<void (bool state)> _muteSound{nullptr};
668
        std::function<void (int volume)> _setVolume{nullptr};
669
        std::function<void (const std::string& str)> _sendVirtualKeys{nullptr};
670
        std::function<void (bool state)> _showPhoneDialog{nullptr};
671
        std::function<void (const std::string& number)> _setPhoneNumber{nullptr};
672
        std::function<void (const std::string& msg)> _setPhoneStatus{nullptr};
673
        std::function<void (int state, int id)> _setPhoneState{nullptr};
674
        std::function<void ()> _repaintWindows{nullptr};
675
        std::function<void (uint handle)> _toFront{nullptr};
676
        std::function<void (int width, int height)> _setMainWindowSize{nullptr};
677
        std::function<void (const std::string& file, size_t size)> _downloadSurface{nullptr};
678
        std::function<void (const std::string& msg, const std::string& title)> _displayMessage{nullptr};
679
        std::function<void (ulong handle, const std::string& msg, const std::string& title, int x, int y)> _askPassword{nullptr};
680
        std::function<void (ulong handle, const std::string& path, const std::string& extension, const std::string& suffix)> _fileDialog{nullptr};
681
        std::function<void (const std::string& text)> _startWait{nullptr};
682
        std::function<void ()> _stopWait{nullptr};
683
        std::function<void (ulong handle)> _pageFinished{nullptr};
684
        std::function<void (ulong handle, ulong parent, bool vertical, TBitmap buffer, int width, int height, int left, int top, int space, TColor::COLOR_T fillColor)> _displayViewButton{nullptr};
685
        std::function<void (Button::TButton& button, unsigned char *buffer, int pixline)> _addViewButtonItem{nullptr};
686
        std::function<void (ulong handle, ulong parent, TBitmap buffer, TColor::COLOR_T fillColor)> _updateViewButton{nullptr};
687
        std::function<void (ulong parent, std::vector<PGSUBVIEWITEM_T> items)> _addViewButtonItems{nullptr};
688
        std::function<void (PGSUBVIEWITEM_T& item, ulong parent)> _updateViewButtonItem{nullptr};
689
        std::function<void (ulong handle, ulong parent, int position, int timer)> _showSubViewItem{nullptr};
690
        std::function<void (ulong handle, ulong parent, int position, int timer)> _toggleSubViewItem{nullptr};
691
        std::function<void (ulong handle)> _hideAllSubViewItems{nullptr};
692
        std::function<void (ulong handle, ulong parent)> _hideSubViewItem{nullptr};
693
        std::function<void (ulong handle, int padding)> _setSubViewPadding{nullptr};
458 andreas 694
        std::function<void (INTERCOM_t ic)> _initializeIntercom{nullptr};
695
        std::function<void ()> _intercomStart{nullptr};
696
        std::function<void ()> _intercomStop{nullptr};
697
        std::function<void (int level)> _intercomSpkLevel{nullptr};
698
        std::function<void (int level)> _intercomMicLevel{nullptr};
699
        std::function<void (bool mute)> _intercomMute{nullptr};
446 andreas 700
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
701
        std::function<void (int orientation)> _onOrientationChange{nullptr};
702
        std::function<void (const std::string& oldNetlinx, int oldPort, int oldChannelID, const std::string& oldSurface, bool oldToolbarSuppress, bool oldToolbarForce)> _onSettingsChanged{nullptr};
703
#endif
704
        typedef struct _FTP_SURFACE_t
705
        {
706
            std::string file;
707
            size_t size{0};
708
        }_FTP_SURFACE_t;
709
 
710
        typedef enum _EVENT_TYPE
711
        {
712
            _EVENT_MOUSE_CLICK,
713
            _EVENT_MOUSE_MOVE
714
        }_EVENT_TYPE;
715
 
716
        typedef struct _CLICK_QUEUE_t
717
        {
718
            bool coords{false};
719
            ulong handle{0};
720
            bool pressed{false};
721
            int x{0};
722
            int y{0};
723
            _EVENT_TYPE eventType{_EVENT_MOUSE_CLICK};
724
        }_CLICK_QUEUE_t;
725
 
726
        /**
727
         * @brief doOverlap checks for overlapping objects
728
         *
729
         * The function checks whether some objects on the surface overlap or
730
         * not. If they do it returns TRUE.
731
         * This is used for images where we should check for a transparent
732
         * pixel.
733
         *
734
         * @param r1    The rectangular of the first object
735
         * @param r2    The rectangular of the second object
736
         * @return If the objects \p r1 and \p r2 overlap at least partialy,
737
         * TRUE is returned. Otherwise FALSE.
738
         */
739
        bool doOverlap(RECT_T r1, RECT_T r2);
740
        /**
741
         * The following function is used internaly. It searches in the map
742
         * table for the button corresponding to the port and channel number
743
         * and puts the result into a chain of buttons. This chain is returned.
744
         *
745
         * If there are some pages not yet in memory, they will be created just
746
         * to be able to set the button(s).
747
         */
748
        std::vector<Button::TButton *> collectButtons(std::vector<TMap::MAP_T>& map);
749
        /**
750
         * This internal function frees and destroys all settings, loaded pages
751
         * and sub pages as well as all buttons ens elements belonging to this
752
         * pages. Wehen the function is finished, the state is the same as it
753
         * was immediately at startup.
754
         * This method is called when a filetransfer starts. It is necessary to
755
         * start all over and read in the changed pages.
756
         *
757
         * @return Returns TRUE on success. Else it returns FALSE and the error
758
         * flag is set.
759
         */
760
        bool destroyAll();
761
 
762
        bool overlap(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
763
        TPage *loadPage(PAGELIST_T& pl, bool *refresh=nullptr);
764
        void setButtonCallbacks(Button::TButton *bt);
765
        bool sendCustomEvent(int value1, int value2, int value3, const std::string& msg, int evType, int cp, int cn);
766
        void reloadSystemPage(TPage *page);
767
        bool _setPageDo(int pageID, const std::string& name, bool forget);
768
        void runClickQueue();
769
        void runUpdateSubViewItem();
770
        void _mouseEvent(int x, int y, bool pressed);
771
        void _mouseEvent(ulong handle, bool pressed);
772
        void _updateSubViewItem(Button::TButton *bt);
773
        void _mouseMoveEvent(int x, int y);
774
#ifndef _NOSIP_
775
        std::string sipStateToString(TSIPClient::SIP_STATE_t s);
776
#endif
777
        // List of command functions
778
        void doFTR(int port, std::vector<int>&, std::vector<std::string>& pars);
779
        void doLEVON(int, std::vector<int>&, std::vector<std::string>&);
780
        void doLEVOF(int, std::vector<int>&, std::vector<std::string>&);
781
        void doRXON(int, std::vector<int>&, std::vector<std::string>&);
782
        void doRXOF(int, std::vector<int>&, std::vector<std::string>&);
783
 
784
        void doON(int port, std::vector<int>& channels, std::vector<std::string>& pars);
785
        void doOFF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
786
        void doLEVEL(int port, std::vector<int>& channels, std::vector<std::string>& pars);
787
        void doBLINK(int port, std::vector<int>& channels, std::vector<std::string>& pars);
788
        void doVER(int port, std::vector<int>& channels, std::vector<std::string>& pars);
789
#ifndef _NOSIP_
790
        void doWCN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
791
#endif
792
        void doAFP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
793
        void doAPG(int port, std::vector<int>& channels, std::vector<std::string>& pars);
794
        void doCPG(int port, std::vector<int>& channels, std::vector<std::string>& pars);
795
        void doDPG(int port, std::vector<int>& channels, std::vector<std::string>& pars);
796
        void doPHE(int port, std::vector<int>& channels, std::vector<std::string>& pars);
797
        void doPHP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
798
        void doPHT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
799
        void doPPA(int port, std::vector<int>& channels, std::vector<std::string>& pars);
800
        void doPPF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
801
        void doPPG(int port, std::vector<int>& channels, std::vector<std::string>& pars);
802
        void doPPK(int port, std::vector<int>& channels, std::vector<std::string>& pars);
803
        void doPPM(int port, std::vector<int>& channels, std::vector<std::string>& pars);
804
        void doPPN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
805
        void doPPT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
806
        void doPPX(int port, std::vector<int>& channels, std::vector<std::string>& pars);
807
        void doPSE(int port, std::vector<int>& channels, std::vector<std::string>& pars);
808
        void doPSP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
809
        void doPST(int port, std::vector<int>& channels, std::vector<std::string>& pars);
810
        void doPAGE(int port, std::vector<int>& channels, std::vector<std::string>& pars);
811
 
812
        void doANI(int port, std::vector<int>& channels, std::vector<std::string>& pars);
813
        void doAPF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
814
        void doBAT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
815
        void doBAU(int port, std::vector<int>& channels, std::vector<std::string>& pars);
816
        void doBCB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
817
        void getBCB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
818
        void doBCF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
819
        void getBCF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
820
        void doBCT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
821
        void getBCT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
822
        void doBDO(int port, std::vector<int>& channels, std::vector<std::string>& pars);
823
        void doBFB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
824
        void doBIM(int port, std::vector<int>& channels, std::vector<std::string>& pars);
825
        void doBMC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
826
        void doBMF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
827
        void doBML(int port, std::vector<int>& channels, std::vector<std::string>& pars);
828
        void doBMP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
829
        void getBMP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
830
        void doBOP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
831
        void getBOP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
832
        void doBOR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
833
        void doBOS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
834
        void doBRD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
835
        void getBRD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
836
        void doBSP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
837
        void doBSM(int port, std::vector<int>& channels, std::vector<std::string>& pars);
838
        void doBSO(int port, std::vector<int>& channels, std::vector<std::string>& pars);
839
        void doBWW(int port, std::vector<int>& channels, std::vector<std::string>& pars);
840
        void getBWW(int port, std::vector<int>& channels, std::vector<std::string>& pars);
841
        void doCPF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
842
        void doDPF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
843
        void doENA(int port, std::vector<int>& channels, std::vector<std::string>& pars);
844
        void doFON(int port, std::vector<int>& channels, std::vector<std::string>& pars);
845
        void getFON(int port, std::vector<int>& channels, std::vector<std::string>& pars);
846
        void doGDI(int port, std::vector<int>& channels, std::vector<std::string>& pars);
847
        void doGIV(int port, std::vector<int>& channels, std::vector<std::string>& pars);
848
        void doGLH(int port, std::vector<int>& channels, std::vector<std::string>& pars);
849
        void doGLL(int port, std::vector<int>& channels, std::vector<std::string>& pars);
850
        void doGSC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
851
        void doGRD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
852
        void doGRU(int port, std::vector<int>& channels, std::vector<std::string>& pars);
853
        void doGSN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
854
        void doICO(int port, std::vector<int>& channels, std::vector<std::string>& pars);
855
        void getICO(int port, std::vector<int>& channels, std::vector<std::string>& pars);
856
        void doJSB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
857
        void getJSB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
858
        void doJSI(int port, std::vector<int>& channels, std::vector<std::string>& pars);
859
        void getJSI(int port, std::vector<int>& channels, std::vector<std::string>& pars);
860
        void doJST(int port, std::vector<int>& channels, std::vector<std::string>& pars);
861
        void getJST(int port, std::vector<int>& channels, std::vector<std::string>& pars);
862
        void doMSP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
863
        void doSHO(int port, std::vector<int>& channels, std::vector<std::string>& pars);
864
        void doTEC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
865
        void getTEC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
866
        void doTEF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
867
        void getTEF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
868
        void doTXT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
869
        void getTXT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
870
        void doUNI(int port, std::vector<int>& channels, std::vector<std::string>& pars);
871
        void doUTF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
872
        void doVTP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
873
 
874
        void doKPS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
875
        void doVKS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
876
 
877
        void doAPWD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
878
        void doPWD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
879
 
880
        void doBBR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
881
        void doRAF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
882
        void doRFR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
883
        void doRMF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
884
        void doRSR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
885
 
886
        void doAKB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
887
        void doAKEYB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
888
        void doAKP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
889
        void doAKEYP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
890
        void doAKEYR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
891
        void doAKR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
892
        void doABEEP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
893
        void doADBEEP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
894
        void doBEEP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
895
        void doDBEEP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
896
        void doEKP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
897
        void doPKB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
898
        void doPKP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
899
        void doRPP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
900
        void doSetup(int port, std::vector<int>& channels, std::vector<std::string>& pars);
901
        void doShutdown(int port, std::vector<int>& channels, std::vector<std::string>& pars);
902
        void doSOU(int port, std::vector<int>& channels, std::vector<std::string>& pars);
903
        void doMUT(int port, std::vector<int>& channels, std::vector<std::string>& pars);
904
        void doTKP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
905
        void doVKB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
906
 
907
        void doLPB(int port, std::vector<int>& channels, std::vector<std::string>& pars);
908
        void doLPC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
909
        void doLPR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
910
        void doLPS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
911
 
457 andreas 912
        void getMODEL(int port, std::vector<int>& channels, std::vector<std::string>& pars);
913
        void doICS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
914
        void doICE(int port, std::vector<int>& channels, std::vector<std::string>& pars);
915
        void doICM(int port, std::vector<int>& channels, std::vector<std::string>& pars);
916
 
446 andreas 917
#ifndef _NOSIP_
918
        void doPHN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
919
        void getPHN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
920
#endif
921
        // Commands for subviews (G4/G5)
922
        void doSHA(int port, std::vector<int>& channels, std::vector<std::string>& pars);
923
        void doSHD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
924
        void doSPD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
925
        void doSSH(int port, std::vector<int>& channels, std::vector<std::string>& pars);
926
        void doSTG(int port, std::vector<int>& channels, std::vector<std::string>& pars);
927
 
928
        // Commands for ListView (G5)
929
        void doLVD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
930
        void doLVE(int port, std::vector<int>& channels, std::vector<std::string>& pars);
931
        void doLVF(int port, std::vector<int>& channels, std::vector<std::string>& pars);
932
        void doLVL(int port, std::vector<int>& channels, std::vector<std::string>& pars);
933
        void doLVM(int port, std::vector<int>& channels, std::vector<std::string>& pars);
934
        void doLVN(int port, std::vector<int>& channels, std::vector<std::string>& pars);
935
        void doLVR(int port, std::vector<int>& channels, std::vector<std::string>& pars);
936
        void doLVS(int port, std::vector<int>& channels, std::vector<std::string>& pars);
937
        // Commands inherited from TPControl (Touch Panel Control)
938
        void doTPCCMD(int port, std::vector<int>& channels, std::vector<std::string>& pars);
939
        void doTPCACC(int port, std::vector<int>& channels, std::vector<std::string>& pars);
940
#ifndef _NOSIP_
941
        void doTPCSIP(int port, std::vector<int>& channels, std::vector<std::string>& pars);
942
#endif
943
        std::mutex surface_mutex;
944
        std::mutex click_mutex;
945
        std::mutex updview_mutex;
946
 
947
        bool mLevelSend{false};                         // TRUE = Level changes are send to the master
948
        bool mRxOn{false};                              // TRUE = String changes are send to master
949
        int mActualPage{0};                             // The number of the actual visible page
950
        int mPreviousPage{0};                           // The number of the previous page
951
        int mLastSubPage{0};                            // The last sorted subpage accessed
952
        int mSavedPage{0};                              // The number of the last normal page. This is set immediately before a setup page is shown
953
        int mFirstLeftPixel{0};                         // Pixels to add to left (x) mouse coordinate
954
        int mFirstTopPixel{0};                          // Pixels to add to top (y) mouse position
955
        std::string mActualGroupName;                   // The name of the actual group
956
        TSubPage *mActualGroupPage{nullptr};            // Pointer to subpage of a group which is visible
957
 
958
        amx::TAmxNet *mAmxNet{nullptr};                 // Pointer to class TAmxNet; Handles the communication with the controller
959
        TPageList *mPageList{nullptr};                  // List of available pages and subpages
960
        PCHAIN_T *mPchain{nullptr};                     // Pointer to chain of pages in memory
961
        SPCHAIN_T *mSPchain{nullptr};                   // Pointer to chain of subpages in memory for the actual page
962
        TSettings *mTSettings{nullptr};                 // Pointer to basic settings for the panel
963
        TPalette *mPalette{nullptr};                    // Pointer to the color handler
964
        TFont *mFonts{nullptr};                         // Pointer to the font handler
965
        TExternal *mExternal{nullptr};                  // Pointer to the external buttons (if any)
966
        TSystemDraw *mSystemDraw{nullptr};              // A pointer to the (optional) system resources
967
        std::thread mThreadAmxNet;                      // The thread handle to the controler handler
968
        TVector<amx::ANET_COMMAND> mCommands;           // Command queue of commands received from controller
969
        std::string mCmdBuffer;                         // Internal used buffer for commands who need more than one network package
970
        std::string mAkbText;                           // This is the text for the virtual keyboard (@AKB)
971
        std::string mAkpText;                           // This is the text for the virtual keyad (@AKP)
972
        bool mPassThrough{false};                       // Can ve set to true with the command ^KPS
973
        bool mInformOrientation{false};                 // TRUE = The actual screen orientation is reported to the controller if it change.
974
        int mOrientation{0};                            // Contains the actual orientation.
975
        int mLastPagePush{0};                           // The number of the last page received a push (key press / mouse hit)
976
        double mDPI{96.0};                              // DPI (Dots Per Inch) of the primary display.
977
        std::atomic<bool> cmdLoop_busy{false};          // As long as this is true the command loop thread is active
978
        std::thread mThreadCommand;                     // Thread handle for command loop thread.
979
        std::vector<int> mSavedSubpages;                // When setup pages are called this contains the actual open subpages
980
        std::vector<_FTP_SURFACE_t> mFtpSurface;        // Contains a list of TP4 surface files gained from a NetLinx.
981
        std::atomic<bool> mClickQueueRun{false};        // TRUE = The click queue thread is running. FALSE: the thread should stop or is not running.
982
        std::vector<_CLICK_QUEUE_t> mClickQueue;        // A queue holding click requests. Needed to serialize the clicks.
983
        std::vector<Button::TButton *> mUpdateViews;    // A queue for the method "updateSubViewItem()"
984
        bool mUpdateViewsRun{false};                    // TRUE = The thread for the queue mUpdateViews is running
985
        std::vector<TButtonStates *> mButtonStates;       // Holds the states for each button
986
        // SIP
987
#ifndef _NOSIP_
988
        bool mPHNautoanswer{false};                     // The state of the SIP autoanswer
989
        TSIPClient *mSIPClient{nullptr};                // Includes the SIP client
990
#endif
991
#ifdef _SCALE_SKIA_
992
        double mScaleFactor{1.0};                       // The scale factor to zoom or shrink all components
993
        double mScaleFactorWidth{1.0};                  // The individual scale factor for the width
994
        double mScaleFactorHeight{1.0};                 // The individual scale factor for the height
995
 
996
        double mScaleSystem{1.0};                       // The scale factor for the system setup pages
997
        double mScaleSystemWidth{1.0};                  // The width scale factor for the system setup pages
998
        double mScaleSystemHeight{1.0};                 // The height scale factor for the system setup pages
999
#endif
1000
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
1001
        int mNetState{0};                               // On Android and IOS remembers the type of connection to the network (cell or wifi)
1002
#endif
1003
        std::map<int, std::function<void (int level)> > mNetCalls;  // List of callbacks for the network state multistate bargraph
1004
#ifdef Q_OS_ANDROID
1005
        std::map<int, std::function<void (int level, bool charging, int chargeType)> > mBatteryCalls;
1006
#endif
1007
#ifdef Q_OS_IOS
1008
        std::map<int, std::function<void (int level, int state)> > mBatteryCalls;
1009
        int mLastBatteryLevel{0};
1010
        int mLastBatteryState{0};
1011
#endif
1012
};
1013
 
1014
#ifdef __ANDROID__
1015
extern "C" {
1016
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_NetworkStatus_informTPanelNetwork(JNIEnv */*env*/, jclass /*clazz*/, jboolean conn, jint level, jint type);
1017
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_BatteryState_informBatteryStatus(JNIEnv */*env*/, jclass /*clazz*/, jint level, jboolean charge, jint chargeType);
1018
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_PhoneCallState_informPhoneState(JNIEnv *env, jclass cl, jboolean call, jstring pnumber);
1019
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_Logger_logger(JNIEnv *env, jclass cl, jint mode, jstring msg);
1020
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_Orientation_informTPanelOrientation(JNIEnv */*env*/, jclass /*clazz*/, jint orientation);
1021
    // Settings
1022
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxIp(JNIEnv *env, jclass clazz, jstring ip);
1023
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxPort(JNIEnv *env, jclass clazz, jint port);
1024
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxChannel(JNIEnv *env, jclass clazz, jint channel);
1025
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxType(JNIEnv *env, jclass clazz, jstring type);
1026
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxFtpUser(JNIEnv *env, jclass clazz, jstring user);
1027
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxFtpPassword(JNIEnv *env, jclass clazz, jstring pw);
1028
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxSurface(JNIEnv *env, jclass clazz, jstring surface);
1029
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setNetlinxFtpPassive(JNIEnv *env, jclass clazz, jboolean passive);
1030
 
1031
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setViewScale(JNIEnv *env, jclass clazz, jboolean scale);
1032
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setViewToolbar(JNIEnv *env, jclass clazz, jboolean bar);
1033
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setViewToolbarForce(JNIEnv *env, jclass clazz, jboolean bar);
1034
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setViewRotation(JNIEnv *env, jclass clazz, jboolean rotate);
1035
 
1036
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundSystem(JNIEnv *env, jclass clazz, jstring sound);
1037
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundSingle(JNIEnv *env, jclass clazz, jstring sound);
1038
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundDouble(JNIEnv *env, jclass clazz, jstring sound);
1039
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundEnable(JNIEnv *env, jclass clazz, jboolean sound);
1040
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundVolume(JNIEnv *env, jclass clazz, jint sound);
1041
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSoundGaim(JNIEnv *env, jclass clazz, jint sound);
1042
 
1043
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipProxy(JNIEnv *env, jclass clazz, jstring sip);
1044
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipPort(JNIEnv *env, jclass clazz, jint sip);
1045
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipTlsPort(JNIEnv *env, jclass clazz, jint sip);
1046
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipStun(JNIEnv *env, jclass clazz, jstring sip);
1047
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipDomain(JNIEnv *env, jclass clazz, jstring sip);
1048
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipUser(JNIEnv *env, jclass clazz, jstring sip);
1049
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipPassword(JNIEnv *env, jclass clazz, jstring sip);
1050
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipIpv4(JNIEnv *env, jclass clazz, jboolean sip);
1051
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipIpv6(JNIEnv *env, jclass clazz, jboolean sip);
1052
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipEnabled(JNIEnv *env, jclass clazz, jboolean sip);
1053
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setSipIphone(JNIEnv *env, jclass clazz, jboolean sip);
1054
 
1055
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogInfo(JNIEnv *env, jclass clazz, jboolean log);
1056
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogWarning(JNIEnv *env, jclass clazz, jboolean log);
1057
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogError(JNIEnv *env, jclass clazz, jboolean log);
1058
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogTrace(JNIEnv *env, jclass clazz, jboolean log);
1059
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogDebug(JNIEnv *env, jclass clazz, jboolean log);
1060
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogProfile(JNIEnv *env, jclass clazz, jboolean log);
1061
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogLongFormat(JNIEnv *env, jclass clazz, jboolean log);
1062
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogEnableFile(JNIEnv *env, jclass clazz, jboolean log);
1063
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setLogFile(JNIEnv *env, jclass clazz, jstring log);
1064
 
1065
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setPassword1(JNIEnv *env, jclass clazz, jstring pw);
1066
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setPassword2(JNIEnv *env, jclass clazz, jstring pw);
1067
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setPassword3(JNIEnv *env, jclass clazz, jstring pw);
1068
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_setPassword4(JNIEnv *env, jclass clazz, jstring pw);
1069
 
1070
    JNIEXPORT void JNICALL Java_org_qtproject_theosys_SettingsActivity_saveSettings(JNIEnv *env, jclass clazz);
1071
}
1072
#endif  // __ANDROID__
1073
 
1074
#endif