- can_driver: add filter bank 15 (all ext IDs → FIFO1) and widen bank 14 to accept all standard IDs; add can_driver_send_ext/std and ext/std frame callbacks (can_driver_set_ext_cb / can_driver_set_std_cb) - vesc_can: VESC 29-bit extended CAN protocol driver — send RPM to IDs 56 and 68 (FSESC 6.7 Pro Mini Dual), parse STATUS/STATUS_4/STATUS_5 big-endian payloads, alive timeout, JLINK_TLM_VESC_STATE at 1 Hz - orin_can: Orin↔FC standard CAN protocol — HEARTBEAT/DRIVE/MODE/ESTOP commands in, FC_STATUS + FC_VESC broadcast at 10 Hz - jlink: add JLINK_TLM_VESC_STATE (0x8E), jlink_tlm_vesc_state_t (22 bytes), jlink_send_vesc_state_tlm() - main: wire vesc_can_init/orin_can_init; replace can_driver_send_cmd with vesc_can_send_rpm; inject Orin CAN speed/steer into balance PID; add Orin CAN estop/clear handling; add orin_can_broadcast at 10 Hz - test: 56-test host-side suite for vesc_can; test/stubs/stm32f7xx_hal.h minimal HAL stub for all future host-side tests Safety: balance PID runs independently on Mamba — if Orin CAN link drops (orin_can_is_alive() == false) the robot continues balancing in-place. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
127 lines
4.1 KiB
C
127 lines
4.1 KiB
C
/* test/stubs/stm32f7xx_hal.h — minimal HAL stub for host-side unit tests.
|
|
*
|
|
* Provides just enough types and functions so that the firmware source files
|
|
* compile on a host (Linux/macOS) with -DTEST_HOST.
|
|
* Each test file must define the actual behavior of HAL_GetTick() etc.
|
|
*/
|
|
|
|
#ifndef STM32F7XX_HAL_H
|
|
#define STM32F7XX_HAL_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
|
|
/* ---- Return codes ---- */
|
|
#define HAL_OK 0
|
|
#define HAL_ERROR 1
|
|
#define HAL_BUSY 2
|
|
#define HAL_TIMEOUT 3
|
|
typedef uint32_t HAL_StatusTypeDef;
|
|
|
|
/* ---- Enable / Disable ---- */
|
|
#define ENABLE 1
|
|
#define DISABLE 0
|
|
|
|
/* ---- HAL_GetTick: each test declares its own implementation ---- */
|
|
uint32_t HAL_GetTick(void);
|
|
|
|
/* ---- Minimal CAN types used by can_driver.c / vesc_can.c ---- */
|
|
typedef struct { uint32_t dummy; } CAN_TypeDef;
|
|
|
|
typedef struct {
|
|
uint32_t Prescaler;
|
|
uint32_t Mode;
|
|
uint32_t SyncJumpWidth;
|
|
uint32_t TimeSeg1;
|
|
uint32_t TimeSeg2;
|
|
uint32_t TimeTriggeredMode;
|
|
uint32_t AutoBusOff;
|
|
uint32_t AutoWakeUp;
|
|
uint32_t AutoRetransmission;
|
|
uint32_t ReceiveFifoLocked;
|
|
uint32_t TransmitFifoPriority;
|
|
} CAN_InitTypeDef;
|
|
|
|
typedef struct {
|
|
CAN_TypeDef *Instance;
|
|
CAN_InitTypeDef Init;
|
|
/* opaque HAL internals omitted */
|
|
} CAN_HandleTypeDef;
|
|
|
|
typedef struct {
|
|
uint32_t StdId;
|
|
uint32_t ExtId;
|
|
uint32_t IDE;
|
|
uint32_t RTR;
|
|
uint32_t DLC;
|
|
uint32_t Timestamp;
|
|
uint32_t FilterMatchIndex;
|
|
} CAN_RxHeaderTypeDef;
|
|
|
|
typedef struct {
|
|
uint32_t StdId;
|
|
uint32_t ExtId;
|
|
uint32_t IDE;
|
|
uint32_t RTR;
|
|
uint32_t DLC;
|
|
uint32_t TransmitGlobalTime;
|
|
} CAN_TxHeaderTypeDef;
|
|
|
|
typedef struct {
|
|
uint32_t FilterIdHigh;
|
|
uint32_t FilterIdLow;
|
|
uint32_t FilterMaskIdHigh;
|
|
uint32_t FilterMaskIdLow;
|
|
uint32_t FilterFIFOAssignment;
|
|
uint32_t FilterBank;
|
|
uint32_t FilterMode;
|
|
uint32_t FilterScale;
|
|
uint32_t FilterActivation;
|
|
uint32_t SlaveStartFilterBank;
|
|
} CAN_FilterTypeDef;
|
|
|
|
#define CAN_ID_STD 0x00000000u
|
|
#define CAN_ID_EXT 0x00000004u
|
|
#define CAN_RTR_DATA 0x00000000u
|
|
#define CAN_RTR_REMOTE 0x00000002u
|
|
#define CAN_FILTERMODE_IDMASK 0u
|
|
#define CAN_FILTERSCALE_32BIT 1u
|
|
#define CAN_RX_FIFO0 0u
|
|
#define CAN_RX_FIFO1 1u
|
|
#define CAN_FILTER_ENABLE 1u
|
|
#define CAN_MODE_NORMAL 0u
|
|
#define CAN_SJW_1TQ 0u
|
|
#define CAN_BS1_13TQ 0u
|
|
#define CAN_BS2_4TQ 0u
|
|
#define CAN_ESR_BOFF 0x00000004u
|
|
|
|
static inline HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *h){(void)h;return HAL_OK;}
|
|
static inline HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *h, CAN_FilterTypeDef *f){(void)h;(void)f;return HAL_OK;}
|
|
static inline HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *h){(void)h;return HAL_OK;}
|
|
static inline uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *h){(void)h;return 3u;}
|
|
static inline HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *h, CAN_TxHeaderTypeDef *hdr, uint8_t *d, uint32_t *mb){(void)h;(void)hdr;(void)d;(void)mb;return HAL_OK;}
|
|
static inline uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *h, uint32_t f){(void)h;(void)f;return 0u;}
|
|
static inline HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *h, uint32_t f, CAN_RxHeaderTypeDef *hdr, uint8_t *d){(void)h;(void)f;(void)hdr;(void)d;return HAL_OK;}
|
|
|
|
/* ---- GPIO (minimal, for can_driver GPIO init) ---- */
|
|
typedef struct { uint32_t dummy; } GPIO_TypeDef;
|
|
typedef struct {
|
|
uint32_t Pin; uint32_t Mode; uint32_t Pull; uint32_t Speed; uint32_t Alternate;
|
|
} GPIO_InitTypeDef;
|
|
static inline void HAL_GPIO_Init(GPIO_TypeDef *p, GPIO_InitTypeDef *g){(void)p;(void)g;}
|
|
#define GPIOB ((GPIO_TypeDef *)0)
|
|
#define GPIO_PIN_12 (1u<<12)
|
|
#define GPIO_PIN_13 (1u<<13)
|
|
#define GPIO_MODE_AF_PP 0u
|
|
#define GPIO_NOPULL 0u
|
|
#define GPIO_SPEED_FREQ_HIGH 0u
|
|
#define GPIO_AF9_CAN2 9u
|
|
|
|
/* ---- RCC stubs ---- */
|
|
#define __HAL_RCC_CAN1_CLK_ENABLE() ((void)0)
|
|
#define __HAL_RCC_CAN2_CLK_ENABLE() ((void)0)
|
|
#define __HAL_RCC_GPIOB_CLK_ENABLE() ((void)0)
|
|
|
|
#endif /* STM32F7XX_HAL_H */
|