3.7 KiB
N7 board-side action API
The macros below construct C steps in the authoritative
firmware/application/ota_self_compose_plan.h. The build helper copies that file
into a clean generated compiler tree on every build; do not edit or reuse
build/gcc/application_source. The runtime reads the board's restored/live Hall
position at each step. mm_x100 and degree_x100 are fixed point with two decimals.
Direction and range
| Axis | Motor | Fixed Hall | Physical range | Toward far | Toward near |
|---|---|---|---|---|---|
| 前后 | 0 | 480 | 215.00 mm | OTA_SEAT_SLIDE_BACKWARD |
OTA_SEAT_SLIDE_FORWARD |
| 高度/坐盆 | 1 | 373 | 55.00 mm | OTA_SEAT_HEIGHT_UP |
OTA_SEAT_HEIGHT_DOWN |
| 靠背 | 2 | 917 | 68.00° | OTA_SEAT_BACKREST_RECLINE_DOWN |
OTA_SEAT_BACKREST_RAISE |
| 腿托 | 3 | 647 | 72.00° | OTA_SEAT_LEGREST_RAISE |
OTA_SEAT_LEGREST_LOWER |
Nearest is position zero. Normal DIY Hall bounds are 24..456, 19..354, 46..871, and 33..614 for motors 0..3. Do not seek the physical 0%/100% endpoint from an ordinary DIY image. If board position is invalid, do not blind-move the mechanism.
Speed and stall
OTA_SEAT_SPEED_LOW: 60%OTA_SEAT_SPEED_MEDIUM: 80%OTA_SEAT_SPEED_HIGH: 95%OTA_SEAT_SPEED_DEFAULT: 80%OTA_SEAT_SPEED_CUSTOM(n): custom 1%..95%
Motor 3 ignores the duty argument and always uses 60%. After each actual PWM start or reversal, its Hall stall window starts only after 2 seconds. In the following continuous 1000 ms window, at most 2 rising edges is stall; at least 3 is movement.
Actions
Timed motion:
OTA_SEAT_SLIDE_FOR(direction, durationMs, duty, pauseMs)
OTA_SEAT_HEIGHT_FOR(direction, durationMs, duty, pauseMs)
OTA_SEAT_BACKREST_FOR(direction, durationMs, duty, pauseMs)
OTA_SEAT_LEGREST_FOR(direction, durationMs, duty, pauseMs)
If a timed action reaches 5% or 95%, it reverses and continues the remaining time.
Absolute board position:
OTA_SEAT_SLIDE_TO(positionMmX100, duty, pauseMs)
OTA_SEAT_HEIGHT_TO(positionMmX100, duty, pauseMs)
OTA_SEAT_BACKREST_TO(angleDegX100, duty, pauseMs)
OTA_SEAT_LEGREST_TO(angleDegX100, duty, pauseMs)
Relative distance/angle:
OTA_SEAT_SLIDE_BY(direction, distanceMmX100, duty, pauseMs)
OTA_SEAT_HEIGHT_BY(direction, distanceMmX100, duty, pauseMs)
OTA_SEAT_BACKREST_BY(direction, angleDegX100, duty, pauseMs)
OTA_SEAT_LEGREST_BY(direction, angleDegX100, duty, pauseMs)
Absolute and relative targets clamp to the axis's 5%..95% interval and stop there.
Cycles:
OTA_SEAT_SLIDE_CYCLE(firstDirection, cycles, duty, endpointPauseMs)
OTA_SEAT_HEIGHT_CYCLE(firstDirection, cycles, duty, endpointPauseMs)
OTA_SEAT_BACKREST_CYCLE(firstDirection, cycles, duty, endpointPauseMs)
OTA_SEAT_LEGREST_CYCLE(firstDirection, cycles, duty, endpointPauseMs)
One cycle is two boundary legs. cycles == 0 continues until explicit STOP or a
user-requested program duration. The board owns execution after one TEST_START.
Required CAN position contract
Retain the Base SEAT_INFO implementation at 500 kbit/s using request ID 0x6A0
and response ID 0x6A2, DLC 8. Selectors 0..14 retain their existing job, four live
position/range, four flags, four physical range, persistent state, and runtime-kind
meanings. Continue servicing these queries and explicit STOP during every action,
but never use communication activity as an action lease.
Minimal C plan
#define OTA_SELF_COMPOSE_STEP_COUNT (2u)
#define OTA_SELF_COMPOSE_PROGRAM_REPEAT (1u)
#define OTA_SELF_COMPOSE_MAX_RUNTIME_MS (0ul)
static const ota_self_compose_step_t otaSelfComposePlan[] =
{
OTA_SEAT_HEIGHT_TO(3000ul, OTA_SEAT_SPEED_MEDIUM, 200ul),
OTA_SEAT_BACKREST_BY(OTA_SEAT_BACKREST_RECLINE_DOWN, 3000ul,
OTA_SEAT_SPEED_CUSTOM(75u), 0ul),
};