public Application_Header(DataLink_Header DL, Transport_Header TH, byte [] rawdata) { this.DataLink = DL; this.Transport = TH; this.rawdata = rawdata; this.pullCRC(); this.ApplicationControl = new ApplicationControl(this.Userdata[0]); this.FunctionCode = this.Userdata[1]; this.FunctionName = getFunctionName(this.FunctionCode); int userdataindex = 2; // index for the next data that have to manage if (this.DataLink.Control.DIR == true) //REQ HEADER { userdataindex = 2; } else if (this.FunctionCode != 0) //RES HEADER { this.IIN = new IIN(Userdata[2], Userdata[3]); // IIN data |--MSB--||--LSB--| userdataindex = 4; } //still have data while (userdataindex < this.Userdata.Length) { byte objtemp = Userdata[userdataindex]; byte vartemp = Userdata[userdataindex + 1]; Qualifier qtemp = new Qualifier(Userdata[userdataindex + 2]); userdataindex += 3; // for Object + Var + Qualifier total 3 bytes int rangesizetemp = qtemp.getRangeSize(); byte[] rangetemp = new byte[rangesizetemp]; for (int i = 0; i < rangetemp.Length; i++) { rangetemp[i] = Userdata[userdataindex]; userdataindex++; } // Construct Object Header Object_Header OH = new Object_Header(objtemp, vartemp, qtemp, rangetemp); int osizetemp = OH.getTotalSize(); byte [] datatemp = new byte[osizetemp]; for (int i = 0; i < datatemp.Length; i++) { datatemp[i] = Userdata[userdataindex]; userdataindex++; } //Construct Object Field Object_Field otemp = new Object_Field(OH, datatemp); ObjectList.Add(otemp); //this.Object[objectindex] = new Object_Field(OH, datatemp); } this.Object = new Object_Field[ObjectList.Count]; this.Object = ObjectList.ToArray(typeof(Object_Field)) as Object_Field[]; }
public Object_Field(Object_Header OH, byte [] userdata) { this.ObjectHeader = OH; int userdataindex = 0; // index for running userdata to be Class's attributes this.DataSize = this.ObjectHeader.getDataSize(); //check index size this.IndexSize = this.ObjectHeader.Qualifier.getIndexSize(); this.isSizeIndex = this.ObjectHeader.Qualifier.getIndexType(); uint Ocount = this.ObjectHeader.getObjectQuantity(); // get object quantity of byte int Count = this.ObjectHeader.getObjectCount(); // get object count //---------------------------- Data Object--------------------------------------// if (this.DataSize == 0x81) // Object is bit { this.Obj = new ObjectData[Count]; byte Oindex = 0; // Object Array Index uint tempaddress = this.ObjectHeader.Start; for (int i = 0; i < Ocount; i++) // loop = amount of total bytes { uint indextemp = 0; bool hasIndex = false; //byte[] datatemp = new byte[Ocount]; for (int k = 0; (k < 8) && (Oindex < Count); k++, Oindex++) // loop 8 times for every bits in 1 byte { byte[] datatemp = new byte[1]; datatemp[0] = (byte)(userdata[userdataindex] >> k); //shift k bit datatemp[0] &= 0x01; // Check LSB 0 or 1 Obj[Oindex] = new ObjectData(this.ObjectHeader.ObjectGroup, this.ObjectHeader.ObjectVariation, indextemp, tempaddress, datatemp, hasIndex, true); tempaddress++; } userdataindex++; } } else // Object is byte { Obj = new ObjectData[Ocount]; if (this.ObjectHeader.Qualifier.Qcode != 6 && this.DataSize != 100) // if Q-code isn't 6 and has data { //Ocount = this.getObjectQuantity(); if (IndexSize > 0) //object has index { for (int i = 0; i < Obj.Length; i++) { uint indextemp = 0; //uint tempaddress = 0; bool hasIndex = true; byte[] datatemp = new byte[this.DataSize]; for (int j = 0; j < IndexSize; j++) // loop for combine index data { indextemp += (uint)(userdata[userdataindex] << (8 * j)); userdataindex++; } for (int k = 0; k < this.DataSize; k++) { datatemp[k] = userdata[userdataindex]; userdataindex++; } Obj[i] = new ObjectData(this.ObjectHeader.ObjectGroup, this.ObjectHeader.ObjectVariation, indextemp, indextemp, datatemp, hasIndex); } } else //object has no index { uint tempaddress = this.ObjectHeader.Start;; uint indextemp = 0; bool hasIndex = false; for (int i = 0; i < Obj.Length; i++) { byte[] datatemp = new byte[this.DataSize]; for (int k = 0; k < this.DataSize; k++) { datatemp[k] = userdata[userdataindex]; userdataindex++; } Obj[i] = new ObjectData(this.ObjectHeader.ObjectGroup, this.ObjectHeader.ObjectVariation, indextemp, tempaddress, datatemp, hasIndex); tempaddress++; } } } } //--------------------------------------------------------------------------------// }