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 static_assert(efi::size(values_1) <= 8);
185 static_assert(efi::size(values_2) <= 8);
191 for (
size_t valueIdx = 0; valueIdx < efi::size(values_1); valueIdx++) {
192 msg[valueIdx] = RAW_TO_BYTE(values_1[valueIdx]);
197 for (
size_t valueIdx = 0; valueIdx < efi::size(values_2); valueIdx++) {
198 msg[valueIdx] = RAW_TO_BYTE(values_2[valueIdx]);
206 msg[0] = (int)bench_test_magic_numbers_e::BENCH_HEADER;
219 msg[0] = TRUNCATE_TO_BYTE(boardId >> 8);
220 msg[1] = TRUNCATE_TO_BYTE(boardId);
223 msg[2] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 16);
224 msg[3] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 8);
225 msg[4] = TRUNCATE_TO_BYTE(numSecondsSinceReset);
228 msg[5] = engineType >> 8;
243 msg[0] = TRUNCATE_TO_BYTE(pinToggleCounter >> 8);
244 msg[1] = TRUNCATE_TO_BYTE(pinToggleCounter);
246 for (
int i = 0, mIdx = 2; i < 2; i++) {
247 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 16);
248 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 8);
249 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i]);
281 if (CAN_EID(frame) != (
int)bench_test_packet_ids_e::IO_CONTROL) {
284 if (frame.
data8[0] != (
int)bench_test_magic_numbers_e::BENCH_HEADER) {
288 bench_test_io_control_e command = (bench_test_io_control_e)frame.
data8[1];
289 if (command == bench_test_io_control_e::CAN_BENCH_GET_COUNT) {
291 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_SET) {
294 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_CLEAR) {
296 }
else if (command == bench_test_io_control_e::CAN_QC_ETB) {
297 uint8_t dcIndex = frame.
data8[2];
298 uint8_t direction = frame.
data8[3];
300 }
else if (command == bench_test_io_control_e::CAN_BENCH_SET_ENGINE_TYPE) {
301 int eType = frame.
data8[2];
307}
else if (command == bench_test_io_control_e::CAN_BENCH_START_PIN_TEST) {
311 }
else if (command == bench_test_io_control_e::CAN_BENCH_END_PIN_TEST) {
313 }
else if (command == bench_test_io_control_e::CAN_BENCH_EXECUTE_BENCH_TEST) {
314 int benchCommandIdx = frame.
data8[2];
316 }
else if (command == bench_test_io_control_e::CAN_BENCH_QUERY_PIN_STATE) {
324#if EFI_CAN_SUPPORT && EFI_PROD_CODE
331 criticalAssertVoid(boardOutputs !=
nullptr,
"outputs not defined");
332 Gpio pin = boardOutputs[index];
336 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)
void sendQcBenchBoardStatus()
void sendQcBenchRawAnalogValues()
static bool qcDirectPinControlMode
static void sendSavedBenchStatePackets()
void initQcBenchControls()
static void sendOutBoardMeta()
PinRepository pinRepository
static void resetPinStats(bench_mode_e benchModePinIdx)
void sendQcBenchAuxDigitalCounters()
static void sendPinStatePackets(int pinToggleCounter, uint32_t durationsInStateMs[2])
void sendQcBenchEventCounters()
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
int getHwEventCounter(int index) const
int vvtEventFallCounter[CAM_INPUTS_COUNT]
int vvtEventRiseCounter[CAM_INPUTS_COUNT]
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 Engine *const 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.