Commit 63579378 authored by wangxuhui's avatar wangxuhui

Merge branch 'dev' into 'release'

Dev

See merge request !106
parents 67e2db5a 00e65d02
......@@ -748,6 +748,16 @@
<FileType>4</FileType>
<FilePath>..\..\..\..\Source\Application\Hysteresis_V10_239.lib</FilePath>
</File>
<File>
<FileName>Data_OilPressure.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\..\..\Source\Application\Data_OilPressure.c</FilePath>
</File>
<File>
<FileName>Data_OilPressure.h</FileName>
<FileType>5</FileType>
<FilePath>..\..\..\..\Source\Application\Data_OilPressure.h</FilePath>
</File>
</Files>
</Group>
<Group>
......
......@@ -64,11 +64,8 @@ typedef enum {
following is an example for different system frequencies */
//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
#if (HAS_BOOTLOADER == 1U)
const uint8_t user_opt_data[4] __attribute__((used)) __attribute__((section(".ARM.__AT_0x0000C4C0"))) =
#else
#if (HAS_BOOTLOADER != 1U)
const uint8_t user_opt_data[4] __attribute__((used)) __attribute__((section(".ARM.__AT_0x000000C0"))) =
#endif
{
/**
......@@ -132,7 +129,7 @@ const uint8_t user_opt_data[4] __attribute__((used)) __attribute__((section(".AR
// <0x72=> VLVDH = 4.06V/3.98V, VLVDL = 2.75V ( interrupt & reset mode )
// <i> Please setting the item for interrupt & reset mode
// </h>
0x72,
0x73,
/**
* @brief HOCO Control BYTE (FRQSEL)
......@@ -170,7 +167,7 @@ const uint8_t user_opt_data[4] __attribute__((used)) __attribute__((section(".AR
0xFF
};
#endif
//-------- <<< end of configuration section >>> ------------------
/** @} */ /* End of group Configuration_of_User_Option_Byte */
......
......@@ -7,7 +7,8 @@
Light_uint8_t LightADCompleteFlg = 0u;
Light_uint16_t LightR = 0u;
Light_uint16_t LightR_Status = 0;
Light_uint16_t LightR_Status_Count = 0u;
Light_uint16_t LightR_Status_NCount = 0u;
Light_uint16_t LightR_Status_DCount = 0u;
Light_uint16_t NtcDataCount;
Light_uint16_t NtcData[LIGHT_DATA_NUM] = {0};
typedef struct
......@@ -206,23 +207,41 @@ void BackLight_Get_curDuty(void)
NTCresistance = ADC_Read_Signal(ADC_CH_NTC_TEMP);
/* 计算温度值 */
NTCDegrees = NTC_Get_Degrees(NTCResBoard ,NTCDegreesBoard, sizeof(NTCResBoard)/sizeof(uint16_t), NTCresistance);
if ( NTCDegrees < 650 )
if ( NTCDegrees < 600 )
{
g_stBL.destFactor = 100;
}
else if ( NTCDegrees <= 850 )
{
wtemp = (850 - NTCDegrees);
wtemp *= 3;
wtemp += 400;
wtemp *= 1;
wtemp += 700;
wtemp /= 10;
g_stBL.destFactor = wtemp;
/* 85°为40%占空比,65°为100%占空比, 1°大概为3% */
/* 85°为70%占空比,60°为95%占空比, 1°大概为1% */
}
else
else if(NTCDegrees <= 880 )
{
g_stBL.destFactor = 40;
wtemp = (880 - NTCDegrees);
wtemp *= 16;
wtemp += 200;
wtemp /= 10;
g_stBL.destFactor = wtemp;
/* 88°为20%占空比,85°为70%占空比, 1°大概为16.6% */
}
else if(NTCDegrees <= 900 )
{
wtemp = (900 - NTCDegrees);
wtemp *= 5;
wtemp += 100;
wtemp /= 10;
g_stBL.destFactor = wtemp;
/* 90°为10%占空比,88°为20%占空比, 1°大概为5% */
}
else
{
g_stBL.destFactor = 10;
}
if ( (g_stBL.curFactor < g_stBL.destFactor) && (NTCDegrees < 750) )
{
......@@ -309,17 +328,17 @@ void BackLight_Get_curDuty(void)
g_stBL.u16TftdestDuty = 100;
}
/* 如果当前占空比小于100,那还是按照上次结果显示 */
if(g_stBL.u16TftcurDuty < 100)
{
// /* 如果当前占空比小于100,那还是按照上次结果显示 */
// if(g_stBL.u16TftcurDuty < 100)
// {
// g_stBL.u16TftcurDuty = g_stBL.u16TftdestDuty;
// }
// /* 逐步逼近目标占空比 */
// else
// {
// U16_Data_Gradient((uint16_t *)&g_stBL.u16TftcurDuty, g_stBL.u16TftdestDuty, 1u, (uint16_t *)&g_stBL.u16DialDampingTimer, 1u);
// }
g_stBL.u16TftcurDuty = g_stBL.u16TftdestDuty;
}
/* 逐步逼近目标占空比 */
else
{
U16_Data_Gradient((uint16_t *)&g_stBL.u16TftcurDuty, g_stBL.u16TftdestDuty, 1u, (uint16_t *)&g_stBL.u16DialDampingTimer, 1u);
}
}
#if 0
......@@ -477,43 +496,47 @@ void BackLight_Process(void)
if(LightR <= 200)
{
LightR_Status_Count++;
if(LightR_Status_Count>=150)
LightR_Status_NCount++;
if(LightR_Status_NCount>=150)
{
LightR_Status_Count = 0;
LightR_Status_NCount = 150;
LightR_Status_DCount = 0;
LightR_Status = 0;
g_u8Display_Mode = ModeNIGHT;
}
}
else if(LightR > 200)
{
LightR_Status_Count++;
if(LightR_Status_Count>=150)
LightR_Status_DCount++;
if(LightR_Status_DCount>=150)
{
LightR_Status_Count = 0;
LightR_Status_DCount = 150;
LightR_Status_NCount = 0;
LightR_Status = 1;
g_u8Display_Mode = ModeDAY;
}
}
/* 系统的意思是要当前背光等级基础上的80%和20%,不是直接设置背光 */
/*if(LightR_Status == 0)
{
BackLight_Set_Lvl(Light_Lvl_1);
BackLight_Set_Lvl(Light_Lvl_1);
}
else
{
BackLight_Set_Lvl(Light_Lvl_4);
BackLight_Set_Lvl(Light_Lvl_4);
}*/
if(LightR_Status == 0)
{
g_u8Display_Mode = ModeNIGHT;
}
else if(LightR_Status == 1)
{
g_u8Display_Mode = ModeDAY;
}
// if(LightR_Status == 0)
// {
// g_u8Display_Mode = ModeNIGHT;
// }
// else if(LightR_Status == 1)
// {
// g_u8Display_Mode = ModeDAY;
// }
}
}
/* 根据感光判断当前应该设置什么背光等级 */
else if(Menu_Item_Select_Get(MENU_ITEM_BACKLIGHT_AUTO))
if(Menu_Item_Select_Get(MENU_ITEM_BACKLIGHT_AUTO))
{
if(Backlight_GetPwmLevel() == 1U)
{
......@@ -566,26 +589,26 @@ void BackLight_Process(void)
}
/* 数据处理,包括NTC功能 */
BackLight_Get_curDuty();
if(Menu_Item_Select_Get(MENU_ITEM_SELECT_AUTO))
{
uint16_t u16TftPwmBackShow = g_stBL.u16TftcurDuty ;
if(LightR_Status == 0)
{
u16TftPwmBackShow *= 20U;
u16TftPwmBackShow /= 100U;
}
else
{
u16TftPwmBackShow *= 80U;
u16TftPwmBackShow /= 100U;
}
TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, u16TftPwmBackShow);
}
else
{
TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, g_stBL.u16TftcurDuty);
}
TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, g_stBL.u16TftcurDuty);
// if(Menu_Item_Select_Get(MENU_ITEM_SELECT_AUTO))
// {
// uint16_t u16TftPwmBackShow = g_stBL.u16TftcurDuty ;
// if(LightR_Status == 0)
// {
// u16TftPwmBackShow *= 20U;
// u16TftPwmBackShow /= 100U;
// }
// else
// {
// u16TftPwmBackShow *= 80U;
// u16TftPwmBackShow /= 100U;
// }
// TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, u16TftPwmBackShow);
// }
// else
// {
// TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, g_stBL.u16TftcurDuty);
// }
}
else
{
......
......@@ -8,6 +8,8 @@ uint8_t GetPhoneBookVaild = 0;
uint8_t TextInit = 0;
uint8_t SetUUIDTimes = 0;
uint16_t LastPhoneBookTotalCount = 0;
uint8_t LastCurIgnSt = POWER_STATE_IGN_OFF;
uint8_t IOState = 0;
_PICID_Struct PicObj;
_QRCODE_RECT QRCode_Rect;
const uint8_t HJBlueToothName[9]= {"HJ750"};
......@@ -47,6 +49,14 @@ uint8_t MCUVersionASCLLList[26] =
void TextService(void);
void BlueTooth_IGOFF_INIT(void)
{
GetBlueToothVaild =0;
OTA_Update_Flag = 0;
SetBluetoothCloseCount = 0;
SetBluetoothTurnXX(0);
SetUpdateCtrl(0,QRCode_Rect);
}
void BlueToothService(void)
{
if(SYS_OPR_STAT_IGN_ON)
......@@ -61,18 +71,30 @@ void BlueToothService(void)
}
else
{
SetBluetoothCloseCount++;
if(GetBlueToothVaild == 1)
{
if(SetBluetoothCloseCount < 30)
{
SetBluetoothTurnXX(0);
}
else
{
GetBlueToothVaild = 0;
SetBluetoothCloseCount = 0;
}
SetBluetoothCloseCount++;
// if(SetBluetoothCloseCount < 30)
// {
// SetBluetoothTurnXX(0);
// }
// else
// {
// GetBlueToothVaild = 0;
// SetBluetoothCloseCount = 0;
// }
// SetBluetoothCloseCount++;
SetBluetoothTurnXX(0);
GetBlueToothVaild = 0;
}
if(SetBluetoothCloseCount >= 5)
{
SetBluetoothTurnXX(0);
SetBluetoothCloseCount = 0;
}
else
{
;
}
}
......@@ -146,10 +168,22 @@ void BlueToothService(void)
}
else
{
GetBlueToothVaild =0;
OTA_Update_Flag = 0;
SetBluetoothTurnXX(0);
SetUpdateCtrl(0,QRCode_Rect);
;
}
if (LastCurIgnSt != System_FUN_KL15_Status_Get())
{
if (SYS_OPR_STAT_IGN_ON)
{
IOState = IOState & 0x02;
PackedTransfer_EasyNavigation(IOState);
}
else
{
SetPagePic(GRAPHICS_PAGE_0, Pic_0001_0_0);
IOState = IOState | 0x01;
PackedTransfer_EasyNavigation(IOState);
}
LastCurIgnSt = System_FUN_KL15_Status_Get();
}
}
......@@ -379,7 +413,7 @@ uint8_t Get_UUID_UDSStatus(void)
{
for(uint8_t i=0;i<21;i++)
{
if(UUIDConfigBuf[i]!=0xFF)
if(UUIDConfigBuf[i]!=0xFF)//UUIDConfigBuf[i] < 10
{
return 1;
}
......
......@@ -23,8 +23,10 @@ typedef struct {
uint16_t Vaild;
}TEXT_STRUCT;
#define INFORMATION_VERSION_DATE "20241015"
#define INFORMATION_VERSION_DATE "20241111"
#define SW_EXTERNAL_VERSION "100"
#define POWER_STATE_IGN_OFF 0u
#define POWER_STATE_IGN_ON 1u
static const uint8_t DATA_Version[8] = {INFORMATION_VERSION_DATE};
static const uint8_t SW_Version[3] = {SW_EXTERNAL_VERSION};
......@@ -41,6 +43,7 @@ static const uint8_t SW_Version[3] = {SW_EXTERNAL_VERSION};
extern void BlueToothService(void);
extern uint8_t Get_Talking_PhoneBookValid(void);
extern uint8_t Get_UUID_UDSStatus(void);
extern void BlueTooth_IGOFF_INIT(void);
extern _PICID_Struct PicObj;
extern _QRCODE_RECT QRCode_Rect;
extern uint8_t PhoneNumber[40];
......@@ -52,5 +55,7 @@ extern uint8_t InformationMCUVersion[26];
extern uint8_t TextFaultCodeNum[10];
extern uint8_t UUIDDisplay[42];
extern TEXT_STRUCT TextPara[];
extern uint8_t UUIDConfigBuf[21];
extern uint8_t IOState;
#endif
\ No newline at end of file
......@@ -3,7 +3,7 @@
#include "Hysteresis.h"
#define FAST_TIME 15 //20*20 400ms变化一格
#define NORMAL_TIME 500 //500*20 10s变化一格
#define Disconnected_TIME 25 //掉线时间
#define Disconnected_TIME 1 //掉线时间
#pragma ghs section bss = ".myNonInitArea"
//_Data_Cng Data_Cng_Percent;
//_Data_Cng Data_Cng_Pressure;
......@@ -19,6 +19,8 @@ DataCoolantTempSamplerStruct DataResCoolantTempSampler ;
uint8_t u8SelfCheckTime_Finish;
#define SelfCheckTime 60
uint16_t TEMP_SPEED;
uint8_t Lost_Flag;
uint16_t Lost_Time;
uint16_t time_temp;
uint16_t time_power_on = 0;
uint16_t time_lost = 0;
......@@ -114,6 +116,7 @@ void TEMP_KL30_Init ( void )
DataCoolantTemp_Dis.u8_CurSeg = 0;
DataCoolantTemp.TEMPSetp = 0;
DataCoolantTemp.u8_ResStatus = 0;
DataCoolantTemp.u8_Last_ResStatus = 0;
TEMP_SPEED = 0;
time_power_on = 0;
time_lost = 0;
......@@ -133,6 +136,7 @@ void TEMP_KL15_Init ( void )
DataCoolantTemp.u16Res_ADValue = 0;
DataCoolantTemp.u8Res_ADValid = 0;
DataCoolantTemp.u8_ResStatus = 0;
DataCoolantTemp.u8_Last_ResStatus = 0;
DataCoolantTemp_Dis.u8_CurSeg = 0;
DataResCoolantTempSampler.Cnt = 0;
DataCoolantTemp.TEMPMode = 0;
......@@ -147,7 +151,7 @@ void Data_Coolant_Temp_Processing_Service ( void )
uint16_t Coolant_Temperature;
uint32_t Temp;
uint8_t i;
Coolant_Temperature = Get_CAN_CH0_ID_101_Sig_ECU_Engine_Temperature();
//can
if (SYS_OPR_STAT_IGN_ON )
......@@ -175,7 +179,7 @@ void Data_Coolant_Temp_Processing_Service ( void )
else if(Coolant_Temperature <= 2430)
{
Coolant_Temperature =0;
DataCoolantTemp.u8Can_Valid = 0;
DataCoolantTemp.u8Can_Valid = 1;
}
else
{
......@@ -249,7 +253,7 @@ void Data_Coolant_Temp_Processing_Service ( void )
}
else
{
DataCoolantTemp.u8_ResStatus = 3;//当前状态为开路
DataCoolantTemp.u8_Last_ResStatus = 3;//当前状态为开路
DataCoolantTemp.u8Res_Valid = 0 ;
DataCoolantTemp.u16Res_Actual = 0 ;
DataResCoolantTempSampler.ResOpen_InActTimer = 0;
......@@ -274,7 +278,7 @@ void Data_Coolant_Temp_Processing_Service ( void )
}
if(DataCoolantTemp.u8Can_Valid || DataCoolantTemp.u8Res_Valid )
{
DataCoolantTemp.u8_ResStatus = 1;//当前状态正常
DataCoolantTemp.u8_Last_ResStatus = 1;//当前状态正常
}
if (DataCoolantTemp.u8Can_Valid == 1)
{
......@@ -285,20 +289,21 @@ void Data_Coolant_Temp_Processing_Service ( void )
DataCoolantTemp.Temp_Value = DataCoolantTemp.u16Res_Actual;
if(DataCoolantTemp.u16Res_ADValue < 40)
{
DataCoolantTemp.u8_ResStatus = 2;//当前状态为短路
DataCoolantTemp.u8_Last_ResStatus = 2;//当前状态为短路
DataCoolantTemp.TEMPMode = 2;
}
}
else
{
if(DataCoolantTemp.u8_ResStatus != 3)
if(DataCoolantTemp.u8_Last_ResStatus != 3)
{
DataCoolantTemp.u8_ResStatus = 0;
DataCoolantTemp.u8_Last_ResStatus = 0;
}
DataCoolantTemp.Temp_Value = 0;
}
TEMP_Gauges_Cal();
time_power_on++;
TEMP_SPEED = NORMAL_TIME;
if(time_power_on >= 100)//上电延时获取数据
{
time_power_on = 100;
......@@ -306,18 +311,28 @@ void Data_Coolant_Temp_Processing_Service ( void )
if(DataCoolantTemp.u8Can_Valid||DataCoolantTemp.u8Res_Valid)
{
time_lost = 0;
if(DataCoolantTemp.TEMPMode == 3)//掉线
if(DataCoolantTemp.TEMPMode ==3)//掉线
{
TEMP_SPEED = FAST_TIME;
if(DataCoolantTemp.u8_ResStatus != 3)
{
Lost_Flag = 1;
time_temp = 0;
}
}
else if(DataCoolantTemp.TEMPMode == 0)//自检
else if (DataCoolantTemp.TEMPMode == 2)
{
DataCoolantTemp_Dis.u8_CurSeg = DataCoolantTemp.TEMPSetp;
if(DataCoolantTemp.u8_ResStatus != 2)
{
Lost_Flag = 1;
time_temp = 0;
}
}
if(DataCoolantTemp.TEMPMode == 3)
else if(DataCoolantTemp.TEMPMode == 0)//自检
{
DataCoolantTemp.TEMP_Fastime = 100;
DataCoolantTemp_Dis.u8_CurSeg = DataCoolantTemp.TEMPSetp;
}
DataCoolantTemp.TEMPMode = 1;
}
else
......@@ -329,28 +344,42 @@ void Data_Coolant_Temp_Processing_Service ( void )
if(DataCoolantTemp.TEMPMode != 3)
{
DataCoolantTemp.TEMPMode = 3;
TEMP_SPEED = NORMAL_TIME;
time_temp = 0;
Lost_Flag = 1;
}
DataCoolantTemp.TEMPSetp = 0;
}
}
}
time_temp ++;
if(DataCoolantTemp.TEMP_Fastime>0)
// if(DataCoolantTemp.u8_ResStatus==0)
// {
// DataCoolantTemp.u8_ResStatus = DataCoolantTemp.u8_Last_ResStatus;
// }
if(DataCoolantTemp.u8_ResStatus != DataCoolantTemp.u8_Last_ResStatus)
{
DataCoolantTemp.TEMP_Fastime--;
}
if(DataCoolantTemp.TEMP_Fastime==0)
{
if(DataCoolantTemp.TEMPSetp == DataCoolantTemp_Dis.u8_CurSeg)
Lost_Time++;
if(Lost_Time > 150)
{
TEMP_SPEED = NORMAL_TIME;
time_temp = 0;
}
DataCoolantTemp.u8_ResStatus = DataCoolantTemp.u8_Last_ResStatus;
Lost_Time = 0;
Lost_Flag = 0;
DataCoolantTemp_Dis.u8_CurSeg = DataCoolantTemp.TEMPSetp;
}
}
// if(Lost_Flag)
// {
// Lost_Time++;
// if(Lost_Time > 150)
// {
// DataCoolantTemp.u8_ResStatus = DataCoolantTemp.u8_Last_ResStatus;
// Lost_Time = 0;
// Lost_Flag = 0;
// DataCoolantTemp_Dis.u8_CurSeg = DataCoolantTemp.TEMPSetp;
// }
// }
}
time_temp ++;
if(time_temp>=TEMP_SPEED)
{
......
......@@ -31,7 +31,8 @@ typedef struct
uint8_t TEMPSetp;
uint8_t TEMPMode;
uint16_t TEMP_Fastime ;
uint8_t u8_ResStatus //
uint8_t u8_ResStatus;
uint8_t u8_Last_ResStatus;
}DataCoolantTempStruct; //水温数据结构
......
#include "Data_OilPressure.h"
#include "Components.h"
#define OIL_DATA_TIME 25u /*这里填写多长时间采集一个数据,单位ms*/
#define OIL_DATA_NUM 20u /*机油压力电阻采集数据总数 最大255*/
#define OIL_CAL_START 5u /*数据排序后取中间部分计算平均:起始*/
#define OIL_CAL_END 15u /*数据排序后取中间部分计算平均:结束*/
uint16_t g_u16OilData[OIL_DATA_NUM];
uint8_t g_u8OilDataCount = 0u;
// uint8_t g_u8OILStateInitFlag = 0u;
uint16_t OilPressureR = 0u; /*滤波后的机油压力电阻,精度0.1*/
uint8_t g_u8OilADCompleteFlg = 0u;
void Oil_Pressure_KL30_Init(void)
{
// g_u8OILStateInitFlag = 1u;
g_u8OilADCompleteFlg = 0u;
}
void Oil_Pressure_KL15_Init(void)
{
// g_u8OILStateInitFlag = 1u;
g_u8OilADCompleteFlg = 0u;
}
void Oil_R_Cal(uint8_t deltaTime)
{
uint16_t OilPressureRes = 0;
uint8_t i, j;
uint32_t temp32;
static uint16_t timeCount = 0;
// if(g_u8OILStateInitFlag)
// {
// OilPressureR = ADC_Read_Signal(ADC_CH_OIL_PRESSURE_R);
// }
if(AMT630H_Animation_Finish_Flage() == 1)
{
if (timeCount >= OIL_DATA_TIME)
{
timeCount = 0;
if (g_u8OilDataCount < OIL_DATA_NUM)
{
/*获取机油压力电阻*/
OilPressureRes = ADC_Read_Signal(ADC_CH_OIL_PRESSURE_R);
/*四舍五入*/
if (OilPressureRes < 60000) //针对此项目机油压力采集电路补偿后的阻值
{
if (OilPressureRes % 10 >= 5)
{
OilPressureRes += 5;
}
}
else
{
OilPressureRes = 0xFFFF;
}
/*由小到大插入数据*/
for (i = 0; i < g_u8OilDataCount; i++)
{
if (OilPressureRes < g_u16OilData[i])
{
break;
}
}
for (j = g_u8OilDataCount; j > i; j--)
{
g_u16OilData[j] = g_u16OilData[j - 1];
}
g_u16OilData[i] = OilPressureRes;
g_u8OilDataCount++;
}
else
{
/*一组数据采集完毕,取中间部分计算平均值*/
temp32 = 0;
for (i = OIL_CAL_START; i < OIL_CAL_END; i++)
{
temp32 += g_u16OilData[i];
}
OilPressureR = temp32 / (OIL_CAL_END - OIL_CAL_START);
g_u8OilDataCount = 0;
g_u8OilADCompleteFlg = 1;
}
}
timeCount += deltaTime;
}
}
uint8_t Get_OilPressureStauts(void)
{
if(OilPressureR < 59500)
{
return 1U;
}
else
{
return 0u;
}
}
\ No newline at end of file
#ifndef DATA_OILPRESSURE_H
#define DATA_OILPRESSURE_H
#include "stdint.h"
void Oil_Pressure_KL30_Init(void);
void Oil_Pressure_KL15_Init(void);
void Oil_R_Cal(uint8_t deltaTime);
uint8_t Get_OilPressureStauts(void);
#endif
\ No newline at end of file
This diff is collapsed.
......@@ -6,55 +6,40 @@
#include <string.h>
/*故障码类型A can报文轮询发送方式*/
#define FaultCodeType_A 1
#define FaultCodeType FaultCodeType_A
#define MaxFaultCode 40
#define MaxFaultCode 72
#define FaultCodeCount 5000
typedef enum
{
DTC1,
DTC2,
DTC3,
NUM_FAULT_TYPES,
} FaultCodeType_Num;
typedef uint32_t (*FaultCodeCallback)(void); /* 故障码回调函数 */
typedef uint16_t (*FaultCodeNumback)(void); /* 故障码个数回调函数 */
typedef uint16_t (*FaultCodeValidback)(void); /* 故障码有效回调函数 */
typedef struct
{
uint32_t u16FaultCode; /* 故障码 */
uint16_t u16FaultCodeCount; /* 故障码总数 */
} _st_FaultCode;
#define DISP_TIMER 500
typedef struct
typedef uint32_t(*Get_FaultCode)(void);
typedef uint8_t(*Get_FaultCodeNum)(void);
typedef struct __attribute__((aligned(4)))
{
FaultCodeCallback callbacks[NUM_FAULT_TYPES];
FaultCodeNumback FaultCodeNumCbk;
FaultCodeValidback FaultCodeVaildCbk;
} _st_Init;
uint32_t *code_list; //故障码列表
uint8_t hade; //列表头
uint8_t tail; //列表尾
uint8_t code_num; //获取的故障码数量
uint8_t len; //故障码列表最大长度
uint8_t disp; //故障码显示下标
uint16_t TimeCount; //故障码循环显示用的定时器
uint16_t disp_timer; //故障码显示的超时时间,超时显示下一个
Get_FaultCode Get_FaultCode1_cbk; //获取故障码的回调函数1
Get_FaultCode Get_FaultCode2_cbk; //获取故障码的回调函数2
Get_FaultCodeNum Get_FaultCodeNum_cbk; //获取故障码数量的回调函数
}FaultCodeList_t;
uint8_t List_Init(FaultCodeList_t *CodeList, uint32_t Arr[], uint8_t Len);
extern void FaultCode_Service(uint16_t Cycle);
extern void FaultCode_Init(void);
void FaultCode_Init(void);
void FaultCode_Servers(void);
extern uint32_t Get_Current_FaultCode(void);
extern uint8_t Get_Current_Hight_FaultCode(void);
extern uint8_t Get_Current_Hight_FaultCode(void);
extern uint8_t Get_FaultCode_Valid(void);
extern uint8_t Get_Current_Mid_FaultCode(void);
// extern uint8_t Get_FaultCode_Valid(void);
#endif
\ No newline at end of file
......@@ -48,76 +48,6 @@ static uint16_t AMT630H_Animation_DispPic = 0;
static uint16_t AMT630H_Animation_RefreshTime = 0;
static uint32_t AMT630H_Animation_RefreshTime_default = 0;
static const uint16_t BootAnimationList[AMT630H_ANIMATION_PIC_NUM] = {
Pic_1055_0_0,
Pic_1056_0_0,
Pic_1057_0_0,
Pic_1058_0_0,
Pic_1059_0_0,
Pic_1060_0_0,
Pic_1061_0_0,
Pic_1062_0_0,
Pic_1063_0_0,
Pic_1064_0_0,
Pic_1065_0_0,
Pic_1066_0_0,
Pic_1067_0_0,
Pic_1068_0_0,
Pic_1069_0_0,
Pic_1070_0_0,
Pic_1071_0_0,
Pic_1072_0_0,
Pic_1073_0_0,
Pic_1074_0_0,
Pic_1075_0_0,
Pic_1076_0_0,
Pic_1077_0_0,
Pic_1078_0_0,
Pic_1079_0_0,
Pic_1080_0_0,
Pic_1081_0_0,
Pic_1082_0_0,
Pic_1083_0_0,
Pic_1084_0_0,
Pic_1085_0_0,
Pic_1086_0_0,
Pic_1087_0_0,
Pic_1088_0_0,
Pic_1089_0_0,
Pic_1090_0_0,
Pic_1091_0_0,
Pic_1092_0_0,
Pic_1093_0_0,
Pic_1094_0_0,
Pic_1095_0_0,
Pic_1096_0_0,
Pic_1097_0_0,
Pic_1098_0_0,
Pic_1099_0_0,
Pic_1100_0_0,
Pic_1101_0_0,
Pic_1102_0_0,
Pic_1103_0_0,
Pic_1104_0_0,
Pic_1105_0_0,
Pic_1106_0_0,
Pic_1107_0_0,
Pic_1108_0_0,
Pic_1109_0_0,
Pic_1110_0_0,
Pic_1111_0_0,
Pic_1112_0_0,
Pic_1113_0_0,
Pic_1114_0_0,
Pic_1115_0_0,
Pic_1116_0_0,
Pic_1117_0_0,
Pic_1118_0_0,
Pic_1119_0_0,
Pic_1120_0_0,
Pic_1121_0_0,
Pic_1122_0_0,
Pic_1123_0_0,
Pic_1124_0_0,
Pic_1125_0_0,
Pic_1125_0_0,
Pic_1125_0_0,
......@@ -125,7 +55,76 @@ static const uint16_t BootAnimationList[AMT630H_ANIMATION_PIC_NUM] = {
Pic_1125_0_0,
Pic_1125_0_0,
Pic_1125_0_0,
Pic_1124_0_0,
Pic_1123_0_0,
Pic_1122_0_0,
Pic_1121_0_0,
Pic_1120_0_0,
Pic_1119_0_0,
Pic_1118_0_0,
Pic_1117_0_0,
Pic_1116_0_0,
Pic_1115_0_0,
Pic_1114_0_0,
Pic_1113_0_0,
Pic_1112_0_0,
Pic_1111_0_0,
Pic_1110_0_0,
Pic_1109_0_0,
Pic_1108_0_0,
Pic_1107_0_0,
Pic_1106_0_0,
Pic_1105_0_0,
Pic_1104_0_0,
Pic_1103_0_0,
Pic_1102_0_0,
Pic_1101_0_0,
Pic_1100_0_0,
Pic_1099_0_0,
Pic_1098_0_0,
Pic_1097_0_0,
Pic_1096_0_0,
Pic_1095_0_0,
Pic_1094_0_0,
Pic_1093_0_0,
Pic_1092_0_0,
Pic_1091_0_0,
Pic_1090_0_0,
Pic_1089_0_0,
Pic_1088_0_0,
Pic_1087_0_0,
Pic_1086_0_0,
Pic_1085_0_0,
Pic_1084_0_0,
Pic_1083_0_0,
Pic_1082_0_0,
Pic_1081_0_0,
Pic_1080_0_0,
Pic_1079_0_0,
Pic_1078_0_0,
Pic_1077_0_0,
Pic_1076_0_0,
Pic_1075_0_0,
Pic_1074_0_0,
Pic_1073_0_0,
Pic_1072_0_0,
Pic_1071_0_0,
Pic_1070_0_0,
Pic_1069_0_0,
Pic_1068_0_0,
Pic_1067_0_0,
Pic_1066_0_0,
Pic_1065_0_0,
Pic_1064_0_0,
Pic_1063_0_0,
Pic_1062_0_0,
Pic_1061_0_0,
Pic_1060_0_0,
Pic_1059_0_0,
Pic_1058_0_0,
Pic_1057_0_0,
Pic_1056_0_0,
Pic_1055_0_0,
};
void AMT630H_Animation_PlayProc(uint16_t PicIndex)
{
......@@ -133,6 +132,16 @@ void AMT630H_Animation_PlayProc(uint16_t PicIndex)
uint32_t tmpLen = 0;
SetPageGuid(GRAPHICS_PAGE_0, 1, 0, 0);
SetPageBackground(GRAPHICS_PAGE_0, PicIndex);
// if (AMT630H_Animation_DispPic == (AMT630H_ANIMATION_PIC_NUM - 30))
// {
// IOState = IOState | 0x02;
// PackedTransfer_EasyNavigation(IOState);
// }
// else
// {
// IOState = IOState & 0x01;
// PackedTransfer_EasyNavigation(IOState);
// }
PackedTransfer_Page();
// PackedTransfer_GetSwVer();
......@@ -413,7 +422,7 @@ void AMT630H_Main(void)
{
AMT630H_Animation_RefreshTime = 0;
AMT630H_Animation_PlayProc(BootAnimationList[AMT630H_Animation_DispPic]);
AMT630H_Animation_DispPic--;
AMT630H_Animation_DispPic++;
if(AMT630H_Animation_DispPic >= AMT630H_ANIMATION_PIC_NUM)
{
AMT630H_Animation_Finish = 1;
......@@ -425,12 +434,25 @@ void AMT630H_Main(void)
}
else
{
AMT630H_Animation_RefreshTime = 0;
PicObj.qr_logo_id = 0;//Pic_0234 小数字9 EA
PicObj.main_pic_id = Pic_0001; //转速红12
PicObj.update_pic_id = Pic_0233;//小数字8 E9
PicObj.second_menu = 0;
PicObj.navigation_task_id = Pic_0411;//红色小e 19B
if(g_u8Display_Mode == ModeDAY)
{
PicObj.qr_pic_id = Pic_0494;//请使用猎变APP扫码连接
}
else
{
PicObj.qr_pic_id = Pic_1031;//请使用猎变APP扫码连接
}
if(AMT630H_RefreshTime >= AMT630H_REFRESH_TIME)
{
AMT630H_RefreshTime = 0;
//AMT630H_GUI_DisplayProc();
SetPageGuid(GRAPHICS_PAGE_0, 1, 0, 0);
PackedTransfer_DisplayPhoneMirrorQRcode(0, PicObj);
SetPagePic(GRAPHICS_PAGE_0, Pic_0001_0_0);
PackedTransfer_Page();
}
......@@ -452,7 +474,7 @@ unsigned char AMT630H_isInitFinish(void)
void AMT630H_Animation_IGON(void)
{
AMT630H_Animation_Finish = 0;
AMT630H_Animation_DispPic = 76;
AMT630H_Animation_DispPic = 0;
}
unsigned char AMT630H_Animation_Finish_Flage(void)
{
......
......@@ -142,7 +142,14 @@ static const uint16_t PicIndexData[] = {
Pic_1094, 1040, 0, 0, Pic_1095, 1040, 0, 0, Pic_1096, 1040, 0, 0, Pic_1097, 1040, 0, 0, Pic_1098, 1040, 0, 0, Pic_1099, 1040, 0, 0, Pic_1100, 1040, 0, 0, Pic_1101, 1040, 0, 0, Pic_1102, 1040, 0, 0, Pic_1103, 1040, 0, 0,
Pic_1104, 1040, 0, 0, Pic_1105, 1040, 0, 0, Pic_1106, 1040, 0, 0, Pic_1107, 1040, 0, 0, Pic_1108, 1040, 0, 0, Pic_1109, 1040, 0, 0, Pic_1110, 1040, 0, 0, Pic_1111, 1040, 0, 0, Pic_1112, 1040, 0, 0, Pic_1113, 1040, 0, 0,
Pic_1114, 1040, 0, 0, Pic_1115, 1040, 0, 0, Pic_1116, 1040, 0, 0, Pic_1117, 1040, 0, 0, Pic_1118, 1040, 0, 0, Pic_1119, 1040, 0, 0, Pic_1120, 1040, 0, 0, Pic_1121, 1040, 0, 0, Pic_1122, 1040, 0, 0, Pic_1123, 1040, 0, 0,
Pic_1124, 1040, 0, 0, Pic_1125, 1040, 0, 0,
Pic_1124, 1040, 0, 0, Pic_1125, 1040, 0, 0, Pic_1126, 13, 486, 251, Pic_1126, 13, 501, 251, Pic_1126, 13, 516, 251, Pic_1126, 13, 531, 251, Pic_1126, 13, 546, 251, Pic_1126, 13, 561, 251, Pic_1126, 13, 576, 251, Pic_1126, 13, 591, 251,
Pic_1126, 13, 606, 251, Pic_1126, 13, 621, 251, Pic_1126, 13, 636, 251, Pic_1126, 13, 651, 251, Pic_1126, 13, 666, 251, Pic_1126, 13, 681, 251, Pic_1126, 13, 696, 251, Pic_1126, 13, 711, 251, Pic_1126, 13, 726, 251, Pic_1126, 13, 741, 251,
Pic_1126, 13, 756, 251, Pic_1126, 13, 771, 251, Pic_1126, 13, 786, 251, Pic_1127, 12, 487, 252, Pic_1128, 13, 486, 251, Pic_1129, 14, 485, 251, Pic_1130, 15, 485, 252, Pic_1131, 14, 485, 252, Pic_1132, 13, 486, 251, Pic_1133, 13, 486, 252,
Pic_1134, 13, 486, 251, Pic_1135, 13, 486, 251, Pic_1136, 8, 489, 263, Pic_1137, 52, 632, 551, Pic_1138, 133, 786, 561, Pic_1139, 13, 486, 251, Pic_1139, 13, 501, 251, Pic_1139, 13, 516, 251, Pic_1139, 13, 531, 251, Pic_1139, 13, 546, 251,
Pic_1139, 13, 561, 251, Pic_1139, 13, 576, 251, Pic_1139, 13, 591, 251, Pic_1139, 13, 606, 251, Pic_1139, 13, 621, 251, Pic_1139, 13, 636, 251, Pic_1139, 13, 651, 251, Pic_1139, 13, 666, 251, Pic_1139, 13, 681, 251, Pic_1139, 13, 696, 251,
Pic_1139, 13, 711, 251, Pic_1139, 13, 726, 251, Pic_1139, 13, 741, 251, Pic_1139, 13, 756, 251, Pic_1139, 13, 771, 251, Pic_1139, 13, 786, 251, Pic_1140, 12, 487, 252, Pic_1141, 13, 486, 251, Pic_1142, 14, 485, 251, Pic_1143, 15, 485, 252,
Pic_1144, 14, 485, 252, Pic_1145, 13, 486, 251, Pic_1146, 13, 486, 252, Pic_1147, 13, 486, 251, Pic_1148, 13, 486, 251, Pic_1149, 8, 489, 263, Pic_1150, 71, 576, 287, Pic_0040, 12, 591, 289, Pic_0040, 12, 619, 289, Pic_1151, 85, 569, 287,
Pic_0040, 12, 584, 289, Pic_0040, 12, 626, 289, Pic_1152, 71, 576, 287, Pic_0225, 12, 591, 289, Pic_0225, 12, 619, 289, Pic_1153, 85, 569, 287, Pic_0225, 12, 584, 289, Pic_0225, 12, 626, 289,
};
#define PicIndexData_LEN 14888
//uint32_t PicIndexDataLEN = 0;
......
#ifndef PICBIN_H
#define PICBIN_H
/* Flash Bin Version:20241014 2024-10-14 11:24:42 Compression ratio:70.00% */
/* Flash Bin Version:20241029 2024-10-29 15:58:39 Compression ratio:70.00% */
#define Pic_0001 1
#define Pic_0002 2
#define Pic_0003 3
......@@ -1127,6 +1127,34 @@
#define Pic_1123 1123
#define Pic_1124 1124
#define Pic_1125 1125
#define Pic_1126 1126
#define Pic_1127 1127
#define Pic_1128 1128
#define Pic_1129 1129
#define Pic_1130 1130
#define Pic_1131 1131
#define Pic_1132 1132
#define Pic_1133 1133
#define Pic_1134 1134
#define Pic_1135 1135
#define Pic_1136 1136
#define Pic_1137 1137
#define Pic_1138 1138
#define Pic_1139 1139
#define Pic_1140 1140
#define Pic_1141 1141
#define Pic_1142 1142
#define Pic_1143 1143
#define Pic_1144 1144
#define Pic_1145 1145
#define Pic_1146 1146
#define Pic_1147 1147
#define Pic_1148 1148
#define Pic_1149 1149
#define Pic_1150 1150
#define Pic_1151 1151
#define Pic_1152 1152
#define Pic_1153 1153
enum {
Pic_0001_0_0 = 0,
......@@ -2552,10 +2580,85 @@ enum {
enum {
Pic_1124_0_0 = 1400,
Pic_1125_0_0,
Pic_1126_486_251,
Pic_1126_501_251,
Pic_1126_516_251,
Pic_1126_531_251,
Pic_1126_546_251,
Pic_1126_561_251,
Pic_1126_576_251,
Pic_1126_591_251,
Pic_1126_606_251,
Pic_1126_621_251,
Pic_1126_636_251,
Pic_1126_651_251,
Pic_1126_666_251,
Pic_1126_681_251,
Pic_1126_696_251,
Pic_1126_711_251,
Pic_1126_726_251,
Pic_1126_741_251,
Pic_1126_756_251,
Pic_1126_771_251,
Pic_1126_786_251,
Pic_1127_487_252,
Pic_1128_486_251,
Pic_1129_485_251,
Pic_1130_485_252,
Pic_1131_485_252,
Pic_1132_486_251,
Pic_1133_486_252,
Pic_1134_486_251,
Pic_1135_486_251,
Pic_1136_489_263,
Pic_1137_632_551,
Pic_1138_786_561,
Pic_1139_486_251,
Pic_1139_501_251,
Pic_1139_516_251,
Pic_1139_531_251,
Pic_1139_546_251,
Pic_1139_561_251,
Pic_1139_576_251,
Pic_1139_591_251,
Pic_1139_606_251,
Pic_1139_621_251,
Pic_1139_636_251,
Pic_1139_651_251,
Pic_1139_666_251,
Pic_1139_681_251,
Pic_1139_696_251,
Pic_1139_711_251,
Pic_1139_726_251,
Pic_1139_741_251,
Pic_1139_756_251,
Pic_1139_771_251,
Pic_1139_786_251,
Pic_1140_487_252,
Pic_1141_486_251,
Pic_1142_485_251,
Pic_1143_485_252,
Pic_1144_485_252,
Pic_1145_486_251,
Pic_1146_486_252,
Pic_1147_486_251,
Pic_1148_486_251,
Pic_1149_489_263,
Pic_1150_576_287,
Pic_0040_591_289,
Pic_0040_619_289,
Pic_1151_569_287,
Pic_0040_584_289,
Pic_0040_626_289,
Pic_1152_576_287,
Pic_0225_591_289,
Pic_0225_619_289,
Pic_1153_569_287,
Pic_0225_584_289,
Pic_0225_626_289,
};
#define PIC_INDEX_DATA_CRC 0xC0A4A9AD
#define PIC_INDEX_DATA_CRC 0x12535796
extern void User_PicIndexDataInit(void);
#endif
......@@ -4,7 +4,7 @@
* \attention
*
* This file is automatically generated by analog signals configuration tool.
* Date : 2024/6/18 22:46:57
* Date : 2024/11/6 19:09:16
* Cfg Tool Ver : 1.1.0
* Engineer : ShiHao
* (c) Heilongjiang TYW electronics co., LTD
......@@ -74,7 +74,7 @@ ADC_Data_st_t stADCData[ADC_SIGNAL_CH_NUMBER];
const uint8_t __attribute__((aligned(4))) u8ADCChList[ADC_CONV_CH_NUMBER] =
{
2U, 3U, 7U, 5U, 6U, 4U, 12U,
2U, 3U, 7U, 5U, 6U, 12U, 11U, 4U,
};
const __attribute__((aligned(4))) ADC_Ch_Cfg_st_t stADCChCfg[ADC_SIGNAL_CH_NUMBER] =
......@@ -84,9 +84,9 @@ const __attribute__((aligned(4))) ADC_Ch_Cfg_st_t stADCChCfg[ADC_SIGNAL_CH_NUMBE
{ 2U, 0U, 0U, 0U, 0U, 1U, ADC_Voltage_Calc_Circuit101,},
{ 3U, 2U, 0U, 2U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 4U, 2U, 0U, 2U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 5U, 3U, 0U, 5000U, 0U, 10U, ADC_Res_Calc_Circuit201,},
{ 6U, 0U, 0U, 0U, 0U, 1U, ADC_Voltage_Calc_Circuit101,},
{ 5U, 0U, 0U, 0U, 0U, 1U, ADC_Voltage_Calc_Circuit101,},
{ 6U, 3U, 0U, 5000U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 7U, 3U, 0U, 5000U, 0U, 10U, ADC_Res_Calc_Circuit201,},
};
const __attribute__((aligned(4))) ADC_Res_List_st_t stADCResList[ADC_SIGNAL_CH_NUMBER] =
......@@ -96,8 +96,9 @@ const __attribute__((aligned(4))) ADC_Res_List_st_t stADCResList[ADC_SIGNAL_CH_N
{ 0U, 0U, 0U, 0U,},
{ 0U, 0U, 500U, 300U,},
{ 0U, 0U, 500U, 0U,},
{ 0U, 100000U, 0U, 0U,},
{ 47000U, 0U, 47000U, 0U,},
{ 47000U, 0U, 100000U, 0U,},
{ 0U, 100000U, 0U, 0U,},
};
/* Private function prototypes ----------------------------------------------*/
......@@ -175,7 +176,7 @@ void Analog_Signal_Conv_Service(void)
if (stADCCtrl.u8DebounceCnt == 0U)
{
stADCCtrl.enStatus = ADC_STAT_CONV;
stADCCtrl.enStatus = ADC_STAT_CONV;
}
else
{
......
......@@ -4,7 +4,7 @@
* \attention
*
* This file is automatically generated by analog signals configuration tool.
* Date : 2024/6/18 22:46:57
* Date : 2024/11/6 19:09:16
* Cfg Tool Ver : 1.1.0
* Engineer : ShiHao
* (c) Heilongjiang TYW electronics co., LTD
......@@ -33,13 +33,14 @@ enum ADCChName
ADC_CH_FUEL_VREF,
ADC_CH_FUEL1,
ADC_CH_COOLANT_TEMP1_R,
ADC_CH_NTC_TEMP,
ADC_CH_LIGHT_SENSITIVE,
ADC_CH_OIL_PRESSURE_R,
ADC_CH_NTC_TEMP,
};
/* Exported macro ------------------------------------------------------------*/
#define ADC_TOTAL_CH_NUMBER (7U)
#define ADC_SIGNAL_CH_NUMBER (7U)
#define ADC_TOTAL_CH_NUMBER (8U)
#define ADC_SIGNAL_CH_NUMBER (8U)
#define ADC_REF_VOLTAGE u16ADCRefVoltage
/* Exported variables --------------------------------------------------------*/
......
......@@ -28,6 +28,7 @@
#include "Data_VSpeed.h"
#include "Data_Coolant.h"
#include "Data_Fuel.h"
#include "Data_OilPressure.h"
#include "Hysteresis.h"
#include "Mileage\Services_Mileage_User.h"
#include "BackLight.h"
......
This diff is collapsed.
......@@ -62,6 +62,8 @@ Key_Status_en_t Key_Status_Read_Left(void);
Key_Status_en_t Key_Status_Read_Right(void);
void Key_Event_Short_Press_Left(void);
void Key_Event_Short_Press_Right(void);
void Key_Event_SHORT_PRESS_2_Right(void);
void Key_Event_BackLight_Press_Left(void);
void Get_Into_OTA_Update_Mode(void);
void KEY_RIGHT_EVENT_NONE_Service(void);
void KEY_LEFT_EVENT_NONE_Service(void);
......
......@@ -9,7 +9,7 @@ const Line_In_Attribute_st g_stLineInAttribute[LINE_IN_MAX] =
{LEVEL_LOW, LEVEL_HIGH, LINE_IN_IG_ON, 20U, 20U, Get_LINE_IN_Turn_Right, },/*P9*/
{LEVEL_LOW, LEVEL_HIGH, LINE_IN_IG_ON, 40U, 20U, Get_LINE_IN_High_Beam, },/*P18*/
{LEVEL_HIGH, LEVEL_LOW, LINE_IN_IG_ON, 125U, 20U, Get_LINE_IN_Efi_Fault, },/*P15*/
{LEVEL_LOW, LEVEL_HIGH, LINE_IN_IG_ON, 125U, 0U, Get_LINE_IN_ABS, },/*P7*/
{LEVEL_LOW, LEVEL_HIGH, LINE_IN_IG_ON, 170U, 0U, Get_LINE_IN_ABS, },/*P7*/
{LEVEL_HIGH, LEVEL_LOW, LINE_IN_IG_ON, 125U, 20U, Get_LINE_IN_Auto_Start_Stop, },/*P12*/
{LEVEL_HIGH, LEVEL_LOW, LINE_IN_IG_ON, 2000U, 20U, Get_LINE_IN_Oil_Pressure_Alert, },/*P21*/
{LEVEL_LOW, LEVEL_HIGH, LINE_IN_IG_ON, 125U, 20U, Get_LINE_IN_Coolant_Temperature }, /*P11*/
......@@ -95,13 +95,13 @@ Linelib_uint8_t Get_LINE_IN_Auto_Start_Stop(void)
Linelib_uint8_t Get_LINE_IN_Oil_Pressure_Alert(void)
{
Linelib_uint8_t ret = 0U;
if (RTE_GPIO_Get_Level(Gears_N_MCU))
if (Get_OilPressureStauts())
{
ret = 1u;
ret = 0u;
}
else
{
ret = 0UL;
ret = 1UL;
}
return ret;
}
......
......@@ -65,11 +65,11 @@ void Menu_User_Init(void)
Menu_Init_st.enMenuItemLen = MENU_ITEM_MAX;
Menu_Init_st.uintMenuConfig = 0x0001;
Menu_Init_st.uintMenuCursorMemoryDepth = 0;
Menu_Init((uint8_t *)u8MenuRamData, (Menu_Item_Attribute_st_t *)stMenuItemAttribute, (Menu_Init_st_t *)&Menu_Init_st);
Menu_Item_Select_Set(MENU_ITEM_SELECT_DAYTIME, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 1);
Menu_Item_Select_Set(MENU_ITEM_UNIT_KM, 1);
Menu_Item_Select_Set(MENU_ITEM_LANGUAGE_CHINESE, 1);
Menu_Init((uint8_t *)u8MenuRamData, (Menu_Item_Attribute_st_t *)stMenuItemAttribute, (Menu_Init_st_t *)&Menu_Init_st);
}
void Menu_User_WAKEUP(void)
......@@ -80,11 +80,11 @@ void Menu_User_WAKEUP(void)
Menu_Init_st.enMenuItemLen = MENU_ITEM_MAX;
Menu_Init_st.uintMenuConfig = 0x0001;
Menu_Init_st.uintMenuCursorMemoryDepth = 0;
Menu_Wake_Up_Init((uint8_t *)u8MenuRamData, (Menu_Item_Attribute_st_t *)stMenuItemAttribute, (Menu_Init_st_t *)&Menu_Init_st);
Menu_Item_Select_Set(MENU_ITEM_SELECT_DAYTIME, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 1);
Menu_Item_Select_Set(MENU_ITEM_UNIT_KM, 1);
Menu_Item_Select_Set(MENU_ITEM_LANGUAGE_CHINESE, 1);
Menu_Wake_Up_Init((uint8_t *)u8MenuRamData, (Menu_Item_Attribute_st_t *)stMenuItemAttribute, (Menu_Init_st_t *)&Menu_Init_st);
}
/*---------------------------------------------------------------------------------------*/
......@@ -232,80 +232,80 @@ void Menu_Logic_Operation_Select_Auto(Menu_Key_en_t enKeyType)
void Menu_Logic_Operation_Backlight_5(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 1);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
// }
}
void Menu_Logic_Operation_Backlight_4(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 1);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
// }
}
void Menu_Logic_Operation_Backlight_3(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 1);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
// }
}
void Menu_Logic_Operation_Backlight_2(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 1);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
// }
}
void Menu_Logic_Operation_Backlight_1(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 1);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 1);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 0);
// }
}
void Menu_Logic_Operation_Backlight_Auto(Menu_Key_en_t enKeyType)
{
if(enKeyType == MENU_KEY_CONFIRM_SHORT)
{
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 1);
}
// if(enKeyType == MENU_KEY_CONFIRM_SHORT)
// {
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_5, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_4, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_3, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_2, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_1, 0);
// Menu_Item_Select_Set(MENU_ITEM_BACKLIGHT_AUTO, 1);
// }
}
void Menu_Logic_Operation_Bluetooth_Open_Close(Menu_Key_en_t enKeyType)
......
......@@ -17,13 +17,13 @@ uint8_t odo_readState;
static uint32_t Data_User_EEPROM_Read(uint16_t u16BlockID, uint32_t u32Data[], uint16_t u16Len);
static void Data_User_EEPROM_Write(Data_EEPROM_Enum_t BlockID, uint32_t u32Data[], uint16_t u16Len);
#define EEPROM_BLOCK_00 0
#define EEPROM_BLOCK_01 16
#define EEPROM_BLOCK_02 32
#define EEPROM_BLOCK_03 48
#define EEPROM_BLOCK_04 64
#define EEPROM_BLOCK_05 80
#define EEPROM_BLOCK_06 96
#define EEPROM_BLOCK_00 0x00
#define EEPROM_BLOCK_01 0x20
#define EEPROM_BLOCK_02 0x40
#define EEPROM_BLOCK_03 0x60
#define EEPROM_BLOCK_04 0x80
#define EEPROM_BLOCK_05 0xC0
#define EEPROM_BLOCK_06 0xE0
......
......@@ -55,6 +55,7 @@ static void Power_KL30_Init(void)
Key_KL30_Init_EXample();
Data_User_Mileage_KL30Init();
Fuel_KL30_Init();
Oil_Pressure_KL30_Init();
BackLight_30_Init();
Amt630hInit();
Telltales_Init();
......@@ -91,6 +92,7 @@ static void Power_Wakeup_Init(void)
Key_Wakeup_Init_EXample();
Line_In_KL15_ON_Init();
Fuel_KL30_Init();
Oil_Pressure_KL30_Init();
BackLight_WakeUp_Init();
RTE_UART_Sleep_Init(UART_CH2);
loc_config.u32UARTChEn = 1U;
......@@ -123,6 +125,8 @@ static void Power_IG_OFF_Init(void)
{
Line_In_KL15_OFF_Init();
BackLight_15_Init();
BlueTooth_IGOFF_INIT();
Menu_Change_Branch_To_Item(MENU_BRANCH_ANIMATION,MENU_ITEM_MAIN_ITEM);
}
static void Power_IG_ON_Init(void)
......@@ -131,6 +135,7 @@ static void Power_IG_ON_Init(void)
Line_In_KL15_ON_Init();
Telltales_KL15_Init();
Fuel_KL15_Init();
Oil_Pressure_KL15_Init();
TEMP_KL15_Init();
//RTE_GPIO_Set_Level(Blacklight_PWM, 1);
FaultCode_Init();
......@@ -139,6 +144,7 @@ static void Power_IG_ON_Init(void)
// Amt630hInit();
AMT630H_GUI_SELFCHECK_STS_INIT();
Menu_Service(MENU_KEY_TIMEOUT); /* 菜单回到初始界面 */
g_u8UDSreadprec = 0U;
}
static void Power_Sleep_Init(void)
......@@ -211,7 +217,7 @@ static Power_Status_em Power_Stay_Protect(void)
/* 关闭所有外设,坪保留AD采集,电溝状思切�? */
{
TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, 0);
//CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
// CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Disable);
}
u8PowerSts = EM_IGN_OFF_Init;
/* 电溝模弝正常 */
......@@ -225,7 +231,7 @@ static Power_Status_em Power_Stay_Protect(void)
if ( SYS_OPR_STAT_RUN )
{
Amt630hInit();
//CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);
// CAN_TX_SetEnable(&CAN_CH0_CanMsgTxOp, CAN_N_TX_Enable);
return u8PowerSts;
}
......
......@@ -68,6 +68,7 @@ uint8_t rte_can_init(can_config_st_t *config)
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Level = GPIO_Level_HIGH;
GPIO_InitStruct.GPIO_Ctrl = GPIO_Control_DIG;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_Init(GPIO_PORT5, &GPIO_InitStruct);
/* CRXD pin init */
......
......@@ -34,13 +34,14 @@ void Sys_5ms_Tasks(void)
void Sys_10ms_Tasks(void)
{
Can_BusOff_Recover(10);
FaultCode_Service(10u);
FaultCode_Servers();
Line_In_Debounce_Service(10u);
My_Key_Service();
Data_Mileage_Write_EEPROM();
Key_Clear_Time();
Key_TimeOut_Service();
Fuel_R_Cal(10u);
Oil_R_Cal(10u);
Data_Light_Res_service(10);
BackLight_Process();
}
......@@ -73,10 +74,6 @@ void Sys_50ms_Tasks(void)
VechileSpeed_time++;
}
uint32_t ODOtest = 0;
uint32_t Triptest = 0;
uint32_t aaa = 0;
void Sys_100ms_Tasks(void)
{
BlueToothService();
......@@ -85,7 +82,7 @@ void Sys_100ms_Tasks(void)
Fuel_Cal_Sevice(100u);
Services_Mileage_Callback();
// Data_Mileage_Clear();
RTE_GPIO_Config(RTE_GPIO_PORT05_PIN04, GpioOut_High);
// RTE_GPIO_Config(RTE_GPIO_PORT05_PIN04, GpioOut_High);
//BackLight_Process();
//TimerM_PWM_set_duty(TIMERM_COUNTER1, TIMERM_CHB, 100);
......
......@@ -29,12 +29,12 @@
/******************************************************************************
program version
*******************************************************************************/
#define SWV 0x108 // 0x100 = 1.00 software version 软件版本号
#define HWV 0x110 // 0x100 = 1.00 hardware version 硬件版本号
#define BTV 0x104 // 0x100 = 1.00 bootloader version boot程序版本号
#define SWV 0x109 // 0x100 = 1.00 software version 软件版本号
#define HWV 0x120 // 0x100 = 1.00 hardware version 硬件版本号
#define BTV 0x105 // 0x100 = 1.00 bootloader version boot程序版本号
#define internal_version (108UL) /* 内部版本号 105 -> 1.05 */
#define internal_date (20241015UL) /* 内部版本日期 20240805 -> 2024.08.05 */
#define internal_version (109UL) /* 内部版本号 105 -> 1.05 */
#define internal_date (20241111UL) /* 内部版本日期 20240805 -> 2024.08.05 */
/**
*DFlash
......
# 2024.10.31
允许校验到芯片结束地址
没有跳转到App时, 先初始化时钟再进行Flash操作
内部版本信息更新(1.05_20241031)
# 2024.08.21
使用中微官方推荐的添加函数到SRAM方式(#pragma多个函数添加到section)
L1: 修改block计算公式, 新Boot的CRC等信息使用全局变量存储, 减少函数调用
......
......@@ -4,7 +4,7 @@
* \attention
*
* This file is automatically generated by analog signals configuration tool.
* Date : 2024/6/18 22:46:57
* Date : 2024/11/9 15:54:41
* Cfg Tool Ver : 1.1.0
* Engineer : ShiHao
* (c) Heilongjiang TYW electronics co., LTD
......@@ -33,11 +33,14 @@ enum ADCChName
ADC_CH_FUEL_VREF,
ADC_CH_FUEL1,
ADC_CH_COOLANT_TEMP1_R,
ADC_CH_LIGHT_SENSITIVE,
ADC_CH_OIL_PRESSURE_R,
ADC_CH_NTC_TEMP,
};
/* Exported macro ------------------------------------------------------------*/
#define ADC_TOTAL_CH_NUMBER (5U)
#define ADC_SIGNAL_CH_NUMBER (5U)
#define ADC_TOTAL_CH_NUMBER (8U)
#define ADC_SIGNAL_CH_NUMBER (8U)
#define ADC_REF_VOLTAGE u16ADCRefVoltage
/* Exported variables --------------------------------------------------------*/
......
......@@ -4,7 +4,7 @@
* \attention
*
* This file is automatically generated by analog signals configuration tool.
* Date : 2024/6/18 22:46:57
* Date : 2024/11/9 15:54:41
* Cfg Tool Ver : 1.1.0
* Engineer : ShiHao
* (c) Heilongjiang TYW electronics co., LTD
......@@ -74,7 +74,7 @@ ADC_Data_st_t stADCData[ADC_SIGNAL_CH_NUMBER];
const uint8_t __attribute__((aligned(4))) u8ADCChList[ADC_CONV_CH_NUMBER] =
{
2U, 3U, 7U, 5U, 6U,
2U, 3U, 7U, 5U, 6U, 12U, 11U, 4U,
};
const __attribute__((aligned(4))) ADC_Ch_Cfg_st_t stADCChCfg[ADC_SIGNAL_CH_NUMBER] =
......@@ -84,6 +84,9 @@ const __attribute__((aligned(4))) ADC_Ch_Cfg_st_t stADCChCfg[ADC_SIGNAL_CH_NUMBE
{ 2U, 0U, 0U, 0U, 0U, 1U, ADC_Voltage_Calc_Circuit101,},
{ 3U, 2U, 0U, 2U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 4U, 2U, 0U, 2U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 5U, 0U, 0U, 0U, 0U, 1U, ADC_Voltage_Calc_Circuit101,},
{ 6U, 3U, 0U, 5000U, 0U, 1U, ADC_Res_Calc_Circuit101,},
{ 7U, 3U, 0U, 5000U, 0U, 10U, ADC_Res_Calc_Circuit201,},
};
const __attribute__((aligned(4))) ADC_Res_List_st_t stADCResList[ADC_SIGNAL_CH_NUMBER] =
......@@ -93,6 +96,9 @@ const __attribute__((aligned(4))) ADC_Res_List_st_t stADCResList[ADC_SIGNAL_CH_N
{ 0U, 0U, 0U, 0U,},
{ 0U, 0U, 500U, 300U,},
{ 0U, 0U, 500U, 0U,},
{ 0U, 100000U, 0U, 0U,},
{ 47000U, 0U, 47000U, 0U,},
{ 47000U, 0U, 100000U, 0U,},
};
/* Private function prototypes ----------------------------------------------*/
......
/**************************************************************************//**
* \file Analog_Signals.h
* \brief Analog signal processing
* \attention
*
* This file is automatically generated by analog signals configuration tool.
* Date : 2024/6/18 22:46:57
* Cfg Tool Ver : 1.1.0
* Engineer : ShiHao
* (c) Heilongjiang TYW electronics co., LTD
*
******************************************************************************/
#ifndef ANALOG_SIGNALS_H__
#define ANALOG_SIGNALS_H__
/* Includes -----------------------------------------------------------------*/
#include "ADC.h"
#include "Analog_Circuits.h"
#include "RTE.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern {
#endif
/*! @{ */
/* Exported types ------------------------------------------------------------*/
enum ADCChName
{
ADC_CH_KL30_VOLTAGE = 0,
ADC_CH_KL15_VOLTAGE,
ADC_CH_FUEL_VREF,
ADC_CH_FUEL1,
ADC_CH_COOLANT_TEMP1_R,
};
/* Exported macro ------------------------------------------------------------*/
#define ADC_TOTAL_CH_NUMBER (5U)
#define ADC_SIGNAL_CH_NUMBER (5U)
#define ADC_REF_VOLTAGE u16ADCRefVoltage
/* Exported variables --------------------------------------------------------*/
extern volatile uint16_t u16ADCRefVoltage;
extern const uint8_t u8ADCChList[];
/* Exported functions --------------------------------------------------------*/
extern void Analog_Signal_Conv_Init(void);
extern void Analog_Signal_Conv_Stop(void);
extern void Analog_Signal_Conv_Service(void);
extern uint16_t ADC_Read_Signal(uint8_t u8ADCCh);
extern uint8_t ADC_Read_Signal_Valid(uint8_t u8ADCCh);
extern uint16_t ADC_Conv_Single_Channel(uint8_t u8ADCCh);
/*! @} */
#ifdef __cplusplus
}
#endif
#endif /* ANALOG_SIGNALS_H__ */
#new Option
#Wed Aug 21 20:04:42 CST 2024
#Mon Nov 11 18:37:13 CST 2024
IsSort=true
MergeFlashIsCompression=false
ChangeAppFilePath=
......@@ -7,7 +7,7 @@ MergeCanXLSPath=
RH850_D1M1AGPIOJSONpath=
DBFFilePath=
MergeCrcTtpe=29
MergeBootFilePath=D\:\\git\\haojin750tft\\Firmware\\utility\\Boot_Release\\HaoJin_750TFT_HJYB-7500TFT_BV1.04_20240821.hex
MergeBootFilePath=D\:\\git\\haojin750tft\\Firmware\\utility\\Boot_Release\\HaoJin_750TFT_HJYB-7500TFT_BV1.05_20241031.hex
IsMergeChangeAddress=false
MergeFlashOutPutFilePath=
GPIOOutPutPath=
......@@ -47,7 +47,7 @@ IsMergeCreateHex=false
MergeFlashIsCreateREC=false
TTFExtractTTFpath=
MergeImageFilePath=
IsMergeCreateUpdateBin=false
IsMergeCreateUpdateBin=true
MergeImageSize=128M
CRCFilePath=
MergeFlashCompressionFormat=
......@@ -56,7 +56,7 @@ IsHexDisplay=true
MergeLineInXLSPath=
MergeFlashInPutFilePath=
MergeFlashIsInternal=false
MergeOutPutFilePath=D\:\\\u9879\u76EE\\\u8C6A\u8FDB\\haojin750TFT\\srec-8.21
MergeOutPutFilePath=D\:\\\u9879\u76EE\\\u8C6A\u8FDB\\haojin750TFT\\srec-shuo\\srec-11.11
MergeAppFilePath=D\:\\git\\haojin750tft\\Firmware\\Project\\Cmsemicon\\BAT32A279\\MDK_ARM\\Objects\\HaoJin750TFT.hex
MergeTelltalesXLSPath=
FillingByte=-86
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment