Subversion Repositories HomeAutomation

Rev

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