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);
144 this->
hcan->Instance->BTR =
presets.getPreset(preset).init;
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;
274 sFilterConfig.FilterIdHigh = (filter.
filter_id << 5) & 0xFFFF;
275 sFilterConfig.FilterIdLow = 0;
276 sFilterConfig.FilterMaskIdHigh = (filter.
filter_mask << 5) & 0xFFFF;
277 sFilterConfig.FilterMaskIdLow = 0;
280 sFilterConfig.FilterIdHigh = (filter.
filter_id >> 13) & 0xFFFF;
281 sFilterConfig.FilterIdLow = (filter.
filter_id << 3) & 0xFFF8;
282 sFilterConfig.FilterMaskIdHigh = (filter.
filter_mask >> 13) & 0xFFFF;
283 sFilterConfig.FilterMaskIdLow = (filter.
filter_mask << 3) & 0xFFF8;
285 sFilterConfig.FilterIdLow |= 0x04;
286 sFilterConfig.FilterMaskIdLow |= 0x04;
291 int32_t lowestId = 0;
293 int32_t foundId = -1;
295 for(uint8_t
id = lowestId;
id < highestId ;
id++ ){
296 bool foundExisting =
false;
298 if(
id == filter.FilterBank
304 foundExisting =
true;
314 if(foundId < highestId){
315 if(sFilterConfig.FilterBank == 0)
316 sFilterConfig.FilterBank = foundId;
317 if (HAL_CAN_ConfigFilter(this->
hcan, &sFilterConfig) == HAL_OK){
331 for (uint8_t i = 0; i <
canFilters.size(); i++){
353 for(uint8_t i = 0; i<
presets.presets.size();i++){
354 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)
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.
CANPort(const CANPortHardwareConfig &presets, uint8_t instance=0)
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()
CommandHandler(const char *clsname, uint16_t clsid, uint8_t instance=0)
void restoreFlashDelayed()
static struct @024127060247016123033304002117326322243354210111 data
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]