|  |  |  | #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;
 | 
					
						
							|  |  |  | };
 |