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.
		
		
		
		
			
				
					142 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					142 lines
				
				3.8 KiB
			| 
											8 years ago
										 | #pragma once
 | ||
| 
											8 years ago
										 | #include "panda_shared/panda.h"
 | ||
| 
											8 years ago
										 | #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;
 | ||
|  | };
 |