15#include "can_common.h"
27#define TRUNCATE_TO_BYTE(i) ((i) & 0xff)
29#define RAW_TO_BYTE(v) TRUNCATE_TO_BYTE((int)(v * 255.0 / 5.0))
63 criticalError(
"QC of invalid pin %d %s", (
int)
pin, msg);
67#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
71#if (BOARD_EXT_GPIOCHIPS > 0)
100 size_t outputIndex = frame.
data8[2];
102 criticalError(
"QC pin index %d out of range", outputIndex);
105#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
107 criticalAssertVoid(boardOutputs !=
nullptr,
"outputs not defined");
108 Gpio pin = boardOutputs[outputIndex];
121#if EFI_SHAFT_POSITION_INPUT
129 msg[0] = TRUNCATE_TO_BYTE(primaryRise + primaryFall);
130 msg[1] = TRUNCATE_TO_BYTE(secondaryRise + secondaryFall);
132 for (
int camIdx = 0; camIdx < 4; camIdx++) {
133 int vvtRise = 0, vvtFall = 0;
134 if (camIdx < CAM_INPUTS_COUNT) {
139 msg[2 + camIdx] = TRUNCATE_TO_BYTE(vvtRise + vvtFall);
157 for (
int i =0;i<LUA_DIGITAL_INPUT_COUNT;i++) {
163 const float values_1[] = {
174 const float values_2[] = {
184 const float lua_values_1[] = {
194 static_assert(efi::size(values_1) <= 8);
195 static_assert(efi::size(values_2) <= 8);
196 static_assert(efi::size(lua_values_1) <= 8);
202 for (
size_t valueIdx = 0; valueIdx < efi::size(values_1); valueIdx++) {
203 msg[valueIdx] = RAW_TO_BYTE(values_1[valueIdx]);
208 for (
size_t valueIdx = 0; valueIdx < efi::size(values_2); valueIdx++) {
209 msg[valueIdx] = RAW_TO_BYTE(values_2[valueIdx]);
215 for (
size_t valueIdx = 0; valueIdx < efi::size(lua_values_1); valueIdx++) {
216 msg[valueIdx] = RAW_TO_BYTE(lua_values_1[valueIdx]);
224 msg[0] = (int)bench_test_magic_numbers_e::BENCH_HEADER;
237 msg[0] = TRUNCATE_TO_BYTE(boardId >> 8);
238 msg[1] = TRUNCATE_TO_BYTE(boardId);
241 msg[2] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 16);
242 msg[3] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 8);
243 msg[4] = TRUNCATE_TO_BYTE(numSecondsSinceReset);
246 msg[5] = engineType >> 8;
261 msg[0] = TRUNCATE_TO_BYTE(pinToggleCounter >> 8);
262 msg[1] = TRUNCATE_TO_BYTE(pinToggleCounter);
264 for (
int i = 0, mIdx = 2; i < 2; i++) {
265 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 16);
266 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 8);
267 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i]);
299 if (CAN_EID(frame) != (
int)bench_test_packet_ids_e::HW_QC_IO_CONTROL) {
302 if (frame.
data8[0] != (
int)bench_test_magic_numbers_e::BENCH_HEADER) {
306 bench_test_io_control_e command = (bench_test_io_control_e)frame.
data8[1];
307 if (command == bench_test_io_control_e::CAN_BENCH_GET_COUNT) {
309 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_SET) {
312 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_CLEAR) {
314 }
else if (command == bench_test_io_control_e::CAN_QC_ETB) {
315 uint8_t dcIndex = frame.
data8[2];
316 uint8_t direction = frame.
data8[3];
318 }
else if (command == bench_test_io_control_e::CAN_BENCH_SET_ENGINE_TYPE) {
319 int eType = frame.
data8[2];
325}
else if (command == bench_test_io_control_e::CAN_BENCH_START_PIN_TEST) {
329 }
else if (command == bench_test_io_control_e::CAN_BENCH_END_PIN_TEST) {
331 }
else if (command == bench_test_io_control_e::CAN_BENCH_EXECUTE_BENCH_TEST) {
332 int benchCommandIdx = frame.
data8[2];
334 }
else if (command == bench_test_io_control_e::CAN_BENCH_QUERY_PIN_STATE) {
342#if EFI_CAN_SUPPORT && EFI_PROD_CODE
349 criticalAssertVoid(boardOutputs !=
nullptr,
"outputs not defined");
350 Gpio pin = boardOutputs[index];
354 efiPrintf(
"original pin %s value %d",
hwPortname(
pin), physicalValue);
int getSavedBenchTestPinStates(uint32_t durationsInStateMs[2])
static uint32_t savedDurationsInStateMs[2]
void handleBenchCategory(uint16_t index)
static int savedPinToggleCounter
Utility methods related to bench testing.
void sendQcBenchButtonCounters()
static void sendManualPinTest(int id)
static void directWritePad(Gpio pin, int value, const char *msg="")
static void setPin(const CANRxFrame &frame, int value)
void processCanQcBenchTest(const CANRxFrame &frame)
static void qcSetEtbState(uint8_t dcIndex, uint8_t direction)
static bool qcDirectPinControlMode
static void sendSavedBenchStatePackets()
void initQcBenchControls()
PinRepository pinRepository
static void resetPinStats(bench_mode_e benchModePinIdx)
void sendQcBenchRawAnalogValues(size_t bus)
void sendQcBenchBoardStatus(size_t bus)
static void sendOutBoardMeta(size_t bus)
void sendQcBenchAuxDigitalCounters()
void sendQcBenchEventCounters(size_t bus)
static void sendPinStatePackets(int pinToggleCounter, uint32_t durationsInStateMs[2])
TriggerCentral triggerCentral
SwitchedState brakePedalSwitchedState
SwitchedState clutchUpSwitchedState
SwitchedState acButtonSwitchedState
SimpleSwitchedState luaDigitalInputState[LUA_DIGITAL_INPUT_COUNT]
OutputPin * getOutputPinForBenchMode(bench_mode_e idx)
Single output pin reference and state.
const char *& getBrainUsedPin(size_t idx)
virtual float getRaw() const
uint16_t getCounter() const
int getHwEventCounter(int index) const
void addConsoleActionII(const char *token, VoidIntInt callback)
Register a console command with two Integer parameters.
void addConsoleActionI(const char *token, VoidInt callback)
Register a console command with one Integer parameter.
int gpiochips_writePad(brain_pin_e pin, int value)
Set value to gpio of gpiochip.
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin)
ioportmask_t getHwPin(const char *msg, brain_pin_e brainPin)
efitimesec_t getTimeNowS()
Current system time in seconds (32 bits)
static EngineAccessor engine
static constexpr engine_configuration_s * engineConfiguration
int getBoardMetaOutputsCount()
Gpio * getBoardMetaOutputs()
int getBoardMetaLowSideOutputsCount()
int getBoardMetaDcOutputsCount()
void hellenEnableEn(const char *msg)
bool getHellenBoardEnabled()
FrequencySensor vehicleSpeedSensor(SensorType::VehicleSpeed, MS2NT(500))
void efiSetPadModeWithoutOwnershipAcquisition(const char *msg, brain_pin_e brainPin, iomode_t mode)
int brainPin_to_index(Gpio brainPin)
const char * hwPortname(brain_pin_e brainPin)
bool brain_pin_is_onchip(brain_pin_e brainPin)
bool isBrainPinValid(brain_pin_e brainPin)
@ AcceleratorPedalPrimary
@ AcceleratorPedalSecondary
void setEngineType(int value, bool isWriteToFlash)
This file is about configuring engine via the human-readable protocol.
@ SHAFT_SECONDARY_FALLING
uint8_t data8[8]
Frame data.
uint16_t vvtEventRiseCounter[CAM_INPUTS_COUNT]
uint16_t vvtEventFallCounter[CAM_INPUTS_COUNT]