Subversion Repositories HomeAutomation

Rev

Rev 456 | Go to most recent revision | Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
455 arune 1
using System;
2
using System.Threading;
3
using System.Collections.Generic;
4
using System.Text;
5
 
6
class Program {
7
	const byte DEBUG_LEVEL = 3;	//0, 1, 2, 3
8
	//static SerialConnection sc;
9
	static DaemonConnection dc;
10
	static Arguments CommandLine;
11
	//static TcpServer tcps;
12
	static Downloader dl;
13
 
14
	//private const byte CAN_NMT = 0x00;
15
 
16
	//private const byte CAN_NMT_RESET = 0x04;
17
	//private const byte CAN_NMT_START_APP 	= 0x24;
18
	//private const byte CAN_NMT_APP_START 	= 0x28;
19
	private const byte MY_ID = 0x00;
20
	private const byte MY_NID = 0x0;
21
 
22
	private static HexFile hf;
23
	static bool aBios=false;
24
	static bool aReset=false;
25
	static bool aStart=false;
26
	static bool aTerminal=false;
27
 
28
	static bool sNodeid=false;
29
	static bool sHexfile=false;
30
 
31
	static string hexfile=null;
32
	static byte nodeid=0;
33
	static string host=null;
34
	static int port=1200;
35
 
36
	static void Main(string[] args) {
37
 
38
		bool error = false;
39
		if (args.Length < 4) {
40
			Console.WriteLine("Syntax: program.exe [options] -h <host> -p <port>");
41
			Console.WriteLine("Host and port are host and port of canDaemon, most likely localhost and 1200.");
42
			Console.WriteLine("Options:");
43
			Console.WriteLine("  -f <hexfile>   Specify a file to be loaded to target.");
44
			Console.WriteLine("  -n <nodeid>    Id of target node, hex or decimal.");
45
			Console.WriteLine("  -t             Enter terminal mode.");
46
			Console.WriteLine("  -r             Reset node before loading target.");
47
			Console.WriteLine("  -s             Start node after loading target.");
48
			Console.WriteLine("  -b             Program hex as bios, use with caution.");
49
			error = true;
50
            return;
51
		} 
52
 
53
		if (!error) {
54
			//Console.WriteLine("arg0: " + args[0] + "\n");
55
			//argPort = args[0];
56
			//argBaud = Int32.Parse(args[1]);
57
			CommandLine=new Arguments(args);
58
 
59
			if (CommandLine["b"] == "true") { aBios = true; }
60
			if (CommandLine["r"] == "true") { aReset = true; }
61
			if (CommandLine["s"] == "true") { aStart = true; }
62
			if (CommandLine["t"] == "true") { aTerminal = true; }
63
 
64
			hexfile = CommandLine["f"];
65
 
66
			if (hexfile != null) {
67
				sHexfile = true;
68
			}
69
			if (!aTerminal && !sHexfile) {
70
				Console.WriteLine("When not in terminal mode a hexfile must be supplied");
71
				error = true;
72
			} 
73
 
74
			string node = CommandLine["n"];
75
 
76
			if (!parseNodeId(node)) {
77
				error = true;
78
			}
79
 
80
			if (!aTerminal && !sNodeid) {
81
				Console.WriteLine("When not in terminal mode a nodeid must be supplied");
82
				error = true;
83
			} 
84
 
85
			host = CommandLine["h"];
86
			string sPort = CommandLine["p"];
87
			if ((host == null) || (sPort.Length == 0)) {
88
				error = true;
89
			} else {
90
				try {
91
					port = int.Parse(sPort);
92
				} catch {
93
					error = true;
94
				}
95
			}
96
		}
97
 
98
		if  (!error) {
99
			//commandline feedback output (use debuglevel for hiding these)
100
			Console.WriteLine("canDude settings:");
101
			Console.WriteLine("Nodeaddress: 0x" + String.Format("{0:x2}", nodeid));
102
			Console.WriteLine("Host: {0}:{1}", host, port);
103
			if (hexfile != null) { Console.WriteLine("Hexfile: {0}", hexfile); }
104
			Console.Write("Parameters: ");
105
			if (aBios) { Console.Write("Bios "); }
106
			if (aReset) { Console.Write("Reset "); }
107
			if (aStart) { Console.Write("Start "); }
108
			if (aTerminal) { Console.Write("Terminal"); }
109
			Console.WriteLine("");
110
		}
111
 
112
		if (!error && aTerminal) {
113
			bool success = true;
114
 
115
			dc = new DaemonConnection();
116
			if (dc.init(host, port)) {
117
				Console.WriteLine("Connected to candaemon");
118
			} else { 
119
				Console.WriteLine("Connection to candaemon could not be established, I quit");
120
				success = false; 
121
			}
122
 
123
			hf = new HexFile();
124
			if (sHexfile && success) {
125
				if (hf.loadHex(hexfile)) {
126
					Console.WriteLine("Hexfile loaded");
127
				} else { success = false; }
128
			}
129
 
130
			if (success) {
131
				if (DEBUG_LEVEL>0) {
132
					Console.WriteLine("");
133
					Console.WriteLine("canDude commands:");
134
					//Console.WriteLine("reset - reset communication.");
135
					Console.WriteLine("exit             - exit program");
136
					Console.WriteLine("load [<hexfile>] - reload hexfile or load new hexfile");
137
					Console.WriteLine("node <nodeid>    - specify id of target node, hex or decimal");
138
					Console.WriteLine("reset            - reset node");
139
					Console.WriteLine("start            - start application in node (no feedback yet)");
140
					Console.WriteLine("go               - start download application to target");
141
					Console.WriteLine("go bios          - start download bios to target, use with caution");
142
					Console.WriteLine("");
143
					//Thread.Sleep(1000);
144
				}
145
 
146
				string instr;
147
				do {
148
					Console.Write("> ");
149
					instr = Console.ReadLine().ToLower();
150
				} while (parseInput(instr));
151
 
152
				//exit command
153
				dc.stop();
154
			}
155
		}
156
 
157
		if (!error && !aTerminal) {
158
			//not terminal mode
159
			bool success = true;
160
 
161
			//load hexfile (a hexfile must be supplied as commandline argument)
162
			hf = new HexFile();
163
			if (hf.loadHex(hexfile)) {
164
				Console.WriteLine("Hexfile loaded");
165
			} else { 
166
				success = false;
167
				Console.WriteLine("Hexfile could not be loaded, I quit");
168
			}
169
 
170
			//connect to candaemon
171
			dc = new DaemonConnection();
172
			if (success) {
173
				if (dc.init(host, port)) {
174
					Console.WriteLine("Connected to candaemon");
175
				} else { 
176
					Console.WriteLine("Connection to candaemon could not be established, I quit");
177
					success = false; 
178
				}
179
			}
180
 
181
			//if a hexfile is loaded and we are connected to candaemon then start autodownloading sequence
182
			if (success) {
183
				bool autosuccess = true;
184
 
185
				CanNMT cpn = new CanNMT();
186
				if (aReset) {
187
					//send a reset command (and wait for feedback)
188
					if (!cpn.doReset(dc, nodeid)) {
189
						Console.WriteLine("Target node did not respond to reset, I quit");
190
						autosuccess = false;
191
					}
192
				}
193
 
194
				if (autosuccess) {
195
					//send application
196
					Console.WriteLine("Programming not implemented yet, I quit");
197
					autosuccess = false;
198
				}
199
 
200
				if (autosuccess && aStart) {
201
					//start applikation
202
					cpn.doStart(dc, nodeid);
203
				}
204
 
205
			}
206
		}
207
	}
208
 
209
	static private bool parseNodeId(string node) {
210
		sNodeid = false;
211
		if (node.Length > 0) {
212
			try {
213
				nodeid = byte.Parse(node);
214
				sNodeid = true;
215
			} catch {}
216
		}
217
		if (node.Length > 2) {
218
			if (node.Substring(0, 2).Equals("0x")) {
219
				if (node.Length == 3) {
220
					try {
221
						nodeid = byte.Parse(node.Substring(2, 1), System.Globalization.NumberStyles.HexNumber);
222
						sNodeid = true;
223
					} catch {
224
						Console.WriteLine("nodeadress error!");
225
						return false;
226
					}
227
				} else if (node.Length == 4) {
228
					try {
229
						nodeid = byte.Parse(node.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
230
						sNodeid = true;
231
					} catch {
232
						Console.WriteLine("nodeadress error!");
233
						return false;
234
					}
235
				} else {
236
					Console.WriteLine("nodeadress error!");
237
					return false;
238
				}
239
			}
240
		}
241
 
242
		return true;
243
	}
244
 
245
	static private bool parseInput(string instr) {
246
		if (instr.Equals("reset")) {
247
			if (sNodeid) {
248
				CanNMT cpn = new CanNMT();
249
				cpn.doReset(dc, nodeid);
250
			} else {
251
				Console.WriteLine("No nodeid has been specified");
252
			}
253
		}
254
		else if (instr.Equals("start")) {
255
			if (sNodeid) {
256
				CanNMT cpn = new CanNMT();
257
				cpn.doStart(dc, nodeid);
258
			} else {
259
				Console.WriteLine("No nodeid has been specified");
260
			}
261
		}
262
		else if (instr.StartsWith("go")) {
263
			bool dlBios = false;
264
			bool error = true;
265
			if (instr.Equals("go bios")) {
266
				dlBios = true;
267
				error = false;
268
			} else if (instr.Equals("go")) {
269
				error = false;
270
			}
271
 
272
			if (!sNodeid) {
273
				Console.WriteLine("No nodeid has been specified");
274
				error = true;
275
			}
276
			if (!sHexfile) {
277
				Console.WriteLine("No hexfile has been specified");
278
				error = true;
279
			}
280
 
281
			CanNMT cpn = new CanNMT();
282
			if (!error && aReset) {
283
				//send a reset command (and wait for feedback)
284
				if (!cpn.doReset(dc, nodeid)) {
285
					Console.WriteLine("Target node did not respond to reset");
286
					error = true;
287
				}
288
			}
289
 
290
			if (!error) {
291
				//send application
292
				dl = new Downloader(hf, dc, nodeid, dlBios);
293
				if (!dl.go()) { 
294
					Console.WriteLine("Error occured during download"); 
295
					error = true;
296
				}
297
			}
298
 
299
			if (!error && aStart) {
300
				//start applikation
301
				cpn.doStart(dc, nodeid);
302
			}
303
 
304
		}
305
		else if (instr.StartsWith("load")) {
306
			if (instr.Length > 5) {
307
				//second argument is a hexfile, this file should be loaded
308
				hexfile = instr.Substring(5);
309
				if (hf.loadHex(hexfile)) {
310
					sHexfile = true;
311
					Console.WriteLine("Hexfile loaded");
312
				} else { 
313
					Console.WriteLine("Hexfile could not be loaded");
314
				}
315
			} else {
316
				//reload current hexfile. if a hexfile already has been specified
317
				if (sHexfile) {
318
					if (hf.loadHex(hexfile)) {
319
						Console.WriteLine("Hexfile reloaded");
320
					} else { 
321
						Console.WriteLine("Hexfile could not be reloaded");
322
					}
323
				} else {
324
					Console.WriteLine("No hexfile has been specified");
325
				}
326
 
327
			}
328
		}
329
		else if (instr.StartsWith("node")) {
330
			//change nodeid
331
			if (instr.Length > 5) {
332
				//second argument is nodeid
333
				string node = instr.Substring(5);
334
				parseNodeId(node);
335
			}
336
			Console.WriteLine("NodeId is 0x"+ String.Format("{0:x2}", nodeid));
337
		}
338
		else if (instr.Equals("exit")) {
339
			return false;
340
		}
341
		else {
342
			Console.WriteLine("Unknown command.");
343
		}
344
 
345
		return true;
346
	}
347
 
348
}