1 import java.io._
2 import java.nio.ByteBuffer
3
4 import scala.collection.mutable.ListBuffer
5
6 object Hello_mdf {
7
8 def main(args: Array[String]) {
9 var datFile = "D:\\Scala\\Dat\\00006004_251-4416EN12-ECU FI 0_1212_Knock and Pre-ignition control check on vehicle (Dynamic and diagnosis)_cold start 30C_tianmashan_00006004_2018-10-17_09-10-11_2018-10-17_09-21-22_sorted.dat";
10 var fis = new FileInputStream(new File(datFile))
11 val bytes = new Array[Byte](fis.available().toInt)
12 fis.read(bytes)
13 fis.close()
14
15 var mdf = new MDF(bytes)
16
17 var dict: Map[String, Channel] = Map()
18 var channelTmep = new Channel;
19
20 channelTmep = mdf.get("DFES_ctEntry")
21 if(channelTmep == null)
22 println("Signal is not found")
23 else
24 dict += ("DFES_ctEntry" -> mdf.get("DFES_ctEntry"))
25
26 channelTmep = mdf.get("nmot_w")
27 if(channelTmep == null)
28 println("Signal is not found")
29 else
30 dict += ("nmot_w" -> mdf.get("nmot_w"))
31
32 channelTmep = mdf.get("rl_w")
33 if(channelTmep == null)
34 println("Signal is not found")
35 else
36 dict += ("rl_w" -> mdf.get("rl_w"))
37
38 channelTmep = mdf.get("EpmCaS_phiCaSOfsAvg_[0]")
39 if(channelTmep == null)
40 println("Signal is not found")
41 else
42 dict += ("EpmCaS_phiCaSOfsAvg_[0]" -> mdf.get("EpmCaS_phiCaSOfsAvg_[0]"))
43 channelTmep = mdf.get("EpmCaS_phiCaSOfsAvg_[1]")
44 if(channelTmep == null)
45 println("Signal is not found")
46 else
47 dict += ("EpmCaS_phiCaSOfsAvg_[1]" -> mdf.get("EpmCaS_phiCaSOfsAvg_[1]"))
48
49 channelTmep = mdf.get("fkmsdk_w")
50 if(channelTmep == null)
51 println("Signal is not found")
52 else
53 dict += ("fkmsdk_w" -> mdf.get("fkmsdk_w")) // 节气门自学习
54
55 channelTmep = mdf.get("fra_w")
56 if(channelTmep == null)
57 println("Signal is not found")
58 else
59 dict += ("fra_w" -> mdf.get("fra_w"))
60
61 channelTmep = mdf.get("uprm_w")
62 if(channelTmep == null)
63 println("Signal is not found")
64 else
65 dict += ("uprm_w" -> mdf.get("uprm_w"))
66
67 channelTmep = mdf.get("MoF_rTrqInrAct")
68 if(channelTmep == null)
69 println("Signal is not found")
70 else
71 dict += ("MoF_rTrqInrAct" -> mdf.get("MoF_rTrqInrAct"))
72
73 channelTmep = mdf.get("miist_w")
74 if(channelTmep == null)
75 println("Signal is not found")
76 else
77 dict += ("miist_w" -> mdf.get("miist_w"))
78
79 channelTmep = mdf.get("rkrnv6_w_[0]")
80 if(channelTmep == null)
81 println("Signal is not found")
82 else
83 dict += ("rkrnv6_w_[0]" -> mdf.get("rkrnv6_w_[0]"))
84 channelTmep = mdf.get("rkrnv6_w_[1]")
85 if(channelTmep == null)
86 println("Signal is not found")
87 else
88 dict += ("rkrnv6_w_[1]" -> mdf.get("rkrnv6_w_[1]"))
89 channelTmep = mdf.get("rkrnv6_w_[2]")
90 if(channelTmep == null)
91 println("Signal is not found")
92 else
93 dict += ("rkrnv6_w_[2]" -> mdf.get("rkrnv6_w_[2]"))
94 channelTmep = mdf.get("rkrnv6_w_[3]")
95 if(channelTmep == null)
96 println("Signal is not found")
97 else
98 dict += ("rkrnv6_w_[3]" -> mdf.get("rkrnv6_w_[3]"))
99
100 channelTmep = mdf.get("B_kl")
101 if(channelTmep == null)
102 println("Signal is not found")
103 else
104 dict += ("B_kl" -> mdf.get("B_kl"))
105
106
107 dict.keys.foreach {
108 i => {
109 println("*************" + i + "*******************")
110 for (j <- 0 until 30) {
111 println("Count: "+ j, " time: "+dict(i).time(j), " data: "+dict(i).data(j))
112 }
113 println("*****************************************")
114 }
115 }
116
117 // make fault counter
118 var faultCounter = makeEmptySeries(dict("nmot_w"))
119
120 // var dict_nmotrl = p1
121 var nmotSeries =makeSeries(dict("nmot_w"))
122 var rlSeries =makeSeries(dict("rl_w"))
123 var nmotRlSeries = makeXYSeries(dict("nmot_w"), dict("rl_w"))
124 // epm
125 var epm0Series =makeSeries(dict("EpmCaS_phiCaSOfsAvg_[0]"))
126 var epm1Series =makeSeries(dict("EpmCaS_phiCaSOfsAvg_[1]"))
127
128 var (epm0StatisX, epm0StatisY) =makeDistribution(-10,10, 30, dict("EpmCaS_phiCaSOfsAvg_[0]"))
129 var (epm1StatisX, epm1StatisY) =makeDistribution(-10,10, 30, dict("EpmCaS_phiCaSOfsAvg_[0]"))
130 // throttle
131 var fkmsdkSeries =makeSeries(dict("fkmsdk_w"))
132 var (fkmsdkStatisX, fkmsdkStatisY) =makeDistribution(-10,10, 30, dict("fkmsdk_w"))
133 // lambda
134 var lambdaSeries = makeSeries(dict("fra_w"))
135 var (lambdaSeriesStatisX, lambdaSeriesStatisY) = makeDistribution(-10,10, 30, dict("fra_w"))
136 // hdfs
137 var uprmSeries = makeSeries(dict("uprm_w"))
138 var (uprmSeriesStatisX, uprmSeriesStatisY) =makeDistribution(-10,10, 30, dict("uprm_w"))
139 // safetyTorque
140 var minusArray = makeMinusSeries(dict("MoF_rTrqInrAct"), dict("miist_w"))
141 var (minusArrayX, minusArrayY) = makeDistributionMinus(-10,10, 30, dict("MoF_rTrqInrAct"), dict("miist_w"))
142 // knock OverView
143 // Noise Ref
144 var noiseRef0 = makeSeries(dict("rkrnv6_w_[0]"))
145 var noiseRef1 = makeSeries(dict("rkrnv6_w_[1]"))
146 var noiseRef2 = makeSeries(dict("rkrnv6_w_[2]"))
147 var noiseRef3 = makeSeries(dict("rkrnv6_w_[3]"))
148
149 // println(epm0StatisY.mkString(","))
150 println("--------------------------------------done--------------------------------------")
151 }
152
153 def makeEmptySeries(_channel: Channel): List[Array[Double]]={
154
155 var _series= new ListBuffer[Array[Double]]
156
157 for (i <- 0 until _channel.time.length) {
158
159 var _arr = new Array[Double](2)
160 _arr(0) = _channel.time(i)
161 _arr(1) = 0.0
162 _series.append(_arr)
163 }
164
165 _series.toList
166 }
167
168 def makeSeries(_channel: Channel): List[Array[Double]]={
169
170 var _series= new ListBuffer[Array[Double]]
171
172 for (i <- 0 until _channel.time.length) {
173
174 var _arr = new Array[Double](2)
175 _arr(0) = _channel.time(i)
176 _arr(1) = _channel.data(i)
177 _series.append(_arr)
178 }
179
180 _series.toList
181 }
182
183 def makeMinusSeries(_channel: Channel, _channel2: Channel): List[Array[Double]]={
184
185 var _series= new ListBuffer[Array[Double]]
186
187 for (i <- 0 until _channel.time.length) {
188
189 var _arr = new Array[Double](2)
190 _arr(0) = _channel.time(i)
191 _arr(1) = _channel.data(i)-_channel2.data(i)
192 _series.append(_arr)
193 }
194
195 _series.toList
196 }
197
198 def makeXYSeries(_channel: Channel, _channel2: Channel): List[Array[Double]]={
199
200 var _series= new ListBuffer[Array[Double]]
201
202 for (i <- 0 until _channel.time.length) {
203
204 var _arr = new Array[Double](2)
205 _arr(0) = _channel.data(i)
206 _arr(1) = _channel2.data(i)
207 _series.append(_arr)
208 }
209
210 _series.toList
211 }
212
213 def makeDistribution(_min:Double, _max:Double, _bin:Int, _chan: Channel)={
214
215 var _seriesX = new Array[Double](_bin)
216 var _seriesY = new Array[Double](_bin)
217
218 var x_delta = (_max-_min)/(_bin-1)
219
220 for(i<-0 until _bin-1){
221 _seriesX(i) = _min+i*x_delta
222 }
223 _seriesX(_seriesX.length-1) = _max
224
225 for(i<-0 until _chan.data.length){
226 for (j<-0 until _bin){
227 if(_chan.data(i)>_seriesX(j)-x_delta/2 & _chan.data(i)<=_seriesX(j)+x_delta/2){
228 _seriesY(j)+=1
229 }
230 }
231 }
232
233 (_seriesX, _seriesY)
234
235 }
236
237 def makeDistributionMinus(_min:Double, _max:Double, _bin:Int, _chan: Channel, _chan2:Channel) ={
238
239 var _seriesX = new Array[Double](_bin)
240 var _seriesY = new Array[Double](_bin)
241
242 var x_delta = (_max-_min)/(_bin-1)
243
244 for(i<-0 until _bin-1){
245 _seriesX(i) = _min+i*x_delta
246 }
247 _seriesX(_seriesX.length-1) = _max
248
249 for(i<-0 until _chan.data.length){
250 for (j<-0 until _bin){
251 if((_chan.data(i)-_chan2.data(i))>_seriesX(j)-x_delta/2 & (_chan.data(i)-_chan2.data(i))<=_seriesX(j)+x_delta/2){
252 _seriesY(j)+=1
253 }
254 }
255 }
256 (_seriesX, _seriesY)
257 }
258
259 class MDF {
260
261 var allBytes: Array[Byte] = _
262 var idBlock: IDBlock = _
263 var hdBlock: HDBlock = _
264 var dgBlocks: List[DGBlock] = _
265
266 def this(_bytes: Array[Byte]) {
267
268 this()
269 this.allBytes = _bytes
270 this.idBlock = new IDBlock(_bytes)
271 this.hdBlock = new HDBlock(_bytes)
272
273 this.dgBlocks = List()
274 var dg = new DGBlock(_bytes, hdBlock.pointerFirstDGBlock)
275 dgBlocks = dgBlocks :+ dg
276 while (dg.pointerNextDGBlock != 0) {
277 dg = new DGBlock(_bytes, dg.pointerNextDGBlock)
278 dgBlocks = dgBlocks :+ dg
279 }
280 }
281
282 def get(_channelName: String): Channel = {
283
284 for {
285 i <- 0 until this.dgBlocks.length
286 j <- 0 until this.dgBlocks(i).cgBlocks.length
287 k <- 0 until this.dgBlocks(i).cgBlocks(j).cnBlocks.length
288 } {
289
290 /*println("i: "+i)
291 println("j: "+j)
292 println("k: "+k)*/
293
294 var shortSignalName = this.dgBlocks(i).cgBlocks(j).cnBlocks(k).shortSignalName
295 var index = 0
296 if(shortSignalName.contains("\\")){
297 index = shortSignalName.indexOf("\\")
298 shortSignalName = shortSignalName.substring(0,index)
299 }
300 else if(shortSignalName.contains(":")){
301 index = shortSignalName.indexOf(":")
302 shortSignalName = shortSignalName.substring(0,index)
303 }
304
305 if (shortSignalName.equals(_channelName)) {
306 // println("shortSignalName: "+this.dgBlocks(i).cgBlocks(j).cnBlocks(k).shortSignalName)
307 var _channel = new Channel()
308
309 _channel.idxCGBlock = j
310
311 _channel.cCBlock = new CCBlock(this.allBytes, this.dgBlocks(i).cgBlocks(j).cnBlocks(k).pointerCCBlock)
312
313 var numberOfRecord = this.dgBlocks(i).cgBlocks(j).numberRecords
314 // println("numberOfRecord", numberOfRecord)
315
316 var recordSizeInByte = this.dgBlocks(i).cgBlocks(j).sizeDataRecord
317 // println("recordSizeInByte", recordSizeInByte)
318
319 var pointerDataBlock = this.dgBlocks(i).pointerDataBlock
320 // println("pointerDataBlock", pointerDataBlock)
321
322 var signalDataType = this.dgBlocks(i).cgBlocks(j).cnBlocks(k).signalDataType
323 var signalDataType0 = this.dgBlocks(i).cgBlocks(j).cnBlocks(0).signalDataType
324 // println("signalDataType", signalDataType)
325
326 var numberOfBits = this.dgBlocks(i).cgBlocks(j).cnBlocks(k).numberOfBits
327 var numberOfBits0 = this.dgBlocks(i).cgBlocks(j).cnBlocks(0).numberOfBits
328 // println("numberOfBits", numberOfBits)
329
330 var startOffsetInBits = this.dgBlocks(i).cgBlocks(j).cnBlocks(k).startOffsetInBits
331 var startOffsetInBits0 = this.dgBlocks(i).cgBlocks(j).cnBlocks(0).startOffsetInBits
332 // println("startOffsetInBits", startOffsetInBits)
333
334 var shortSignalName = this.dgBlocks(i).cgBlocks(j).cnBlocks(k).shortSignalName
335 var shortSignalName0 = this.dgBlocks(i).cgBlocks(j).cnBlocks(0).shortSignalName
336 // println("shortSignalName", shortSignalName)
337
338 var buffer = new Array[Byte](numberOfRecord * recordSizeInByte)
339 for (i <- 0 until buffer.length) {
340 // data block from dg
341 buffer(i) = this.allBytes(i + pointerDataBlock)
342 }
343
344 var rawData = new Array[Double](numberOfRecord)
345 // println(this.dgBlocks(i).cgBlocks(j).cnBlocks(0).shortSignalName) // get time channel signal name
346 var rawTime = new Array[Double](numberOfRecord)
347
348 signalDataType match {
349 case 0 => {
350 // println("signalDataType",signalDataType)
351 if (numberOfBits == 1) {
352 // println("numberOfBits",numberOfBits)
353 rawData = DataReaderBit(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
354 }
355
356 if (numberOfBits / 8 == 1) {
357 if (shortSignalName.contains("$")) {
358 }
359 else {
360 // println("numberOfBits",numberOfBits,"OK")
361 rawData = DataReaderBit(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
362 }
363 }
364
365 if (numberOfBits / 8 == 2) {
366 // println("numberOfBits",numberOfBits)
367 rawData = DataReaderUInt16(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
368 }
369
370 if (numberOfBits / 8 == 4) {
371 // println("numberOfBits",numberOfBits)
372 rawData = DataReaderUInt32(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
373 }
374 if (numberOfBits0 / 8 == 8) {
375 // println("8")
376 rawTime = DataReaderUInt64(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
377 }
378 }
379
380 case 1 => {
381 println("signalDataType"+signalDataType)
382 if (numberOfBits / 8 == 1) {
383 if (shortSignalName.contains("$")) {
384 }
385 else {
386 rawData = DataReaderBit(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
387 }
388 }
389 if (numberOfBits / 8 == 2) {
390 rawData = DataReaderUInt16(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
391 }
392 if (numberOfBits / 8 == 4) {
393 rawData = DataReaderUInt32(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
394 }
395 }
396
397 case 2 => {
398 println("signalDataType"+signalDataType)
399 if (numberOfBits / 8 == 4) {
400 rawData = DataReaderFloat(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
401 }
402 }
403
404 case 3 => {
405 println("signalDataType"+signalDataType)
406 rawData = DataReaderDouble(buffer, startOffsetInBits, numberOfRecord, recordSizeInByte)
407 }
408
409 case _ => {
410 println("signalDataType Error")
411 }
412 }
413
414 signalDataType0 match {
415 case 0 => {
416 if (numberOfBits0 == 1) {
417 // println("1")
418 rawTime = DataReaderBit(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
419 }
420
421 if (numberOfBits0 / 8 == 1) {
422 if (shortSignalName.contains("$")) {
423 }
424 else {
425 // println("2")
426 rawTime = DataReaderBit(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
427 }
428 }
429
430 if (numberOfBits0 / 8 == 2) {
431 // println("3")
432 rawTime = DataReaderUInt16(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
433 }
434
435 if (numberOfBits0 / 8 == 4) {
436 // println("4")
437 rawTime = DataReaderUInt32(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
438 }
439
440 if (numberOfBits0 / 8 == 8) {
441 // println("8")
442 rawTime = DataReaderUInt64(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
443 }
444 }
445
446 case 1 => {
447 if (numberOfBits0 / 8 == 1) {
448 if (shortSignalName.contains("$")) {
449 }
450 else {
451 println("5")
452 rawTime = DataReaderBit(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
453 }
454 }
455 if (numberOfBits0 / 8 == 2) {
456 println("6")
457 rawTime = DataReaderUInt16(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
458 }
459 if (numberOfBits0 / 8 == 4) {
460 println("7")
461 rawTime = DataReaderUInt32(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
462 }
463 }
464
465 case 2 => {
466 if (numberOfBits0 / 8 == 4) {
467 println("8")
468 rawTime = DataReaderFloat(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
469 }
470 // if (numberOfBits0 / 8 == 8) {
471 // // println("4")
472 // rawTime = DataReaderUInt64(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
473 // }
474 }
475
476 case 3 => {
477 println("9","startOffset: "+startOffsetInBits0,"Record: " + numberOfRecord,"recordSize: "+recordSizeInByte)
478 rawTime = DataReaderDouble(buffer, startOffsetInBits0, numberOfRecord, recordSizeInByte)
479 }
480 case _ => {
481 println("signalDataType0")
482 }
483 }
484
485 // case 4 =>{println("lack of signal data type 4")}
486 // case 5 =>{println("lack of signal data type 5")}
487 // case 6 =>{println("lack of signal data type 6")}
488 // case 7 =>{
489 // // null
490 // }
491 // case 8 =>{println("lack of signal data type 8")}
492 // case 9 =>{println("lack of signal data type 9")}
493 // case 10 =>{println("lack of signal data type 10")}
494 // case 11 =>{println("lack of signal data type 11")}
495 // case 12 =>{println("lack of signal data type 12")}
496 // case 13 =>{println("lack of signal data type 13")}
497 // case 14 =>{println("lack of signal data type 14")}
498 // case 15 =>{println("lack of signal data type 15")}
499 // case 16 =>{println("lack of signal data type 16")}
500 //
501 // println("_channel.cCBlock.conversionType",_channel.cCBlock.conversionType)
502 // println("_channel.cCBlock.sizeInformation",_channel.cCBlock.sizeInformation)
503 // println("_channel.cCBlock.p1",_channel.cCBlock.p1)
504 // println("_channel.cCBlock.p2",_channel.cCBlock.p2)
505
506 _channel.cCBlock.conversionType match {
507 case 0 => {
508 if (_channel.cCBlock.sizeInformation > 0) {
509 for (i <- 0 until rawData.length) {
510 rawData(i) = _channel.cCBlock.p1 + _channel.cCBlock.p2 * rawData(i)
511 }
512 }
513 }
514
515 case 1 => {
516 println("lack of cc type 1")
517 }
518 case 2 => {
519 println("lack of cc type 2")
520 }
521 case 6 => {
522 println("lack of cc type 6")
523 }
524 case 7 => {
525 println("lack of cc type 7")
526 }
527 case 8 => {
528 println("lack of cc type 8")
529 }
530 case 9 => {
531 println("lack of cc type 9")
532 }
533 case 10 => {
534 println("lack of cc type 10")
535 }
536 case 11 => {
537 // println(this.dgBlocks(i).cgBlocks(j).cnBlocks(k).shortSignalName)
538 println("lack of cc type 11")
539 }
540 case 12 => {
541 println("lack of cc type 12")
542 }
543 case 132 => {
544 println("lack of cc type 132")
545 }
546 case 133 => {
547 println("lack of cc type 133")
548 }
549 case _ => {
550
551 }
552 }
553
554 var time_cc = new CCBlock(this.allBytes, this.dgBlocks(i).cgBlocks(j).cnBlocks(0).pointerCCBlock)
555 // println("time_cc.conversionType", time_cc.conversionType)
556 // println("time_cc.sizeInformation", time_cc.sizeInformation)
557 // println("time_cc.p1", time_cc.p1)
558 // println("time_cc.p2", time_cc.p2)
559
560 time_cc.conversionType match {
561 case 0 => {
562 if (time_cc.sizeInformation > 0) {
563 for (i <- 0 until rawTime.length) {
564 rawTime(i) = time_cc.p1 + time_cc.p2 * rawTime(i)
565 }
566
567 }
568 }
569 }
570
571 // for(i<-0 until 1000){
572 // println("time", i, rawTime(i))
573 // }
574 _channel.time = rawTime
575 _channel.data = rawData
576 return _channel
577 }
578 }
579 return null
580 }
581 }
582
583 class Channel {
584 var arrayBuffer: Array[Byte] = _
585
586 var channelName = ""
587 var idxCGBlock = 0
588 var cNBlock: CNBlock = _
589 var cCBlock: CCBlock = _
590 var time: Array[Double] = _
591 var data: Array[Double] = _
592
593 }
594
595 class IDBlock(var _bytes: Array[Byte]) {
596
597 var FileIdentifier = ""
598 var formatIdentifier = ""
599 var programIdentifier = ""
600 var defaultByteOrder = 0
601 var defaultFloatingPointFormat = 0
602 var versionNumber = 0
603
604 this.makeIDBlock()
605
606 def makeIDBlock(): Unit = {
607
608 var offset = 0
609 var len = 8
610 this.FileIdentifier = bytes2str(_bytes, offset, len)
611 offset += len
612
613 len = 8
614 this.formatIdentifier = bytes2str(_bytes, offset, len)
615 // println("this.formatIdentifier", this.formatIdentifier)
616 offset += len
617
618 len = 8
619 this.programIdentifier = bytes2str(_bytes, offset, len)
620 offset += len
621
622 len = 2
623 this.defaultByteOrder = bytes2uint16(_bytes, offset)
624 offset += len
625
626 len = 2
627 this.defaultFloatingPointFormat = bytes2uint16(_bytes, offset)
628 offset += len
629
630 len = 2
631 this.versionNumber = bytes2uint16(_bytes, offset)
632 }
633 }
634
635 class HDBlock(var _bytes: Array[Byte]) {
636 var blockTypeIdentifier = ""
637 var blockSize = 0
638 var pointerFirstDGBlock = 0
639 var pointerFileComment = 0
640 var pointerProgramBlock = 0
641 var numberDGroups = 0
642 var date = ""
643 var time = ""
644 var author = ""
645 var organization = ""
646 var project = ""
647 var measureObject = ""
648
649 this.makeHDBlock()
650
651 def makeHDBlock(): Unit = {
652
653 var offset = 64
654 var len = 2
655 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
656 offset += len
657
658 len = 2
659 this.blockSize = bytes2uint16(_bytes, offset)
660 offset += len
661
662 len = 4
663 this.pointerFirstDGBlock = bytes2uint32(_bytes, offset)
664 offset += len
665
666 len = 4
667 this.pointerFileComment = bytes2uint32(_bytes, offset)
668 offset += len
669
670 len = 4
671 this.pointerProgramBlock = bytes2uint32(_bytes, offset)
672 offset += len
673
674 len = 2
675 this.numberDGroups = bytes2uint16(_bytes, offset)
676 offset += len
677
678 len = 10
679 this.date = bytes2str(_bytes, offset, len)
680 offset += len
681
682 len = 8
683 this.time = bytes2str(_bytes, offset, len)
684 offset += len
685
686 len = 32
687 this.author = bytes2str(_bytes, offset, len)
688 offset += len
689
690 len = 32
691 this.organization = bytes2str(_bytes, offset, len)
692 offset += len
693
694 len = 32
695 this.project = bytes2str(_bytes, offset, len)
696 offset += len
697
698 len = 32
699 this.measureObject = bytes2str(_bytes, offset, len)
700 offset += len
701
702 }
703 }
704
705 class TXBlock(var _bytes: Array[Byte], var _offset: Int) {
706 var blockTypeIdentifier = ""
707 var blockSize = 0
708 var Text = ""
709
710 this.makeTXBlock()
711
712 def makeTXBlock(): Unit = {
713 var offset = _offset
714
715 var len = 2
716
717 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
718 offset += len
719
720 len = 2
721
722 this.blockSize = bytes2uint16(_bytes, offset)
723 offset += len
724
725 len = this.blockSize - 4
726 this.Text = bytes2str(_bytes, offset, len)
727 offset += len
728 }
729 }
730
731 class CEBlock(var _bytes: Array[Byte], var _offset: Int) {
732 var blockTypeIdentifier = ""
733 var blockSize = 0
734 var extensionType = 0
735 var moduleNumber = 0
736 var address = 0
737 var description = ""
738 var ECUIdentification = ""
739 var CANMessage = 0
740 var CANChannelIndex = 0
741 var messageName = ""
742 var senderName = ""
743
744 this.makeCEBlock()
745
746 def makeCEBlock(): Unit = {
747 var offset = _offset
748
749 var len = 2
750 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
751 offset += len
752
753 len = 2
754 this.blockSize = bytes2uint16(_bytes, offset)
755 offset += len
756
757 len = 2
758 this.extensionType = bytes2uint16(_bytes, offset)
759 offset += len
760
761 if(this.extensionType == 2){
762 len = 2
763 this.moduleNumber = bytes2uint16(_bytes, offset)
764 offset += len
765
766 len = 4
767 this.address = bytes2uint32(_bytes, offset)
768 offset += len
769
770 len = 80
771 this.description = bytes2str(_bytes, offset, len)
772 offset += len
773
774 len = 32
775 this.ECUIdentification = bytes2str(_bytes, offset, len)
776 offset += len
777
778 }
779 else if(this.extensionType == 19){
780 len = 4
781 this.moduleNumber = bytes2uint32(_bytes, offset)
782 offset += len
783
784 len = 4
785 this.address = bytes2uint32(_bytes, offset)
786 offset += len
787
788 len = 36
789 this.description = bytes2str(_bytes, offset, len)
790 offset += len
791
792 len = 36
793 this.ECUIdentification = bytes2str(_bytes, offset, len)
794 offset += len
795 }
796 }
797 }
798
799 class DGBlock(var _bytes: Array[Byte], var _offset: Int) {
800 var blockTypeIdentifier = ""
801 var blockSize = 0
802 var pointerNextDGBlock = 0
803 var pointerFirstCGBlock = 0
804 var pointerTriggerBlock = 0
805 var pointerDataBlock = 0
806 var numberCGs = 0
807 var numberRecordIDs = 0
808
809 var cgBlocks: List[CGBlock] = List()
810
811 this.makeDGBlock()
812
813 def makeDGBlock(): Unit = {
814
815 var offset = _offset
816 var len = 2
817 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
818 offset += len
819
820 len = 2
821 this.blockSize = bytes2uint16(_bytes, offset)
822 offset += len
823
824 len = 4
825 this.pointerNextDGBlock = bytes2uint32(_bytes, offset)
826 offset += len
827
828 len = 4
829 this.pointerFirstCGBlock = bytes2uint32(_bytes, offset)
830 offset += len
831
832 len = 4
833 this.pointerTriggerBlock = bytes2uint32(_bytes, offset)
834 offset += len
835
836 len = 4
837 this.pointerDataBlock = bytes2uint32(_bytes, offset)
838 offset += len
839
840 len = 2
841 this.numberCGs = bytes2uint16(_bytes, offset)
842 offset += len
843
844 len = 10
845 this.numberRecordIDs = bytes2uint16(_bytes, offset)
846 offset += len
847
848 var cg = new CGBlock(_bytes, this.pointerFirstCGBlock)
849 cgBlocks = cgBlocks :+ cg
850
851 while (cg.pointerNextCGBlock != 0) {
852 cg = new CGBlock(_bytes, cg.pointerNextCGBlock)
853 cgBlocks = cgBlocks :+ cg
854 }
855
856 }
857 }
858
859 class CGBlock(var _bytes: Array[Byte], var _offset: Int) {
860 var blockTypeIdentifier = ""
861 var blockSize = 0
862 var pointerNextCGBlock = 0
863 var pointerFirstCNBlock = 0
864 var pointerComment = 0
865 var recordID = 0
866 var numberChannels = 0
867 var sizeDataRecord = 0
868 var numberRecords = 0
869
870 var cnBlocks: List[CNBlock] = List()
871
872 this.makeCGBlock()
873
874 def makeCGBlock(): Unit = {
875
876 var offset = _offset
877 var len = 2
878 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
879 offset += len
880
881 len = 2
882 this.blockSize = bytes2uint16(_bytes, offset)
883 offset += len
884
885 len = 4
886 this.pointerNextCGBlock = bytes2uint32(_bytes, offset)
887 offset += len
888
889 len = 4
890 this.pointerFirstCNBlock = bytes2uint32(_bytes, offset)
891 offset += len
892
893 len = 4
894 this.pointerComment = bytes2uint32(_bytes, offset)
895 offset += len
896
897 len = 2
898 this.recordID = bytes2uint16(_bytes, offset)
899 offset += len
900
901 len = 2
902 this.numberChannels = bytes2uint16(_bytes, offset)
903 offset += len
904
905 len = 2
906 this.sizeDataRecord = bytes2uint16(_bytes, offset)
907 offset += len
908
909 len = 4
910 this.numberRecords = bytes2uint32(_bytes, offset)
911 offset += len
912
913
914 var cn = new CNBlock(_bytes, this.pointerFirstCNBlock)
915 cnBlocks = cnBlocks :+ cn
916
917 while (cn.pointerNextCNBlock != 0) {
918 cn = new CNBlock(_bytes, cn.pointerNextCNBlock)
919 cnBlocks = cnBlocks :+ cn
920 }
921 }
922 }
923
924 class CNBlock(var _bytes: Array[Byte], var _offset: Int) {
925 var blockTypeIdentifier = ""
926 var blockSize = 0
927 var pointerNextCNBlock = 0
928 var pointerCCBlock = 0
929 var pointerCEBlock = 0
930 var pointerCDBlock = 0
931 var pointerComment = 0
932 var channelType = 0
933 var shortSignalName = ""
934 var signalDescription = ""
935 var startOffsetInBits = 0
936 var numberOfBits = 0
937 var signalDataType = 0
938 var valueRangeValid = false
939 var minSignalValue = 0.0
940 var maxSignalValue = 0.0
941 var sampleRate = 0.0
942 var pointerLongSignalName = 0
943 var pointerDisplayName = 0
944 var additionalByteOffset = 0
945
946 this.makeCNBlock()
947
948 var ccBlock = new CCBlock(_bytes, this.pointerCCBlock)
949 var ceBlock = new CEBlock(_bytes, this.pointerCEBlock)
950 //var txBlock = new TXBlock(_bytes, this.pointerComment)
951
952 def makeCNBlock() = {
953
954 var offset = _offset
955 var len = 2
956 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
957 offset += len
958
959 len = 2
960 this.blockSize = bytes2uint16(_bytes, offset)
961 offset += len
962
963 len = 4
964 this.pointerNextCNBlock = bytes2uint32(_bytes, offset)
965 offset += len
966
967 len = 4
968 this.pointerCCBlock = bytes2uint32(_bytes, offset)
969 offset += len
970
971 len = 4
972 this.pointerCEBlock = bytes2uint32(_bytes, offset)
973 offset += len
974
975 len = 4
976 this.pointerCDBlock = bytes2uint32(_bytes, offset)
977 offset += len
978
979 len = 4
980 this.pointerComment = bytes2uint32(_bytes, offset)
981 offset += len
982
983 len = 2
984 this.channelType = bytes2uint16(_bytes, offset)
985 offset += len
986
987 len = 32
988 this.shortSignalName = bytes2str(_bytes, offset, len)
989 offset += len
990
991 len = 128
992 this.signalDescription = bytes2str(_bytes, offset, len)
993 offset += len
994
995 len = 2
996 this.startOffsetInBits = bytes2uint16(_bytes, offset)
997 offset += len
998
999 len = 2
1000 this.numberOfBits = bytes2uint16(_bytes, offset)
1001 offset += len
1002
1003 len = 2
1004 this.signalDataType = bytes2uint16(_bytes, offset)
1005 offset += len
1006
1007 len = 2
1008 this.valueRangeValid = bytes2bool(_bytes, offset)
1009 offset += len
1010
1011 len = 64
1012 this.minSignalValue = bytes2real(_bytes, offset)
1013 offset += len
1014
1015 len = 64
1016 this.maxSignalValue = bytes2real(_bytes, offset)
1017 offset += len
1018
1019 len = 64
1020 this.sampleRate = bytes2real(_bytes, offset)
1021 offset += len
1022
1023 len = 4
1024 this.pointerLongSignalName = bytes2uint32(_bytes, offset)
1025 offset += len
1026
1027 len = 4
1028 this.pointerDisplayName = bytes2uint32(_bytes, offset)
1029 offset += len
1030
1031 len = 2
1032 this.additionalByteOffset = bytes2uint16(_bytes, offset)
1033 offset += len
1034 }
1035 }
1036
1037 class CCBlock(var _bytes: Array[Byte], var _offset: Int) {
1038 var arrayBuffer: Array[Byte] = _
1039 var blockTypeIdentifier = ""
1040 var blockSize = 0
1041 var physicalValueRangeValid = false
1042 var minPhysicalSignalValue = 0.0
1043 var maxPhysicalSignalValue = 0.0
1044 var physicalUnit = ""
1045 var conversionType = 0
1046 var sizeInformation = 0
1047 var p1 = 0.0
1048 var p2 = 0.0
1049
1050 // var additionalConversionData
1051
1052 this.makeCCBlock()
1053
1054 def makeCCBlock() = {
1055
1056 arrayBuffer = _bytes
1057 var offset = _offset
1058 var len = 2
1059 this.blockTypeIdentifier = bytes2str(_bytes, offset, len)
1060 // println("this.blockTypeIdentifier",this.blockTypeIdentifier)
1061 offset += len
1062
1063 len = 2
1064 this.blockSize = bytes2uint16(_bytes, offset)
1065 // println("this.blockSize",this.blockSize)
1066 offset += len
1067
1068 len = 2
1069 this.physicalValueRangeValid = bytes2bool(_bytes, offset)
1070 // println("this.physicalValueRangeValid",this.physicalValueRangeValid)
1071 offset += len
1072
1073 len = 8
1074 this.minPhysicalSignalValue = bytes2real(_bytes, offset)
1075 // println("this.minPhysicalSignalValue",this.minPhysicalSignalValue)
1076 offset += len
1077
1078 len = 8
1079 this.maxPhysicalSignalValue = bytes2real(_bytes, offset)
1080 // println("this.maxPhysicalSignalValue",this.maxPhysicalSignalValue)
1081 offset += len
1082
1083 len = 20
1084 this.physicalUnit = bytes2str(_bytes, offset, len)
1085 // println("this.physicalUnit",this.physicalUnit)
1086 offset += len
1087
1088 len = 2
1089 this.conversionType = bytes2uint16(_bytes, offset)
1090 // println("this.conversionType",this.conversionType)
1091 offset += len
1092
1093 len = 2
1094 this.sizeInformation = bytes2uint16(_bytes, offset)
1095 // println("this.sizeInformation",this.sizeInformation)
1096 offset += len
1097
1098 len = 8
1099 this.p1 = bytes2real(_bytes, offset)
1100 // println("this.p1",this.p1)
1101 offset += len
1102
1103 len = 8
1104 this.p2 = bytes2real(_bytes, offset)
1105 // println("this.p2",this.p2)
1106 offset += len
1107
1108 }
1109 }
1110
1111
1112 def bytes2str(_bytes: Array[Byte], _offset: Int, _len: Int): String = {
1113 var temp_bytes = new Array[Byte](_len)
1114 for (i <- 0 to _len - 1) {
1115 temp_bytes(i) = _bytes(i + _offset)
1116 }
1117
1118 return new String(temp_bytes).trim()
1119 }
1120
1121 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = {
1122 var b0 = _bytes(_offset) & 0xff
1123
1124 return b0
1125 }
1126
1127 def bytes2uint16(_bytes: Array[Byte], _offset: Int): Int = {
1128 var b0 = _bytes(_offset) & 0xff
1129 var b1 = _bytes(_offset + 1) & 0xff
1130
1131 return (b1 << 8) | b0
1132 }
1133
1134 def bytes2uint32(_bytes: Array[Byte], _offset: Int): Int = {
1135
1136 var b0 = _bytes(_offset) & 0xff
1137 var b1 = _bytes(_offset + 1) & 0xff
1138 var b2 = _bytes(_offset + 2) & 0xff
1139 var b3 = _bytes(_offset + 3) & 0xff
1140
1141 return (b3 << 24) | (b2 << 16) | (b1 << 8) | b0
1142 }
1143
1144 def bytes2bool(_bytes: Array[Byte], _offset: Int): Boolean = {
1145 var b0 = _bytes(_offset) & 0xff
1146 var b1 = _bytes(_offset + 1) & 0xff
1147
1148 return if (((b1 << 8) | b0) != 0) true else false
1149 }
1150
1151 def bytes2float(_bytes: Array[Byte], _offset: Int): Double = {
1152
1153 var _array: Array[Byte] = new Array[Byte](4)
1154
1155 for (i <- 0 until 4) {
1156 _array(i) = _bytes(-i + _offset + 4)
1157 }
1158
1159 return ByteBuffer.wrap(_array).getFloat()
1160
1161 // var b0 = _bytes(_offset) & 0xff
1162 // var b1 = _bytes(_offset + 1) & 0xff
1163 // var b2 = _bytes(_offset + 2) & 0xff
1164 // var b3 = _bytes(_offset + 3) & 0xff
1165
1166 // return ((b3 << 24) | (b2 << 16) | (b1 << 8) | b0).toDouble
1167 }
1168
1169 def bytes2real(_bytes: Array[Byte], _offset: Int): Double = {
1170
1171 var _array: Array[Byte] = new Array[Byte](8)
1172
1173 for (i <- 0 until 8) {
1174 _array(i) = _bytes(-i + _offset + 7)
1175 }
1176
1177 // var b0 = _bytes(_offset) & 0xff
1178 // var b1 = _bytes(_offset + 1) & 0xff
1179 // var b2 = _bytes(_offset + 2) & 0xff
1180 // var b3 = _bytes(_offset + 3) & 0xff
1181 // var b4 = _bytes(_offset + 4) & 0xff
1182 // var b5 = _bytes(_offset + 5) & 0xff
1183 // var b6 = _bytes(_offset + 6) & 0xff
1184 // var b7 = _bytes(_offset + 7) & 0xff
1185
1186 return ByteBuffer.wrap(_array).getDouble
1187
1188 // return ((b7 << 56) |(b6 << 48)|(b5 << 40)|(b4 << 32)|(b3 << 24)|(b2 << 16)|(b1 << 8)| b0).toDouble
1189 }
1190
1191 def bytes2long(_bytes: Array[Byte], _offset: Int): Double = {
1192
1193 var _array: Array[Byte] = new Array[Byte](8)
1194
1195 for (i <- 0 until 8) {
1196 _array(i) = _bytes(-i + _offset + 7)
1197 }
1198 return ByteBuffer.wrap(_array).getLong
1199
1200 // return ((b7 << 56) |(b6 << 48)|(b5 << 40)|(b4 << 32)|(b3 << 24)|(b2 << 16)|(b1 << 8)| b0).toDouble
1201 }
1202
1203 def DataReaderBit(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1204 var startposition = _startOffsetInBits / 8
1205 var curPos = startposition
1206
1207 var result: Array[Double] = new Array[Double](_numberOfRecord)
1208 for (i <- 0 until _numberOfRecord - 1) {
1209 result(i) = bytes2uint8(_byte, curPos)
1210 curPos += _recordSizeInByte
1211 }
1212 return result
1213 }
1214
1215 def DataReaderUInt(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1216 var startposition = _startOffsetInBits / 8
1217 var curPos = startposition
1218
1219 var result: Array[Double] = new Array[Double](_numberOfRecord)
1220 for (i <- 0 until _numberOfRecord - 1) {
1221 result(i) = bytes2uint8(_byte, curPos)
1222 curPos += _recordSizeInByte
1223 }
1224
1225 return result
1226 }
1227
1228 def DataReaderUInt16(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1229 var startposition = _startOffsetInBits / 8
1230 var curPos = startposition
1231
1232 var result: Array[Double] = new Array[Double](_numberOfRecord)
1233
1234 for (i <- 0 until _numberOfRecord - 1) {
1235 result(i) = bytes2uint16(_byte, curPos)
1236 curPos += _recordSizeInByte
1237 }
1238 return result
1239 }
1240
1241 def DataReaderUInt32(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1242 var startposition = _startOffsetInBits / 8
1243 var curPos = startposition
1244
1245 var result: Array[Double] = new Array[Double](_numberOfRecord)
1246
1247 for (i <- 0 until _numberOfRecord - 1) {
1248 result(i) = bytes2uint32(_byte, curPos)
1249 curPos += _recordSizeInByte
1250 }
1251 return result
1252 }
1253
1254 def DataReaderUInt64(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1255 var startposition = _startOffsetInBits / 8
1256 var curPos = startposition
1257
1258 var result: Array[Double] = new Array[Double](_numberOfRecord)
1259
1260 for (i <- 0 until _numberOfRecord - 1) {
1261 result(i) = bytes2long(_byte, curPos)
1262 curPos += _recordSizeInByte
1263 }
1264 return result
1265 }
1266
1267 def DataReaderFloat(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1268 var startposition = _startOffsetInBits / 8
1269 var curPos = startposition
1270 var result: Array[Double] = new Array[Double](_numberOfRecord)
1271
1272 for (i <- 0 until _numberOfRecord - 1) {
1273 result(i) = bytes2float(_byte, curPos)
1274 curPos += _recordSizeInByte
1275 }
1276 return result
1277 }
1278
1279 def DataReaderDouble(_byte: Array[Byte], _startOffsetInBits: Int, _numberOfRecord: Int, _recordSizeInByte: Int): Array[Double] = {
1280 var startposition = _startOffsetInBits / 8
1281 var curPos = startposition
1282
1283 var result: Array[Double] = new Array[Double](_numberOfRecord)
1284
1285 for (i <- 0 until _numberOfRecord - 1) {
1286 result(i) = bytes2real(_byte, curPos)
1287 curPos += _recordSizeInByte
1288 }
1289 return result
1290 }
1291
1292 }