22#ifdef CAN_COMMANDS_DISABLED_IF_NOT_USED
61 for (uint8_t i = 0; i <
canFilters.size(); i++){
66 HAL_CAN_Stop(this->
hcan);
102#ifdef CAN_COMMANDS_DISABLED_IF_NOT_USED
106 HAL_CAN_ActivateNotification(
hcan, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_RX_FIFO1_MSG_PENDING | CAN_IT_RX_FIFO0_FULL | CAN_IT_RX_FIFO0_OVERRUN | CAN_IT_RX_FIFO1_FULL | CAN_IT_RX_FIFO1_OVERRUN | CAN_IT_ERROR | CAN_IT_BUSOFF | CAN_IT_TX_MAILBOX_EMPTY);
108 return HAL_CAN_Start(this->
hcan) == HAL_OK;
117#ifdef CAN_COMMANDS_DISABLED_IF_NOT_USED
120 return HAL_CAN_Stop(this->
hcan) == HAL_OK;
142 HAL_CAN_Stop(this->
hcan);
145 HAL_CAN_ResetError(
hcan);
147 HAL_CAN_Start(this->
hcan);
190 header.IDE = pHeader->
extId ? CAN_ID_EXT : CAN_ID_STD;
191 header.RTR = pHeader->
rtr ? CAN_RTR_REMOTE : CAN_RTR_DATA;
198 if(pTxMailbox ==
nullptr){
199 pTxMailbox = &mailbox;
207 if(!HAL_CAN_GetTxMailboxesFreeLevel(
hcan)){
217 if (HAL_CAN_AddTxMessage(this->
hcan, &
header, aData, pTxMailbox) != HAL_OK)
250 code & (HAL_CAN_ERROR_TX_ALST0 | HAL_CAN_ERROR_TX_ALST1 | HAL_CAN_ERROR_TX_ALST2 | HAL_CAN_ERROR_TX_TERR0 | HAL_CAN_ERROR_TX_TERR1 | HAL_CAN_ERROR_TX_TERR2)
264 CAN_FilterTypeDef sFilterConfig;
265 sFilterConfig.FilterActivation = filter.
active;
266 sFilterConfig.FilterBank = 0;
267 sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
268 sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
269 sFilterConfig.FilterFIFOAssignment = filter.
buffer == 0 ? CAN_RX_FIFO0 : CAN_RX_FIFO1;
270 sFilterConfig.FilterIdHigh = ((filter.
filter_id << 5) | (filter.
filter_id >> (32 - 5))) & 0xFFFF;
271 sFilterConfig.FilterIdLow = (filter.
filter_id >> (11 - 3)) & 0xFFF8;
273 sFilterConfig.FilterMaskIdLow = (filter.
filter_mask >> (11 - 3)) & 0xFFF8;
277 sFilterConfig.FilterIdLow |= 0x04;
278 sFilterConfig.FilterMaskIdLow |= 0x4;
282 int32_t lowestId = 0;
284 int32_t foundId = -1;
286 for(uint8_t
id = lowestId;
id < highestId ;
id++ ){
287 bool foundExisting =
false;
289 if(
id == filter.FilterBank
295 foundExisting =
true;
305 if(foundId < highestId){
306 if(sFilterConfig.FilterBank == 0)
307 sFilterConfig.FilterBank = foundId;
308 if (HAL_CAN_ConfigFilter(this->
hcan, &sFilterConfig) == HAL_OK){
322 for (uint8_t i = 0; i <
canFilters.size(); i++){
345 replies.emplace_back(std::string(
presets.
presets[i].name) +
":" + std::to_string(i));
CAN_TxHeaderTypeDef header
static const uint32_t sendTimeout
bool sendMessage(CAN_tx_msg &msg)
void canErrorCallback(CANPort *port, uint32_t code) override
const OutputPin * silentPin
static const uint8_t slaveFilterStart
CommandStatus command(const ParsedCommand &cmd, std::vector< CommandReply > &replies)
void setSpeedPreset(uint8_t preset)
std::vector< CAN_FilterTypeDef > canFilters
int32_t addCanFilter(CAN_filter filter)
void canTxAbortCallback(CANPort *port, uint32_t mailbox) override
void setSilentMode(bool silent)
static ClassIdentifier info
void setSpeed(uint32_t speed)
void canTxCpltCallback(CANPort *port, uint32_t mailbox) override
CANPort_2B(CAN_HandleTypeDef &hcan, const CANPortHardwareConfig &presets, const OutputPin *silentPin=nullptr, uint8_t instance=0)
void removeCanFilter(uint8_t filterId)
constexpr PresetEntry getPreset(uint8_t idx) const
const std::span< const PresetEntry > presets
virtual void giveSemaphore()
virtual uint8_t speedToPreset(uint32_t speed)
Gets preset index for a speed.
cpp_freertos::BinarySemaphore configSem
virtual bool takeSemaphore(uint32_t delay=portMAX_DELAY)
const CANPortHardwareConfig & presets
CAN port presets for different speeds. Hardware dependent.
virtual uint32_t presetToSpeed(uint8_t preset)
Gets speed for a preset index.
void registerCommand(const char *cmd, const ID cmdid, const char *help=nullptr, uint32_t flags=0)
virtual void setCommandsEnabled(bool enable)
static CommandStatus handleGetSet(const ParsedCommand &cmd, std::vector< CommandReply > &replies, TVal &value)
virtual CmdHandlerInfo * getCommandHandlerInfo()
void write(bool state) const
void restoreFlashDelayed()
bool Take(TickType_t Timeout=portMAX_DELAY)
bool Flash_Write(uint16_t adr, uint16_t dat)
bool Flash_Read(uint16_t adr, uint16_t *buf, bool checkempty=true)
static void * memcpy(void *dst, const void *src, size_t n)
uint8_t data[CAN_MSGBUFSIZE]