// CANInterfacePlugin.h // // Defines the API for building a CAN Interface Plugin to support // PWM-cable-free CAN motor control on FRC robots. This allows you // to connect any CAN interface to the secure Jaguar CAN driver. // #ifndef __CANInterfacePlugin_h__ #define __CANInterfacePlugin_h__ #include #define CAN_IS_FRAME_REMOTE 0x80000000 #define CAN_IS_FRAME_11BIT 0x40000000 #define CAN_29BIT_MESSAGE_ID_MASK 0x1FFFFFFF #define CAN_11BIT_MESSAGE_ID_MASK 0x000007FF class CANInterfacePlugin { public: CANInterfacePlugin() {} virtual ~CANInterfacePlugin() {} /** * This entry-point of the CANInterfacePlugin is passed a message that the * driver needs to send to * a device on the CAN bus. * * This function may be called from multiple contexts and must therefore be * reentrant. * * @param messageID The 29-bit CAN message ID in the lsbs. The msb can * indicate a remote frame. * @param data A pointer to a buffer containing between 0 and 8 bytes to send * with the message. May be nullptr if dataSize is 0. * @param dataSize The number of bytes to send with the message. * @return Return any error code. On success return 0. */ virtual int32_t sendMessage(uint32_t messageID, const uint8_t *data, uint8_t dataSize) = 0; /** * This entry-point of the CANInterfacePlugin is passed buffers which should * be populated with * any received messages from devices on the CAN bus. * * This function is always called by a single task in the Jaguar driver, so it * need not be reentrant. * * This function is expected to block for some period of time waiting for a * message from the CAN bus. * It may timeout periodically (returning non-zero to indicate no message was * populated) to allow for * shutdown and unloading of the plugin. * * @param messageID A reference to be populated with a received 29-bit CAN * message ID in the lsbs. * @param data A pointer to a buffer of 8 bytes to be populated with data * received with the message. * @param dataSize A reference to be populated with the size of the data * received (0 - 8 bytes). * @return This should return 0 if a message was populated, non-0 if no * message was not populated. */ virtual int32_t receiveMessage(uint32_t &messageID, uint8_t *data, uint8_t &dataSize) = 0; #if defined(__linux) /** * This entry-point of the CANInterfacePlugin returns status of the CAN bus. * * This function may be called from multiple contexts and must therefore be * reentrant. * * This function will return detailed hardware status if available for * diagnostics of the CAN interface. * * @param busOffCount The number of times that sendMessage failed with a * busOff error indicating that messages * are not successfully transmitted on the bus. * @param txFullCount The number of times that sendMessage failed with a * txFifoFull error indicating that messages * are not successfully received by any CAN device. * @param receiveErrorCount The count of receive errors as reported by the CAN * driver. * @param transmitErrorCount The count of transmit errors as reported by the * CAN driver. * @return This should return 0 if all status was retrieved successfully or an * error code if not. */ virtual int32_t getStatus(uint32_t &busOffCount, uint32_t &txFullCount, uint32_t &receiveErrorCount, uint32_t &transmitErrorCount) { return 0; } #endif }; /** * This function allows you to register a CANInterfacePlugin to provide access a * CAN bus. * * @param interface A pointer to an object that inherits from CANInterfacePlugin * and implements * the pure virtual interface. If nullptr, unregister the current plugin. */ void FRC_NetworkCommunication_CANSessionMux_registerInterface( CANInterfacePlugin *interface); #endif // __CANInterfacePlugin_h__