1 #ifndef SCRIPTCONTAINER_H
2 #define SCRIPTCONTAINER_H
3 
4 #include "can_structs.h"
5 #include "canfilter.h"
6 #include "bus_protocols/isotp_handler.h"
7 #include "bus_protocols/isotp_message.h"
8 #include "bus_protocols/uds_handler.h"
9 
10 #include <QElapsedTimer>
11 #include <QJSEngine>
12 #include <QTimer>
13 #include <qlistwidget.h>
14 
15 class ScriptingWindow;
16 
17 class CANScriptHelper: public QObject
18 {
19     Q_OBJECT
20 public:
21     CANScriptHelper(QJSEngine *engine);
22 
23 public slots:
24     void setFilter(QJSValue id, QJSValue mask, QJSValue bus);
25     void clearFilters();
26     void sendFrame(QJSValue bus, QJSValue id, QJSValue length, QJSValue data);
27     void setRxCallback(QJSValue cb);
28 
29 private slots:
30     void gotTargettedFrame(const CANFrame &frame);
31 
32 private:
33     QList<CANFilter> filters;
34     QJSValue gotFrameFunction;
35     QJSEngine *scriptEngine;
36 };
37 
38 class ISOTPScriptHelper: public QObject
39 {
40     Q_OBJECT
41 public:
42     ISOTPScriptHelper(QJSEngine *engine);
43 public slots:
44     void setFilter(QJSValue id, QJSValue mask, QJSValue bus);
45     void clearFilters();
46     void sendISOTP(QJSValue bus, QJSValue id, QJSValue length, QJSValue data);
47     void setRxCallback(QJSValue cb);
48 private slots:
49     void newISOMessage(ISOTP_MESSAGE msg);
50 private:
51     QJSValue gotFrameFunction;
52     QJSEngine *scriptEngine;
53     ISOTP_HANDLER *handler;
54 };
55 
56 class UDSScriptHelper: public QObject
57 {
58     Q_OBJECT
59 public:
60     UDSScriptHelper(QJSEngine *engine);
61 public slots:
62     void setFilter(QJSValue id, QJSValue mask, QJSValue bus);
63     void clearFilters();
64     void sendUDS(QJSValue bus, QJSValue id, QJSValue service, QJSValue sublen, QJSValue subFunc, QJSValue length, QJSValue data);
65     void setRxCallback(QJSValue cb);
66 private slots:
67     void newUDSMessage(UDS_MESSAGE msg);
68 private:
69     QJSValue gotFrameFunction;
70     QJSEngine *scriptEngine;
71     UDS_HANDLER *handler;
72 };
73 
74 class ScriptContainer : public QObject
75 {
76     Q_OBJECT
77 
78 public:
79     ScriptContainer();
80     virtual ~ScriptContainer();
81     void setScriptWindow(ScriptingWindow *win);
82 
83     QString fileName;
84     QString filePath;
85     QString scriptText;
86 
87 /*
88   Anything registered as a public slot on this class and that takes either no arguments
89   or only QJSValue arguments will be callable from scripts via  host.XXX calls. So, have at it, champ.
90 */
91 public slots:
92     void compileScript();
93     void setTickInterval(QJSValue interval);
94     void log(QJSValue logString);
95     void addParameter(QJSValue name);
96     void updateValuesTable(QTableWidget *widget);
97     void updateParameter(QString name, QString value);
98 
99 signals:
100     void sendLog(QString text);
101 
102 private slots:
103     void tick();
104 
105 private:
106     QJSEngine *scriptEngine;
107     QJSValue compiledScript;
108     QJSValue setupFunction;
109     QJSValue tickFunction;
110     QTimer timer;
111     ScriptingWindow *window;
112     CANScriptHelper *canHelper;
113     ISOTPScriptHelper *isoHelper;
114     UDSScriptHelper *udsHelper;
115     QVector<QString> scriptParams;
116 };
117 
118 #endif // SCRIPTCONTAINER_H
119