zephyr/modules/canopennode/canopennode.h

181 lines
5.1 KiB
C

/*
* 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_ */