Kinetis Bootloader Host  2.0.0
Host Tools for Kinetis devices
apps/elftosb/common/StSRecordFile.h
1 /*
2  * File: StSRecordFile.h
3  *
4  * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
5  * See included license file for license details.
6  */
7 #if !defined(_StSRecordFile_h_)
8 #define _StSRecordFile_h_
9 
10 //#include <stdint.h>
11 #include "stdafx.h"
12 #include <istream>
13 #include <string>
14 #include <vector>
15 #include <stdexcept>
16 
17 enum
18 {
20  SRECORD_START_CHAR = 'S',
21 
23  SRECORD_MIN_LENGTH = 10,
24 
26  SRECORD_ADDRESS_START_CHAR_INDEX = 4
27 };
28 
39 {
40 public:
44  struct SRecord
45  {
46  unsigned m_type;
47  unsigned m_count;
48  uint32_t m_address;
49  unsigned m_dataCount;
50  uint8_t *m_data;
51  uint8_t m_checksum;
52  };
53 
55  typedef std::vector<SRecord>::const_iterator const_iterator;
56 
57 public:
59  StSRecordFile(std::istream &inStream);
60 
62  virtual ~StSRecordFile();
63 
65 
66  virtual void setName(const std::string &inName) { m_name = inName; }
67  virtual std::string getName() const { return m_name; }
69 
71 
72  virtual bool isSRecordFile();
74 
76  virtual void parse();
78 
80 
81  inline unsigned getRecordCount() const { return static_cast<unsigned>(m_records.size()); }
84  inline const_iterator getBegin() const { return m_records.begin(); }
85  inline const_iterator getEnd() const { return m_records.end(); }
87 
89 
90  inline const SRecord &operator[](unsigned inIndex) { return m_records[inIndex]; }
92 
93 protected:
94  std::istream &m_stream;
95  std::vector<SRecord> m_records;
96 
97  std::string m_name;
98 
100 
101  virtual void parseLine(std::string &inLine);
102 
103  bool isHexDigit(char c);
104  int hexDigitToInt(char digit);
105  int readHexByte(std::string &inString, int inIndex);
107 };
108 
112 class StSRecordParseException : public std::runtime_error
113 {
114 public:
116  StSRecordParseException(const std::string &inMessage)
117  : std::runtime_error(inMessage)
118  {
119  }
120 };
121 
122 #endif // _StSRecordFile_h_
uint8_t m_checksum
The checksum byte present in the S-record.
Definition: apps/elftosb/common/StSRecordFile.h:51
Definition: apps/elftosb/common/StSRecordFile.h:44
virtual void parse()
Parses the entire S-record input stream.
Definition: apps/elftosb/common/StSRecordFile.cpp:54
uint32_t m_address
The address specified as part of the S-record.
Definition: apps/elftosb/common/StSRecordFile.h:48
std::istream & m_stream
The input stream for the S-record data.
Definition: apps/elftosb/common/StSRecordFile.h:94
STL namespace.
unsigned m_dataCount
Number of bytes of data.
Definition: apps/elftosb/common/StSRecordFile.h:49
S-record parser.
Definition: apps/elftosb/common/StSRecordFile.h:38
int readHexByte(std::string &inString, int inIndex)
Definition: apps/elftosb/common/StSRecordFile.cpp:108
std::string m_name
File name. (optional)
Definition: apps/elftosb/common/StSRecordFile.h:97
Simple exception thrown to indicate an error in the input SRecord data format.
Definition: apps/elftosb/common/StSRecordFile.h:112
std::vector< SRecord >::const_iterator const_iterator
Iterator type.
Definition: apps/elftosb/common/StSRecordFile.h:55
std::vector< SRecord > m_records
Vector of S-records in the input data.
Definition: apps/elftosb/common/StSRecordFile.h:95
const_iterator getBegin() const
Definition: apps/elftosb/common/StSRecordFile.h:84
unsigned getRecordCount() const
Definition: apps/elftosb/common/StSRecordFile.h:82
unsigned m_count
Number of character pairs (bytes) from address through checksum.
Definition: apps/elftosb/common/StSRecordFile.h:47
virtual ~StSRecordFile()
Destructor.
Definition: apps/elftosb/common/StSRecordFile.cpp:18
StSRecordFile(std::istream &inStream)
Constructor.
Definition: apps/elftosb/common/StSRecordFile.cpp:12
StSRecordParseException(const std::string &inMessage)
Default constructor.
Definition: apps/elftosb/common/StSRecordFile.h:116
unsigned m_type
Record number type, such as 9 for "S9", 3 for "S3" and so on.
Definition: apps/elftosb/common/StSRecordFile.h:46
virtual void parseLine(std::string &inLine)
Parses individual S-records.
Definition: apps/elftosb/common/StSRecordFile.cpp:128
virtual bool isSRecordFile()
Determine if the file is an S-record file.
Definition: apps/elftosb/common/StSRecordFile.cpp:33
uint8_t * m_data
Pointer to data, or NULL if no data for this record type.
Definition: apps/elftosb/common/StSRecordFile.h:50