7 #include "can_common.h"
12 #define TRUNCATE_TO_BYTE(i) ((i) & 0xff)
14 #define RAW_TO_BYTE(v) TRUNCATE_TO_BYTE((int)(v * 255.0 / 5.0))
25 criticalError(
"QC of invalid pin %d", (
int)
pin);
29 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
33 #if (BOARD_EXT_GPIOCHIPS > 0)
64 int outputIndex = frame.
data8[2];
66 criticalError(
"QC pin index %d", outputIndex);
69 #if EFI_GPIO_HARDWARE && EFI_PROD_CODE
71 criticalAssertVoid(boardOutputs !=
nullptr,
"outputs not defined");
72 Gpio pin = boardOutputs[outputIndex];
85 #if EFI_SHAFT_POSITION_INPUT
93 msg[0] = TRUNCATE_TO_BYTE(primaryRise + primaryFall);
94 msg[1] = TRUNCATE_TO_BYTE(secondaryRise + secondaryFall);
96 for (
int camIdx = 0; camIdx < 4; camIdx++) {
97 int vvtRise = 0, vvtFall = 0;
98 if (camIdx < CAM_INPUTS_COUNT) {
103 msg[2 + camIdx] = TRUNCATE_TO_BYTE(vvtRise + vvtFall);
121 for (
int i =0;i<LUA_DIGITAL_INPUT_COUNT;i++) {
127 const float values_1[] = {
138 const float values_2[] = {
155 for (
size_t valueIdx = 0; valueIdx <
efi::size(values_1); valueIdx++) {
156 msg[valueIdx] = RAW_TO_BYTE(values_1[valueIdx]);
161 for (
size_t valueIdx = 0; valueIdx <
efi::size(values_2); valueIdx++) {
162 msg[valueIdx] = RAW_TO_BYTE(values_2[valueIdx]);
170 msg[0] = (int)bench_test_magic_numbers_e::BENCH_HEADER;
183 msg[0] = TRUNCATE_TO_BYTE(boardId >> 8);
184 msg[1] = TRUNCATE_TO_BYTE(boardId);
187 msg[2] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 16);
188 msg[3] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 8);
189 msg[4] = TRUNCATE_TO_BYTE(numSecondsSinceReset);
192 msg[5] = engineType >> 8;
200 msg[0] = TRUNCATE_TO_BYTE(pinToggleCounter >> 8);
201 msg[1] = TRUNCATE_TO_BYTE(pinToggleCounter);
203 for (
int i = 0, mIdx = 2; i < 2; i++) {
204 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 16);
205 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i] >> 8);
206 msg[mIdx++] = TRUNCATE_TO_BYTE(durationsInStateMs[i]);
233 pin->resetToggleStats();
240 if (CAN_EID(frame) != (
int)bench_test_packet_ids_e::IO_CONTROL) {
243 if (frame.
data8[0] != (
int)bench_test_magic_numbers_e::BENCH_HEADER) {
247 bench_test_io_control_e command = (bench_test_io_control_e)frame.
data8[1];
248 if (command == bench_test_io_control_e::CAN_BENCH_GET_COUNT) {
250 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_SET) {
254 }
else if (command == bench_test_io_control_e::CAN_QC_OUTPUT_CONTROL_CLEAR) {
257 }
else if (command == bench_test_io_control_e::CAN_QC_ETB) {
258 uint8_t dcIndex = frame.
data8[2];
259 uint8_t direction = frame.
data8[3];
261 }
else if (command == bench_test_io_control_e::CAN_BENCH_SET_ENGINE_TYPE) {
262 int eType = frame.
data8[2];
268 }
else if (command == bench_test_io_control_e::CAN_BENCH_START_PIN_TEST) {
272 }
else if (command == bench_test_io_control_e::CAN_BENCH_END_PIN_TEST) {
274 }
else if (command == bench_test_io_control_e::CAN_BENCH_EXECUTE_BENCH_TEST) {
275 int benchCommandIdx = frame.
data8[2];
277 }
else if (command == bench_test_io_control_e::CAN_BENCH_QUERY_PIN_STATE) {
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 setPin(const CANRxFrame &frame, int value)
void processCanQcBenchTest(const CANRxFrame &frame)
static void qcSetEtbState(uint8_t dcIndex, uint8_t direction)
void sendQcBenchBoardStatus()
void sendQcBenchRawAnalogValues()
bool qcDirectPinControlMode
static void sendSavedBenchStatePackets()
void initQcBenchControls()
static void directWritePad(Gpio pin, int value)
static void sendOutBoardMeta()
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]
PinRepository pinRepository
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.
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)
int getBoardMetaOutputsCount()
Gpio * getBoardMetaOutputs()
int getBoardMetaDcOutputsCount()
int getBoardMetaLowSideOutputsCount()
FrequencySensor vehicleSpeedSensor(SensorType::VehicleSpeed, MS2NT(500))
void efiSetPadModeWithoutOwnershipAcquisition(const char *msg, brain_pin_e brainPin, iomode_t mode)
engine_configuration_s * engineConfiguration
int brainPin_to_index(Gpio 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.