/**
 * @file	   nms_can.h
 *
 * @copyright  Nehemis SARL reserves all rights even in the event of industrial
 *             property rights. We reserve all rights of disposal such as
 *             copying and passing on to third parties.
 *
 * @brief	   CANOpen files abstracted for furthur use in the project.
 *
 */

#ifndef NMS_CAN_H_
#define NMS_CAN_H_

/******************************************************************************
 * Include Header Files
 ******************************************************************************/
#include "nms_types.h"
#include "co_datatype.h"
#include "co_nmt.h"
///******************************************************************************
// * Macro constant declarations
// ******************************************************************************/
//#define NMS_CANOPEN_BITRATE					250u
///******************************************************************************
// * Extern Function Declarations
// ******************************************************************************/
/**
 * @brief Initializes the CAN controller and CANopen stack.
 */
void NmsCanInit(void);

/**
 * @brief Runs the CAN communication tasks.
 *
 * @param    canLine_u8	 Can line selected.
 */
void NmsCanRun(void);

/**
 * @brief 	Retrieves a 8-bit object from the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			pObj_pu8 	Pointer to store the retrieved object value.
 * 			canLine_u8	Can line selected.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanGetObj_u8(uint16 index_u16, uint8 subIndex_u8, uint8 *pObj_pu8);

/**
 * @brief 	Retrieves a 32-bit object from the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			pObj_pu8 	Pointer to store the retrieved object value.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanGetObj_u32(uint16 index_u16, uint8 subIndex_u8, uint32 *pObj_pu32);

/**
 * @brief 	Retrieves a float object from the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			pObj_f32 	Pointer to store the retrieved object value.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanGetObj_f32(uint16 index_u16, uint8 subIndex_u8, float32 *pObj_pf32);

/**
 * @brief 	Puts a 8-bit object in the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			newVal_u32 	The new value to be set.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanPutObj_u8(uint16 index_u16, uint8 subIndex_u8, uint8 newVal_u8);

/**
 * @brief 	Puts a 32-bit object in the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			newVal_u16 	The new value to be set.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanPutObj_u16(uint16 index_u16, uint8 subIndex_u8, uint16 newVal_u16);

/**
 * @brief 	Puts a 32-bit object in the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			newVal_u32 	The new value to be set.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanPutObj_u32(uint16 index_u16, uint8 subIndex_u8, uint32 newVal_u32);

/**
 * @brief 	Puts a float object in the CANopen object dictionary.
 *
 * @param 	index_u16 	The object dictionary index.
 * 			subIndex_u8 The sub-index of the object.
 * 			newVal_u32 	The new value to be set.
 *
 * @return 	Error code. (NMS_ERR_NONE if successful, or an error code).
 */
uint32 NmsCanPutObj_f32(uint16 index_u16, uint8 subIndex_u8, uint32 newVal_u32);

/**
 * @brief	Checks if all nodes are in OPERATIONAL state.
 *
 * @return	CO_TRUE if all nodes are OPERATIONAL, CO_FALSE otherwise.
 */
bool NmsCanAreAllNodesOperational(void);
#endif /* NMS_CAN_H_ */
