Subversion Repositories HomeAutomation

Rev

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