Subversion Repositories HomeAutomation

Rev

Rev 456 | Rev 459 | 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
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
 
456 arune 76
            if (node != null) {
77
                if (!parseNodeId(node)) {
78
                    error = true;
79
                }
455 arune 80
            }
81
 
82
            if (!aTerminal && !sNodeid) {
83
                Console.WriteLine("When not in terminal mode a nodeid must be supplied");
84
                error = true;
85
            }
86
 
87
            host = CommandLine["h"];
88
            string sPort = CommandLine["p"];
89
            if ((host == null) || (sPort.Length == 0)) {
90
                error = true;
91
            } else {
92
                try {
93
                    port = int.Parse(sPort);
94
                } catch {
95
                    error = true;
96
                }
97
            }
98
        }
99
 
100
        if  (!error) {
101
            //commandline feedback output (use debuglevel for hiding these)
102
            Console.WriteLine("canDude settings:");
456 arune 103
            if (sNodeid) { Console.WriteLine("Nodeaddress: 0x" + String.Format("{0:x2}", nodeid)); }
455 arune 104
            Console.WriteLine("Host: {0}:{1}", host, port);
105
            if (hexfile != null) { Console.WriteLine("Hexfile: {0}", hexfile); }
106
            Console.Write("Parameters: ");
107
            if (aBios) { Console.Write("Bios "); }
108
            if (aReset) { Console.Write("Reset "); }
109
            if (aStart) { Console.Write("Start "); }
110
            if (aTerminal) { Console.Write("Terminal"); }
111
            Console.WriteLine("");
112
        }
113
 
114
        if (!error && aTerminal) {
115
            bool success = true;
116
 
117
            dc = new DaemonConnection();
118
            if (dc.init(host, port)) {
119
                Console.WriteLine("Connected to candaemon");
120
            } else {
121
                Console.WriteLine("Connection to candaemon could not be established, I quit");
122
                success = false;
123
            }
124
 
125
            hf = new HexFile();
126
            if (sHexfile && success) {
127
                if (hf.loadHex(hexfile)) {
128
                    Console.WriteLine("Hexfile loaded");
129
                } else { success = false; }
130
            }
131
 
132
            if (success) {
133
                if (DEBUG_LEVEL>0) {
134
                    Console.WriteLine("");
458 arune 135
                    printHelp();
455 arune 136
                    Console.WriteLine("");
137
                    //Thread.Sleep(1000);
138
                }
139
 
140
                string instr;
141
                do {
142
                    Console.Write("> ");
456 arune 143
                    instr = Console.ReadLine();
455 arune 144
                } while (parseInput(instr));
145
 
146
                //exit command
147
                dc.stop();
148
            }
149
        }
150
 
151
        if (!error && !aTerminal) {
152
            //not terminal mode
153
            bool success = true;
154
 
155
            //load hexfile (a hexfile must be supplied as commandline argument)
156
            hf = new HexFile();
157
            if (hf.loadHex(hexfile)) {
158
                Console.WriteLine("Hexfile loaded");
159
            } else {
160
                success = false;
161
                Console.WriteLine("Hexfile could not be loaded, I quit");
162
            }
163
 
164
            //connect to candaemon
165
            dc = new DaemonConnection();
166
            if (success) {
167
                if (dc.init(host, port)) {
168
                    Console.WriteLine("Connected to candaemon");
169
                } else {
170
                    Console.WriteLine("Connection to candaemon could not be established, I quit");
171
                    success = false;
172
                }
173
            }
174
 
175
            //if a hexfile is loaded and we are connected to candaemon then start autodownloading sequence
176
            if (success) {
177
                bool autosuccess = true;
178
 
179
                CanNMT cpn = new CanNMT();
180
                if (aReset) {
181
                    //send a reset command (and wait for feedback)
182
                    if (!cpn.doReset(dc, nodeid)) {
183
                        Console.WriteLine("Target node did not respond to reset, I quit");
184
                        autosuccess = false;
185
                    }
186
                }
187
 
188
                if (autosuccess) {
189
                    //send application
190
                    Console.WriteLine("Programming not implemented yet, I quit");
191
                    autosuccess = false;
192
                }
193
 
194
                if (autosuccess && aStart) {
195
                    //start applikation
196
                    cpn.doStart(dc, nodeid);
197
                }
198
 
199
            }
200
        }
201
    }
202
 
458 arune 203
    static private void printHelp() {
204
        Console.WriteLine("canDude commands:");
205
        //Console.WriteLine("reset - reset communication.");
206
        Console.WriteLine("load [<hexfile>] - reload hexfile or load new hexfile");
207
        Console.WriteLine("node <nodeid>    - specify id of target node, hex or decimal");
208
        Console.WriteLine("reset            - reset node");
209
        Console.WriteLine("start            - start application in node (no feedback yet)");
210
        Console.WriteLine("go               - start download application to target");
211
        Console.WriteLine("go bios          - start download bios to target, use with caution");
212
        Console.WriteLine("help             - prints this help");
213
        Console.WriteLine("exit or quit     - exit program");
214
    }  
215
 
455 arune 216
    static private bool parseNodeId(string node) {
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 {
231
                        Console.WriteLine("nodeadress error!");
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 {
239
                        Console.WriteLine("nodeadress error!");
240
                        return false;
241
                    }
242
                } else {
243
                    Console.WriteLine("nodeadress error!");
244
                    return false;
245
                }
246
            }
247
        }
248
 
249
        return true;
250
    }
251
 
252
    static private bool parseInput(string instr) {
253
        if (instr.Equals("reset")) {
254
            if (sNodeid) {
255
                CanNMT cpn = new CanNMT();
256
                cpn.doReset(dc, nodeid);
257
            } else {
258
                Console.WriteLine("No nodeid has been specified");
259
            }
260
        }
261
        else if (instr.Equals("start")) {
262
            if (sNodeid) {
263
                CanNMT cpn = new CanNMT();
264
                cpn.doStart(dc, nodeid);
265
            } else {
266
                Console.WriteLine("No nodeid has been specified");
267
            }
268
        }
269
        else if (instr.StartsWith("go")) {
270
            bool dlBios = false;
271
            bool error = true;
272
            if (instr.Equals("go bios")) {
273
                dlBios = true;
274
                error = false;
275
            } else if (instr.Equals("go")) {
276
                error = false;
277
            }
278
 
279
            if (!sNodeid) {
280
                Console.WriteLine("No nodeid has been specified");
281
                error = true;
282
            }
283
            if (!sHexfile) {
284
                Console.WriteLine("No hexfile has been specified");
285
                error = true;
286
            }
287
 
288
            CanNMT cpn = new CanNMT();
289
            if (!error && aReset) {
290
                //send a reset command (and wait for feedback)
291
                if (!cpn.doReset(dc, nodeid)) {
292
                    Console.WriteLine("Target node did not respond to reset");
293
                    error = true;
294
                }
295
            }
296
 
297
            if (!error) {
298
                //send application
299
                dl = new Downloader(hf, dc, nodeid, dlBios);
300
                if (!dl.go()) {
301
                    Console.WriteLine("Error occured during download");
302
                    error = true;
303
                }
304
            }
305
 
306
            if (!error && aStart) {
307
                //start applikation
308
                cpn.doStart(dc, nodeid);
309
            }
310
 
311
        }
312
        else if (instr.StartsWith("load")) {
313
            if (instr.Length > 5) {
314
                //second argument is a hexfile, this file should be loaded
315
                hexfile = instr.Substring(5);
316
                if (hf.loadHex(hexfile)) {
317
                    sHexfile = true;
318
                    Console.WriteLine("Hexfile loaded");
319
                } else {
320
                    Console.WriteLine("Hexfile could not be loaded");
321
                }
322
            } else {
323
                //reload current hexfile. if a hexfile already has been specified
324
                if (sHexfile) {
325
                    if (hf.loadHex(hexfile)) {
326
                        Console.WriteLine("Hexfile reloaded");
327
                    } else {
328
                        Console.WriteLine("Hexfile could not be reloaded");
329
                    }
330
                } else {
331
                    Console.WriteLine("No hexfile has been specified");
332
                }
333
 
334
            }
335
        }
336
        else if (instr.StartsWith("node")) {
337
            //change nodeid
338
            if (instr.Length > 5) {
339
                //second argument is nodeid
340
                string node = instr.Substring(5);
341
                parseNodeId(node);
342
            }
343
            Console.WriteLine("NodeId is 0x"+ String.Format("{0:x2}", nodeid));
344
        }
458 arune 345
        else if (instr.Equals("help")) {
346
            printHelp();
347
        }
348
        else if (instr.Equals("exit") || instr.Equals("quit")) {
455 arune 349
            return false;
350
        }
351
        else {
352
            Console.WriteLine("Unknown command.");
353
        }
354
 
355
        return true;
356
    }
357
 
358
}