Extract "send to buffer X" method

This commit is contained in:
Dmitry
2016-01-06 19:27:03 +03:00
parent a250acba70
commit e6653b01fd
2 changed files with 32 additions and 28 deletions
+24 -28
View File
@@ -7,8 +7,8 @@ const struct MCP_CAN::TXBn_REGS MCP_CAN::TXB[MCP_CAN::N_TXBUFFERS] = {
};
const struct MCP_CAN::RXBn_REGS MCP_CAN::RXB[N_RXBUFFERS] = {
{MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA},
{MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA}
{MCP_RXB0CTRL, MCP_RXB0SIDH, MCP_RXB0DATA, CANINTF_RX0IF},
{MCP_RXB1CTRL, MCP_RXB1SIDH, MCP_RXB1DATA, CANINTF_RX1IF}
};
void MCP_CAN::startSPI() {
@@ -427,25 +427,9 @@ MCP_CAN::ERROR MCP_CAN::initFilt(const RXF num, const bool ext, const uint32_t u
return res;
}
MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
MCP_CAN::ERROR MCP_CAN::sendMessage(const TXBn txbn, const struct can_frame *frame)
{
if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) {
return ERROR_FAILTX;
}
const struct TXBn_REGS *txbuf = NULL;
for (int i=0; i<N_TXBUFFERS; i++) {
uint8_t ctrlval = readRegister(TXB[i].CTRL);
if ( (ctrlval & TXB_TXREQ) == 0 ) {
txbuf = &TXB[i];
break;
}
}
if (txbuf == NULL) {
return ERROR_FAILTX;
}
const struct TXBn_REGS *txbuf = &TXB[txbn];
uint8_t data[13];
@@ -466,6 +450,25 @@ MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
return ERROR_OK;
}
MCP_CAN::ERROR MCP_CAN::sendMessage(const struct can_frame *frame)
{
if (frame->can_dlc > CAN_MAX_CHAR_IN_MESSAGE) {
return ERROR_FAILTX;
}
TXBn txBuffers[N_TXBUFFERS] = {TXB0, TXB1, TXB2};
for (int i=0; i<N_TXBUFFERS; i++) {
const struct TXBn_REGS *txbuf = &TXB[txBuffers[i]];
uint8_t ctrlval = readRegister(txbuf->CTRL);
if ( (ctrlval & TXB_TXREQ) == 0 ) {
return sendMessage(txBuffers[i], frame);
}
}
return ERROR_FAILTX;
}
//MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, uint32_t *id, uint8_t *dlc, uint8_t buf[], bool *rtr, bool *ext)
MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame)
{
@@ -499,14 +502,7 @@ MCP_CAN::ERROR MCP_CAN::readMessage(const RXBn rxbn, struct can_frame *frame)
readRegisterS(rxb->DATA, frame->data, dlc);
switch (rxbn) {
case RXB0:
modifyRegister(MCP_CANINTF, CANINTF_RX0IF, 0);
break;
case RXB1:
modifyRegister(MCP_CANINTF, CANINTF_RX1IF, 0);
break;
}
modifyRegister(MCP_CANINTF, rxb->CANINTF_RXnIF, 0);
return ERROR_OK;
}
+8
View File
@@ -113,6 +113,12 @@ class MCP_CAN
RXB1 = 1
};
enum TXBn {
TXB0 = 0,
TXB1 = 1,
TXB2 = 2
};
enum /*class*/ MODE : uint8_t {
MODE_NORMAL = 0x00,
MODE_SLEEP = 0x20,
@@ -310,6 +316,7 @@ class MCP_CAN
REGISTER CTRL;
REGISTER SIDH;
REGISTER DATA;
CANINTF CANINTF_RXnIF;
} RXB[N_RXBUFFERS];
uint8_t SPICS;
@@ -340,6 +347,7 @@ class MCP_CAN
ERROR begin(const CAN_SPEED speedset);
ERROR initMask(const uint8_t num, const bool ext, const uint32_t ulData);
ERROR initFilt(const RXF num, const bool ext, const uint32_t ulData);
ERROR sendMessage(const TXBn txbn, const struct can_frame *frame);
ERROR sendMessage(const struct can_frame *frame);
ERROR readMessage(const RXBn rxbn, struct can_frame *frame);
ERROR readMessage(struct can_frame *frame);