Subversion Repositories HomeAutomation

Rev

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
}