Rev 270 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 270 | johboh | 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 | } |