Subversion Repositories HomeAutomation

Rev

Rev 450 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
450 arune 1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.IO;
5
using System.Globalization;
6
 
7
public class HexFile {
8
    private const ulong USER_RESET_ADDR = 0; //0x1000;  //0x1000 för PIC??
9
    private const ulong BUFFER_SIZE = 5200000;
10
    private const ulong LINE_MAX_SIZE = 1024;
11
    private const ulong ERROR_BUFFER_SIZE = 256;
12
    private const ulong FILE_PATH_SIZE = 256;
13
 
14
    private ulong length = 0;
15
    private ulong addrLower = 0;
16
    private ulong addrUpper = 0;
17
    private string filepath = "";
18
    private bool valid = false;
19
    private byte[] buff = new byte[BUFFER_SIZE];
20
 
21
    public HexFile() { }
22
 
23
    public bool isValid() { return valid; }
24
 
25
    public bool loadHex(string filepath) {
26
        // Populate buffer
27
 
28
        byte lineDataCount = 0;
29
        ulong lineAddrHigh = 0;
30
        ulong lineAddr = 0;
31
        byte lineCode = 0;
32
        ulong fullAddr = 0;
33
 
34
        this.filepath = filepath;
35
        this.length = 0;
36
        this.addrLower = 0x7FFFFFFF;
37
        this.addrUpper = 0;
38
        this.valid = false;
39
 
40
        // Prime the buffer
41
        for (ulong i = 0; i < BUFFER_SIZE; i++) buff[i] = 0xFF;
42
 
43
 
44
        // Try opening file
45
        if (!File.Exists(this.filepath)) {
46
            // The file could not be opened
47
            Console.WriteLine("Error in HexFile: Unable to load file.");
48
            return false;
49
        }
50
        else {
51
            FileStream file = new FileStream(this.filepath, FileMode.Open, FileAccess.Read);
52
            StreamReader sr = new StreamReader(file);
53
 
54
            // Safely use the file stream
55
 
56
            // For each line, read until eof.
57
            while (!sr.EndOfStream) {
58
                // read one line
59
                string oneLine = sr.ReadLine();
60
 
61
                // If valid line
62
                if (!oneLine.Equals("") && oneLine[0]==':') {
63
                    lineDataCount = byte.Parse(oneLine.Substring(1,2), NumberStyles.HexNumber);
64
                    lineAddr =  ulong.Parse(oneLine.Substring(3,4),NumberStyles.HexNumber) & 65535;  
65
                    lineCode = byte.Parse(oneLine.Substring(7,2), NumberStyles.HexNumber);  
66
                    fullAddr = (lineAddrHigh * 65536) + lineAddr;
67
 
68
                    switch(lineCode) {
69
                            case 0:
70
                                this.length +=lineDataCount;
71
                                if ((fullAddr + lineDataCount - 1) > this.addrUpper) this.addrUpper = fullAddr + lineDataCount - 1;
72
                                if (lineCode == 0 && fullAddr < this.addrLower) this.addrLower = fullAddr;
73
                                for (int j = 0; j < lineDataCount; j++) {
74
                                    buff[fullAddr] = byte.Parse(oneLine.Substring(j * 2 + 9, 2), System.Globalization.NumberStyles.HexNumber);
75
                                    buff[fullAddr] &= (byte)255;
76
                                    fullAddr++;
77
                                }
78
                                break;
79
                            case 4:
80
                                lineAddrHigh = ulong.Parse(oneLine.Substring(9, 4), System.Globalization.NumberStyles.HexNumber) & 65535;
81
                                break;
82
                            case 1: break;
83
 
84
                    }
85
                    //Console.WriteLine("lineDataCount: " + lineCode + " lineAddr: " + lineAddr + " lineCode: " + lineCode + " addrLower: " + this.addrLower);
86
                }
87
            }
88
 
89
            this.valid = true;
90
            sr.Close();
91
        }
92
 
93
        // Force lower addr to start
94
        //this.addrLower = USER_RESET_ADDR;
95
 
96
        return true;
97
    }
98
 
99
 
100
    public ulong getAddrUpper() { return addrUpper; }
101
 
102
    public ulong getAddrLower() { return addrLower; }
103
 
104
    public ulong getLength() { return length; }
105
 
106
    public byte getByte(ulong addr)
107
    {
108
        if (addr>=BUFFER_SIZE) return 0xFF;
109
        return buff[addr];
110
    }
111
 
112
}