Subversion Repositories HomeAutomation

Rev

Rev 455 | Rev 458 | 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("");
135
                    Console.WriteLine("canDude commands:");
136
                    //Console.WriteLine("reset - reset communication.");
137
                    Console.WriteLine("exit             - exit program");
138
                    Console.WriteLine("load [<hexfile>] - reload hexfile or load new hexfile");
139
                    Console.WriteLine("node <nodeid>    - specify id of target node, hex or decimal");
140
                    Console.WriteLine("reset            - reset node");
141
                    Console.WriteLine("start            - start application in node (no feedback yet)");
142
                    Console.WriteLine("go               - start download application to target");
143
                    Console.WriteLine("go bios          - start download bios to target, use with caution");
144
                    Console.WriteLine("");
145
                    //Thread.Sleep(1000);
146
                }
147
 
148
                string instr;
149
                do {
150
                    Console.Write("> ");
456 arune 151
                    instr = Console.ReadLine();
455 arune 152
                } while (parseInput(instr));
153
 
154
                //exit command
155
                dc.stop();
156
            }
157
        }
158
 
159
        if (!error && !aTerminal) {
160
            //not terminal mode
161
            bool success = true;
162
 
163
            //load hexfile (a hexfile must be supplied as commandline argument)
164
            hf = new HexFile();
165
            if (hf.loadHex(hexfile)) {
166
                Console.WriteLine("Hexfile loaded");
167
            } else {
168
                success = false;
169
                Console.WriteLine("Hexfile could not be loaded, I quit");
170
            }
171
 
172
            //connect to candaemon
173
            dc = new DaemonConnection();
174
            if (success) {
175
                if (dc.init(host, port)) {
176
                    Console.WriteLine("Connected to candaemon");
177
                } else {
178
                    Console.WriteLine("Connection to candaemon could not be established, I quit");
179
                    success = false;
180
                }
181
            }
182
 
183
            //if a hexfile is loaded and we are connected to candaemon then start autodownloading sequence
184
            if (success) {
185
                bool autosuccess = true;
186
 
187
                CanNMT cpn = new CanNMT();
188
                if (aReset) {
189
                    //send a reset command (and wait for feedback)
190
                    if (!cpn.doReset(dc, nodeid)) {
191
                        Console.WriteLine("Target node did not respond to reset, I quit");
192
                        autosuccess = false;
193
                    }
194
                }
195
 
196
                if (autosuccess) {
197
                    //send application
198
                    Console.WriteLine("Programming not implemented yet, I quit");
199
                    autosuccess = false;
200
                }
201
 
202
                if (autosuccess && aStart) {
203
                    //start applikation
204
                    cpn.doStart(dc, nodeid);
205
                }
206
 
207
            }
208
        }
209
    }
210
 
211
    static private bool parseNodeId(string node) {
212
        sNodeid = false;
213
        if (node.Length > 0) {
214
            try {
215
                nodeid = byte.Parse(node);
216
                sNodeid = true;
217
            } catch {}
218
        }
219
        if (node.Length > 2) {
220
            if (node.Substring(0, 2).Equals("0x")) {
221
                if (node.Length == 3) {
222
                    try {
223
                        nodeid = byte.Parse(node.Substring(2, 1), System.Globalization.NumberStyles.HexNumber);
224
                        sNodeid = true;
225
                    } catch {
226
                        Console.WriteLine("nodeadress error!");
227
                        return false;
228
                    }
229
                } else if (node.Length == 4) {
230
                    try {
231
                        nodeid = byte.Parse(node.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
232
                        sNodeid = true;
233
                    } catch {
234
                        Console.WriteLine("nodeadress error!");
235
                        return false;
236
                    }
237
                } else {
238
                    Console.WriteLine("nodeadress error!");
239
                    return false;
240
                }
241
            }
242
        }
243
 
244
        return true;
245
    }
246
 
247
    static private bool parseInput(string instr) {
248
        if (instr.Equals("reset")) {
249
            if (sNodeid) {
250
                CanNMT cpn = new CanNMT();
251
                cpn.doReset(dc, nodeid);
252
            } else {
253
                Console.WriteLine("No nodeid has been specified");
254
            }
255
        }
256
        else if (instr.Equals("start")) {
257
            if (sNodeid) {
258
                CanNMT cpn = new CanNMT();
259
                cpn.doStart(dc, nodeid);
260
            } else {
261
                Console.WriteLine("No nodeid has been specified");
262
            }
263
        }
264
        else if (instr.StartsWith("go")) {
265
            bool dlBios = false;
266
            bool error = true;
267
            if (instr.Equals("go bios")) {
268
                dlBios = true;
269
                error = false;
270
            } else if (instr.Equals("go")) {
271
                error = false;
272
            }
273
 
274
            if (!sNodeid) {
275
                Console.WriteLine("No nodeid has been specified");
276
                error = true;
277
            }
278
            if (!sHexfile) {
279
                Console.WriteLine("No hexfile has been specified");
280
                error = true;
281
            }
282
 
283
            CanNMT cpn = new CanNMT();
284
            if (!error && aReset) {
285
                //send a reset command (and wait for feedback)
286
                if (!cpn.doReset(dc, nodeid)) {
287
                    Console.WriteLine("Target node did not respond to reset");
288
                    error = true;
289
                }
290
            }
291
 
292
            if (!error) {
293
                //send application
294
                dl = new Downloader(hf, dc, nodeid, dlBios);
295
                if (!dl.go()) {
296
                    Console.WriteLine("Error occured during download");
297
                    error = true;
298
                }
299
            }
300
 
301
            if (!error && aStart) {
302
                //start applikation
303
                cpn.doStart(dc, nodeid);
304
            }
305
 
306
        }
307
        else if (instr.StartsWith("load")) {
308
            if (instr.Length > 5) {
309
                //second argument is a hexfile, this file should be loaded
310
                hexfile = instr.Substring(5);
311
                if (hf.loadHex(hexfile)) {
312
                    sHexfile = true;
313
                    Console.WriteLine("Hexfile loaded");
314
                } else {
315
                    Console.WriteLine("Hexfile could not be loaded");
316
                }
317
            } else {
318
                //reload current hexfile. if a hexfile already has been specified
319
                if (sHexfile) {
320
                    if (hf.loadHex(hexfile)) {
321
                        Console.WriteLine("Hexfile reloaded");
322
                    } else {
323
                        Console.WriteLine("Hexfile could not be reloaded");
324
                    }
325
                } else {
326
                    Console.WriteLine("No hexfile has been specified");
327
                }
328
 
329
            }
330
        }
331
        else if (instr.StartsWith("node")) {
332
            //change nodeid
333
            if (instr.Length > 5) {
334
                //second argument is nodeid
335
                string node = instr.Substring(5);
336
                parseNodeId(node);
337
            }
338
            Console.WriteLine("NodeId is 0x"+ String.Format("{0:x2}", nodeid));
339
        }
340
        else if (instr.Equals("exit")) {
341
            return false;
342
        }
343
        else {
344
            Console.WriteLine("Unknown command.");
345
        }
346
 
347
        return true;
348
    }
349
 
350
}