Subversion Repositories HomeAutomation

Rev

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