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