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.
180 lines
5.1 KiB
180 lines
5.1 KiB
/* |
|
* Copyright (c) 2019 Vestas Wind Systems A/S |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
/** |
|
* @defgroup CAN CAN BUS |
|
* @{ |
|
* @} |
|
*/ |
|
|
|
/** |
|
* @brief CANopen Network Stack |
|
* @defgroup canopen CANopen Network Stack |
|
* @ingroup CAN |
|
* @{ |
|
*/ |
|
|
|
#ifndef ZEPHYR_MODULES_CANOPENNODE_CANOPENNODE_H_ |
|
#define ZEPHYR_MODULES_CANOPENNODE_CANOPENNODE_H_ |
|
|
|
#include <CANopen.h> |
|
#include <CO_Emergency.h> |
|
#include <CO_SDO.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
/** |
|
* @brief CANopen object dictionary storage types. |
|
*/ |
|
enum canopen_storage { |
|
CANOPEN_STORAGE_RAM, |
|
CANOPEN_STORAGE_ROM, |
|
CANOPEN_STORAGE_EEPROM, |
|
}; |
|
|
|
struct canopen_context { |
|
const struct device *dev; |
|
}; |
|
|
|
/** |
|
* @brief Attach CANopen object dictionary storage handlers. |
|
* |
|
* Attach CANopen storage handler functions to object dictionary |
|
* indexes 0x1010 (Store parameters) and 0x1011 (Restore default |
|
* parameters). This function must be called after calling CANopenNode |
|
* `CO_init()`. |
|
* |
|
* The handlers will save object dictionary entries of type @ref |
|
* CANOPEN_STORAGE_ROM to non-volatile storage when a CANopen SDO |
|
* client writes 0x65766173 ('s', 'a', 'v', 'e' from LSB to MSB) to |
|
* object dictionary index 0x1010 sub-index 1. |
|
* |
|
* Object dictionary entries of types @ref CANOPEN_STORAGE_ROM (and |
|
* optionally @ref CANOPEN_STORAGE_EEPROM) will be deleted from |
|
* non-volatile storage when a CANopen SDO client writes 0x64616F6C |
|
* ('l', 'o', 'a', 'd' from LSB to MSB) to object dictionary index |
|
* 0x1011 sub-index 1. |
|
* |
|
* Object dictionary entries of type @ref CANOPEN_STORAGE_EEPROM may be |
|
* saved by the application by periodically calling @ref |
|
* canopen_storage_save(). |
|
* |
|
* Object dictionary entries of type @ref CANOPEN_STORAGE_RAM are |
|
* never saved to non-volatile storage. |
|
* |
|
* @param sdo CANopenNode SDO server object |
|
* @param em CANopenNode Emergency object |
|
*/ |
|
void canopen_storage_attach(CO_SDO_t *sdo, CO_EM_t *em); |
|
|
|
/** |
|
* @brief Save CANopen object dictionary entries to non-volatile storage. |
|
* |
|
* Save object dictionary entries of a given type to non-volatile |
|
* storage. |
|
* |
|
* @param storage CANopen object dictionary entry type |
|
* |
|
* @return 0 if successful, negative errno code if failure |
|
*/ |
|
int canopen_storage_save(enum canopen_storage storage); |
|
|
|
/** |
|
* @brief Erase CANopen object dictionary entries from non-volatile storage. |
|
* |
|
* Erase object dictionary entries of a given type from non-volatile |
|
* storage. |
|
* |
|
* @param storage CANopen object dictionary entry type |
|
* |
|
* @return 0 if successful, negative errno code if failure |
|
*/ |
|
int canopen_storage_erase(enum canopen_storage storage); |
|
|
|
/** |
|
* @brief Attach CANopen object dictionary program download handlers. |
|
* |
|
* Attach CANopen program download functions to object dictionary |
|
* indexes 0x1F50, 0x1F51, 0x1F56, and 0x1F57. This function must be |
|
* called after calling CANopenNode `CO_init()`. |
|
* |
|
* @param nmt CANopenNode NMT object |
|
* @param sdo CANopenNode SDO server object |
|
* @param em CANopenNode Emergency object |
|
*/ |
|
void canopen_program_download_attach(CO_NMT_t *nmt, CO_SDO_t *sdo, CO_EM_t *em); |
|
|
|
/** |
|
* @typedef canopen_led_callback_t |
|
* @brief CANopen LED indicator callback function signature. |
|
* |
|
* @param value true if the LED indicator shall be turned on, false otherwise. |
|
* @param arg argument that was passed when LEDs were initialized. |
|
*/ |
|
typedef void (*canopen_led_callback_t)(bool value, void *arg); |
|
|
|
/** |
|
* @brief Initialize CANopen LED indicators. |
|
* |
|
* Initialize CANopen LED indicators and attach callbacks for setting |
|
* their state. Two LED indicators, a red and a green, are supported |
|
* according to CiA 303-3. |
|
* |
|
* @param nmt CANopenNode NMT object. |
|
* @param green_cb callback for changing state on the green LED indicator. |
|
* @param green_arg argument to pass to the green LED indicator callback. |
|
* @param red_cb callback for changing state on the red LED indicator. |
|
* @param red_arg argument to pass to the red LED indicator callback. |
|
*/ |
|
void canopen_leds_init(CO_NMT_t *nmt, |
|
canopen_led_callback_t green_cb, void *green_arg, |
|
canopen_led_callback_t red_cb, void *red_arg); |
|
|
|
/** |
|
* @brief Indicate CANopen program download in progress |
|
* |
|
* Indicate that a CANopen program download is in progress. |
|
* |
|
* @param in_progress true if program download is in progress, false otherwise |
|
*/ |
|
void canopen_leds_program_download(bool in_progress); |
|
|
|
/** |
|
* @brief Callback for incoming CAN message |
|
* |
|
* This callback will be called from interrupt context and should therefore |
|
* return quickly. |
|
* |
|
* It can be used to e.g. wake the loop polling calling CO_process. |
|
*/ |
|
typedef void (*canopen_rxmsg_callback_t)(void); |
|
|
|
/** |
|
* @brief Set callback for incoming CAN message |
|
* |
|
* Set up callback to be called on incoming CAN message on any of |
|
* the configured filters for CANopenNode. |
|
* |
|
* This can be used to wake the loop calling CO_process when an incoming |
|
* message needs to be processed. |
|
* |
|
* Setting a new callback will overwrite any existing callback. |
|
* |
|
* @param callback the callback to set |
|
*/ |
|
void canopen_set_rxmsg_callback(canopen_rxmsg_callback_t callback); |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
/** |
|
* @} |
|
*/ |
|
|
|
#endif /* ZEPHYR_MODULES_CANOPENNODE_CANOPENNODE_H_ */
|
|
|