Subversion Repositories HomeAutomation

Rev

Blame | Last modification | View Log | SVN | RSS feed

  1. #define STRICT
  2. #include "CanProtoMessage.h"
  3.  
  4.  
  5. CanProtoMessage::CanProtoMessage() {}
  6.  
  7. CanProtoMessage::CanProtoMessage(unsigned char funct, unsigned int funcc, unsigned char nid, unsigned int sid, unsigned char data_length, unsigned char data[])
  8. {
  9.     CanProtoMessage::funct=funct;
  10.     CanProtoMessage::funcc=funcc;
  11.     CanProtoMessage::nid=nid;
  12.     CanProtoMessage::sid=sid;
  13.     CanProtoMessage::data_length=data_length;
  14.     for(int i=0;i<8;i++) CanProtoMessage::data[i]=data[i];
  15. }
  16.  
  17. CanProtoMessage::CanProtoMessage(unsigned char bytes[],int startIndex)
  18. {
  19.     // Constructor
  20.     // 17 bytes, a packet.
  21.     // 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
  22.     /*
  23.     * 000TTTTC CCCCCCCC CNNNNNNS SSSSSSSS
  24.     *
  25.     * <FUNCT> = 00011110 00000000 00000000 00000000 = 0x1E000000    max(0xF, 15)
  26.     * <FUNCC> = 00000001 11111111 10000000 00000000 = 0x01FF8000    max(0x3FF, 1023)
  27.     * <NID>   = 00000000 00000000 01111110 00000000 = 0x00007E00    max(0x3F, 63)
  28.     * <SID>   = 00000000 00000000 00000001 11111111 = 0x000001FF    max(0x1FF, 511)
  29.     *
  30.     <FUNCT>, 4 bitar = Function Type, funktionstyp.
  31.     <FUNCC>, 10 bitar = Function Code, funktionskod.
  32.     <NID>, 6 bitar = Network ID, nätverksid.
  33.     <SID>, 9 bitar = Sender ID, sändarid.
  34.     */
  35.    
  36.     // To fix lazy indexing.
  37.     startIndex--;
  38.  
  39.     CanProtoMessage::funct = ((0x1E & bytes[startIndex+1])>>1); // 00011110 & id[0]
  40.     CanProtoMessage::funcc = ((0x01 & bytes[startIndex+1])<<9) + ((0xFF & bytes[startIndex+2])<<1) + ((0x80 & bytes[startIndex+3])>>7); // 00000001 & id[0]<<16 + 11111111 & id[1]<<8 + 10000000 & id[2]
  41.     CanProtoMessage::nid   = ((0x7E & bytes[startIndex+3])>>1); // 01111110 & id[2]
  42.     CanProtoMessage::sid   = ((0x01 & bytes[startIndex+3])<<8) + (0xFF & bytes[startIndex+4]); // 00000001 & id[2]<<8 + 11111111 & id[3]
  43.  
  44.     CanProtoMessage::data_length = bytes[startIndex+7];
  45.  
  46.     for(int i=0;i<8;i++) CanProtoMessage::data[i]=bytes[startIndex+8+i];
  47.  
  48. }
  49.  
  50. CanProtoMessage::~CanProtoMessage()
  51. {
  52.     //Destructor
  53. }
  54.  
  55. bool CanProtoMessage::equals(CanProtoMessage *cpm)
  56. {
  57.     unsigned char * bytes;
  58.    
  59.     bytes = cpm->getData();
  60.  
  61.  
  62.     for(int i=0;i<8;i++) if (CanProtoMessage::data[i]!=bytes[i]) return false;
  63.  
  64.     return (CanProtoMessage::funct==cpm->getFunct() && CanProtoMessage::funcc==cpm->getFuncc() && CanProtoMessage::nid==cpm->getNid() && CanProtoMessage::sid==cpm->getSid() && CanProtoMessage::data_length==cpm->getDataLength());
  65.  
  66. }
  67.  
  68. unsigned char CanProtoMessage::getFunct(){ return CanProtoMessage::funct; }
  69. unsigned int CanProtoMessage::getFuncc(){ return CanProtoMessage::funcc; }
  70. unsigned char CanProtoMessage::getNid(){ return CanProtoMessage::nid; }
  71. unsigned int CanProtoMessage::getSid(){ return CanProtoMessage::sid; }
  72. unsigned char CanProtoMessage::getDataLength(){ return CanProtoMessage::data_length; }
  73. unsigned char* CanProtoMessage::getData(){ return CanProtoMessage::data; }
  74. void CanProtoMessage::getBytes(unsigned char bytes[])
  75. {
  76.  
  77.     // 17 bytes, a packet.
  78.     // 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
  79.     /*
  80.     * 000TTTTC CCCCCCCC CNNNNNNS SSSSSSSS
  81.     *
  82.     * <FUNCT> = 00011110 00000000 00000000 00000000 = 0x1E000000
  83.     * <FUNCC> = 00000001 11111111 10000000 00000000 = 0x01FF8000
  84.     * <NID>   = 00000000 00000000 01111110 00000000 = 0x00007E00
  85.     * <SID>   = 00000000 00000000 00000001 11111111 = 0x000001FF
  86.     *
  87.     <FUNCT>, 4 bitar = Function Type, funktionstyp.
  88.     <FUNCC>, 10 bitar = Function Code, funktionskod.
  89.     <NID>, 6 bitar = Network ID, nätverksid.
  90.     <SID>, 9 bitar = Sender ID, sändarid.
  91.     */
  92.  
  93.     bytes[0]=UART_START_BYTE;
  94.     bytes[1]=((CanProtoMessage::funct & 0x0F)<<1)+((CanProtoMessage::funcc & 0x200)>>9);
  95.     bytes[2]=((CanProtoMessage::funcc & 0x1FE)>>1);
  96.     bytes[3]=((CanProtoMessage::funcc & 0x01)<<7)+((CanProtoMessage::nid & 0x3F)<<1)+((CanProtoMessage::sid & 0x100)>>8);
  97.     bytes[4]=(CanProtoMessage::sid & 0xFF);
  98.     bytes[5]=1;
  99.     bytes[6]=0;
  100.     bytes[7]=CanProtoMessage::data_length;
  101.     for(int i=0;i<8;i++) bytes[i+8]=CanProtoMessage::data[i];
  102.     bytes[16]=UART_END_BYTE;
  103. }