19 Commits
0.0.3 ... main

Author SHA1 Message Date
316f095c55 Update .gitea/workflows/build.yaml
Some checks failed
C Release thumbv7em-none-eabihf / Build-Release (push) Failing after 19s
2024-12-06 00:19:02 +00:00
6f40370a94 Update .gitmodules
Some checks failed
C Release thumbv7em-none-eabihf / Build-Release (push) Failing after 13s
fixed ;
2024-12-06 00:11:14 +00:00
d8551c58b7 Update .gitmodules
Some checks failed
C Release thumbv7em-none-eabihf / Build-Release (push) Failing after 12s
now using https for all submodules
2024-12-06 00:10:14 +00:00
decb22747c Update .gitea/workflows/build.yaml
Some checks failed
C Release thumbv7em-none-eabihf / Build-Release (push) Failing after 1m8s
2024-12-06 00:04:40 +00:00
3b10f5ffe6 Update .gitea/workflows/build.yaml
Some checks failed
C Release thumbv7em-none-eabihf / Build-Release (push) Failing after 1s
2024-12-05 03:17:07 +00:00
1e0fd80f5c added MLZR_Comm 2024-06-03 22:04:46 +02:00
41cc7a9ff6 display current ambientlight 2024-06-02 02:26:33 +02:00
f263896cbf update proto 2024-06-02 02:10:45 +02:00
d8e27df3fe added a way to readout the current value 2024-06-02 02:05:31 +02:00
be0ce6dee5 now using cls-build container for faster builds 2024-05-30 04:04:57 +02:00
0798ec40c1 added ambient light to can bus 2024-05-29 04:01:55 +02:00
4724da0455 new version 2024-05-29 03:36:18 +02:00
13002071d7 added passthouth off headlight settings messages 2024-05-29 03:28:16 +02:00
8d02489b16 fix CI compile 2024-05-28 04:56:24 +02:00
452246951b fixed error on can parsing 2024-05-28 04:55:31 +02:00
eb5733da97 added new signal 2024-05-28 04:21:39 +02:00
766d5e9ca8 refactor Functions to group everything connected to the vehicle to a central location 2024-05-28 03:52:03 +02:00
9c489c1a25 disable_sd_log 2024-05-24 16:08:01 +02:00
d0544576a3 Master is now using the same FW_Update Methode as the Slaves 2024-05-24 01:58:53 +02:00
38 changed files with 806 additions and 314 deletions

View File

@@ -4,15 +4,16 @@ on: [push]
jobs: jobs:
Build-Release: Build-Release:
runs-on: ubuntu-latest runs-on: cls-build
steps: steps:
- name: Install dependencies #- name: Install dependencies
run: apt-get update && apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi ninja-build cmake protobuf-compiler python3 python3-grpcio python3-protobuf python3-pkg-resources python3-requests # run: apt-get update && apt-get install -y gcc-arm-none-eabi binutils-arm-none-eabi ninja-build cmake protobuf-compiler python3 python3-grpcio python3-protobuf python3-pkg-resources python3-requests
# run: pip install setuptools # run: pip install setuptools
- name: Check out repository code - name: Check out repository code
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
token: ${{ secrets.TOKEN }}
submodules: true submodules: true
fetch-depth: 0 fetch-depth: 0

12
.gitmodules vendored
View File

@@ -9,13 +9,19 @@
url = https://github.com/ThrowTheSwitch/Unity url = https://github.com/ThrowTheSwitch/Unity
[submodule "Application/CLS"] [submodule "Application/CLS"]
path = Application/CLS path = Application/CLS
url = git@git.lan:oliver/libCLS.git url = https://git.revwal.de/oliver/libCLS.git
[submodule "lib/ulog"] [submodule "lib/ulog"]
path = lib/ulog path = lib/ulog
url = https://github.com/rdpoor/ulog.git url = https://github.com/rdpoor/ulog.git
[submodule "lib/ee24"] [submodule "lib/ee24"]
path = lib/ee24 path = lib/ee24
url = git@git.lan:oliver/ee24.git url = https://git.revwal.de/oliver/ee24.git
[submodule "proto"] [submodule "proto"]
path = proto path = proto
url = git@git.lan:oliver/cls-proto.git url = https://git.revwal.de/oliver/cls-proto.git
[submodule "lib/TinyFrame"]
path = lib/TinyFrame
url = https://github.com/MightyPork/TinyFrame.git
[submodule "Application/MLZR_Comm"]
path = Application/MLZR_Comm
url = https://git.revwal.de/ODDIY/MLZR_Comm.git

View File

@@ -34,7 +34,7 @@ void BSP_SDLogger_Init(int log_number) {
ULOG_ERROR("Failed to open file %s", file_name); 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 // close the file
f_close(&file); f_close(&file);

View File

@@ -1,4 +1,5 @@
#include "CLS_BSP.h" #include "CLS_BSP.h"
#include "CLSAddress.h"
#ifdef CLS_BSP_FDCAN #ifdef CLS_BSP_FDCAN
@@ -67,4 +68,9 @@ CLS_Position_t CLS_BSP_GetPosition(void) {
} }
void CLS_BSP_SetPosition(CLS_Position_t position) { 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_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(${PROJECT_NAME} PRIVATE CLS) target_link_libraries(${PROJECT_NAME} PRIVATE CLS BSP Vehicle)

View File

@@ -1,4 +1,7 @@
add_subdirectory(Tasks) add_subdirectory(Tasks)
add_subdirectory(CLS) add_subdirectory(CLS)
add_subdirectory(CLS_BSP) add_subdirectory(CLS_BSP)
add_subdirectory(BSP) add_subdirectory(BSP)
add_subdirectory(ram_loader)
add_subdirectory(MLZR_Comm)
add_subdirectory(Vehicle)

1
Application/MLZR_Comm Submodule

Submodule Application/MLZR_Comm added at 48a98f4c82

View File

@@ -12,6 +12,8 @@ target_sources(${PROJECT_NAME}
${CMAKE_CURRENT_LIST_DIR}/FirmwareUpdate.c ${CMAKE_CURRENT_LIST_DIR}/FirmwareUpdate.c
${CMAKE_CURRENT_LIST_DIR}/LightTask.c ${CMAKE_CURRENT_LIST_DIR}/LightTask.c
${CMAKE_CURRENT_LIST_DIR}/LightState.c ${CMAKE_CURRENT_LIST_DIR}/LightState.c
${CMAKE_CURRENT_LIST_DIR}/Headlight_can.c
INTERFACE INTERFACE
${CMAKE_CURRENT_LIST_DIR}/UsbDataHandler.h ${CMAKE_CURRENT_LIST_DIR}/UsbDataHandler.h
${CMAKE_CURRENT_LIST_DIR}/CanDataTask.h ${CMAKE_CURRENT_LIST_DIR}/CanDataTask.h
@@ -22,4 +24,4 @@ target_sources(${PROJECT_NAME}
target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR}) target_include_directories(${PROJECT_NAME} INTERFACE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(${PROJECT_NAME} PUBLIC PROTOS CLS) target_link_libraries(${PROJECT_NAME} PUBLIC PROTOS CLS)
target_link_libraries(${PROJECT_NAME} PRIVATE Revision CLS_BSP BSP ulog) target_link_libraries(${PROJECT_NAME} PRIVATE Revision CLS_BSP BSP ulog Vehicle ram_loader)

View File

@@ -11,6 +11,7 @@
#include "ulog.h" #include "ulog.h"
#include "BSP_POWER.h" #include "BSP_POWER.h"
#include "BSP_GPIO.h" #include "BSP_GPIO.h"
#include "Vehicle.h"
// Define thread flags // Define thread flags
#define FLAG_FDCAN_RX_FIFO0 (1<<0) #define FLAG_FDCAN_RX_FIFO0 (1<<0)
#define FLAG_FDCAN_RX_FIFO1 (1<<1) #define FLAG_FDCAN_RX_FIFO1 (1<<1)
@@ -46,7 +47,7 @@ const osThreadAttr_t CarCanTask_attr = {
.priority = osPriorityNormal, .priority = osPriorityNormal,
}; };
static uint64_t last_car_message_time = 0;
uint32_t dlcDecode(uint32_t dlcCode) { uint32_t dlcDecode(uint32_t dlcCode) {
switch(dlcCode) { switch(dlcCode) {
@@ -130,11 +131,6 @@ 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 // convert byte to 2 hex characters
void byteToHex(uint8_t byte, char * hex) { void byteToHex(uint8_t byte, char * hex) {
@@ -143,6 +139,10 @@ void byteToHex(uint8_t byte, char * hex) {
hex[1] = hexLookup[byte & 0x0F]; hex[1] = hexLookup[byte & 0x0F];
} }
static FDCAN_RxHeaderTypeDef RxHeader = {0};
static uint8_t RxData[8] = {0};
void CarCanTask_func(void *argument) { void CarCanTask_func(void *argument) {
// for testing accept all messages from the car can bus // for testing accept all messages from the car can bus
@@ -152,20 +152,8 @@ 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 */ /* Start the FDCAN module */
if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK){ if (HAL_FDCAN_Start(&hfdcan2) != HAL_OK){
@@ -176,8 +164,7 @@ void CarCanTask_func(void *argument) {
Error_Handler(); Error_Handler();
} }
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[8];
for(;;) { for(;;) {
// wait for interrupt event on any fifo // wait for interrupt event on any fifo
@@ -261,71 +248,8 @@ void CarCanTask_func(void *argument) {
if (HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) { if (HAL_FDCAN_GetRxMessage(&hfdcan2, FDCAN_RX_FIFO1, &RxHeader, RxData) != HAL_OK) {
Error_Handler(); Error_Handler();
} else { } 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 ); //ULOG_DEBUG("Used Car MSG: %x, %d %s", RxHeader.Identifier, CLS_BSP_DLC_ToBytes(RxHeader.DataLength), msg );
} }
@@ -339,9 +263,6 @@ void CarCanTask_func(void *argument) {
* @return true if a car can message has been received * @return true if a car can message has been received
* @return false if no 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() { bool CanDataTask_CarCanActive() {
@@ -350,20 +271,9 @@ bool CanDataTask_CarCanActive() {
} }
return osKernelGetTickCount() - last_car_message_time < 1000; 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) { void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) {
// Notify the thread // Notify the thread

View File

@@ -10,6 +10,9 @@
#include "crc.h" #include "crc.h"
#include "FirmwareUpdate.h" #include "FirmwareUpdate.h"
#include "stdbool.h" #include "stdbool.h"
#include "CLS.h"
#include "stdbool.h"
#include "ram_loader.h"
// static memory only for decoding messages // static memory only for decoding messages
static cls_firmware_Start msg_cls_firmware_Start; static cls_firmware_Start msg_cls_firmware_Start;
@@ -58,19 +61,15 @@ void DataSend_FirmwareFileCheck(uint32_t crc, uint32_t device_id, bool ready_for
#define CHUNK_SIZE 256 // Change this to the size of chunks you want to read #define CHUNK_SIZE 256 // Change this to the size of chunks you want to read
static uint8_t crc_buffer[CHUNK_SIZE]; static uint8_t crc_buffer[CHUNK_SIZE];
void DataClbk_cls_firmware_Start(void *msg, uint32_t length) {
DATA_CLBK_SETUP(cls_firmware_Start); void fw_Start_Slave( cls_firmware_Start * msg) {
fwStartTime = osKernelGetSysTimerCount();
fwPackageCounter = 0;
uint32_t crc = 0; uint32_t crc = 0;
UINT totalRead = 0; UINT totalRead = 0;
UINT bytesRead = 0; UINT bytesRead = 0;
if(FileOpen) {
f_close(&FwFile);
}
// Check if file already exists // Check if file already exists
if(f_open(&FwFile, msg_cls_firmware_Start.name, FA_READ) == FR_OK) { if(f_open(&FwFile, msg->name, FA_READ) == FR_OK) {
__HAL_CRC_DR_RESET(&hcrc); __HAL_CRC_DR_RESET(&hcrc);
do { do {
@@ -80,16 +79,38 @@ void DataClbk_cls_firmware_Start(void *msg, uint32_t length) {
} while(bytesRead == CHUNK_SIZE); } while(bytesRead == CHUNK_SIZE);
f_close(&FwFile); f_close(&FwFile);
if(crc == msg_cls_firmware_Start.crc_fw) { if(crc == msg->crc_fw) {
// CRC matches, no need for transfer // CRC matches, no need for transfer
DataSend_FirmwareFileCheck(crc, msg_cls_firmware_Start.device_id, false, totalRead, msg_cls_firmware_Start.name); DataSend_FirmwareFileCheck(crc, msg->device_id, false, totalRead, msg->name);
return; return;
} }
} }
fresult_open = f_open(&FwFile, msg_cls_firmware_Start.name, FA_CREATE_ALWAYS | FA_WRITE); fresult_open = f_open(&FwFile, msg->name, FA_CREATE_ALWAYS | FA_WRITE);
FileOpen=true; FileOpen=true;
DataSend_FirmwareFileCheck(crc, msg_cls_firmware_Start.device_id, fresult_open==FR_OK, totalRead, msg_cls_firmware_Start.name); DataSend_FirmwareFileCheck(crc, msg->device_id, fresult_open==FR_OK, totalRead, msg->name);
}
void fw_Start_Master( cls_firmware_Start * msg) {
fresult_open = f_open(&FwFile, "firm.bin", FA_CREATE_ALWAYS | FA_WRITE);
FileOpen=true;
DataSend_FirmwareFileCheck(0, msg->device_id, fresult_open==FR_OK, 0, msg->name);
}
void DataClbk_cls_firmware_Start(void *msg, uint32_t length) {
DATA_CLBK_SETUP(cls_firmware_Start);
fwStartTime = osKernelGetSysTimerCount();
fwPackageCounter = 0;
if(FileOpen) {
f_close(&FwFile);
}
if(msg_cls_firmware_Start.device_id == gCLS_DEVICE_ADDRESS) {
fw_Start_Master(&msg_cls_firmware_Start);
} else {
fw_Start_Slave(&msg_cls_firmware_Start);
}
} }
@@ -133,10 +154,14 @@ void DataClbk_cls_firmware_Done(void *msg, uint32_t length) {
fresult_open = 0xFF; fresult_open = 0xFF;
FileOpen=false; FileOpen=false;
FirmwareUpdateArgs args; if(msg_cls_firmware_Done.device_id == gCLS_DEVICE_ADDRESS) {
args.device = msg_cls_firmware_Done.device_id; RamLoader_LoadApplication();
memcpy(args.name, msg_cls_firmware_Start.name, sizeof(args.name)); } else {
FirmwareUpdateTask_start(args); FirmwareUpdateArgs args;
args.device = msg_cls_firmware_Done.device_id;
memcpy(args.name, msg_cls_firmware_Start.name, sizeof(args.name));
FirmwareUpdateTask_start(args);
}
} }

View File

@@ -160,7 +160,6 @@ void FirmwareUpdateTask_start(FirmwareUpdateArgs args) {
} }
} }
UsbDataPacket buffer;
void CLSFirmwareUpdateTask_func(void *argument) { void CLSFirmwareUpdateTask_func(void *argument) {
FirmwareUpdateArgs args; FirmwareUpdateArgs args;
osStatus_t status; osStatus_t status;

View File

@@ -0,0 +1,116 @@
#include "UsbDataHandler.h"
#include "headlight.pb.h"
#include "CanDataHandler.h"
#include "stdint.h"
#include "cmsis_os2.h"
#include "CLS.h"
#include "CLS_BSP.h"
#include "CLSAddress.h"
#include "ulog.h"
#include "Vehicle.h"
cls_headlight_RequestSettings msg_cls_headlight_RequestSettings;
cls_headlight_Settings msg_cls_headlight_Settings;
cls_headlight_SaveSettings msg_cls_headlight_SaveSettings;
typedef struct Headlight_Control_Setting {
float alpha;
uint16_t on_threshold;
uint16_t off_threshold;
} Headlight_Control_Setting_t;
uint16_t headlight_amblight = 0;
void CanData_ambilight(CanDataId canid, uint8_t* data, uint8_t len) {
if(len == 2) {
headlight_amblight = (data[1] << 8) | data[0];
}
ULOG_INFO("Ambilight: %d", headlight_amblight);
}
void AddHeadlightMessages() {
CanData_regEventMsg(GENERATE_CLS_ADDRESS(CLS_CODE_STATUS, 0, CLS_CH_STA_AMBIENTLIGHT), CanData_ambilight);
}
// whan a message is received, this function is called
void DataClbk_cls_headlight_Settings(void* msg, uint32_t length) {
DATA_CLBK_SETUP(cls_headlight_Settings);
uint8_t device = msg_cls_headlight_Settings.deviceId;
uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 0);
CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_8);
Headlight_Control_Setting_t data = {0};
data.alpha = msg_cls_headlight_Settings.alpha;
data.on_threshold = msg_cls_headlight_Settings.on_threshold;
data.off_threshold = msg_cls_headlight_Settings.off_threshold;
CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)&data);
}
void DataClbk_cls_headlight_SaveSettings(void* msg, uint32_t length) {
DATA_CLBK_SETUP(cls_headlight_SaveSettings);
uint8_t device = msg_cls_headlight_SaveSettings.deviceId;
uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 4);
CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_1);
CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)"X");
}
static Headlight_Control_Setting_t response_theme = {0};
static cls_headlight_Settings headligh_settings = {0};
void CanData_responseHeadlightSetting(CanDataId canid, uint8_t* data, uint8_t len) {
if(len == 8) {
memcpy(&response_theme, data, 8);
headligh_settings.alpha = response_theme.alpha;
headligh_settings.on_threshold = response_theme.on_threshold;
headligh_settings.off_threshold = response_theme.off_threshold;
headligh_settings.deviceId = (canid >> 3) & 0x1F;
USBDataResonse(&headligh_settings,cls_headlight_Settings_fields, cls_usb_PackageType_HEADLIGHT_SETTINGS);
}
CanData_removeEvent(canid);
}
void DataClbk_cls_headlight_RequestSettings(void* msg, uint32_t length) {
DATA_CLBK_SETUP(cls_headlight_RequestSettings);
uint8_t device = msg_cls_headlight_RequestSettings.deviceId;
uint8_t data = 0;
uint16_t msg_light_setting = GENERATE_CLS_ADDRESS(CLS_CODE_CONFIG, device, 7);
CLS_BSP_TxHeaderType can_header = CREATE_BSP_CAN_HEADER(msg_light_setting, CLS_BSP_DLC_BYTES_1);
CanData_regEventMsg(msg_light_setting,CanData_responseHeadlightSetting);
CLS_BSP_CAN_AddMessageToSend(&can_header, (uint8_t*)&data);
}
void DataClbk_cls_headlight_RequestBrightness(void* msg, uint32_t length) {
cls_headlight_RequestBrightness msg_cls_headlight_RequestBrightness;
memcpy(&msg_cls_headlight_RequestBrightness, msg, sizeof(cls_headlight_RequestBrightness));
cls_headlight_Brightness msg_cls_headlight_Brightness;
msg_cls_headlight_Brightness.brightness = headlight_amblight;
USBDataResonse(&msg_cls_headlight_Brightness,cls_headlight_Brightness_fields, cls_usb_PackageType_HEADLIGHT_BRIGHTNESS);
}

View File

@@ -5,6 +5,7 @@
#include "LightTask.h" #include "LightTask.h"
#include "ulog.h" #include "ulog.h"
#include "stdbool.h" #include "stdbool.h"
#include "Vehicle.h"
// Create the task with a specific priority and stack size // Create the task with a specific priority and stack size
osThreadAttr_t task_attr = { osThreadAttr_t task_attr = {
@@ -24,89 +25,15 @@ 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 // Function to determine the next state of the light
// return 1 as default state // return 1 as default state
// return 2 if the engine is running // return 2 if the engine is running
// return 3 if the headlight and engine is running // return 3 if the headlight and engine is running
static int determineNextState() static int determineNextState()
{ {
if (isHeadlightOn() && isEngineRunning()) { if (Vehicle_isHeadlightOn() && Vehicle_isEngineRunning()) {
return 2; return 2;
} else if (isEngineRunning()) { } else if (Vehicle_isEngineRunning()) {
return 1; return 1;
} else { } else {
return 0; return 0;

View File

@@ -11,6 +11,7 @@
#include "BSP_GPIO.h" #include "BSP_GPIO.h"
#include "CanDataTask.h" #include "CanDataTask.h"
#include "Vehicle.h"
#include "BSP_ADC.h" #include "BSP_ADC.h"
#define DIMM_DEADZONE_VOLTAGE 0.7 #define DIMM_DEADZONE_VOLTAGE 0.7
@@ -82,14 +83,14 @@ void LightTask_func(void *argument) {
float dimmfactor = 1.0; uint8_t dimm = 255;
// currenlty not working
// only dimm if the headlight is on // only dimm if the headlight is on
if (BSP_GPIO_HeadLightIsSet()) { //if (Vehicle_isHeadlightOn()) {
// new version over CAN // new version over CAN
uint8_t precent = CanDataTask_CarCanBrightness(); //dimm = Vehicle_Brightness();
dimmfactor = (float)precent / 100.0;
// old version over ADC // old version over ADC
// calculate the dimmfactor based on the battery voltage and the dimmer voltage // calculate the dimmfactor based on the battery voltage and the dimmer voltage
@@ -104,9 +105,10 @@ void LightTask_func(void *argument) {
//} else { //} else {
// dimmfactor = (v_dimm - 4.0) / (v_bus - 4.0); // dimmfactor = (v_dimm - 4.0) / (v_bus - 4.0);
//} //}
}
uint8_t adjustedBrightness = (uint8_t)(brightness * dimmfactor); //}
uint8_t adjustedBrightness = (brightness * dimm)/ 255;
lightSettings_dimmed.brightness = adjustedBrightness; lightSettings_dimmed.brightness = adjustedBrightness;
lightSettings_dimmed.theme = lightSettings.theme; lightSettings_dimmed.theme = lightSettings.theme;

View File

@@ -3,6 +3,7 @@
#include "FreeRTOS.h" #include "FreeRTOS.h"
#include "firmware.pb.h" #include "firmware.pb.h"
#include "light.pb.h" #include "light.pb.h"
#include "headlight.pb.h"
#include "usb_device.h" #include "usb_device.h"
#include <pb_decode.h> #include <pb_decode.h>
#include "cls_device.pb.h" #include "cls_device.pb.h"
@@ -62,7 +63,10 @@ union {
cls_light_SaveThemeSettings msg_cls_light_SaveThemeSettings; cls_light_SaveThemeSettings msg_cls_light_SaveThemeSettings;
cls_light_RequestThemeSetting msg_cls_light_RequestThemeSetting; cls_light_RequestThemeSetting msg_cls_light_RequestThemeSetting;
cls_usb_JumpToBootloader msg_cls_usb_JumpToBootloader; cls_usb_JumpToBootloader msg_cls_usb_JumpToBootloader;
cls_headlight_Settings msg_cls_headlight_Settings;
cls_headlight_SaveSettings msg_cls_headlight_SaveSettings;
cls_headlight_RequestSettings msg_cls_headlight_RequestSettings;
cls_headlight_RequestBrightness msg_cls_headlight_RequestBrightness;
} mem_msg_decode; } mem_msg_decode;
@@ -121,6 +125,10 @@ message_handler_t message_handlers[] = {
MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_SETTING_THEME_SAVE, cls_light_SaveThemeSettings), MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_SETTING_THEME_SAVE, cls_light_SaveThemeSettings),
MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_REQUEST_THEME, cls_light_RequestThemeSetting), MESSAGE_HANDLER(cls_usb_PackageType_LIGHT_REQUEST_THEME, cls_light_RequestThemeSetting),
MESSAGE_HANDLER(cls_usb_PackageType_JUMP_TO_BOOTLOADER, cls_usb_JumpToBootloader), MESSAGE_HANDLER(cls_usb_PackageType_JUMP_TO_BOOTLOADER, cls_usb_JumpToBootloader),
MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_SETTINGS, cls_headlight_Settings),
MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_SAVE_SETTINGS, cls_headlight_SaveSettings),
MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_REQUEST_SETTINGS, cls_headlight_RequestSettings),
MESSAGE_HANDLER(cls_usb_PackageType_HEADLIGHT_REQUEST_BRIGHTNESS, cls_headlight_RequestBrightness),
}; };

View File

@@ -136,6 +136,10 @@ void DataClbk_cls_light_GlobalTheme(void* msg, uint32_t length);
void DataClbk_cls_light_ThemeSettings(void* msg, uint32_t length); void DataClbk_cls_light_ThemeSettings(void* msg, uint32_t length);
void DataClbk_cls_light_SaveThemeSettings(void* msg, uint32_t length); void DataClbk_cls_light_SaveThemeSettings(void* msg, uint32_t length);
void DataClbk_cls_light_RequestThemeSetting(void* msg, uint32_t length); void DataClbk_cls_light_RequestThemeSetting(void* msg, uint32_t length);
void DataClbk_cls_headlight_Settings(void* msg, uint32_t length);
void DataClbk_cls_headlight_SaveSettings(void* msg, uint32_t length);
void DataClbk_cls_headlight_RequestSettings(void* msg, uint32_t length);
void DataClbk_cls_headlight_RequestBrightness(void* msg, uint32_t length);
#include "usb.pb.h" #include "usb.pb.h"
void USBDataResonse(void * msg, const pb_msgdesc_t *fields, cls_usb_PackageType typeid); void USBDataResonse(void * msg, const pb_msgdesc_t *fields, cls_usb_PackageType typeid);

View File

@@ -0,0 +1,32 @@
# 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

@@ -0,0 +1,82 @@
#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

@@ -0,0 +1,24 @@
#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

@@ -0,0 +1,149 @@
#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

@@ -0,0 +1,34 @@
# Set the minimum required CMake version
cmake_minimum_required(VERSION 3.12)
# Set the project name
project(ram_loader)
# Add the source files for the library
set(SOURCES
ram_loader.c
)
# Add the header files for the library
set(HEADERS
ram_loader.h
)
# Create the library target
add_library(ram_loader ${SOURCES} ${HEADERS})
# Set the include directories for the library
target_include_directories(ram_loader PUBLIC ./)
# Set any additional compiler flags or options
# target_compile_options(${PROJECT_NAME} PRIVATE ...)
# Set any additional linker flags or options
# target_link_options(${PROJECT_NAME} PRIVATE ...)
# Specify any dependencies for the library
# target_link_libraries(${PROJECT_NAME} <dependency1> <dependency2> ...)
# Optionally, add an executable target for testing
# add_executable(test_ram_loader test/test_ram_loader.cpp)
# target_link_libraries(test_ram_loader ${PROJECT_NAME})

View File

@@ -0,0 +1,110 @@
#include "fatfs.h"
#include "string.h"
#define RAM_LOADER_BUFFER_SIZE 15*1024
#define RAM_LOADER_ADDRESS 0x38000000
#define APP_START_ADDRESS RAM_LOADER_ADDRESS
uint8_t * ram_loader_buffer = (uint8_t *) RAM_LOADER_ADDRESS;
void _app_start(void)
{
__disable_irq();
// Reset USB
//De-init all peripherals
//HAL_ADC_DeInit(&hadc1);
// Disable Systick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
// Reset clock to default
HAL_RCC_DeInit();
// Clear all interrupt bits
for (uint8_t i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
__enable_irq();
// set the vector table offset register
SCB->VTOR = APP_START_ADDRESS;
// get the application stack pointer
__set_MSP(((uint32_t *)APP_START_ADDRESS)[0]);
// jump to the application
((void (*)(void))((uint32_t *)APP_START_ADDRESS)[1])();
// the application should never return
// ULOG_ERROR("Failed to start application");
while (1) {}
}
static uint8_t buffer[512];
void RamLoader_LoadApplication()
{
// check if the file "load.bin" exists
FIL file;
FRESULT res = f_open(&file, "load.bin", FA_READ);
if (res != FR_OK) {
// ULOG_ERROR("Failed to open file load.bin");
return;
}
UINT size = f_size(&file);
// ensure the file is not larger than the buffer
if (size > RAM_LOADER_BUFFER_SIZE ) {
// ULOG_ERROR("File load.bin is too large");
return;
}
// read the file into the buffer
UINT bytes_read;
uint32_t remaining_bytes = size;
uint8_t *destination_ptr = ram_loader_buffer;
uint8_t *buffer_ptr = buffer;
while (remaining_bytes > 0) {
UINT read_size = remaining_bytes > 512 ? 512 : remaining_bytes;
res = f_read(&file, buffer_ptr, read_size, &bytes_read);
if (res != FR_OK) {
// ULOG_ERROR("Failed to read file load.bin");
return;
}
if (bytes_read != read_size) {
// ULOG_ERROR("Failed to read file load.bin completely");
return;
}
memcpy(destination_ptr, buffer_ptr, read_size);
remaining_bytes -= read_size;
destination_ptr += read_size;
}
// close the file
f_close(&file);
// check that the file to flash exists ("firm.bin")
res = f_open(&file, "firm.bin", FA_READ);
if (res != FR_OK) {
// ULOG_ERROR("Failed to open file firm.bin");
return;
}
//close the file
f_close(&file);
_app_start();
}

View File

@@ -0,0 +1,3 @@
#pragma once
void RamLoader_LoadApplication();

View File

@@ -124,6 +124,7 @@ nanopb_generate_cpp(PROTO_SRCS PROTO_HDRS RELPATH proto
proto/cls_device.proto proto/cls_device.proto
proto/light.proto proto/light.proto
proto/usb.proto proto/usb.proto
proto/headlight.proto
) )
add_library(PROTOS ${PROTO_SRCS} ${PROTO_HDRS}) add_library(PROTOS ${PROTO_SRCS} ${PROTO_HDRS})
target_include_directories(PROTOS PUBLIC ${NANOPB_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}) target_include_directories(PROTOS PUBLIC ${NANOPB_INCLUDE_DIRS} ${PROJECT_BINARY_DIR})
@@ -140,9 +141,9 @@ add_subdirectory("Application")
add_executable(${CMAKE_PROJECT_NAME}) add_executable(${CMAKE_PROJECT_NAME})
target_sources(${CMAKE_PROJECT_NAME} PUBLIC ${sources_SRCS}) target_sources(${CMAKE_PROJECT_NAME} PUBLIC ${sources_SRCS})
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC Tasks CLS CLS_BSP BSP EE24 INA219 ulog) 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 PROTOS) #target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC PROTOS)
target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC uart_driver) target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC mlzr_comm TinyFrame uart_driver)
#target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb) #target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC lwrb)
target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE target_compile_options(${CMAKE_PROJECT_NAME} PRIVATE

View File

@@ -40,6 +40,8 @@
#include "BSP_GPIO.h" #include "BSP_GPIO.h"
#include "BSP_ADC.h" #include "BSP_ADC.h"
#include "BSP_SDLogger.h" #include "BSP_SDLogger.h"
#include "Vehicle.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
@@ -150,6 +152,8 @@ void MX_FREERTOS_Init(void) {
} }
/* USER CODE BEGIN Header_StartDefaultTask */ /* USER CODE BEGIN Header_StartDefaultTask */
void AddHeadlightMessages();
/** /**
* @brief Function implementing the defaultTask thread. * @brief Function implementing the defaultTask thread.
* @param argument: Not used * @param argument: Not used
@@ -158,6 +162,7 @@ void MX_FREERTOS_Init(void) {
#include "CLS_BSP.h" #include "CLS_BSP.h"
#include "CLSAddress.h" #include "CLSAddress.h"
#include "mlzr_comm.h"
/* USER CODE END Header_StartDefaultTask */ /* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument) void StartDefaultTask(void *argument)
{ {
@@ -167,6 +172,9 @@ void StartDefaultTask(void *argument)
BSP_EE24_Init(); BSP_EE24_Init();
BSP_INA_Init(); BSP_INA_Init();
MLZR_INIT();
retSD = f_mount(&SDFatFS,SDPath,0); retSD = f_mount(&SDFatFS,SDPath,0);
retSD = f_open(&SDFile, "counter.bin", FA_READ); retSD = f_open(&SDFile, "counter.bin", FA_READ);
@@ -188,6 +196,7 @@ void StartDefaultTask(void *argument)
} }
BSP_SDLogger_Init(counter); BSP_SDLogger_Init(counter);
AddHeadlightMessages();
char INA_LOG[72]; char INA_LOG[72];
@@ -236,7 +245,7 @@ void WaitForStartConfirm_Task(void *argument) {
while(1) { while(1) {
osDelayUntil(tick); osDelayUntil(tick);
tick += delayTime; tick += delayTime;
if(BSP_GPIO_K15isSet() || CanDataTask_gotCarCanMessage()) { if(BSP_GPIO_K15isSet() || Vehicle_gotUnlockMessage()) {
BSP_POWER_FullPowerMode(); BSP_POWER_FullPowerMode();
ULOG_INFO("Power systems started"); ULOG_INFO("Power systems started");
osThreadExit(); osThreadExit();

View File

@@ -41,6 +41,7 @@
#include "BSP_POWER.h" #include "BSP_POWER.h"
#include "BSP_GPIO.h" #include "BSP_GPIO.h"
#include "BSP_ADC.h" #include "BSP_ADC.h"
#include "ram_loader.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
@@ -73,13 +74,12 @@ static void MPU_Config(void);
void MX_FREERTOS_Init(void); void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */ /* USER CODE BEGIN PFP */
void ULOG_SendLPUART(ulog_level_t level, char *msg); void ULOG_SendLPUART(ulog_level_t level, char *msg);
void JumpToBootloader_system(void);
/* USER CODE END PFP */ /* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/ /* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */ /* USER CODE BEGIN 0 */
const uint32_t OS_BOOTFLAG_ADDRESS = 0x38000000;
const uint32_t OS_BOOTFLAG_MAGIC = 0xDEADBEFF;
/* USER CODE END 0 */ /* USER CODE END 0 */
/** /**
@@ -90,19 +90,6 @@ int main(void)
{ {
/* USER CODE BEGIN 1 */ /* USER CODE BEGIN 1 */
// Check if the bootloader magic number is set at the given address
volatile uint32_t * ptr = (uint32_t *)OS_BOOTFLAG_ADDRESS;
if (*ptr == OS_BOOTFLAG_MAGIC) {
// Jump to the bootloader
*ptr = 0;
JumpToBootloader_system();
}
if (*ptr == 0) {
*ptr = 2;
NVIC_SystemReset();
}
/* USER CODE END 1 */ /* USER CODE END 1 */
@@ -302,58 +289,8 @@ void ULOG_SendLPUART(ulog_level_t level, char *msg) {
HAL_UART_Transmit(&hlpuart1, (const uint8_t*)ulog_send_buffer, send_length, LOG_TIMEOUT); HAL_UART_Transmit(&hlpuart1, (const uint8_t*)ulog_send_buffer, send_length, LOG_TIMEOUT);
} }
void JumpToBootloader(void)
{
// Set the magic number to the given address
volatile uint32_t * ptr = (uint32_t *)OS_BOOTFLAG_ADDRESS;
*ptr = OS_BOOTFLAG_MAGIC;
NVIC_SystemReset();
}
void JumpToBootloader_system(void)
{
#define conBootloadAddress 0x1FF09800
void (*SysMemBootJump)(void);
uint8_t i;
__disable_irq();
// Reset USB
//USBD_DeInit(&hUsbDeviceHS);
//De-init all peripherals
//HAL_ADC_DeInit(&hadc1);
// Disable Systick
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
// Reset clock to default
HAL_RCC_DeInit();
// Clear all interrupt bits
for (i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++)
{
NVIC->ICER[i] = 0xFFFFFFFF;
NVIC->ICPR[i] = 0xFFFFFFFF;
}
__enable_irq();
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (conBootloadAddress + 4)));
__set_MSP(*(uint32_t *)conBootloadAddress);
SysMemBootJump();
while (1); // Just in case...
}
void DataClbk_cls_usb_JumpToBootloader(void* msg, uint32_t length) { void DataClbk_cls_usb_JumpToBootloader(void* msg, uint32_t length) {
JumpToBootloader(); RamLoader_LoadApplication();
} }
/* USER CODE END 4 */ /* USER CODE END 4 */

View File

@@ -22,6 +22,7 @@
#include "stm32h7xx_it.h" #include "stm32h7xx_it.h"
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "AsyncComm.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
@@ -41,7 +42,8 @@
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */ /* USER CODE BEGIN PV */
extern uart_desc_t uart_duplex;
extern uart_desc_t uart_half;
/* USER CODE END PV */ /* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
@@ -233,7 +235,7 @@ void DMA1_Stream0_IRQHandler(void)
/* USER CODE END DMA1_Stream0_IRQn 0 */ /* USER CODE END DMA1_Stream0_IRQn 0 */
/* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */
usart_dma_irq_handler(&uart_duplex);
/* USER CODE END DMA1_Stream0_IRQn 1 */ /* USER CODE END DMA1_Stream0_IRQn 1 */
} }
@@ -247,7 +249,7 @@ void DMA1_Stream1_IRQHandler(void)
/* USER CODE END DMA1_Stream1_IRQn 0 */ /* USER CODE END DMA1_Stream1_IRQn 0 */
/* USER CODE BEGIN DMA1_Stream1_IRQn 1 */ /* USER CODE BEGIN DMA1_Stream1_IRQn 1 */
usart_dma_irq_handler_tx(&uart_duplex);
/* USER CODE END DMA1_Stream1_IRQn 1 */ /* USER CODE END DMA1_Stream1_IRQn 1 */
} }
@@ -261,7 +263,7 @@ void DMA1_Stream2_IRQHandler(void)
/* USER CODE END DMA1_Stream2_IRQn 0 */ /* USER CODE END DMA1_Stream2_IRQn 0 */
/* USER CODE BEGIN DMA1_Stream2_IRQn 1 */ /* USER CODE BEGIN DMA1_Stream2_IRQn 1 */
usart_dma_irq_handler(&uart_half);
/* USER CODE END DMA1_Stream2_IRQn 1 */ /* USER CODE END DMA1_Stream2_IRQn 1 */
} }
@@ -275,7 +277,7 @@ void DMA1_Stream3_IRQHandler(void)
/* USER CODE END DMA1_Stream3_IRQn 0 */ /* USER CODE END DMA1_Stream3_IRQn 0 */
/* USER CODE BEGIN DMA1_Stream3_IRQn 1 */ /* USER CODE BEGIN DMA1_Stream3_IRQn 1 */
usart_dma_irq_handler_tx(&uart_half);
/* USER CODE END DMA1_Stream3_IRQn 1 */ /* USER CODE END DMA1_Stream3_IRQn 1 */
} }
@@ -400,7 +402,7 @@ void USART1_IRQHandler(void)
/* USER CODE END USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */
/* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE BEGIN USART1_IRQn 1 */
usart_irq_handler(&uart_duplex);
/* USER CODE END USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */
} }
@@ -413,7 +415,7 @@ void USART3_IRQHandler(void)
/* USER CODE END USART3_IRQn 0 */ /* USER CODE END USART3_IRQn 0 */
/* USER CODE BEGIN USART3_IRQn 1 */ /* USER CODE BEGIN USART3_IRQn 1 */
usart_irq_handler(&uart_half);
/* USER CODE END USART3_IRQn 1 */ /* USER CODE END USART3_IRQn 1 */
} }

View File

@@ -157,7 +157,7 @@ void MX_USART1_UART_Init(void)
/* USER CODE END USART1_Init 1 */ /* USER CODE END USART1_Init 1 */
USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
USART_InitStruct.BaudRate = 1000000; USART_InitStruct.BaudRate = 2000000;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.Parity = LL_USART_PARITY_NONE;
@@ -273,7 +273,7 @@ void MX_USART3_UART_Init(void)
/* USER CODE END USART3_Init 1 */ /* USER CODE END USART3_Init 1 */
USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
USART_InitStruct.BaudRate = 1000000; USART_InitStruct.BaudRate = 2000000;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1; USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE; USART_InitStruct.Parity = LL_USART_PARITY_NONE;

View File

@@ -4,5 +4,10 @@ add_subdirectory(nanopb)
add_subdirectory(ulog) add_subdirectory(ulog)
add_subdirectory(ina219) add_subdirectory(ina219)
add_library(EE24 STATIC "ee24/ee24.c") add_library(EE24 STATIC "ee24/ee24.c")
target_include_directories(EE24 PUBLIC "ee24") target_include_directories(EE24 PUBLIC "ee24")
add_library(TinyFrame STATIC "TinyFrame/TinyFrame.c")
target_include_directories(TinyFrame PUBLIC "./TinyFrame" "./TinyFrameConf")

1
lib/TinyFrame Submodule

Submodule lib/TinyFrame added at a29167a69f

View File

@@ -0,0 +1,81 @@
//
// TinyFrame configuration file.
//
// Rename to TF_Config.h
//
#ifndef TF_CONFIG_H
#define TF_CONFIG_H
#include <stdint.h>
#include <stdio.h> // used by the TF_Error() macro defined below
//#include <esp8266.h> // when using with esphttpd
//----------------------------- FRAME FORMAT ---------------------------------
// The format can be adjusted to fit your particular application needs
// If the connection is reliable, you can disable the SOF byte and checksums.
// That can save up to 9 bytes of overhead.
// ,-----+-----+-----+------+------------+- - - -+-------------,
// | SOF | ID | LEN | TYPE | HEAD_CKSUM | DATA | DATA_CKSUM |
// | 0-1 | 1-4 | 1-4 | 1-4 | 0-4 | ... | 0-4 | <- size (bytes)
// '-----+-----+-----+------+------------+- - - -+-------------'
// !!! BOTH PEERS MUST USE THE SAME SETTINGS !!!
// Adjust sizes as desired (1,2,4)
#define TF_ID_BYTES 2
#define TF_LEN_BYTES 2
#define TF_TYPE_BYTES 2
// Checksum type. Options:
// TF_CKSUM_NONE, TF_CKSUM_XOR, TF_CKSUM_CRC8, TF_CKSUM_CRC16, TF_CKSUM_CRC32
// TF_CKSUM_CUSTOM8, TF_CKSUM_CUSTOM16, TF_CKSUM_CUSTOM32
// Custom checksums require you to implement checksum functions (see TinyFrame.h)
#define TF_CKSUM_TYPE TF_CKSUM_CRC16
// Use a SOF byte to mark the start of a frame
#define TF_USE_SOF_BYTE 1
// Value of the SOF byte (if TF_USE_SOF_BYTE == 1)
#define TF_SOF_BYTE 0x01
//----------------------- PLATFORM COMPATIBILITY ----------------------------
// used for timeout tick counters - should be large enough for all used timeouts
typedef uint16_t TF_TICKS;
// used in loops iterating over listeners
typedef uint8_t TF_COUNT;
//----------------------------- PARAMETERS ----------------------------------
// Maximum received payload size (static buffer)
// Larger payloads will be rejected.
#define TF_MAX_PAYLOAD_RX 1024
// Size of the sending buffer. Larger payloads will be split to pieces and sent
// in multiple calls to the write function. This can be lowered to reduce RAM usage.
#define TF_SENDBUF_LEN 1024
// --- Listener counts - determine sizes of the static slot tables ---
// Frame ID listeners (wait for response / multi-part message)
#define TF_MAX_ID_LST 50
// Frame Type listeners (wait for frame with a specific first payload byte)
#define TF_MAX_TYPE_LST 5
// Generic listeners (fallback if no other listener catches it)
#define TF_MAX_GEN_LST 5
// Timeout for receiving & parsing a frame
// ticks = number of calls to TF_Tick()
#define TF_PARSER_TIMEOUT_TICKS 10
// Whether to use mutex - requires you to implement TF_ClaimTx() and TF_ReleaseTx()
#define TF_USE_MUTEX 1
// Error reporting function. To disable debug, change to empty define
#define TF_Error(format, ...) printf("[TF] " format "\n", ##__VA_ARGS__)
//------------------------- End of user config ------------------------------
#endif //TF_CONFIG_H

2
proto

Submodule proto updated: 2142d03586...37c0e46f59

View File

@@ -6,6 +6,7 @@ ${PROTO_SRC_DIR}/firmware.proto
${PROTO_SRC_DIR}/light.proto ${PROTO_SRC_DIR}/light.proto
${PROTO_SRC_DIR}/usb.proto ${PROTO_SRC_DIR}/usb.proto
${PROTO_SRC_DIR}/cls_device.proto ${PROTO_SRC_DIR}/cls_device.proto
${PROTO_SRC_DIR}/headlight.proto
) )
# Specify where you want to generate the python code # Specify where you want to generate the python code

View File

@@ -4,25 +4,26 @@ from google.protobuf.message import DecodeError
from serial.tools import list_ports from serial.tools import list_ports
from light_pb2 import GlobalBrightness, Theme, GlobalTheme, ThemeSettings from light_pb2 import GlobalBrightness, Theme, GlobalTheme, ThemeSettings
from headlight_pb2 import Settings, RequestSettings
from usb_pb2 import PackageType from usb_pb2 import PackageType
from vcp_driver import * from vcp_driver import *
if __name__ == "__main__": if __name__ == "__main__":
ser = setup_connection() ser = setup_connection()
# Create a message # Create a message
request = GlobalBrightness() #request = GlobalBrightness()
request.brightness = 100 #request.brightness = 100
# Serialize the request to a bytearray # Serialize the request to a bytearray
request_data = request.SerializeToString() #request_data = request.SerializeToString()
# Send the request # Send the request
send_package(PackageType.LIGHT_GLOBAL_BRIGHT, request_data, ser) #send_package(PackageType.LIGHT_GLOBAL_BRIGHT, request_data, ser)
request = GlobalTheme() #request = GlobalTheme()
request.theme = 1 #request.theme = 1
request_data = request.SerializeToString() #request_data = request.SerializeToString()
send_package(PackageType.LIGHT_GLOBAL_THEME, request_data, ser) #send_package(PackageType.LIGHT_GLOBAL_THEME, request_data, ser)
# request = ThemeSettings() # request = ThemeSettings()
@@ -33,3 +34,14 @@ if __name__ == "__main__":
# request.animation = 2 # request.animation = 2
# request_data = request.SerializeToString() # request_data = request.SerializeToString()
# send_package(PackageType.LIGHT_SETTING_THEME, request_data, ser) # send_package(PackageType.LIGHT_SETTING_THEME, request_data, ser)
request = Settings()
request.deviceId = 1
request.alpha = 0.001
request.on_threshold = 600
request.off_threshold = 400
request.on_time = 100
request.input_invert = False
request_data = request.SerializeToString()
send_package(PackageType.HEADLIGHT_SETTINGS, request_data, ser)

View File

@@ -30,7 +30,7 @@ def make_header(typeid: PackageType, length: int) -> bytearray:
struct_format = '<HHB' # '<' for little-endian, 'H' for uint16_t, 'B' for uint8_t struct_format = '<HHB' # '<' for little-endian, 'H' for uint16_t, 'B' for uint8_t
# Calculate the check byte as the sum of length and type # Calculate the check byte as the sum of length and type
typeidint = int(typeid) typeidint = int(typeid)
check = (length & 0xFF) + ((length >> 8) & 0xFF) + (typeidint & 0xFF) + ((typeidint >> 8) & 0xFF) check = ((length & 0xFF) + ((length >> 8) & 0xFF) + (typeidint & 0xFF) + ((typeidint >> 8) & 0xFF) ) & 0xff
packed_data = struct.pack(struct_format, length, typeid, check) packed_data = struct.pack(struct_format, length, typeid, check)
return packed_data return packed_data

View File

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

View File

@@ -3,21 +3,20 @@ import struct
from google.protobuf.message import DecodeError from google.protobuf.message import DecodeError
from serial.tools import list_ports from serial.tools import list_ports
from light_pb2 import RequestThemeSetting, Theme, ThemeSettings from headlight_pb2 import Settings, RequestSettings
from usb_pb2 import PackageType from usb_pb2 import PackageType
from vcp_driver import * from vcp_driver import *
if __name__ == "__main__": if __name__ == "__main__":
ser = setup_connection() ser = setup_connection()
request = RequestThemeSetting() request = RequestSettings()
request.deviceId = 0 request.deviceId = 1
request.theme = 1
print("send request") print("send request")
print(request) print(request)
request_data = request.SerializeToString() request_data = request.SerializeToString()
send_package(PackageType.LIGHT_REQUEST_THEME, request_data, ser) send_package(PackageType.HEADLIGHT_REQUEST_SETTINGS, request_data, ser)
print("wait for response") print("wait for response")
@@ -30,13 +29,13 @@ if __name__ == "__main__":
print(length, typeid, check) print(length, typeid, check)
# Check if the type is RESPONSE_DEVICE_LIST # Check if the type is RESPONSE_DEVICE_LIST
if typeid == PackageType.LIGHT_SETTING_THEME: if typeid == PackageType.HEADLIGHT_SETTINGS:
# Read the response data from the serial port # Read the response data from the serial port
response_data = ser.read(length) response_data = ser.read(length)
# Try to parse the data as a ResponseDeviceList message # Try to parse the data as a ResponseDeviceList message
try: try:
response = ThemeSettings.FromString(response_data) response = Settings.FromString(response_data)
except DecodeError: except DecodeError:
# If we get a DecodeError, it means the data we read is not a valid # If we get a DecodeError, it means the data we read is not a valid