Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
270 johboh 1
#define STRICT
2
#include "HexFile.h"
3
 
4
 
5
HexFile::HexFile()
6
{
7
    // Constructior
8
}
9
 
10
HexFile::~HexFile()
11
{
12
    //Destructor
13
}
14
 
15
bool HexFile::isValid()
16
{
17
    // Returns if file is a valid hex file.
18
    // TBD!
19
 
20
    return true;
21
}
22
 
23
bool HexFile::loadHex(char filepath[], bool isMC18)
24
{
25
    // Populate buffer
26
 
27
    unsigned char lineDataCount = 0;
28
    unsigned long lineAddrHigh = 0;
29
    unsigned long lineAddr = 0;
30
    unsigned char lineCode = 0;
31
    unsigned long fullAddr = 0;
32
 
33
 
34
 
35
    strcpy_s(HexFile::filepath,FILE_PATH_SIZE,filepath);
36
    HexFile::length = 0;
37
    HexFile::addrLower = 0x7FFFFFFF;
38
    HexFile::addrUpper = 0;
39
 
40
    // Prime the buffer
41
    for (int i = 0; i < BUFFER_SIZE; i++) buff[i] = 0xFF;
42
 
43
 
44
    // Try opening file
45
    ifstream a_file (filepath);
46
 
47
    if ( !a_file.is_open() )
48
    {
49
        // The file could not be opened
50
        strcpy_s(lastError,ERROR_BUFFER_SIZE,"Err! Unable to open file.");
51
        return false;
52
    }
53
    else
54
    {
55
        // Safely use the file stream
56
 
57
        char oneLine[LINE_MAX_SIZE];
58
 
59
        // For each line, read until eof.
60
        while (!a_file.eof())
61
        {
62
            // read one line
63
            a_file.getline(&oneLine[0],LINE_MAX_SIZE);
64
 
65
            // If valid line
66
            if (strcmp(oneLine,"")!=0 && oneLine[0]==':')
67
            {
68
 
69
                lineDataCount = (unsigned char)HexFile::hexToLong(oneLine,1,2);
70
                lineAddr = (unsigned long)HexFile::hexToLong(oneLine,3,4) & 65535;      
71
                lineCode = (unsigned char)HexFile::hexToLong(oneLine,7,2);    
72
 
73
                fullAddr = (lineAddrHigh * 65536) + lineAddr;
74
 
75
                switch(lineCode)
76
                {
77
                        case 0:
78
                            HexFile::length +=lineDataCount;
79
                            if ((fullAddr + lineDataCount - 1) > HexFile::addrUpper) HexFile::addrUpper = fullAddr + lineDataCount - 1;
80
                            if (lineCode == 0 && fullAddr < HexFile::addrLower) HexFile::addrLower = fullAddr;
81
                            for (int j = 0; j < lineDataCount; j++)
82
                            {
83
                                buff[fullAddr] = (unsigned char)HexFile::hexToLong(oneLine,j * 2 + 9, 2); //byte.Parse(oneLine.Substring(j * 2 + 9, 2), System.Globalization.NumberStyles.HexNumber);
84
                                buff[fullAddr] &= 255; //(byte)255;
85
                                fullAddr++;
86
                            }
87
                            break;
88
                        case 4:
89
                            lineAddrHigh = (unsigned long)HexFile::hexToLong(oneLine,9, 4) & 65535; //long.Parse(oneLine.Substring(9, 4), System.Globalization.NumberStyles.HexNumber) & 65535;
90
                            break;
91
                        case 1: break; break;
92
 
93
                }
94
 
95
            }
96
 
97
        }
98
 
99
    }
100
 
101
    // Force lower addr to start
102
    HexFile::addrLower = USER_RESET_ADDR;
103
 
104
    return true;
105
}
106
 
107
 
108
unsigned long HexFile::getAddrUpper(void) { return addrUpper; }
109
 
110
unsigned long HexFile::getAddrLower(void) { return addrLower; }
111
 
112
unsigned long HexFile::getLength(void) { return length; }
113
 
114
unsigned char HexFile::getByte(unsigned long addr)
115
{
116
    if (addr>=BUFFER_SIZE) return 0xFF;
117
    return HexFile::buff[addr];
118
}
119
 
120
// hex to integer
121
unsigned long HexFile::hexToLong(char *str,unsigned int start,unsigned int length)
122
{
123
    unsigned long lng = 0;
124
 
125
    for (unsigned int i=0;i<length;i++)
126
    {
127
        unsigned int newi=i+start;
128
        if (newi>=strlen(str)) break;
129
 
130
        if(str[newi]>='0' && str[newi]<='9')     { lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'0'+00); }
131
        else if(str[newi]>='a' && str[newi]<='f'){ lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'a'+10); }
132
        else if(str[newi]>='A' && str[newi]<='F'){ lng +=(unsigned long)pow(16.0,(double)(length-i-1))*(str[newi]-'A'+10); }
133
        else { lng = 0; break; }
134
    }
135
 
136
    return lng;
137
}