Subversion Repositories HomeAutomation

Rev

Rev 457 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
442 arune 1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
 
5
public class CanPacket {
6
	private byte pktclass = 0;
7
//	private byte type = 0;
8
//	private byte sid = 0;
9
//	private byte rid = 0;
10
	private byte data_length = 0;
11
	private uint id = 0;
12
	private byte[] data = new byte[8];
450 arune 13
	private byte ext = 1;
442 arune 14
	private byte rtr = 0;
15
 
450 arune 16
	public CanPacket() {
17
 
18
	}
19
 
442 arune 20
	public CanPacket(byte[] raw,uint startIndex) { 
21
		// 17 bytes, a packet.
22
		// 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
23
		/*
24
		* 000CCCCx TTTTTTTT SSSSSSSS RRRRRRRR
25
		*
26
		* <CLASS> = 00011110 00000000 00000000 00000000 = 0x1E000000	NMT, ...
27
		* <TYPE>  = 00000000 11111111 00000000 00000000 = 0x00FF0000	NMT[CAN_NMT_PGM_START, CAN_ID_NMT_PGM_ACK, ...]
28
		* <SID>   = 00000000 00000000 11111111 00000000 = 0x0000FF00	Sender ID
29
		* <RID>   = 00000000 00000000 00000000 11111111 = 0x000000FF	Receiver ID
30
		* 
31
		*/
32
 
33
 
34
		uint addr = (((uint)raw[startIndex + 3]) << 24) + (((uint)raw[startIndex + 2]) << 16) + (((uint)raw[startIndex + 1]) << 8) + (((uint)raw[startIndex + 0]));
35
 
36
		this.id = addr;
37
		this.pktclass = (byte)((addr & 0x1E000000) >> 25);
38
//		this.type =	 (byte)((addr & 0x00FF0000) >> 16);
39
//		this.sid =	  (byte)((addr & 0x0000FF00) >> 8);
40
//		this.rid =	  (byte)((addr & 0x000000FF));
41
		this.data_length = raw[startIndex + 6];
42
 
43
		ext = (byte)(0x0f & raw[startIndex + 4]);
44
		rtr = (byte)(0x0f & raw[startIndex + 5]);
45
 
46
		for (int i = 0; i < 8; i++) this.data[i] = raw[startIndex + 7 + i];
47
	}
48
 
49
	public CanPacket(string raw) {
450 arune 50
		//denna funktion fungerar sådär, se till att bygga en bättre parser
51
 
442 arune 52
		//1e00007f 1 0 04 03 02 01 96 3f 76 15
53
		string [] split = null;
1397 arune 54
		//split = raw.Split( new Char [] {' '} );
55
		split = raw.Split( ' ' );
442 arune 56
		if ((split.Length >= 3) && (split.Length <= 11)) {
57
			try {
58
				id = System.Convert.ToUInt32(split[0].Trim(), 16);
457 arune 59
			}
60
			catch {
1397 arune 61
				Console.WriteLine("\noverflow 1 <"+split[0].Trim()+">\n");
457 arune 62
			}
63
			try {
442 arune 64
				ext = (byte)(System.Convert.ToUInt32(split[1].Trim(), 16)&0xFF);
457 arune 65
			}
66
			catch {
1397 arune 67
				Console.WriteLine("\noverflow 2 <"+split[1].Trim()+">\n");
457 arune 68
			}
69
			try {
442 arune 70
				rtr = (byte)(System.Convert.ToUInt32(split[2].Trim(), 16)&0xFF);
457 arune 71
			}
72
			catch {
1397 arune 73
				Console.WriteLine("\noverflow 3 <"+split[2].Trim()+">\n");
457 arune 74
			}
1397 arune 75
			//testa ext och rtr!
76
			string dummy="";
457 arune 77
			try {
442 arune 78
 
79
				for (int i = 0; i < split.Length-3; i++) {
1397 arune 80
					dummy = split[i+3].Trim();
442 arune 81
					if (dummy.Length == 0) break;
82
					data_length = (byte)((i+1)&0xFF);
83
					//Console.WriteLine("i: " + i + " i+3: " + (i+3) + " split[i+3]: " +split[i+3]);
84
					data[i] = (byte)(System.Convert.ToUInt32(dummy, 16)&0xFF);
85
				}
86
			}
87
			catch {
1397 arune 88
				Console.WriteLine("\noverflow 4 <"+dummy+">\n");
442 arune 89
			}
90
		}
91
 
92
	}
93
 
94
	public override int GetHashCode() {
95
		return base.GetHashCode();
96
	}
97
 
98
	public override bool  Equals(Object obj) { 
99
		CanPacket cpm = (CanPacket)obj;
100
 
101
		byte[] bytes = cpm.getData();
102
 
103
		for(int i=0;i<8;i++) if (this.data[i]!=bytes[i]) return false;
104
 
105
		return (this.id==cpm.getId() && this.data_length==cpm.getDataLength());
106
 
107
	}
108
 
109
	public uint getId() { return this.id; }
450 arune 110
	public void setId(uint id) { this.id = id; }
457 arune 111
	public byte getPktClass(){ return this.pktclass; }
450 arune 112
	public void setDataLength(byte datalength){ this.data_length=datalength; }
442 arune 113
	public byte getDataLength(){ return this.data_length; }
114
	public byte[] getData(){ return this.data; }
450 arune 115
	public void setExt(byte ext) { this.ext = ext; }
453 arune 116
 
117
	public void setData(byte[] data){ this.data = data; }
442 arune 118
 
119
//	public override string ToString() {
120
//		string str = "";
121
 
122
//		str = "pktclass: "+pktclass.ToString()+", type: "+type.ToString()+", sid: "+sid.ToString()+", rid: "+rid.ToString()+",data_length: "+data_length.ToString()+", data: ";
123
//		for (int i = 0; i < 8; i++) str+=data[i].ToString()+" ";
124
 
125
//		return str;
126
//	}
127
 
128
	public string toRawString() {
129
 
130
		string returnstring = "PKT " + String.Format("{0:x8}", id);
131
		returnstring = returnstring + " " + String.Format("{0:x1}", ext) + " " + String.Format("{0:x1}", rtr);
132
		for (int i = 0; i < data_length; i++) {
133
			returnstring = returnstring + " " + String.Format("{0:x2}", data[i]);
134
		}
135
		//returnstring = returnstring + "\n";
136
		return returnstring;
137
	}
138
 
139
	public byte[] getBytes() {
140
		byte[] bytes = new byte[15];
141
 
142
		// 17 bytes, a packet.
143
		// 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
144
		/*
145
		* 000CCCCx TTTTTTTT SSSSSSSS RRRRRRRR
146
		*
147
		* <CLASS> = 00011110 00000000 00000000 00000000 = 0x1E000000	NMT, ...
148
		* <TYPE>  = 00000000 11111111 00000000 00000000 = 0x00FF0000	NMT[CAN_NMT_PGM_START, CAN_ID_NMT_PGM_ACK, ...]
149
		* <SID>   = 00000000 00000000 11111111 00000000 = 0x0000FF00	Sender ID
150
		* <RID>   = 00000000 00000000 00000000 11111111 = 0x000000FF	Receiver ID
151
		* 
152
		*/
153
 
154
 
155
		bytes[3] = (byte)((id & 0xFF000000) >> 24);
156
		bytes[2] = (byte)((id & 0x00FF0000) >> 16);
157
		bytes[1] = (byte)((id & 0x0000FF00) >> 8);
158
		bytes[0] = (byte)((id & 0x000000FF));
159
		bytes[4]=ext;
160
		bytes[5]=rtr;
161
		bytes[6]=this.data_length;
162
		for(int i=0;i<8;i++) bytes[i+7]=this.data[i];
163
 
164
		return bytes;
165
	}
166
 
167
}