Skip to content

Commit 12ed8f2

Browse files
committed
Move building header to new method
1 parent 02110df commit 12ed8f2

File tree

1 file changed

+40
-42
lines changed

1 file changed

+40
-42
lines changed

hal/transport/CAN/MyTransportCAN.cpp

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,3 @@
1-
// from address 8bits (A)
2-
// to address 8 bits (B)
3-
// current part number 4 bits (C)
4-
// total part count 4 bits (D)
5-
// 3 bits message_id (E)
6-
// 1 bit require ack (F)
7-
// 1 bit is ack (G)
8-
// 1 bit is extended frame (H). (FIXED)
9-
// 1 bit RTR (Remote Transmission Request) (I) (FIXED)
10-
// 1 bit SRR (Substitute Remote Request) (J) (FIXED)
11-
// header model (32 bits)
12-
// HIJG FEEE DDDD CCCC BBBB BBBB AAAA AAAA
13-
141
#include "hal/transport/CAN/driver/mcp_can.h"
152
#include "hal/transport/CAN/driver/mcp_can.cpp"
163
#include "MyTransportCAN.h"
@@ -27,6 +14,8 @@ long unsigned int rxId;
2714
unsigned char len = 0;
2815
unsigned char rxBuf[8];
2916
unsigned char _nodeId;
17+
18+
//message id updated for every outgoing mesage
3019
uint8_t message_id =0;
3120

3221
//buffer element
@@ -41,6 +30,7 @@ typedef struct {
4130
bool ready;
4231
} CAN_Packet;
4332

33+
//buffer
4434
CAN_Packet packets[CAN_BUF_SIZE];
4535

4636
//filter incoming messages (MCP2515 feature)
@@ -131,6 +121,32 @@ uint8_t _findCanPacketSlot(long unsigned int from,long unsigned int currentPart,
131121
return slot;
132122
}
133123

124+
// from address 8bits (A)
125+
// to address 8 bits (B)
126+
// current part number 4 bits (C)
127+
// total part count 4 bits (D)
128+
// 3 bits message_id (E)
129+
// 1 bit require ack (F)
130+
// 1 bit is ack (G)
131+
// 1 bit is extended frame (H). (FIXED)
132+
// 1 bit RTR (Remote Transmission Request) (I) (FIXED)
133+
// 1 bit SRR (Substitute Remote Request) (J) (FIXED)
134+
// header model (32 bits)
135+
// HIJG FEEE DDDD CCCC BBBB BBBB AAAA AAAA
136+
long unsigned int _buildHeader(uint8_t messageId, uint8_t totalPartCount, uint8_t currentPartNumber,uint8_t toAddress,uint8_t fromAddress){
137+
long unsigned int header=0x80; // set H=1 (FIXED), I=0 (FIXED), J=0 (FIXED), G=0 (To be implemented), F=0 (To be implemented)
138+
header+=(messageId & 0x07); //set messageId
139+
header=header << 4;
140+
header+=(totalPartCount & 0x0F);//set total part count
141+
header=header << 4;
142+
header+=(currentPartNumber & 0x0F);//set current part number
143+
header=header << 8;
144+
header+=toAddress;//set destination address
145+
header=header << 8;
146+
header+=fromAddress;//set source address
147+
CAN_DEBUG(PSTR("CAN:SND:CANH=%" PRIu32 ",ID=%" PRIu8 ",TOTAL=%"PRIu8",CURR=%"PRIu8",TO=%"PRIu8",FROM=%"PRIu8"\n"), header, messageId, totalPartCount,currentPartNumber,toAddress,fromAddress);
148+
return header;
149+
}
134150
bool transportSend(const uint8_t to, const void* data, const uint8_t len, const bool noACK)
135151
{
136152
(void)noACK; // some ack is provided by CAN itself. TODO implement application layer ack.
@@ -140,50 +156,32 @@ bool transportSend(const uint8_t to, const void* data, const uint8_t len, const
140156
if (len % 8 != 0) {
141157
noOfFrames++;
142158
}
143-
//set left most bit to 1 as this indicates extended frame
144-
uint8_t h1 = 0x80;
145-
//increment msg_id for new message.
146-
h1+=message_id;
159+
//update message_id
147160
message_id++;
148-
message_id=(message_id & 0x07);
161+
//make sure message_id isn't longer than 3 bits.
162+
message_id = message_id & 0x07;
149163

150-
//set total number of frames
151-
uint8_t h2 = noOfFrames;
152-
//shift left to create space for current frame number
153-
h2=h2 << 4;
154-
uint8_t i = 0;
155164
CAN_DEBUG(PSTR("CAN:SND:LN=%" PRIu8 ",NOF=%" PRIu8 "\n"), len, noOfFrames);
156-
157-
for (i = 0; i < noOfFrames; i++) {
158-
uint32_t canId = h1;
159-
canId=canId << 8;
160-
//reset current frame number
161-
h2 = h2 & 0xF0;
162-
h2 += i;
163-
canId += h2;
164-
canId=canId << 8;
165-
canId += to;
166-
canId=canId << 8;
167-
canId += _nodeId;
165+
uint8_t currentFrame;
166+
for (currentFrame = 0; currentFrame < noOfFrames; currentFrame++) {
168167
uint8_t partLen;
169168
if (len<=8){
170169
partLen=len;
171-
} else if (i * 8 <= len) {
170+
} else if (currentFrame * 8 <= len) {
172171
partLen = 8;
173172
} else {
174173
partLen = len % 8;
175174
}
176175
uint8_t buff[8];
177176
uint8_t j=0;
178-
// memcpy(buff,datap[i*8+j],partlen);
177+
// memcpy(buff,datap[currentFrame*8],partLen);
179178
for (j = 0; j < partLen; j++) {
180-
buff[j]=datap[i*8+j];
179+
buff[j]=datap[currentFrame*8+j];
181180
}
182-
CAN_DEBUG(PSTR("CAN:SND:LN=%" PRIu8 ",DTA0=%" PRIu8 ",DTA1=%" PRIu8 ",DTA2=%" PRIu8 ",DTA3=%" PRIu8 ",DTA4=%" PRIu8 ",DTA5=%" PRIu8 ",DTA6=%" PRIu8 ",DTA7=%" PRIu8 "\n"), partLen, buff[0], buff[1], buff[2],buff[3],buff[4],buff[5],buff[6],buff[7]);
183181

184-
CAN_DEBUG(PSTR("CAN:SND:LN=%" PRIu8 ",CANH=%" PRIu32 "\n"), partLen, canId);
182+
CAN_DEBUG(PSTR("CAN:SND:LN=%" PRIu8 ",DTA0=%" PRIu8 ",DTA1=%" PRIu8 ",DTA2=%" PRIu8 ",DTA3=%" PRIu8 ",DTA4=%" PRIu8 ",DTA5=%" PRIu8 ",DTA6=%" PRIu8 ",DTA7=%" PRIu8 "\n"), partLen, buff[0], buff[1], buff[2],buff[3],buff[4],buff[5],buff[6],buff[7]);
185183

186-
byte sndStat = CAN0.sendMsgBuf(canId, partLen, buff);
184+
byte sndStat = CAN0.sendMsgBuf(_buildHeader(message_id, noOfFrames, currentFrame, to, _nodeId), partLen, buff);
187185
if (sndStat == CAN_OK) {
188186
CAN_DEBUG(PSTR("CAN:SND:OK\n"));
189187
return true;
@@ -203,7 +201,7 @@ bool transportDataAvailable(void)
203201
long unsigned int currentPart=(rxId & 0x000F0000)>>16;
204202
long unsigned int totalPartCount=(rxId & 0x00F00000)>>20;
205203
long unsigned int messageId=(rxId & 0x07000000)>>24;
206-
CAN_DEBUG(PSTR("CAN:RCV:CANH=%" PRIu32 ",FROM=%" PRIu32 ",TO=%" PRIu32 ",CURR=%" PRIu32 ",TOTAL=%" PRIu32 ",ID=%" PRIu32 "\n"), rxId, from, to, currentPart,totalPartCount,messageId);
204+
CAN_DEBUG(PSTR("CAN:RCV:CANH=%" PRIu32 ",ID=%" PRIu32 ",TOTAL=%"PRIu32",CURR=%"PRIu32",TO=%"PRIu32",FROM=%"PRIu32"\n"), rxId, messageId, totalPartCount,currentPart,to,from);
207205

208206
uint8_t slot;
209207
if(currentPart==0){

0 commit comments

Comments
 (0)