使用intellij IDEA工具,建立Scala项目,解析MDF文件,可根据信号名称,查找该信号的值
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 }