1 |
51 |
nyawn |
package advancedWatchpointControl;
|
2 |
|
|
|
3 |
|
|
import java.io.IOException;
|
4 |
|
|
import java.util.LinkedList;
|
5 |
|
|
import java.util.List;
|
6 |
|
|
|
7 |
|
|
|
8 |
|
|
|
9 |
|
|
public class mainControl {
|
10 |
|
|
|
11 |
|
|
public enum connectionStatus { NOT_CONNECTED, CONNECTING, CONNECTED, CONNECT_ERROR }
|
12 |
|
|
|
13 |
|
|
private targetDebugRegisterSet regSet = null;
|
14 |
|
|
private networkSystem netSys = null;
|
15 |
|
|
private targetTransactor transactor = null;
|
16 |
|
|
private rspCoder rsp = null;
|
17 |
|
|
// Yes, there really need to have three different observer interfaces,
|
18 |
|
|
// in case a single UI class wants to be more than one.
|
19 |
|
|
private List<RegisterObserver> registerObserverList = null;
|
20 |
|
|
private List<NetworkStatusObserver> networkStatusObserverList = null;
|
21 |
|
|
private List<LogMessageObserver> logmsgObserverList = null;
|
22 |
|
|
private String networkStatus = "";
|
23 |
|
|
private String logMessage = "";
|
24 |
|
|
|
25 |
|
|
public mainControl() {
|
26 |
|
|
registerObserverList = new LinkedList<RegisterObserver>();
|
27 |
|
|
networkStatusObserverList = new LinkedList<NetworkStatusObserver>();
|
28 |
|
|
logmsgObserverList = new LinkedList<LogMessageObserver>();
|
29 |
|
|
regSet = new targetDebugRegisterSet(); // Create the object to hold the debug registers
|
30 |
|
|
netSys = new networkSystem(this);
|
31 |
|
|
rsp = new rspCoder(netSys);
|
32 |
|
|
transactor = new targetTransactor(rsp);
|
33 |
|
|
}
|
34 |
|
|
|
35 |
|
|
public void setNetworkSystem(networkSystem ns) {
|
36 |
|
|
netSys = ns;
|
37 |
|
|
}
|
38 |
|
|
|
39 |
|
|
public void registerForRegsetUpdates(RegisterObserver obs) {
|
40 |
|
|
registerObserverList.add(obs);
|
41 |
|
|
}
|
42 |
|
|
|
43 |
|
|
public void registerForNetworkStatusUpdates(NetworkStatusObserver obs) {
|
44 |
|
|
networkStatusObserverList.add(obs);
|
45 |
|
|
}
|
46 |
|
|
|
47 |
|
|
public void registerForLogMessages(LogMessageObserver obs) {
|
48 |
|
|
logmsgObserverList.add(obs);
|
49 |
|
|
}
|
50 |
|
|
|
51 |
|
|
public targetDebugRegisterSet getRegSet() {
|
52 |
|
|
return regSet;
|
53 |
|
|
}
|
54 |
|
|
|
55 |
|
|
public void doNetworkConnect(String serverHostname, int port) {
|
56 |
|
|
if(netSys != null) {
|
57 |
|
|
netSys.connect(serverHostname, port);
|
58 |
|
|
}
|
59 |
|
|
}
|
60 |
|
|
|
61 |
|
|
public synchronized void doReadAllRegisters() {
|
62 |
|
|
try { // Any target interaction may throw an IOException.
|
63 |
|
|
|
64 |
|
|
if(transactor.isTargetRunning()) {
|
65 |
|
|
setLogMessage("Cannot read registers while target is running");
|
66 |
|
|
return;
|
67 |
|
|
}
|
68 |
|
|
|
69 |
|
|
// get all (debug) registers (we use) from the target
|
70 |
|
|
regSet.setDCR(0, transactor.readRegister(targetDebugRegisterSet.regType.DCR0));
|
71 |
|
|
regSet.setDCR(1, transactor.readRegister(targetDebugRegisterSet.regType.DCR1));
|
72 |
|
|
regSet.setDCR(2, transactor.readRegister(targetDebugRegisterSet.regType.DCR2));
|
73 |
|
|
regSet.setDCR(3, transactor.readRegister(targetDebugRegisterSet.regType.DCR3));
|
74 |
|
|
regSet.setDCR(4, transactor.readRegister(targetDebugRegisterSet.regType.DCR4));
|
75 |
|
|
regSet.setDCR(5, transactor.readRegister(targetDebugRegisterSet.regType.DCR5));
|
76 |
|
|
regSet.setDCR(6, transactor.readRegister(targetDebugRegisterSet.regType.DCR6));
|
77 |
|
|
regSet.setDCR(7, transactor.readRegister(targetDebugRegisterSet.regType.DCR7));
|
78 |
|
|
regSet.setDVR(0, transactor.readRegister(targetDebugRegisterSet.regType.DVR0));
|
79 |
|
|
regSet.setDVR(1, transactor.readRegister(targetDebugRegisterSet.regType.DVR1));
|
80 |
|
|
regSet.setDVR(2, transactor.readRegister(targetDebugRegisterSet.regType.DVR2));
|
81 |
|
|
regSet.setDVR(3, transactor.readRegister(targetDebugRegisterSet.regType.DVR3));
|
82 |
|
|
regSet.setDVR(4, transactor.readRegister(targetDebugRegisterSet.regType.DVR4));
|
83 |
|
|
regSet.setDVR(5, transactor.readRegister(targetDebugRegisterSet.regType.DVR5));
|
84 |
|
|
regSet.setDVR(6, transactor.readRegister(targetDebugRegisterSet.regType.DVR6));
|
85 |
|
|
regSet.setDVR(7, transactor.readRegister(targetDebugRegisterSet.regType.DVR7));
|
86 |
|
|
regSet.setDWCR0(transactor.readRegister(targetDebugRegisterSet.regType.DWCR0));
|
87 |
|
|
regSet.setDWCR1(transactor.readRegister(targetDebugRegisterSet.regType.DWCR1));
|
88 |
|
|
regSet.setDMR1(transactor.readRegister(targetDebugRegisterSet.regType.DMR1));
|
89 |
|
|
regSet.setDMR2(transactor.readRegister(targetDebugRegisterSet.regType.DMR2));
|
90 |
|
|
} catch (IOException e) {
|
91 |
|
|
setLogMessage("Network error: " + e.getMessage());
|
92 |
|
|
// *** TODO Disconnect?? Retry?
|
93 |
|
|
}
|
94 |
|
|
|
95 |
|
|
// Notify observers to set GUI elements accordingly
|
96 |
|
|
try {
|
97 |
|
|
for(RegisterObserver obs : registerObserverList) {
|
98 |
|
|
obs.notifyRegisterUpdate(RegisterObserver.updateDirection.REGS_TO_GUI);
|
99 |
|
|
}
|
100 |
|
|
} catch(NumberFormatException e) {
|
101 |
|
|
// Since we're going long->String, this should never happen.
|
102 |
|
|
setLogMessage("Impossible exception while updating GUI!");
|
103 |
|
|
}
|
104 |
|
|
}
|
105 |
|
|
|
106 |
|
|
public synchronized void doWriteAllRegisters() {
|
107 |
|
|
|
108 |
|
|
try {
|
109 |
|
|
|
110 |
|
|
if(transactor.isTargetRunning()) {
|
111 |
|
|
setLogMessage("Cannot write registers while target is running");
|
112 |
|
|
return;
|
113 |
|
|
}
|
114 |
|
|
|
115 |
|
|
// Notify observers to set registers from GUI elements
|
116 |
|
|
try {
|
117 |
|
|
for(RegisterObserver obs : registerObserverList) {
|
118 |
|
|
obs.notifyRegisterUpdate(RegisterObserver.updateDirection.GUI_TO_REGS);
|
119 |
|
|
}
|
120 |
|
|
} catch (NumberFormatException e) {
|
121 |
|
|
// DVRs must be converted from Strings. This may fail and throw the exception.
|
122 |
|
|
setLogMessage("Illegal DVR value, registers not written");
|
123 |
|
|
return;
|
124 |
|
|
}
|
125 |
|
|
|
126 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR0, regSet.getDCR(0));
|
127 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR1, regSet.getDCR(1));
|
128 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR2, regSet.getDCR(2));
|
129 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR3, regSet.getDCR(3));
|
130 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR4, regSet.getDCR(4));
|
131 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR5, regSet.getDCR(5));
|
132 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR6, regSet.getDCR(6));
|
133 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DCR7, regSet.getDCR(7));
|
134 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR0, regSet.getDVR(0));
|
135 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR1, regSet.getDVR(1));
|
136 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR2, regSet.getDVR(2));
|
137 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR3, regSet.getDVR(3));
|
138 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR4, regSet.getDVR(4));
|
139 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR5, regSet.getDVR(5));
|
140 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR6, regSet.getDVR(6));
|
141 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DVR7, regSet.getDVR(7));
|
142 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DWCR0, regSet.getDWCR0());
|
143 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DWCR1, regSet.getDWCR1());
|
144 |
|
|
// Note that DMR2 must be written AFTER the DWCR registers. If
|
145 |
|
|
// DMR2 is written first, then the trap condition will be cleared,
|
146 |
|
|
// but it will still exist because count still equals match val
|
147 |
|
|
// in the DWCR.
|
148 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DMR1, regSet.getDMR1());
|
149 |
|
|
transactor.writeRegister(targetDebugRegisterSet.regType.DMR2, regSet.getDMR2());
|
150 |
|
|
} catch (IOException e) {
|
151 |
|
|
setLogMessage("Network error: " + e.getMessage());
|
152 |
|
|
// TODO *** Disconnect? Retry??
|
153 |
|
|
}
|
154 |
|
|
}
|
155 |
|
|
|
156 |
|
|
|
157 |
|
|
// This is thread-safe for the GUI. It must be used by the network thread (receiveResponse()
|
158 |
|
|
// and anything called from it) to log messages to the GUI.
|
159 |
|
|
public void setLogMessage(final String msg) {
|
160 |
|
|
|
161 |
|
|
logMessage = msg;
|
162 |
|
|
|
163 |
|
|
// Tell the display(s) to fetch and show the status
|
164 |
|
|
for(LogMessageObserver obs : logmsgObserverList) {
|
165 |
|
|
obs.notifyLogMessage();
|
166 |
|
|
}
|
167 |
|
|
}
|
168 |
|
|
|
169 |
|
|
public String getLogMessage() {
|
170 |
|
|
return logMessage;
|
171 |
|
|
}
|
172 |
|
|
|
173 |
|
|
// This just puts the status into a member variable,
|
174 |
|
|
// for the network status observers to retrieve.
|
175 |
|
|
public void setNetworkStatus(connectionStatus cStatus) {
|
176 |
|
|
switch(cStatus) {
|
177 |
|
|
case NOT_CONNECTED:
|
178 |
|
|
networkStatus = "Not Connected";
|
179 |
|
|
break;
|
180 |
|
|
case CONNECTING:
|
181 |
|
|
networkStatus = "Connecting...";
|
182 |
|
|
break;
|
183 |
|
|
case CONNECTED:
|
184 |
|
|
networkStatus = "Connected";
|
185 |
|
|
break;
|
186 |
|
|
case CONNECT_ERROR:
|
187 |
|
|
networkStatus = "Error Connecting";
|
188 |
|
|
break;
|
189 |
|
|
default:
|
190 |
|
|
networkStatus = "Unknown Error";
|
191 |
|
|
}
|
192 |
|
|
|
193 |
|
|
// Tell the display(s) to fetch and show the status
|
194 |
|
|
for(NetworkStatusObserver obs : networkStatusObserverList) {
|
195 |
|
|
obs.notifyNetworkStatus();
|
196 |
|
|
}
|
197 |
|
|
}
|
198 |
|
|
|
199 |
|
|
public String getNetworkStatus() {
|
200 |
|
|
return networkStatus;
|
201 |
|
|
}
|
202 |
|
|
}
|