57 lines
2.1 KiB
C
57 lines
2.1 KiB
C
/*
|
|
* can_manager.h
|
|
*
|
|
* Created on: Sep 16, 2025
|
|
* Author: herli
|
|
*/
|
|
|
|
#ifndef SRC_CAN_LIBS_CAN_MANAGER_H_
|
|
#define SRC_CAN_LIBS_CAN_MANAGER_H_
|
|
|
|
#include "can_schema.h"
|
|
|
|
extern uint8_t startup;
|
|
|
|
extern volatile uint8_t EMPF2_BYTES[8];
|
|
extern volatile uint8_t s_empf2_pending;
|
|
|
|
|
|
/* Provide your HAL-backed TX function when initializing the manager. */
|
|
void can_manager_init(CanTxFn tx_fn);
|
|
|
|
/* Send all TX messages flagged with send_on_boot==1 (templates first, then symbols). */
|
|
void can_manager_boot(void);
|
|
|
|
/* RX entrypoint: call from your FDCAN Rx FIFO callback. */
|
|
void can_manager_on_rx(uint16_t can_id, const uint8_t data[8], uint8_t dlc);
|
|
|
|
/* TX by ID (packs symbols; starts from tx_template if present). Returns false if ID not found. */
|
|
bool can_manager_send(uint16_t can_id);
|
|
|
|
/* Utility: direct send of a message definition (useful if you already called can_db_find) */
|
|
bool can_manager_send_msg(const CanMessageDef *msg);
|
|
|
|
/* NEW: runtime registration of message handlers (keeps can_db.c pure-data) */
|
|
bool can_manager_register_handler(uint16_t can_id, CanDirection dir, CanRxHandler handler);
|
|
|
|
/* Register a handler for a specific message DEFINITION (no IDs in app code) */
|
|
bool can_manager_register_handler_msg(const CanMessageDef *msg, CanRxHandler handler);
|
|
|
|
// STARTUP MANAGER FUNCTIONS //
|
|
void can_manager_set_startup_reply_msg(const CanMessageDef *reply_msg); // use MSG_ID_EMPF3
|
|
/* Optional: we expose a ready-made startup-trigger handler you can register. */
|
|
void can_manager_rx_startup_trigger(const CanMessageDef *msg, const uint8_t in[8], CanTxFn tx);
|
|
|
|
void can_manager_rx_boot_reply_always(const CanMessageDef *msg, const uint8_t in[8], CanTxFn tx);
|
|
|
|
// REQUEST MANAGER FUNCTIONS //
|
|
/* Address-request handler (uses EMPF2 as the reply message def) */
|
|
void can_manager_set_request_reply_msg(const CanMessageDef *reply_msg); // use MSG_ID_EMPF2
|
|
void can_manager_rx_address_request(const CanMessageDef *msg, const uint8_t in[8], CanTxFn tx);
|
|
|
|
// Request/Reply control for EMPF2
|
|
bool can_manager_empf2_has_pending(void);
|
|
void can_manager_empf2_clear_pending(void);
|
|
|
|
#endif /* SRC_CAN_LIBS_CAN_MANAGER_H_ */
|