Scala解析MDF文件

使用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 }
View Code

猜你喜欢

转载自www.cnblogs.com/Wonderful-Life/p/9830777.html