rusefi/firmware/controllers/can/can_bench_test.cpp

168 lines
5.6 KiB
C++
Raw Normal View History

2022-09-29 20:01:06 -07:00
#include "pch.h"
#include "board_id.h"
2022-09-29 20:01:06 -07:00
#include "can_bench_test.h"
#include "can_msg_tx.h"
#include "can_common.h"
#include "frequency_sensor.h"
#include "settings.h"
2022-09-29 20:01:06 -07:00
#define TRUNCATE_TO_BYTE(i) ((i) & 0xff)
// raw values are 0..5V, convert it to 8-bit (0..255)
#define RAW_TO_BYTE(v) TRUNCATE_TO_BYTE((int)(v * 255.0 / 5.0))
bool qcDirectPinControlMode = false;
2022-09-29 20:01:06 -07:00
#if EFI_CAN_SUPPORT
2022-09-29 20:45:46 -07:00
static void setPin(const CANRxFrame& frame, int value) {
int outputIndex = frame.data8[2];
if (outputIndex >= getBoardMetaOutputsCount())
2022-09-29 20:45:46 -07:00
return;
Gpio pin = getBoardMetaOutputs()[outputIndex];
2022-09-29 21:08:26 -07:00
#if EFI_GPIO_HARDWARE && EFI_PROD_CODE
int hwIndex = brainPin_to_index(pin);
if (engine->pinRepository.getBrainUsedPin(hwIndex) == nullptr) {
// if pin is assigned we better configure it
efiSetPadModeWithoutOwnershipAcquisition("QC_SET", pin, PAL_MODE_OUTPUT_PUSHPULL);
}
2022-09-29 20:45:46 -07:00
palWritePad(getHwPort("can_write", pin), getHwPin("can_write", pin), value);
// todo: add smart chip support support
2022-09-29 21:08:26 -07:00
#endif // EFI_GPIO_HARDWARE && EFI_PROD_CODE
2022-09-29 20:45:46 -07:00
}
void sendEventCounters() {
#if EFI_SHAFT_POSITION_INPUT
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::EVENT_COUNTERS, 8, /*bus*/0, /*isExtended*/true);
int primaryFall = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_FALLING);
int primaryRise = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_RISING);
int secondaryFall = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_FALLING);
int secondaryRise = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_RISING);
msg[0] = TRUNCATE_TO_BYTE(primaryRise + primaryFall);
msg[1] = TRUNCATE_TO_BYTE(secondaryRise + secondaryFall);
for (int camIdx = 0; camIdx < 4; camIdx++) {
int vvtRise = 0, vvtFall = 0;
if (camIdx < CAM_INPUTS_COUNT) {
vvtRise = engine->triggerCentral.vvtEventRiseCounter[camIdx];
vvtFall = engine->triggerCentral.vvtEventFallCounter[camIdx];
}
msg[2 + camIdx] = TRUNCATE_TO_BYTE(vvtRise + vvtFall);
}
extern FrequencySensor vehicleSpeedSensor;
msg[6] = TRUNCATE_TO_BYTE(vehicleSpeedSensor.eventCounter);
#endif // EFI_SHAFT_POSITION_INPUT
}
void sendButtonCounters() {
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::BUTTON_COUNTERS, 8, /*bus*/0, /*isExtended*/true);
msg[0] = TRUNCATE_TO_BYTE(engine->brakePedalSwitchedState.getCounter());
msg[1] = TRUNCATE_TO_BYTE(engine->clutchUpSwitchedState.getCounter());
msg[2] = TRUNCATE_TO_BYTE(engine->acButtonSwitchedState.getCounter());
// todo: start button
}
void sendRawAnalogValues() {
const float values_1[] = {
Sensor::getRaw(SensorType::Tps1Primary),
Sensor::getRaw(SensorType::Tps1Secondary),
Sensor::getRaw(SensorType::AcceleratorPedalPrimary),
Sensor::getRaw(SensorType::AcceleratorPedalSecondary),
Sensor::getRaw(SensorType::MapSlow),
Sensor::getRaw(SensorType::Clt),
Sensor::getRaw(SensorType::Iat),
Sensor::getRaw(SensorType::BatteryVoltage),
};
const float values_2[] = {
Sensor::getRaw(SensorType::Tps2Primary),
Sensor::getRaw(SensorType::Tps2Secondary),
Sensor::getRaw(SensorType::AuxLinear1),
Sensor::getRaw(SensorType::AuxLinear2),
2023-09-27 17:43:07 -07:00
Sensor::getRaw(SensorType::OilPressure),
Sensor::getRaw(SensorType::FuelPressureLow),
Sensor::getRaw(SensorType::FuelPressureHigh),
Sensor::getRaw(SensorType::AuxTemp1),
};
static_assert(efi::size(values_1) <= 8);
static_assert(efi::size(values_2) <= 8);
// send the first packet
{
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::RAW_ANALOG_1, 8, /*bus*/0, /*isExtended*/true);
for (int valueIdx = 0; valueIdx < efi::size(values_1); valueIdx++) {
msg[valueIdx] = RAW_TO_BYTE(values_1[valueIdx]);
}
}
{
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::RAW_ANALOG_2, 8, /*bus*/0, /*isExtended*/true);
for (int valueIdx = 0; valueIdx < efi::size(values_2); valueIdx++) {
msg[valueIdx] = RAW_TO_BYTE(values_2[valueIdx]);
}
}
}
static void sendOutBoardMeta() {
#if EFI_PROD_CODE
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::IO_META_INFO, 8, /*bus*/0, /*isExtended*/true);
msg[0] = CAN_BENCH_HEADER;
msg[1] = 0;
msg[2] = getBoardMetaOutputsCount();
msg[3] = getBoardMetaLowSideOutputsCount();
#endif // EFI_PROD_CODE
}
void sendBoardStatus() {
#if EFI_PROD_CODE
2023-09-27 08:34:32 -07:00
CanTxMessage msg(CanCategory::BENCH_TEST, bench_test_packet_ids_e::BOARD_STATUS, 8, /*bus*/0, /*isExtended*/true);
int boardId = getBoardId();
msg[0] = TRUNCATE_TO_BYTE(boardId >> 8);
msg[1] = TRUNCATE_TO_BYTE(boardId);
int numSecondsSinceReset = getTimeNowS();
msg[2] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 16);
msg[3] = TRUNCATE_TO_BYTE(numSecondsSinceReset >> 8);
msg[4] = TRUNCATE_TO_BYTE(numSecondsSinceReset);
2023-08-21 16:04:29 -07:00
2023-08-21 16:28:24 -07:00
int engineType = (int) engineConfiguration->engineType;
msg[5] = engineType >> 8;
msg[6] = engineType;
sendOutBoardMeta();
#endif // EFI_PROD_CODE
}
2022-09-29 20:01:06 -07:00
void processCanBenchTest(const CANRxFrame& frame) {
2023-09-27 08:34:32 -07:00
if (CAN_EID(frame) != bench_test_packet_ids_e::IO_CONTROL) {
2022-09-29 20:01:06 -07:00
return;
}
if (frame.data8[0] != CAN_BENCH_HEADER) {
return;
}
qcDirectPinControlMode = true;
2022-09-29 20:01:06 -07:00
uint8_t command = frame.data8[1];
if (command == CAN_BENCH_GET_COUNT) {
sendOutBoardMeta();
2022-09-29 20:45:46 -07:00
} else if (command == CAN_BENCH_GET_SET) {
setPin(frame, 1);
} else if (command == CAN_BENCH_GET_CLEAR) {
setPin(frame, 0);
} else if (command == CAN_BENCH_SET_ENGINE_TYPE) {
int eType = frame.data8[2];
// todo: fix firmware for 'false' to be possible - i.e. more of properties should be applied on the fly
setEngineType(eType, true);
#if EFI_PROD_CODE
scheduleReboot();
#endif // EFI_PROD_CODE
2022-09-29 20:01:06 -07:00
}
}
#endif // EFI_CAN_SUPPORT