-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCBUS.h
More file actions
86 lines (62 loc) · 1.73 KB
/
CBUS.h
File metadata and controls
86 lines (62 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#ifndef CANBUS_H
#define CANBUS_H
#include <Adafruit_MCP2515.h>
#include "Defaults.h"
#define CAN_INT 13
#define CAN_CS 12
#define CAN_BAUDRATE 125000
// CBUS opcodes
enum CBUS_OPC { NOOP = 0x00, ACON = 0x90, ACOF = 0x91 };
enum CBUSInit { CBUS_INIT_OK = 0, CBUS_INIT_FAIL };
typedef struct {
byte opcode;
byte nodeNumberHigh;
byte nodeNumberLow;
byte eventNumberHigh;
byte eventNumberLow;
byte param1;
byte param2;
byte param3;
} __attribute__((packed)) CBUSPacket;
class CBUS {
Adafruit_MCP2515 mcp;
public:
CBUS() : mcp(CAN_CS) {
};
int init(){
if(!mcp.begin(CAN_BAUDRATE)){
return CBUS_INIT_FAIL;
};
return CBUS_INIT_OK;
}
char getEvent(int * nodeNumber, int * eventNumber){
CBUSPacket packet;
int id;
int packetLength = mcp.parsePacket();
*nodeNumber = *eventNumber = 0;
trace.log("CBUS", "Rx packet:", packetLength);
//No message
if(packetLength == 0){
trace.log("CBUS", "No message");
return 0;
};
if(mcp.packetRtr()){
trace.log("CBUS", "Message is RTR - Ignoring");
return 0;
}
trace.logHex("CBUS", "Message received", (char *)&packet, sizeof(packet));
id = mcp.packetId();
mcp.readBytes((char *)&packet, packetLength <= sizeof(packet) ? packetLength : sizeof(packet));
if(packet.opcode != ACOF && packet.opcode != ACON){
trace.logHex("CBUS", "Opcode not supported: ", packet.opcode);
return 0;
};
trace.log("CBUS", "Opcode: ", (packet.opcode == ACON ? "ACON" : "ACOF"));
*nodeNumber = (packet.nodeNumberHigh << 8) | packet.nodeNumberLow;
*eventNumber = (packet.eventNumberHigh << 8) | packet.eventNumberLow;
trace.log("CBUS", "Node Number: ", *nodeNumber);
trace.log("CBUS", "Event Number: ", *eventNumber);
return packet.opcode;
};
};
#endif