#ifndef CtreCanNode_H_ #define CtreCanNode_H_ #include "ctre.h" //BIT Defines + Typedefs #include //CAN Comm #include #include #include // memcpy #include class CtreCanNode { public: CtreCanNode(UINT8 deviceNumber); ~CtreCanNode(); UINT8 GetDeviceNumber() { return _deviceNumber; } protected: template class txTask{ public: uint32_t arbId; T * toSend; T * operator -> () { return toSend; } T & operator*() { return *toSend; } bool IsEmpty() { if(toSend == 0) return true; return false; } }; template class recMsg{ public: uint32_t arbId; uint8_t bytes[8]; CTR_Code err; T * operator -> () { return (T *)bytes; } T & operator*() { return *(T *)bytes; } }; UINT8 _deviceNumber; void RegisterRx(uint32_t arbId); void RegisterTx(uint32_t arbId, uint32_t periodMs); CTR_Code GetRx(uint32_t arbId,uint8_t * dataBytes,uint32_t timeoutMs); void FlushTx(uint32_t arbId); template txTask GetTx(uint32_t arbId) { txTask retval = {0}; txJobs_t::iterator i = _txJobs.find(arbId); if(i != _txJobs.end()){ retval.arbId = i->second.arbId; retval.toSend = (T*)i->second.toSend; } return retval; } template void FlushTx(T & par) { FlushTx(par.arbId); } template recMsg GetRx(uint32_t arbId, uint32_t timeoutMs) { recMsg retval; retval.err = GetRx(arbId,retval.bytes, timeoutMs); return retval; } private: class txJob_t { public: uint32_t arbId; uint8_t toSend[8]; uint32_t periodMs; }; class rxEvent_t{ public: uint8_t bytes[8]; struct timespec time; rxEvent_t() { bytes[0] = 0; bytes[1] = 0; bytes[2] = 0; bytes[3] = 0; bytes[4] = 0; bytes[5] = 0; bytes[6] = 0; bytes[7] = 0; } }; typedef std::map txJobs_t; txJobs_t _txJobs; typedef std::map rxRxEvents_t; rxRxEvents_t _rxRxEvents; }; #endif