openpilot is an open source driver assistance system. openpilot performs the functions of Automated Lane Centering and Adaptive Cruise Control for over 200 supported car makes and models.
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.
 
 
 
 
 
 

141 lines
3.8 KiB

#pragma once
#include "panda_shared/panda.h"
#include "J2534_v0404.h"
#include "synchronize.h"
#include "J2534Frame.h"
#include "PandaJ2534Device.h"
#include "J2534MessageFilter.h"
#include "MessagePeriodic.h"
class J2534Frame;
class Action;
class PandaJ2534Device;
class J2534MessageFilter;
#define check_bmask(num, mask)(((num) & mask) == mask)
/**
Class representing a generic J2534 Connection created by PassThruConnect,
and is associated with a channelID given to the J2534 API user.
Subclasses implement specific J2534 supported protocols.
*/
class J2534Connection : public std::enable_shared_from_this<J2534Connection> {
friend class PandaJ2534Device;
public:
J2534Connection(
std::shared_ptr<PandaJ2534Device> panda_dev,
unsigned long ProtocolID,
unsigned long Flags,
unsigned long BaudRate
);
virtual ~J2534Connection() {};
//J2534 API functions
virtual long PassThruReadMsgs(PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
long PassThruWriteMsgs(PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout);
virtual long PassThruStartPeriodicMsg(PASSTHRU_MSG *pMsg, unsigned long *pMsgID, unsigned long TimeInterval);
virtual long PassThruStopPeriodicMsg(unsigned long MsgID);
virtual long PassThruStartMsgFilter(unsigned long FilterType, PASSTHRU_MSG *pMaskMsg, PASSTHRU_MSG *pPatternMsg,
PASSTHRU_MSG *pFlowControlMsg, unsigned long *pFilterID);
virtual long PassThruStopMsgFilter(unsigned long FilterID);
virtual long PassThruIoctl(unsigned long IoctlID, void *pInput, void *pOutput);
//Functions for parsing messages to be send with PassThruWriteMsgs.
virtual unsigned long validateTxMsg(PASSTHRU_MSG* msg);
virtual std::shared_ptr<MessageTx> parseMessageTx(PASSTHRU_MSG& msg) { return nullptr; };
//IOCTL functions
long init5b(SBYTE_ARRAY* pInput, SBYTE_ARRAY* pOutput);
long initFast(PASSTHRU_MSG* pInput, PASSTHRU_MSG* pOutput);
long clearTXBuff();
long clearRXBuff();
long clearPeriodicMsgs();
long clearMsgFilters();
virtual void setBaud(unsigned long baud);
unsigned long getBaud() {
return this->BaudRate;
}
unsigned long getProtocol() {
return this->ProtocolID;
};
virtual bool isProtoCan() {
return FALSE;
}
//Port is used in a protocol specific way to differentiate tranceivers.
unsigned long getPort() {
return this->port;
}
virtual void processIOCTLSetConfig(unsigned long Parameter, unsigned long Value);
virtual unsigned long processIOCTLGetConfig(unsigned long Parameter);
//Called when the passthru device has received a message for this connection
//Loopback messages are processed separately.
virtual void processMessage(const J2534Frame& msg);
//Limitations on message size. Override in every subclass.
virtual unsigned long getMinMsgLen() {
return 1;
}
virtual unsigned long getMaxMsgLen() {
return 4128;
}
virtual unsigned long getMaxMsgSingleFrameLen() {
return 12;
}
//Add an Action to the Task Queue for future processing.
//The task should be set its expire time before being submitted.
void schedultMsgTx(std::shared_ptr<Action> msgout);
void rescheduleExistingTxMsgs();
std::shared_ptr<PandaJ2534Device> getPandaDev() {
if (auto panda_dev_sp = this->panda_dev.lock())
return panda_dev_sp;
return nullptr;
}
//Add a message to the queue read by PassThruReadMsgs().
void addMsgToRxQueue(const J2534Frame& frame) {
synchronized(messageRxBuff_mutex) {
messageRxBuff.push(frame);
}
}
bool loopback = FALSE;
protected:
unsigned long ProtocolID;
unsigned long Flags;
unsigned long BaudRate;
unsigned long port;
std::weak_ptr<PandaJ2534Device> panda_dev;
Mutex messageRxBuff_mutex;
std::queue<J2534Frame> messageRxBuff;
std::array<std::shared_ptr<J2534MessageFilter>, 10> filters;
std::queue<std::shared_ptr<Action>> txbuff;
std::array<std::shared_ptr<MessagePeriodic>, 10> periodicMessages;
private:
Mutex staged_writes_lock;
};