source: asp3_wo_tecs/trunk/cfg/common/SRecord.rb@ 304

Last change on this file since 304 was 304, checked in by ertl-honda, 7 years ago

コンフィギュレータをruby版に変更

File size: 6.5 KB
Line 
1#!ruby -Ku
2#
3# TOPPERS Configurator by Ruby
4#
5# Copyright (C) 2015 by Embedded and Real-Time Systems Laboratory
6# Graduate School of Information Science, Nagoya Univ., JAPAN
7# Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
8#
9# 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11# ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12# 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14# (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15# 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16# スコード中に含まれていること.
17# (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18# 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21# 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23# の無保証規定を掲載すること.
24# (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25# 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27# と.
28# (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31# 作権表示,この利用条件および下記の無保証規定を掲載すること.
32# (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35# 報告すること.
36# (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37# 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40# また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41# 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43# å…
44è²¬ã™ã‚‹ã“と.
45#
46# 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48# よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49# に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50# アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51# の責任を負わない.
52#
53# $Id: SRecord.rb 25 2016-01-29 16:48:00Z ertl-hiro $
54#
55
56######################################################################
57# Sレコードファイル処理クラス定義
58######################################################################
59class SRecord
60 def initialize(sFile)
61 @hSrecData = {}
62 @sOneLineData = ""
63 File.open(sFile){|cFile|
64 cFile.each{|sLine|
65 # レコードタイプ
66 sType = sLine.slice(0, 2)
67
68 # データレコードのみ処理する
69 case sType
70 when "S1"
71 # データ長(アドレス分[2byte]+チェックサム分1byteを減算)
72 nLength = sLine.slice(2, 2).hex() - 2 - 1
73
74 # アドレス(4文字=2byte)
75 nAddress = sLine.slice(4, 4).hex()
76
77 # データ(この時点では文字列で取っておく)
78 sData = sLine.slice(8, nLength * 2)
79 when "S2"
80 # データ長(アドレス分[3byte]+チェックサム分1byteを減算)
81 nLength = sLine.slice(2, 2).hex() - 3 - 1
82
83 # アドレス(6文字=3byte)
84 nAddress = sLine.slice(4, 6).hex()
85
86 # データ(この時点では文字列で取っておく)
87 sData = sLine.slice(10, nLength * 2)
88 when "S3"
89 # データ長(アドレス分[4byte]+チェックサム分1byteを減算)
90 nLength = sLine.slice(2, 2).hex() - 4 - 1
91
92 # アドレス(8文字=4byte)
93 nAddress = sLine.slice(4, 8).hex()
94
95 # データ(この時点では文字列で取っておく)
96 sData = sLine.slice(12, nLength * 2)
97 else
98 nAddress = nil
99 end
100
101 if (!nAddress.nil?)
102 @hSrecData[nAddress] = sData
103 end
104 }
105 }
106 @hSrecData.freeze()
107
108 # å…
109¨ãƒ‡ãƒ¼ã‚¿ã‚’1行に変換(å…
110ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’取得しておく)
111 @nHeadAddress = nil
112 nPreAddress = nil
113 nPreData = nil
114 @hSrecData.each{|nAddress, sData|
115 if (@nHeadAddress.nil?)
116 @nHeadAddress = nAddress
117 end
118
119 # アドレスが飛んだ場合0で埋めておく
120 if (!nPreAddress.nil? && !nPreData.nil?)
121 nOffset = nAddress - nPreAddress
122 nDiff = nOffset - (nPreData.size() / 2)
123 if (nDiff > 0)
124 @sOneLineData += "0" * (nDiff * 2)
125 end
126 end
127 nPreAddress = nAddress
128 nPreData = sData
129
130 # å…
131¨ãƒ‡ãƒ¼ã‚¿ã«è¿½åŠ 
132 @sOneLineData += sData
133 }
134 end
135
136 # データ取得
137 def get_data(nAddress, nSize)
138 # アドレス範囲外の場合
139 nChkSize = ((nAddress - @nHeadAddress) * 2) + (nSize * 2)
140 if (nChkSize > @sOneLineData.size())
141 return nil
142 else
143 return @sOneLineData.slice(((nAddress - @nHeadAddress) * 2), (nSize * 2))
144 end
145 end
146
147 # データ書込み
148 def set_data(nAddress, sData)
149 nIdx = (nAddress - @nHeadAddress) * 2
150 sData.chars{|sChar|
151 @sOneLineData[nIdx] = sChar
152 nIdx += 1
153 }
154 end
155
156 # 値としてのデータ取得
157 def get_value(nAddress, nSize, bSigned)
158 nReturnData = nil
159 sTargetData = get_data(nAddress, nSize)
160 if (sTargetData.nil?)
161 return nil
162 end
163
164 # リトルエンディアンの場合,バイトオーダーを逆にする
165 if ($bLittleEndian == true)
166 sReverseStr = ""
167 # 後ろから2文字ずつ抜き出し,並び替える
168 while (sTargetData.size() != 0)
169 sReverseStr += sTargetData[-2]
170 sReverseStr += sTargetData[-1]
171 sTargetData.chop!().chop!()
172 end
173 sTargetData = sReverseStr
174 end
175
176 if (bSigned == false)
177 # 符号無しの場合,そのまま16進数として解釈する
178 nReturnData = sTargetData.hex()
179 else
180 # 1文字目を2進数の文字列で取得
181 sBin = sprintf("%04b", sTargetData[0].hex())
182 if (sBin[0] == "0")
183 # 正の数であればそのまま変換
184 nReturnData = sTargetData.hex()
185 else
186 # 2の補数表現から負の値を取得
187 nBaseNum = ("0x1" + ("0" * nSize * 2)).hex()
188 nReturnData = (-1) * (nBaseNum - sTargetData.hex())
189 end
190 end
191
192 return nReturnData
193 end
194end
Note: See TracBrowser for help on using the repository browser.