Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TCPTARGET_H
00022 #define TCPTARGET_H
00023
00024 #include "Target.h"
00025 #include "../common/consts.h"
00026 #include "../msg/descriptions-manager.h"
00027 #include <QString>
00028 #include <QDialog>
00029 #include <QQueue>
00030 #include <QTimer>
00031 #include <QThread>
00032 #include <map>
00033 #include <dashel/dashel.h>
00034
00035 class QPushButton;
00036 class QGroupBox;
00037 class QLineEdit;
00038 class QSpinBox;
00039 class QListWidget;
00040 class QComboBox;
00041 class QTranslator;
00042
00043
00044 namespace Dashel
00045 {
00046 class Stream;
00047 }
00048
00049 namespace Aseba
00050 {
00053
00054 class DashelConnectionDialog : public QDialog
00055 {
00056 Q_OBJECT
00057
00058 protected:
00059 QPushButton* connectButton;
00060 QGroupBox* netGroupBox;
00061 QLineEdit* host;
00062 QSpinBox* port;
00063 QGroupBox* serialGroupBox;
00064 QListWidget* serial;
00065 QGroupBox* customGroupBox;
00066 QLineEdit* custom;
00067 QComboBox* languageSelectionBox;
00068
00069 public:
00070 DashelConnectionDialog();
00071 std::string getTarget();
00072 QString getLocaleName();
00073
00074 public slots:
00075 void netGroupChecked();
00076 void serialGroupChecked();
00077 void customGroupChecked();
00078 void setupOkStateFromListSelection();
00079 };
00080
00081 class Message;
00082 class UserMessage;
00083
00084 class DashelInterface: public QThread, public Dashel::Hub
00085 {
00086 Q_OBJECT
00087
00088 public:
00089 bool isRunning;
00090 Dashel::Stream* stream;
00091 std::string lastConnectedTarget;
00092 QString language;
00093
00094 public:
00095 DashelInterface(QVector<QTranslator*> translators, const QString& commandLineTarget);
00096 bool attemptToReconnect();
00097
00098
00099 virtual void stop();
00100
00101 signals:
00102 void messageAvailable(Message *message);
00103 void dashelDisconnection();
00104
00105 protected:
00106
00107 virtual void run();
00108
00109
00110 virtual void incomingData(Dashel::Stream *stream);
00111 virtual void connectionClosed(Dashel::Stream *stream, bool abnormal);
00112 };
00113
00115 class SignalingDescriptionsManager: public QObject, public DescriptionsManager
00116 {
00117 Q_OBJECT
00118
00119 signals:
00120 void nodeDescriptionReceivedSignal(unsigned nodeId);
00121
00122 protected:
00123 virtual void nodeProtocolVersionMismatch(const std::string &nodeName, uint16 protocolVersion);
00124 virtual void nodeDescriptionReceived(unsigned nodeId);
00125 };
00126
00127 class DashelTarget: public Target
00128 {
00129 Q_OBJECT
00130
00131 protected:
00132 struct Node
00133 {
00134 Node();
00135
00136 BytecodeVector debugBytecode;
00137 BytecodeVector::EventAddressesToIdsMap eventAddressToId;
00138 unsigned steppingInNext;
00139 unsigned lineInNext;
00140 ExecutionMode executionMode;
00141 };
00142
00143 typedef void (DashelTarget::*MessageHandler)(Message *message);
00144 typedef std::map<unsigned, MessageHandler> MessagesHandlersMap;
00145 typedef std::map<unsigned, Node> NodesMap;
00146
00147 DashelInterface dashelInterface;
00148
00149 MessagesHandlersMap messagesHandlersMap;
00150
00151 QQueue<UserMessage *> userEventsQueue;
00152 SignalingDescriptionsManager descriptionManager;
00153 NodesMap nodes;
00154 QTimer userEventsTimer;
00155 bool writeBlocked;
00156
00157 public:
00158 friend class InvasivePlugin;
00159 DashelTarget(QVector<QTranslator*> translators, const QString& commandLineTarget);
00160 ~DashelTarget();
00161
00162 virtual QString getLanguage() const { return dashelInterface.language; }
00163
00164 virtual void disconnect();
00165
00166 virtual const TargetDescription * const getDescription(unsigned node) const;
00167
00168 virtual void broadcastGetDescription();
00169
00170 virtual void uploadBytecode(unsigned node, const BytecodeVector &bytecode);
00171 virtual void writeBytecode(unsigned node);
00172 virtual void reboot(unsigned node);
00173
00174 virtual void sendEvent(unsigned id, const VariablesDataVector &data);
00175
00176 virtual void setVariables(unsigned node, unsigned start, const VariablesDataVector &data);
00177 virtual void getVariables(unsigned node, unsigned start, unsigned length);
00178
00179 virtual void reset(unsigned node);
00180 virtual void run(unsigned node);
00181 virtual void pause(unsigned node);
00182 virtual void next(unsigned node);
00183 virtual void stop(unsigned node);
00184
00185 virtual void setBreakpoint(unsigned node, unsigned line);
00186 virtual void clearBreakpoint(unsigned node, unsigned line);
00187 virtual void clearBreakpoints(unsigned node);
00188
00189 protected:
00190 virtual void blockWrite();
00191 virtual void unblockWrite();
00192
00193 protected slots:
00194 void updateUserEvents();
00195 void messageFromDashel(Message *message);
00196 void disconnectionFromDashel();
00197 void nodeDescriptionReceived(unsigned node);
00198
00199 protected:
00200 void receivedDescription(Message *message);
00201 void receivedLocalEventDescription(Message *message);
00202 void receivedNativeFunctionDescription(Message *message);
00203 void receivedDisconnected(Message *message);
00204 void receivedVariables(Message *message);
00205 void receivedArrayAccessOutOfBounds(Message *message);
00206 void receivedDivisionByZero(Message *message);
00207 void receivedEventExecutionKilled(Message *message);
00208 void receivedNodeSpecificError(Message *message);
00209 void receivedExecutionStateChanged(Message *message);
00210 void receivedBreakpointSetResult(Message *message);
00211 void receivedBootloaderAck(Message *message);
00212
00213 protected:
00214 bool emitNodeConnectedIfDescriptionComplete(unsigned id, const Node& node);
00215 int getPCFromLine(unsigned node, unsigned line);
00216 int getLineFromPC(unsigned node, unsigned pc);
00217
00218 protected:
00219 void handleDashelException(Dashel::DashelException e);
00220 };
00221
00223 };
00224
00225 #endif