28 #define CAN4_EXTRACT_NUMBER(id) (uint8_t) ((id & 0x0000F800) >> 11)
29 #define CAN4_EXTRACT_COUNT(id) (uint8_t) ((id & 0x000007C0) >> 6)
31 #define _PV(x) ((uint16_t)x) << 1
32 #define _NV(x) ((uint16_t)x) << 11
33 #define _CV(x) ((uint16_t)x) << 6
35 #define CAN4_RETURN_UBOUNDS(x,max,out) if(x > max) return out
37 #define CAN4_BUF_MSG_UNUSED 0xFF
38 #define CAN4_BUF_UNUSED 0xFF
39 #define CAN4_BUF_EOM 0xEE
50 uint8_t can4_msgbuffer[CAN4_BUF_MSG_COUNT][3];
51 uint8_t can4_databuffer[CAN4_BUF_DATA_COUNT];
52 uint8_t can4_bytebuffer[CAN4_BUF_DATA_COUNT][8];
56 static uint8_t can4_getFreeMsgBuffer(
void);
58 static uint8_t can4_getFreeDataBuffer(
void);
59 static void can4_saveDataToByteBuffer(
uint8_t databuf,
uint8_t* data);
66 for(i = 0; i <= CAN4_MAX_PORT; i++)
69 for(i = 0; i < CAN4_BUF_MSG_COUNT; i++)
70 can4_msgbuffer[i][0] = CAN4_BUF_MSG_UNUSED;
72 for(i = 0; i < CAN4_BUF_DATA_COUNT; i++)
73 can4_databuffer[i] = CAN4_BUF_UNUSED;
82 CAN4_RETURN_UBOUNDS(port,CAN4_MAX_PORT,0);
85 if(can4_ports[port])
return 0;
89 if(tmp == 0)
return 0;
91 can4_ports[port] = tmp;
108 for(i = 0; i < len; ) {
109 while(n < 8 && i < len) {
114 if(!
can3_send(dest,_PV(port) | _NV(m) | _CV(count), msg, n, interrupt))
return 0;
133 CAN4_RETURN_UBOUNDS(port,CAN4_MAX_PORT,0);
136 if(!can4_ports[port])
return 0;
141 if(_len == 0)
return 0;
144 _count = CAN4_EXTRACT_COUNT(_id);
145 _num = CAN4_EXTRACT_NUMBER(_id);
150 for(i = 0; i < _len; i++)
162 msgbuf = ((_num == 0) ? can4_getFreeMsgBuffer() : can4_getMsgBuffer(port,_src));
163 if(msgbuf == 0)
return 0;
166 databuf = can4_getFreeDataBuffer();
167 if(databuf == 0)
return 0;
174 can4_databuffer[databuf] = CAN4_BUF_EOM;
175 can4_saveDataToByteBuffer(databuf, _data);
179 can4_msgbuffer[msgbuf][0] = _src;
180 can4_msgbuffer[msgbuf][1] = port;
181 can4_msgbuffer[msgbuf][2] = databuf;
186 can4_adaptRef(can4_msgbuffer[msgbuf][2],databuf);
189 if(_num == (_count - 1)) {
191 _len = can4_saveCompleteData(can4_msgbuffer[msgbuf][2],data, 0,0);
194 can4_msgbuffer[msgbuf][0] = CAN4_BUF_MSG_UNUSED;
207 for(i = 0; i < 8; i++) {
208 data[offset * 8 + i] = can4_bytebuffer[databuf][i];
211 if(can4_databuffer[databuf] != CAN4_BUF_EOM)
212 _len = can4_saveCompleteData(can4_databuffer[databuf], data, offset + 1, len + 8);
217 can4_databuffer[databuf] = CAN4_BUF_UNUSED;
222 if(can4_databuffer[dbuf] == CAN4_BUF_EOM)
223 can4_databuffer[dbuf] = databuf;
225 can4_adaptRef(can4_databuffer[dbuf],databuf);
231 for(i = 1; i <= CAN4_BUF_MSG_COUNT; i++) {
232 if(can4_msgbuffer[i - 1][0] == source &&
233 can4_msgbuffer[i - 1][1] == port) {
241 static uint8_t can4_getFreeMsgBuffer(
void) {
243 for(i = 1; i <= CAN4_BUF_MSG_COUNT; i++) {
244 if(can4_msgbuffer[i-1][0] == CAN4_BUF_MSG_UNUSED) {
252 static uint8_t can4_getFreeDataBuffer(
void) {
254 for(i = 1; i <= CAN4_BUF_DATA_COUNT; i++) {
255 if(can4_databuffer[i-1] == CAN4_BUF_UNUSED) {
263 static void can4_saveDataToByteBuffer(
uint8_t databuf,
uint8_t* data) {
266 for(i = 0; i < 8; i++)
267 can4_bytebuffer[databuf][i] = data[i];
271 if(can4_ports[port]) {
273 can4_ports[port] = 0;
uint8_t can3_maskedOpen(uint16_t uid, uint16_t idMask)
uint8_t can4_getData(uint8_t port, uint8_t *data, uint8_t *src)
uint8_t can4_open(uint8_t port)
uint8_t can3_getData(uint8_t buffer, uint8_t *data, uint8_t *source, uint16_t *id)
uint8_t can4_send(uint8_t dest, uint8_t port, uint8_t *data, uint8_t len, uint8_t interrupt)
uint8_t can3_init(uint8_t address)
uint8_t can3_send(uint8_t dest, uint16_t uid, uint8_t *data, uint8_t len, uint8_t interrupt)
void can3_close(uint8_t buffer)
void can4_close(uint8_t port)
uint8_t can4_init(uint8_t address)