nicht wirklich schönere Fixes für FSN

This commit is contained in:
2025-07-12 18:15:44 +02:00
parent fb3eba0a09
commit aee7f4f697
3 changed files with 21 additions and 14 deletions

View File

@ -6,7 +6,6 @@
#include "can-halal.h" #include "can-halal.h"
extern int can_ams_last_tick; extern int can_ams_last_tick;
extern TSState request_state;
HAL_StatusTypeDef can_init(FDCAN_HandleTypeDef* handle) { HAL_StatusTypeDef can_init(FDCAN_HandleTypeDef* handle) {
TRY(ftcan_init(handle)); TRY(ftcan_init(handle));
@ -18,9 +17,9 @@ HAL_StatusTypeDef can_init(FDCAN_HandleTypeDef* handle) {
HAL_StatusTypeDef can_update_state(){ HAL_StatusTypeDef can_update_state(){
uint8_t data; uint8_t data;
if (request_state == TS_ACTIVE){ if (ts_state.target_state == TS_ACTIVE){
data = 0x01; data = 0x01;
} else if (request_state == TS_INACTIVE) { } else if (ts_state.target_state == TS_INACTIVE) {
data = 0x00; data = 0x00;
} else { } else {
return HAL_ERROR; return HAL_ERROR;
@ -38,6 +37,7 @@ void ftcan_msg_received_cb(uint16_t id, size_t len, const uint8_t* data) {
case CAN_ID_AMS_SIGNALS: case CAN_ID_AMS_SIGNALS:
break; break;
case CAN_ID_AMS_ERROR: case CAN_ID_AMS_ERROR:
ts_state.target_state = TS_INACTIVE;
break; break;
default: default:
break; break;

View File

@ -149,6 +149,7 @@ int main(void)
/* USER CODE BEGIN 3 */ /* USER CODE BEGIN 3 */
if (HAL_GetTick() - can_ams_last_tick > AMS_TIMEOUT) { if (HAL_GetTick() - can_ams_last_tick > AMS_TIMEOUT) {
error_led_init(); error_led_init();
change_ts_state(TS_INACTIVE);
led_blink(&htim3, COLOR_ERROR, 0); led_blink(&htim3, COLOR_ERROR, 0);
} else { } else {
led_blink(&htim3, COLOR_HEARTBEAT, 1000); led_blink(&htim3, COLOR_HEARTBEAT, 1000);
@ -157,11 +158,14 @@ int main(void)
// SHOW_STATE(check_sdc_state()); // SHOW_STATE(check_sdc_state());
// SHOW_STATE(can_update_state()); // SHOW_STATE(can_update_state());
TSON = HAL_GPIO_ReadPin(TS_ON_GPIO_Port, TS_ON_Pin); TSON = HAL_GPIO_ReadPin(TS_ON_GPIO_Port, TS_ON_Pin);
if (TSON == 1){ uint8_t sdc_closed = HAL_GPIO_ReadPin(SDC_ON_GPIO_Port, SDC_ON_Pin);
if (TSON == 1 && sdc_closed) {
change_ts_state(TS_ACTIVE); change_ts_state(TS_ACTIVE);
} }
check_sdc_state(); check_sdc_state();
can_update_state(); can_update_state();
HAL_Delay(100);
} }
/* USER CODE END 3 */ /* USER CODE END 3 */
} }

View File

@ -2,10 +2,9 @@
#include "can.h" #include "can.h"
#include "scs_sdc.h" #include "scs_sdc.h"
TSStateHandle ts_state; TSStateHandle ts_state = {.current_state = TS_INACTIVE, .target_state = TS_INACTIVE};
IMDData imd_data; IMDData imd_data;
uint8_t led_state; uint8_t led_state;
TSState request_state = TS_INACTIVE;
void error_led_init() { void error_led_init() {
HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_SET);
@ -21,26 +20,30 @@ void ts_handle_ams_status(const uint8_t* data) {
imd_data.ok = data[6] & 0b10000000; imd_data.ok = data[6] & 0b10000000;
led_state = data[7]; led_state = data[7];
if ((led_state | 0b00000010) == 0b10) { if ((led_state & 0b00000010) == 0b10) {
HAL_GPIO_WritePin(IMD_ERROR_GPIO_Port, IMD_ERROR_Pin, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(IMD_ERROR_GPIO_Port, IMD_ERROR_Pin, GPIO_PIN_RESET);
}
if ((led_state & 0b00000100) == 0b100) {
HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_SET);
} else { } else {
HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(AMS_ERROR_GPIO_Port, AMS_ERROR_Pin, GPIO_PIN_RESET);
} }
if ((led_state | 0b00000100) == 0b100) { if (ts_state.current_state == TS_ERROR || ts_state.current_state == TS_DISCHARGE || ((led_state & 0b110) > 0)) {
HAL_GPIO_WritePin(IMD_ERROR_GPIO_Port, IMD_ERROR_Pin, GPIO_PIN_SET); ts_state.target_state = TS_INACTIVE;
} else {
HAL_GPIO_WritePin(IMD_ERROR_GPIO_Port, IMD_ERROR_Pin, GPIO_PIN_RESET);
} }
} }
HAL_StatusTypeDef change_ts_state(TSState state) { HAL_StatusTypeDef change_ts_state(TSState state) {
if (state == TS_ACTIVE) { if (state == TS_ACTIVE) {
request_state = TS_ACTIVE; ts_state.target_state = TS_ACTIVE;
return HAL_OK; return HAL_OK;
} else if (state == TS_INACTIVE){ } else if (state == TS_INACTIVE){
request_state = TS_INACTIVE; ts_state.target_state = TS_INACTIVE;
return HAL_OK; return HAL_OK;
} else { } else {