Handle Mission Select

This commit is contained in:
Jasper Blanckenburg 2022-05-28 02:00:50 +02:00 committed by jazzpi
parent d7f9d0df9a
commit 5219f3dba7
15 changed files with 326 additions and 32 deletions

View File

@ -1,4 +1,60 @@
#ifndef __EVENTS_H #ifndef __EVENTS_H
#define __EVENTS_H #define __EVENTS_H
#include "stm32g441xx.h"
#include <stdint.h>
typedef enum {
BTN_PRESS_PREV,
BTN_PRESS_R2D,
BTN_PRESS_OK,
BTN_PRESS_NEXT
} ButtonPressEvent;
typedef enum { ENC0, ENC1 } Encoder;
typedef enum { ENC_CHANGE_INC, ENC_CHANGE_DEC } EncoderChangeDirection;
typedef struct {
Encoder encoder;
EncoderChangeDirection dir;
} EncoderChangeEvent;
typedef enum { EV_BTN_PRESS, EV_ENC_CHANGE } EventType;
typedef struct {
EventType type;
union {
ButtonPressEvent btn_press;
EncoderChangeEvent enc_change;
};
} Event;
#define EVENT_QUEUE_SIZE 32
typedef struct {
Event ring_buffer[EVENT_QUEUE_SIZE];
uint16_t read_idx;
uint16_t write_idx;
} EventQueue;
/**
* @brief Push an event to the back of the queue.
*
* The event is deep-copied to the queue, so it can be deallocated after the
* call is complete.
*/
void event_push(Event *ev);
/**
* @brief Pop an event from the start of the queue.
*
* The value in the queue may be overwritten with the next event_push() call.
* Since that call can happen in an interrupt, i.e. is probably out of control
* of the event_pop() caller, we return by value here.
*/
Event event_pop();
uint16_t event_num_pending();
uint16_t event_num_free();
void handle_events();
#endif // __EVENTS_H #endif // __EVENTS_H

View File

@ -75,12 +75,16 @@ void Error_Handler(void);
#define V_POT_GPIO_Port GPIOB #define V_POT_GPIO_Port GPIOB
#define BTN0_Pin GPIO_PIN_12 #define BTN0_Pin GPIO_PIN_12
#define BTN0_GPIO_Port GPIOB #define BTN0_GPIO_Port GPIOB
#define BTN0_EXTI_IRQn EXTI15_10_IRQn
#define BTN1_Pin GPIO_PIN_13 #define BTN1_Pin GPIO_PIN_13
#define BTN1_GPIO_Port GPIOB #define BTN1_GPIO_Port GPIOB
#define BTN1_EXTI_IRQn EXTI15_10_IRQn
#define BTN2_Pin GPIO_PIN_14 #define BTN2_Pin GPIO_PIN_14
#define BTN2_GPIO_Port GPIOB #define BTN2_GPIO_Port GPIOB
#define BTN2_EXTI_IRQn EXTI15_10_IRQn
#define BTN3_Pin GPIO_PIN_15 #define BTN3_Pin GPIO_PIN_15
#define BTN3_GPIO_Port GPIOB #define BTN3_GPIO_Port GPIOB
#define BTN3_EXTI_IRQn EXTI15_10_IRQn
#define DISP_RESET_Pin GPIO_PIN_15 #define DISP_RESET_Pin GPIO_PIN_15
#define DISP_RESET_GPIO_Port GPIOA #define DISP_RESET_GPIO_Port GPIOA
#define ENC0A_Pin GPIO_PIN_4 #define ENC0A_Pin GPIO_PIN_4

View File

@ -28,5 +28,6 @@ extern size_t rpi_num_polls;
void rpi_init(I2C_HandleTypeDef *handle); void rpi_init(I2C_HandleTypeDef *handle);
void rpi_update_tx_buffer(); void rpi_update_tx_buffer();
void rpi_update_tx_buffer_mission_select();
#endif // __RPI_H #endif // __RPI_H

View File

@ -8,8 +8,33 @@ typedef enum {
VIEW_TESTING = 3 VIEW_TESTING = 3
} STWView; } STWView;
typedef enum {
MISSION_NONE,
MISSION_ACCELERATION,
MISSION_SKIDPAD,
MISSION_AUTOCROSS,
MISSION_TRACKDRIVE,
MISSION_EBS_TEST,
MISSION_INSPECTION,
MISSION_MANUAL
} Mission;
typedef struct {
Mission selection;
} MissionSelectState;
typedef struct {
Mission current_mission;
} AMIState;
typedef union {
MissionSelectState mission_select;
AMIState ami;
} ViewState;
typedef struct { typedef struct {
STWView view; STWView view;
ViewState view_state;
} STWState; } STWState;
extern STWState stw_state; extern STWState stw_state;

View File

@ -56,6 +56,7 @@ void DebugMon_Handler(void);
void PendSV_Handler(void); void PendSV_Handler(void);
void SysTick_Handler(void); void SysTick_Handler(void);
void I2C2_EV_IRQHandler(void); void I2C2_EV_IRQHandler(void);
void EXTI15_10_IRQHandler(void);
/* USER CODE BEGIN EFP */ /* USER CODE BEGIN EFP */
/* USER CODE END EFP */ /* USER CODE END EFP */

11
Core/Inc/user_inputs.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef __FT_USER_INPUTS_H
#define __FT_USER_INPUTS_H
#include "events.h"
#include "stm32g4xx_hal.h"
void handle_button_press(const ButtonPressEvent *ev);
void handle_button_press_mission_select(const ButtonPressEvent *ev);
#endif // __FT_USER_INPUTS_H

64
Core/Src/events.c Normal file
View File

@ -0,0 +1,64 @@
#include "events.h"
#include "main.h"
#include "user_inputs.h"
#include <stdint.h>
static volatile EventQueue event_queue = {.read_idx = 0, .write_idx = 0};
void event_push(Event *ev) {
if (event_num_free() == 0) {
// TODO: How do we handle this?
return;
}
event_queue.ring_buffer[event_queue.write_idx] = *ev;
event_queue.write_idx = (event_queue.write_idx + 1) % EVENT_QUEUE_SIZE;
}
Event event_pop() {
if (event_num_pending() == 0) {
// TODO: How do we handle this?
Error_Handler();
}
Event result = event_queue.ring_buffer[event_queue.read_idx];
event_queue.read_idx = (event_queue.read_idx + 1) % EVENT_QUEUE_SIZE;
return result;
}
uint16_t event_num_pending() {
// Copy the values so we can be sure they don't change while we're computing
// this
uint16_t read_idx = event_queue.read_idx;
uint16_t write_idx = event_queue.write_idx;
if (write_idx >= read_idx) {
return write_idx - read_idx;
} else {
return write_idx + (EVENT_QUEUE_SIZE - read_idx);
}
}
uint16_t event_num_free() {
// Copy the values so we can be sure they don't change while we're computing
// this
uint16_t read_idx = event_queue.read_idx;
uint16_t write_idx = event_queue.write_idx;
if (read_idx > write_idx) {
return read_idx - write_idx;
} else {
return read_idx + (EVENT_QUEUE_SIZE - write_idx);
}
}
void handle_events() {
while (event_num_pending() > 0) {
Event ev = event_pop();
switch (ev.type) {
case EV_BTN_PRESS:
handle_button_press(&ev.btn_press);
break;
default:
Error_Handler();
}
}
}

View File

@ -21,10 +21,12 @@
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "events.h"
#include "rpi.h" #include "rpi.h"
#include "state.h" #include "state.h"
#include "stm32g4xx_hal.h" #include "stm32g4xx_hal.h"
#include "stm32g4xx_hal_gpio.h"
#include <stdint.h> #include <stdint.h>
@ -119,13 +121,7 @@ int main(void) {
} else { } else {
HAL_GPIO_WritePin(DISP_RESET_GPIO_Port, DISP_RESET_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(DISP_RESET_GPIO_Port, DISP_RESET_Pin, GPIO_PIN_SET);
} }
if (rpi_num_polls > 0) { handle_events();
if (rpi_active_since == 0) {
rpi_active_since = now;
} else if (now - rpi_active_since > 10000) {
stw_state.view = VIEW_AMI;
}
}
} }
/* USER CODE END 3 */ /* USER CODE END 3 */
} }
@ -343,13 +339,21 @@ static void MX_GPIO_Init(void) {
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : BTN0_Pin BTN1_Pin BTN2_Pin BTN3_Pin /*Configure GPIO pins : BTN0_Pin BTN1_Pin BTN2_Pin BTN3_Pin */
ENC0A_Pin ENC0B_Pin ENC1A_Pin ENC1B_Pin */ GPIO_InitStruct.Pin = BTN0_Pin | BTN1_Pin | BTN2_Pin | BTN3_Pin;
GPIO_InitStruct.Pin = BTN0_Pin | BTN1_Pin | BTN2_Pin | BTN3_Pin | ENC0A_Pin | GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
ENC0B_Pin | ENC1A_Pin | ENC1B_Pin; GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : ENC0A_Pin ENC0B_Pin ENC1A_Pin ENC1B_Pin */
GPIO_InitStruct.Pin = ENC0A_Pin | ENC0B_Pin | ENC1A_Pin | ENC1B_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
} }
/* USER CODE BEGIN 4 */ /* USER CODE BEGIN 4 */

View File

@ -29,7 +29,19 @@ void rpi_init(I2C_HandleTypeDef *handle) {
} }
} }
void rpi_update_tx_buffer() { i2c_tx_buf[0] = stw_state.view; } void rpi_update_tx_buffer() {
i2c_tx_buf[0] = stw_state.view;
switch (stw_state.view) {
case VIEW_MISSION_SELECT:
rpi_update_tx_buffer_mission_select();
break;
default:
Error_Handler();
}
}
void rpi_update_tx_buffer_mission_select() {
i2c_tx_buf[1] = stw_state.view_state.mission_select.selection;
}
void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *handle) { void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *handle) {
switch (rpi_i2c_state) { switch (rpi_i2c_state) {

View File

@ -2,4 +2,7 @@
STWState stw_state; STWState stw_state;
void state_init() { stw_state.view = VIEW_MISSION_SELECT; } void state_init() {
stw_state.view = VIEW_MISSION_SELECT;
stw_state.view_state.mission_select.selection = MISSION_ACCELERATION;
}

View File

@ -212,6 +212,23 @@ void I2C2_EV_IRQHandler(void)
/* USER CODE END I2C2_EV_IRQn 1 */ /* USER CODE END I2C2_EV_IRQn 1 */
} }
/**
* @brief This function handles EXTI line[15:10] interrupts.
*/
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(BTN0_Pin);
HAL_GPIO_EXTI_IRQHandler(BTN1_Pin);
HAL_GPIO_EXTI_IRQHandler(BTN2_Pin);
HAL_GPIO_EXTI_IRQHandler(BTN3_Pin);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
/* USER CODE END 1 */ /* USER CODE END 1 */

77
Core/Src/user_inputs.c Normal file
View File

@ -0,0 +1,77 @@
#include "user_inputs.h"
#include "events.h"
#include "main.h"
#include "state.h"
#include "stm32g4xx_hal_gpio.h"
void HAL_GPIO_EXTI_Callback(uint16_t pin) {
Event ev;
GPIO_PinState state = HAL_GPIO_ReadPin(GPIOB, pin);
ev.type = state;
switch (pin) {
case BTN0_Pin:
ev.type = EV_BTN_PRESS;
ev.btn_press = BTN_PRESS_PREV;
break;
case BTN1_Pin:
ev.type = EV_BTN_PRESS;
ev.btn_press = BTN_PRESS_R2D;
break;
case BTN2_Pin:
ev.type = EV_BTN_PRESS;
ev.btn_press = BTN_PRESS_OK;
break;
case BTN3_Pin:
ev.type = EV_BTN_PRESS;
ev.btn_press = BTN_PRESS_NEXT;
break;
default:
Error_Handler();
}
event_push(&ev);
}
void handle_button_press(const ButtonPressEvent *ev) {
switch (stw_state.view) {
case VIEW_MISSION_SELECT:
handle_button_press_mission_select(ev);
break;
case VIEW_AMI:
break;
default:
Error_Handler();
}
}
void handle_button_press_mission_select(const ButtonPressEvent *ev) {
switch (*ev) {
case BTN_PRESS_PREV: {
Mission *selection = &stw_state.view_state.mission_select.selection;
if (*selection == MISSION_ACCELERATION || *selection == MISSION_NONE) {
*selection = MISSION_MANUAL;
} else {
*selection = *selection - 1;
}
break;
}
case BTN_PRESS_R2D:
break;
case BTN_PRESS_OK:
stw_state.view_state.ami.current_mission =
stw_state.view_state.mission_select.selection;
stw_state.view = VIEW_AMI;
break;
case BTN_PRESS_NEXT: {
Mission *selection = &stw_state.view_state.mission_select.selection;
if (*selection == MISSION_MANUAL) {
*selection = MISSION_ACCELERATION;
} else {
*selection = *selection + 1;
}
break;
}
}
}

View File

@ -1,5 +1,5 @@
########################################################################################################################## ##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Fri May 27 00:09:05 CEST 2022] # File automatically-generated by tool: [projectgenerator] version: [3.16.0] date: [Sat May 28 00:49:24 CEST 2022]
########################################################################################################################## ##########################################################################################################################
# ------------------------------------------------ # ------------------------------------------------
@ -56,11 +56,11 @@ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr_ex.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr_ex.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_cortex.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_cortex.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_fdcan.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_fdcan.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c_ex.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim_ex.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim_ex.c \
Core/Src/system_stm32g4xx.c \ Core/Src/system_stm32g4xx.c
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c_ex.c
# ASM sources # ASM sources
ASM_SOURCES = \ ASM_SOURCES = \

View File

@ -36,12 +36,14 @@ BUILD_DIR = build
###################################### ######################################
# C sources # C sources
C_SOURCES = \ C_SOURCES = \
Core/Src/events.c \
Core/Src/main.c \ Core/Src/main.c \
Core/Src/rpi.c \ Core/Src/rpi.c \
Core/Src/state.c \ Core/Src/state.c \
Core/Src/stm32g4xx_hal_msp.c \ Core/Src/stm32g4xx_hal_msp.c \
Core/Src/stm32g4xx_it.c \ Core/Src/stm32g4xx_it.c \
Core/Src/system_stm32g4xx.c \ Core/Src/system_stm32g4xx.c \
Core/Src/user_inputs.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc.c \
Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc_ex.c \ Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc_ex.c \
@ -81,7 +83,7 @@ PREFIX = arm-none-eabi-
POSTFIX = " POSTFIX = "
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable. # either it can be added to the PATH environment variable.
GCC_PATH="/home/jasper/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/10.3.1-2.3.1/.content/bin
ifdef GCC_PATH ifdef GCC_PATH
CXX = $(GCC_PATH)/$(PREFIX)g++$(POSTFIX) CXX = $(GCC_PATH)/$(PREFIX)g++$(POSTFIX)
CC = $(GCC_PATH)/$(PREFIX)gcc$(POSTFIX) CC = $(GCC_PATH)/$(PREFIX)gcc$(POSTFIX)

View File

@ -55,6 +55,7 @@ MxCube.Version=6.5.0
MxDb.Version=DB.6.0.50 MxDb.Version=DB.6.0.50
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
NVIC.EXTI15_10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true
NVIC.I2C2_EV_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.I2C2_EV_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
@ -115,36 +116,44 @@ PB11.GPIO_Label=V_POT
PB11.Locked=true PB11.Locked=true
PB11.Mode=IN14-Single-Ended PB11.Mode=IN14-Single-Ended
PB11.Signal=ADC1_IN14 PB11.Signal=ADC1_IN14
PB12.GPIOParameters=GPIO_Label PB12.GPIOParameters=GPIO_PuPd,GPIO_Label
PB12.GPIO_Label=BTN0 PB12.GPIO_Label=BTN0
PB12.GPIO_PuPd=GPIO_PULLUP
PB12.Locked=true PB12.Locked=true
PB12.Signal=GPIO_Input PB12.Signal=GPXTI12
PB13.GPIOParameters=GPIO_Label PB13.GPIOParameters=GPIO_PuPd,GPIO_Label
PB13.GPIO_Label=BTN1 PB13.GPIO_Label=BTN1
PB13.GPIO_PuPd=GPIO_PULLUP
PB13.Locked=true PB13.Locked=true
PB13.Signal=GPIO_Input PB13.Signal=GPXTI13
PB14.GPIOParameters=GPIO_Label PB14.GPIOParameters=GPIO_PuPd,GPIO_Label
PB14.GPIO_Label=BTN2 PB14.GPIO_Label=BTN2
PB14.GPIO_PuPd=GPIO_PULLUP
PB14.Locked=true PB14.Locked=true
PB14.Signal=GPIO_Input PB14.Signal=GPXTI14
PB15.GPIOParameters=GPIO_Label PB15.GPIOParameters=GPIO_PuPd,GPIO_Label
PB15.GPIO_Label=BTN3 PB15.GPIO_Label=BTN3
PB15.GPIO_PuPd=GPIO_PULLUP
PB15.Locked=true PB15.Locked=true
PB15.Signal=GPIO_Input PB15.Signal=GPXTI15
PB4.GPIOParameters=GPIO_Label PB4.GPIOParameters=GPIO_PuPd,GPIO_Label
PB4.GPIO_Label=ENC0A PB4.GPIO_Label=ENC0A
PB4.GPIO_PuPd=GPIO_PULLUP
PB4.Locked=true PB4.Locked=true
PB4.Signal=GPIO_Input PB4.Signal=GPIO_Input
PB5.GPIOParameters=GPIO_Label PB5.GPIOParameters=GPIO_PuPd,GPIO_Label
PB5.GPIO_Label=ENC0B PB5.GPIO_Label=ENC0B
PB5.GPIO_PuPd=GPIO_PULLUP
PB5.Locked=true PB5.Locked=true
PB5.Signal=GPIO_Input PB5.Signal=GPIO_Input
PB6.GPIOParameters=GPIO_Label PB6.GPIOParameters=GPIO_PuPd,GPIO_Label
PB6.GPIO_Label=ENC1A PB6.GPIO_Label=ENC1A
PB6.GPIO_PuPd=GPIO_PULLUP
PB6.Locked=true PB6.Locked=true
PB6.Signal=GPIO_Input PB6.Signal=GPIO_Input
PB7.GPIOParameters=GPIO_Label PB7.GPIOParameters=GPIO_PuPd,GPIO_Label
PB7.GPIO_Label=ENC1B PB7.GPIO_Label=ENC1B
PB7.GPIO_PuPd=GPIO_PULLUP
PB7.Locked=true PB7.Locked=true
PB7.Signal=GPIO_Input PB7.Signal=GPIO_Input
PinOutPanel.RotationAngle=0 PinOutPanel.RotationAngle=0
@ -215,6 +224,14 @@ RCC.USART3Freq_Value=16000000
RCC.USBFreq_Value=64000000 RCC.USBFreq_Value=64000000
RCC.VCOInputFreq_Value=16000000 RCC.VCOInputFreq_Value=16000000
RCC.VCOOutputFreq_Value=128000000 RCC.VCOOutputFreq_Value=128000000
SH.GPXTI12.0=GPIO_EXTI12
SH.GPXTI12.ConfNb=1
SH.GPXTI13.0=GPIO_EXTI13
SH.GPXTI13.ConfNb=1
SH.GPXTI14.0=GPIO_EXTI14
SH.GPXTI14.ConfNb=1
SH.GPXTI15.0=GPIO_EXTI15
SH.GPXTI15.ConfNb=1
VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals
VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals
VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Mode=SysTick