2 Commits

Author SHA1 Message Date
993920fb1c fixed 2024-05-24 18:21:41 +00:00
b09121b876 use const brightness 2024-05-24 18:04:08 +00:00
17 changed files with 200 additions and 331 deletions

View File

@@ -34,7 +34,7 @@ void BSP_SDLogger_Init(int log_number) {
ULOG_ERROR("Failed to open file %s", file_name);
}
//ULOG_SUBSCRIBE(BSP_SDLogger_ULOG, ULOG_DEBUG_LEVEL);
ULOG_SUBSCRIBE(BSP_SDLogger_ULOG, ULOG_DEBUG_LEVEL);
// close the file
f_close(&file);

View File

@@ -1,5 +1,4 @@
#include "CLS_BSP.h"
#include "CLSAddress.h"
#ifdef CLS_BSP_FDCAN
@@ -68,9 +67,4 @@ CLS_Position_t CLS_BSP_GetPosition(void) {
}
void CLS_BSP_SetPosition(CLS_Position_t position) {
}
#include "BSP_GPIO.h"
}

View File

@@ -12,4 +12,4 @@ target_sources(${PROJECT_NAME}
)
target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE CLS BSP Vehicle)
target_link_libraries(${PROJECT_NAME} PRIVATE CLS)

View File

@@ -2,5 +2,4 @@ add_subdirectory(Tasks)
add_subdirectory(CLS)
add_subdirectory(CLS_BSP)
add_subdirectory(BSP)
add_subdirectory(ram_loader)
add_subdirectory(Vehicle)
add_subdirectory(ram_loader)

View File

@@ -22,4 +22,4 @@ target_sources(${PROJECT_NAME}
target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC PROTOS CLS)
target_link_libraries(${PROJECT_NAME} PRIVATE Revision CLS_BSP BSP ulog Vehicle ram_loader)
target_link_libraries(${PROJECT_NAME} PRIVATE Revision CLS_BSP BSP ulog ram_loader)

View File

@@ -11,7 +11,6 @@
#include "ulog.h"
#include "BSP_POWER.h"
#include "BSP_GPIO.h"
#include "Vehicle.h"
// Define thread flags
#define FLAG_FDCAN_RX_FIFO0 (1<<0)
#define FLAG_FDCAN_RX_FIFO1 (1<<1)
@@ -47,7 +46,7 @@ const osThreadAttr_t CarCanTask_attr = {
.priority = osPriorityNormal,
};
static uint64_t last_car_message_time = 0;
uint32_t dlcDecode(uint32_t dlcCode) {
switch(dlcCode) {
@@ -131,6 +130,11 @@ void CanDataTask_func(void *argument) {
}
}
static uint64_t last_unlock_message_time = UINT64_MAX;
static uint64_t last_car_message_time = 0;
static uint8_t car_can_brightness = 255;
static float car_can_speed = 0;
static int car_can_direction = 0;
// convert byte to 2 hex characters
void byteToHex(uint8_t byte, char * hex) {
@@ -139,10 +143,6 @@ void byteToHex(uint8_t byte, char * hex) {
hex[1] = hexLookup[byte & 0x0F];
}
static FDCAN_RxHeaderTypeDef RxHeader = {0};
static uint8_t RxData[8] = {0};
void CarCanTask_func(void *argument) {
// for testing accept all messages from the car can bus
@@ -152,8 +152,20 @@ void CarCanTask_func(void *argument) {
}
Vehicle_Setup_CAN();
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = CLS_BSP_CAN_FILTER_LIST;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
sFilterConfig.FilterID1 = 0x391;
sFilterConfig.FilterID2 = 0x395;
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
sFilterConfig.FilterIndex = 1;
sFilterConfig.FilterID1 = 0x351;
sFilterConfig.FilterID2 = 0x635;
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
/* Start the FDCAN module */
if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK){
@@ -164,7 +176,8 @@ void CarCanTask_func(void *argument) {
Error_Handler();
}
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
for(;;) {
// wait for interrupt event on any fifo
@@ -248,8 +261,71 @@ void CarCanTask_func(void *argument) {
if (HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) {
Error_Handler();
} else {
char msg[17] = {0};
Vehicle_Receive_CAN(RxHeader, RxData);
// do something with the can data
if(RxHeader.Identifier == 0x391) {
byteToHex(RxData[0], &msg[0]);
byteToHex(RxData[1], &msg[2]);
byteToHex(RxData[2], &msg[4]);
if (RxData[1] == 0x04)
{
// car was unlocked
last_unlock_message_time = osKernelGetTickCount();
}
else if (RxData[1] ==0x80)
{
// car was locked
if (!BSP_GPIO_K15isSet()) {
NVIC_SystemReset();
}
}
}
if (RxHeader.Identifier == 0x395) {
byteToHex(RxData[0], &msg[0]);
// send the unlock message to the car
if ((RxData[0] & 0x0F) == 0x01) {
// car was unlocked
last_unlock_message_time = osKernelGetTickCount();
ULOG_DEBUG("Unlock message received");
} else if ((RxData[0] & 0x0F) == 0x02) {
// car was locked
if (!BSP_GPIO_K15isSet()) {
NVIC_SystemReset();
}
}
}
// speed signal
// AA BB XX YY 00 00 00 00
// Speed (XX*(2^8)+(YY-1))/190
// direction AA = 0x00 forward, 0x02 backward
if (RxHeader.Identifier == 0x351) {
uint16_t speed = (RxData[2] << 8) + RxData[3];
float speed_kmh = (speed - 1) / 190.0;
car_can_speed = speed_kmh;
car_can_direction = RxData[0];
ULOG_DEBUG("Speed: %f, Direction: %d", car_can_speed, car_can_direction);
}
// brightness knob in 0 - 100
if (RxHeader.Identifier == 0x635) {
// scale the brightness to 0 - 255 only using integer math
car_can_brightness = ((uint32_t)RxData[0] * 255) / 100;
ULOG_DEBUG("Brightness: %d", car_can_brightness);
}
//ULOG_DEBUG("Used Car MSG: %x, %d %s", RxHeader.Identifier, CLS_BSP_DLC_ToBytes(RxHeader.DataLength), msg );
}
@@ -263,6 +339,9 @@ void CarCanTask_func(void *argument) {
* @return true if a car can message has been received
* @return false if no car can message has been received
*/
bool CanDataTask_gotCarCanMessage() {
return last_unlock_message_time != UINT64_MAX;
}
bool CanDataTask_CarCanActive() {
@@ -271,9 +350,20 @@ bool CanDataTask_CarCanActive() {
}
return osKernelGetTickCount() - last_car_message_time < 1000;
}
uint8_t CanDataTask_CarCanBrightness() {
return car_can_brightness;
}
float CanDataTask_CarCanSpeed() {
return car_can_speed;
}
int CanDataTask_CarCanDirectionIsForward() {
return car_can_direction == 0;
}
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
// Notify the thread

View File

@@ -5,7 +5,6 @@
#include "LightTask.h"
#include "ulog.h"
#include "stdbool.h"
#include "Vehicle.h"
// Create the task with a specific priority and stack size
osThreadAttr_t task_attr = {
@@ -25,15 +24,89 @@ void LightStateTask_start(void)
// Check if K15 is on for switching the light state
static bool isK15On()
{
return BSP_GPIO_K15isSet();
}
// Define the threshold voltage for engine running
#define ENGINE_RUNNING_THRESHOLD 13.3 // 13.5V
// Define thresholds with hysteresis
#define ENGINE_RUNNING_THRESHOLD_HIGH (ENGINE_RUNNING_THRESHOLD + 0.125)
#define ENGINE_RUNNING_THRESHOLD_LOW (ENGINE_RUNNING_THRESHOLD - 0.125)
// Global variable to store the current engine state
static bool engineRunning = false;
// Function to initialize the engine state based on the initial voltage
static void initializeEngineState()
{
float initialVoltage = BSP_ADC_ReadBusValue();
if (initialVoltage > ENGINE_RUNNING_THRESHOLD)
{
engineRunning = true;
}
else
{
engineRunning = false;
}
}
// Ensure the engine state is initialized once
static bool isEngineInitialized = false;
static bool isEngineRunning()
{
if (!isEngineInitialized)
{
initializeEngineState();
isEngineInitialized = true;
}
float voltage = BSP_ADC_ReadBusValue();
if (engineRunning)
{
// If engine is currently running, use the lower threshold to turn it off
if (voltage < ENGINE_RUNNING_THRESHOLD_LOW)
{
engineRunning = false;
}
}
else
{
// If engine is currently off, use the higher threshold to turn it on
if (voltage > ENGINE_RUNNING_THRESHOLD_HIGH)
{
engineRunning = true;
}
}
return engineRunning;
}
// check if the headlight is on and the engine is running to switch the light state
// we can check the headlight using the GPIO functions
static bool isHeadlightOn()
{
return BSP_GPIO_HeadLightIsSet();
}
// Function to determine the next state of the light
// return 1 as default state
// return 2 if the engine is running
// return 3 if the headlight and engine is running
static int determineNextState()
{
if (Vehicle_isHeadlightOn() && Vehicle_isEngineRunning()) {
if (isHeadlightOn() && isEngineRunning()) {
return 2;
} else if (Vehicle_isEngineRunning()) {
} else if (isEngineRunning()) {
return 1;
} else {
return 0;

View File

@@ -11,7 +11,6 @@
#include "BSP_GPIO.h"
#include "CanDataTask.h"
#include "Vehicle.h"
#include "BSP_ADC.h"
#define DIMM_DEADZONE_VOLTAGE 0.7
@@ -78,19 +77,19 @@ void LightTask_func(void *argument) {
// calculate the brightness to send
uint8_t brightness = lightSettings.brightness;
//uint8_t brightness = lightSettings.brightness;
// Read ADC battery voltage and dimmer voltage
uint8_t dimm = 255;
//float dimmfactor = 1.0;
// currenlty not working
// only dimm if the headlight is on
//if (Vehicle_isHeadlightOn()) {
//if (BSP_GPIO_HeadLightIsSet()) {
// new version over CAN
//dimm = Vehicle_Brightness();
//uint8_t precent = CanDataTask_CarCanBrightness();
//dimmfactor = (float)precent / 100.0;
// old version over ADC
// calculate the dimmfactor based on the battery voltage and the dimmer voltage
@@ -105,15 +104,14 @@ void LightTask_func(void *argument) {
//} else {
// dimmfactor = (v_dimm - 4.0) / (v_bus - 4.0);
//}
// }
//}
uint8_t adjustedBrightness = (brightness * dimm)/ 255;
lightSettings_dimmed.brightness = adjustedBrightness;
lightSettings_dimmed.theme = lightSettings.theme;
//uint8_t adjustedBrightness = (uint8_t)(brightness * dimmfactor);
//lightSettings_dimmed.brightness = adjustedBrightness;
//lightSettings_dimmed.theme = lightSettings.theme;
CLS_BSP_CAN_AddMessageToSend(&can_header,(uint8_t*)&lightSettings_dimmed);
lightSettings.brightness = 255;
CLS_BSP_CAN_AddMessageToSend(&can_header,(uint8_t*)&lightSettings);
if( settingChangeTime !=0 && tick > settingChangeTime + settingSaveTimeout) {
BSP_EE24_PartWrite(BSP_EE24_PART_GLOBAL_LIGHT, (uint8_t*) &lightSettings, sizeof(lightSettings));

View File

@@ -1,32 +0,0 @@
# Set the minimum required CMake version
cmake_minimum_required(VERSION 3.12)
# Set the project name
project(Vehicle)
# Add the source files for the library
set(SOURCES
Vehicle.c
Vehicle_can.c
)
# Add the header files for the library
set(HEADERS
Vehicle.h
)
# Create the library target
add_library(Vehicle ${SOURCES} ${HEADERS})
# Set the include directories for the library
target_include_directories(Vehicle PUBLIC ./)
# Set any additional compiler flags or options
# target_compile_options(Vehicle PRIVATE ...)
# Set any additional linker flags or options
# target_link_options(Vehicle PRIVATE ...)
# Specify any dependencies for the library
target_link_libraries(Vehicle BSP CLS CLS_BSP)

View File

@@ -1,82 +0,0 @@
#include "Vehicle.h"
#include "BSP_GPIO.h"
#include "stdbool.h"
#include "BSP_ADC.h"
// Define the threshold voltage for engine running
#define ENGINE_RUNNING_THRESHOLD 13.0 // 13.5V
// Define thresholds with hysteresis
#define ENGINE_RUNNING_THRESHOLD_HIGH (ENGINE_RUNNING_THRESHOLD + 0.225)
#define ENGINE_RUNNING_THRESHOLD_LOW (ENGINE_RUNNING_THRESHOLD - 0.225)
// Global variable to store the current engine state
static bool engineRunning = false;
void Vehicle_Init() {
engineRunning = false;
}
bool Vehicle_isHeadlightOn()
{
return BSP_GPIO_HeadLightIsSet();
}
bool Vehicle_isEngineRunning() {
float voltage = BSP_ADC_ReadBusValue();
if (engineRunning)
{
// If engine is currently running, use the lower threshold to turn it off
if (voltage < ENGINE_RUNNING_THRESHOLD_LOW)
{
engineRunning = false;
}
}
else
{
// If engine is currently off, use the higher threshold to turn it on
if (voltage > ENGINE_RUNNING_THRESHOLD_HIGH)
{
engineRunning = true;
}
}
return engineRunning;
}
bool Vehicle_isK15On() {
return BSP_GPIO_K15isSet();
}
#include "CLS.h"
#include "CLS_BSP.h"
#include "CLSAddress.h"
static CLS_VehicleStatus_t status = {0};
_Static_assert(sizeof(status) == 8, "CLS_HeatbeatData_t is not 8 bytes");
void CLS_VehicleHeatbeat(void *argument) {
CLS_BSP_TxHeaderType cls_vehicle_header = CREATE_BSP_CAN_HEADER(GENERATE_CLS_ADDRESS(CLS_CODE_STATUS,0,CLS_CH_STA_VEHICLE), CLS_BSP_DLC_BYTES_8);
status.k15 = Vehicle_isK15On();
status.headlight = Vehicle_isHeadlightOn();
status.engine = Vehicle_isEngineRunning();
status.speed = (uint8_t)Vehicle_Speed();
status.unlocked = Vehicle_UnlockedSignal();
CLS_BSP_CAN_AddMessageToSend(&cls_vehicle_header, (uint8_t*)&status);
}

View File

@@ -1,24 +0,0 @@
#include "fdcan.h"
#include "stdint.h"
#include "stdbool.h"
void Vehicle_Init();
bool Vehicle_isHeadlightOn();
bool Vehicle_isEngineRunning();
bool Vehicle_isK15On();
void Vehicle_Setup_CAN();
void Vehicle_Receive_CAN( FDCAN_RxHeaderTypeDef header, uint8_t* data);
bool Vehicle_gotUnlockMessage();
uint8_t Vehicle_Brightness();
float Vehicle_Speed();
int Vehicle_DirectionIsForward();
bool Vehicle_UnlockedSignal();

View File

@@ -1,146 +0,0 @@
#include "Vehicle.h"
#include "fdcan.h"
#include "CLS.h"
#include "CLS_BSP.h"
#include "BSP_GPIO.h"
#include "cmsis_os2.h"
static uint64_t last_unlock_message_time = UINT64_MAX;
static uint8_t car_can_brightness = 255;
static float car_can_speed = 0;
static int car_can_direction = 0;
void Vehicle_Setup_CAN() {
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = CLS_BSP_CAN_FILTER_LIST;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_RXFIFO1;
sFilterConfig.FilterID1 = 0x391;
sFilterConfig.FilterID2 = 0x395;
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
sFilterConfig.FilterIndex = 1;
sFilterConfig.FilterID1 = 0x351;
sFilterConfig.FilterID2 = 0x635;
HAL_FDCAN_ConfigFilter(&hfdcan2, &sFilterConfig);
}
static void rx_unlock_key(uint8_t * RxData ) {
if (RxData[1] == 0x04)
{
// car was unlocked
last_unlock_message_time = osKernelGetTickCount();
}
else if (RxData[1] ==0x80)
{
// car was locked
if (!BSP_GPIO_K15isSet()) {
NVIC_SystemReset();
}
}
}
static void rx_unlock_secure(uint8_t * RxData ) {
if ((RxData[0] & 0x0F) == 0x01) {
// car was unlocked
last_unlock_message_time = osKernelGetTickCount();
} else if ((RxData[0] & 0x0F) == 0x02) {
// car was locked
if (!BSP_GPIO_K15isSet()) {
NVIC_SystemReset();
}
}
}
static void rx_speed(uint8_t * RxData) {
// speed signal
// AA BB XX YY 00 00 00 00
// Speed (XX*(2^8)+(YY-1))/190
// direction AA = 0x00 forward, 0x02 backward
uint16_t speed = (RxData[2] << 8) + RxData[3];
float speed_kmh = (speed - 1) / 190.0;
car_can_speed = speed_kmh;
car_can_direction = RxData[0];
//ULOG_DEBUG("Speed: %f, Direction: %d", car_can_speed, car_can_direction);
}
static void rx_brightness(uint8_t* RxData) {
// scale the brightness to 0 - 255 only using integer math
car_can_brightness = ((uint32_t)RxData[0] * 255) / 100;
//ULOG_DEBUG("Brightness: %d", car_can_brightness);
}
void Vehicle_Receive_CAN( FDCAN_RxHeaderTypeDef RxHeader, uint8_t* RxData) {
if(RxHeader.Identifier == 0x391) {
rx_unlock_key(RxData);
}
if (RxHeader.Identifier == 0x395) {
rx_unlock_secure(RxData);
}
if (RxHeader.Identifier == 0x351) {
rx_speed(RxData);
}
// brightness knob in 0 - 100
if (RxHeader.Identifier == 0x635) {
rx_brightness(RxData);
}
}
bool Vehicle_gotUnlockMessage() {
return last_unlock_message_time != UINT64_MAX;
}
uint8_t Vehicle_Brightness() {
return car_can_brightness;
}
float Vehicle_Speed() {
return car_can_speed;
}
int Vehicle_DirectionIsForward() {
return car_can_direction == 0;
}
static bool unlocked = false;
bool Vehicle_UnlockedSignal() {
if (unlocked) {
if(Vehicle_isK15On()) {
unlocked = false;
last_unlock_message_time = UINT64_MAX;
}
}
if (!unlocked) {
if (Vehicle_gotUnlockMessage()) {
unlocked = true;
}
}
return unlocked;
}

View File

@@ -140,7 +140,7 @@ add_subdirectory("Application")
add_executable(${CMAKE_PROJECT_NAME})
target_sources(${CMAKE_PROJECT_NAME} PUBLIC ${sources_SRCS})
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tasks CLS CLS_BSP BSP EE24 INA219 ulog ram_loader Vehicle)
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tasks CLS CLS_BSP BSP EE24 INA219 ulog ram_loader)
#target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC PROTOS)
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver)
#target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb)

View File

@@ -40,7 +40,6 @@
#include "BSP_GPIO.h"
#include "BSP_ADC.h"
#include "BSP_SDLogger.h"
#include "Vehicle.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -237,7 +236,7 @@ void WaitForStartConfirm_Task(void *argument) {
while(1) {
osDelayUntil(tick);
tick += delayTime;
if(BSP_GPIO_K15isSet() || Vehicle_gotUnlockMessage()) {
if(BSP_GPIO_K15isSet() || CanDataTask_gotCarCanMessage()) {
BSP_POWER_FullPowerMode();
ULOG_INFO("Power systems started");
osThreadExit();

2
proto

Submodule proto updated: 4ff29f9d5b...2142d03586

View File

@@ -6,10 +6,10 @@ if __name__ == "__main__":
ser = setup_connection()
# Create a message
request = UpdateDeviceSettings()
request.device = 0
request.type = Type.COMMING_HOME
request.position.append(Position.LEFT)
request.position.append(Position.CENTER)
request.device = 5
request.type = Type.LIGHT
request.position.append(Position.RIGHT)
request.position.append(Position.FLOOR)
# Serialize the request to a bytearray
request_data = request.SerializeToString()