Rev 450 | Rev 457 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed
using System;using System.Collections.Generic;using System.Text;public class CanPacket {private byte pktclass = 0;// private byte type = 0;// private byte sid = 0;// private byte rid = 0;private byte data_length = 0;private uint id = 0;private byte[] data = new byte[8];private byte ext = 1;private byte rtr = 0;public CanPacket() {}public CanPacket(byte[] raw,uint startIndex) {// 17 bytes, a packet.// UART_START_BYTE id[0] id[1] id[2] id[3] extended remote_request data_length d[0] d[1] d[2] d[3] d[4] d[5] d[6] d[7] UART_END_BYTE/** 000CCCCx TTTTTTTT SSSSSSSS RRRRRRRR** <CLASS> = 00011110 00000000 00000000 00000000 = 0x1E000000 NMT, ...* <TYPE> = 00000000 11111111 00000000 00000000 = 0x00FF0000 NMT[CAN_NMT_PGM_START, CAN_ID_NMT_PGM_ACK, ...]* <SID> = 00000000 00000000 11111111 00000000 = 0x0000FF00 Sender ID* <RID> = 00000000 00000000 00000000 11111111 = 0x000000FF Receiver ID**/uint addr = (((uint)raw[startIndex + 3]) << 24) + (((uint)raw[startIndex + 2]) << 16) + (((uint)raw[startIndex + 1]) << 8) + (((uint)raw[startIndex + 0]));this.id = addr;this.pktclass = (byte)((addr & 0x1E000000) >> 25);// this.type = (byte)((addr & 0x00FF0000) >> 16);// this.sid = (byte)((addr & 0x0000FF00) >> 8);// this.rid = (byte)((addr & 0x000000FF));this.data_length = raw[startIndex + 6];ext = (byte)(0x0f & raw[startIndex + 4]);rtr = (byte)(0x0f & raw[startIndex + 5]);for (int i = 0; i < 8; i++) this.data[i] = raw[startIndex + 7 + i];}public CanPacket(string raw) {//denna funktion fungerar sådär, se till att bygga en bättre parser//1e00007f 1 0 04 03 02 01 96 3f 76 15string [] split = null;split = raw.Split( new Char [] {' '} );if ((split.Length >= 3) && (split.Length <= 11)) {try {id = System.Convert.ToUInt32(split[0].Trim(), 16);ext = (byte)(System.Convert.ToUInt32(split[1].Trim(), 16)&0xFF);rtr = (byte)(System.Convert.ToUInt32(split[2].Trim(), 16)&0xFF);//testa ext och rtr!for (int i = 0; i < split.Length-3; i++) {string dummy = split[i+3].Trim();if (dummy.Length == 0) break;data_length = (byte)((i+1)&0xFF);//Console.WriteLine("i: " + i + " i+3: " + (i+3) + " split[i+3]: " +split[i+3]);data[i] = (byte)(System.Convert.ToUInt32(dummy, 16)&0xFF);}}catch {Console.WriteLine("overflow ");}}}// public CanPacket(byte pktclass, byte type, byte sid, byte rid, byte data_length, byte[] data) {// //keep for compability for a while (Downloader.cs)// this.id = ((uint)pktclass<<24)|((uint)type<<16)|((uint)sid<<8)|((uint)rid);// this.data_length=data_length;// ext = 1;// rtr = 0;// for(int i=0;i<8;i++) this.data[i]=data[i];// }// public CanPacket(byte pktclass, byte type, byte sid, byte rid, byte data_length, byte[] data, byte rtr, byte ext) {// this.pktclass=pktclass;// this.type=type;// this.sid=sid;// this.rid=rid;// this.data_length=data_length;// for(int i=0;i<8;i++) this.data[i]=data[i];// this.ext = (byte)(0x0f & ext);// this.rtr = (byte)(0x0f & rtr);// }public override int GetHashCode() {return base.GetHashCode();}public override bool Equals(Object obj) {CanPacket cpm = (CanPacket)obj;byte[] bytes = cpm.getData();for(int i=0;i<8;i++) if (this.data[i]!=bytes[i]) return false;return (this.id==cpm.getId() && this.data_length==cpm.getDataLength());}public uint getId() { return this.id; }public void setId(uint id) { this.id = id; }//public byte getPktClass(){ return this.pktclass; }// public uint getType(){ return this.type; }// public uint getSid(){ return this.sid; }// public uint getRid(){ return this.sid; }public void setDataLength(byte datalength){ this.data_length=datalength; }public byte getDataLength(){ return this.data_length; }public byte[] getData(){ return this.data; }public void setExt(byte ext) { this.ext = ext; }public void setData(byte[] data){ this.data = data; }// public override string ToString() {// string str = "";// str = "pktclass: "+pktclass.ToString()+", type: "+type.ToString()+", sid: "+sid.ToString()+", rid: "+rid.ToString()+",data_length: "+data_length.ToString()+", data: ";// for (int i = 0; i < 8; i++) str+=data[i].ToString()+" ";// return str;// }public string toRawString() {string returnstring = "PKT " + String.Format("{0:x8}", id);returnstring = returnstring + " " + String.Format("{0:x1}", ext) + " " + String.Format("{0:x1}", rtr);for (int i = 0; i < data_length; i++) {returnstring = returnstring + " " + String.Format("{0:x2}", data[i]);}//returnstring = returnstring + "\n";return returnstring;}public byte[] getBytes() {byte[] bytes = new byte[15];// 17 bytes, a packet.// UART_START_BYTE id[0] id[1] id[2] id[3] extended remote_request data_length d[0] d[1] d[2] d[3] d[4] d[5] d[6] d[7] UART_END_BYTE/** 000CCCCx TTTTTTTT SSSSSSSS RRRRRRRR** <CLASS> = 00011110 00000000 00000000 00000000 = 0x1E000000 NMT, ...* <TYPE> = 00000000 11111111 00000000 00000000 = 0x00FF0000 NMT[CAN_NMT_PGM_START, CAN_ID_NMT_PGM_ACK, ...]* <SID> = 00000000 00000000 11111111 00000000 = 0x0000FF00 Sender ID* <RID> = 00000000 00000000 00000000 11111111 = 0x000000FF Receiver ID**/bytes[3] = (byte)((id & 0xFF000000) >> 24);bytes[2] = (byte)((id & 0x00FF0000) >> 16);bytes[1] = (byte)((id & 0x0000FF00) >> 8);bytes[0] = (byte)((id & 0x000000FF));bytes[4]=ext;bytes[5]=rtr;bytes[6]=this.data_length;for(int i=0;i<8;i++) bytes[i+7]=this.data[i];return bytes;}}