Subversion Repositories HomeAutomation

Rev

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