You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.5 KiB
44 lines
1.5 KiB
#include "stdafx.h"
|
|
#include "MessageTx_CAN.h"
|
|
#include "J2534Connection_CAN.h"
|
|
|
|
MessageTx_CAN::MessageTx_CAN(
|
|
std::shared_ptr<J2534Connection> connection_in,
|
|
PASSTHRU_MSG& to_send
|
|
) : MessageTx(connection_in, to_send), sentyet(FALSE), txInFlight(FALSE) {};
|
|
|
|
void MessageTx_CAN::execute() {
|
|
uint32_t addr = ((uint8_t)fullmsg.Data[0]) << 24 | ((uint8_t)fullmsg.Data[1]) << 16 |
|
|
((uint8_t)fullmsg.Data[2]) << 8 | ((uint8_t)fullmsg.Data[3]);
|
|
|
|
if (auto conn_sp = std::static_pointer_cast<J2534Connection_CAN>(this->connection.lock())) {
|
|
if (auto panda_dev_sp = conn_sp->getPandaDev()) {
|
|
auto payload = fullmsg.Data.substr(4);
|
|
if (panda_dev_sp->panda->can_send(addr, check_bmask(this->fullmsg.TxFlags, CAN_29BIT_ID),
|
|
(const uint8_t*)payload.c_str(), (uint8_t)payload.size(), panda::PANDA_CAN1) == FALSE) {
|
|
return;
|
|
}
|
|
this->txInFlight = TRUE;
|
|
this->sentyet = TRUE;
|
|
panda_dev_sp->txMsgsAwaitingEcho.push(shared_from_this());
|
|
}
|
|
}
|
|
}
|
|
|
|
//Returns TRUE if receipt is consumed by the msg, FALSE otherwise.
|
|
BOOL MessageTx_CAN::checkTxReceipt(J2534Frame frame) {
|
|
if (txReady()) return FALSE;
|
|
if (frame.Data == fullmsg.Data && ((this->fullmsg.TxFlags & CAN_29BIT_ID) == (frame.RxStatus & CAN_29BIT_ID))) {
|
|
txInFlight = FALSE;
|
|
if (auto conn_sp = std::static_pointer_cast<J2534Connection_CAN>(this->connection.lock()))
|
|
if (conn_sp->loopback)
|
|
conn_sp->addMsgToRxQueue(frame);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void MessageTx_CAN::reset() {
|
|
sentyet = FALSE;
|
|
txInFlight = FALSE;
|
|
}
|
|
|