Subversion Repositories HomeAutomation

Rev

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

  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 = 1;
  14.     private byte rtr = 0;
  15.    
  16.     public CanPacket() {
  17.        
  18.     }
  19.    
  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) {
  50.         //denna funktion fungerar sådär, se till att bygga en bättre parser
  51.        
  52.         //1e00007f 1 0 04 03 02 01 96 3f 76 15
  53.         string [] split = null;
  54.         //split = raw.Split( new Char [] {' '} );
  55.         split = raw.Split( ' ' );
  56.         if ((split.Length >= 3) && (split.Length <= 11)) {
  57.             try {
  58.                 id = System.Convert.ToUInt32(split[0].Trim(), 16);
  59.             }
  60.             catch {
  61.                 Console.WriteLine("\noverflow 1 <"+split[0].Trim()+">\n");
  62.             }
  63.             try {
  64.                 ext = (byte)(System.Convert.ToUInt32(split[1].Trim(), 16)&0xFF);
  65.             }
  66.             catch {
  67.                 Console.WriteLine("\noverflow 2 <"+split[1].Trim()+">\n");
  68.             }
  69.             try {
  70.                 rtr = (byte)(System.Convert.ToUInt32(split[2].Trim(), 16)&0xFF);
  71.             }
  72.             catch {
  73.                 Console.WriteLine("\noverflow 3 <"+split[2].Trim()+">\n");
  74.             }
  75.             //testa ext och rtr!
  76.             string dummy="";
  77.             try {
  78.                
  79.                 for (int i = 0; i < split.Length-3; i++) {
  80.                     dummy = split[i+3].Trim();
  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 {
  88.                 Console.WriteLine("\noverflow 4 <"+dummy+">\n");
  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; }
  110.     public void setId(uint id) { this.id = id; }
  111.     public byte getPktClass(){ return this.pktclass; }
  112.     public void setDataLength(byte datalength){ this.data_length=datalength; }
  113.     public byte getDataLength(){ return this.data_length; }
  114.     public byte[] getData(){ return this.data; }
  115.     public void setExt(byte ext) { this.ext = ext; }
  116.  
  117.     public void setData(byte[] data){ this.data = data; }
  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. }
  168.