Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build_lcm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ jobs:
run: |
./build.sh || true
missing=0
[ ! -f lcm_adv2.hex ] && echo "::warning::ADV2 firmware failed to build" && missing=1
[ ! -f lcm_adv_p42a.hex ] && echo "::warning::ADV-P42A firmware failed to build" && missing=1
[ ! -f lcm_adv_dg40.hex ] && echo "::warning::ADV-DG40 firmware failed to build" && missing=1
[ ! -f lcm_gtv.hex ] && echo "::warning::GTV firmware failed to build" && missing=1
Expand Down
17 changes: 15 additions & 2 deletions LCM/Code/App/datatypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1337,6 +1337,11 @@ typedef struct __attribute__((packed)) {
uint64_t runtime; // Seconds
} backup_data;

typedef enum {
FLOAT_COMMAND_ID = 101, // float/refloat custom commands
LCM_COMMAND_ID = 202, // bms custom commands
} custom_app_data_command_ids;

typedef enum {
FLOAT_COMMAND_GET_INFO = 0, // get version / package info
FLOAT_COMMAND_GET_RTDATA = 1, // get rt data
Expand All @@ -1356,8 +1361,12 @@ typedef enum {
FLOAT_COMMAND_FLYWHEEL = 22,
FLOAT_COMMAND_HAPTIC = 23,
FLOAT_COMMAND_LCM_POLL = 24,
FLOAT_COMMAND_LCM_CTRL = 25,
FLOAT_COMMAND_LCM_INFO = 26
FLOAT_COMMAND_LCM_LIGHT_INFO = 25,
FLOAT_COMMAND_LCM_LIGHT_CTRL = 26,
FLOAT_COMMAND_LCM_DEVICE_INFO = 27,
FLOAT_COMMAND_CHARGING_STATE = 28,
FLOAT_COMMAND_LCM_GET_BATTERY = 29,
FLOAT_COMMAND_LCM_DEBUG = 99
} float_commands;

typedef enum {
Expand Down Expand Up @@ -1397,6 +1406,10 @@ typedef enum {
DEBUG = 255,
} control_commands;

typedef enum {
LCM_COMMAND_EXTERNAL_SHUTDOWN_STATUS = 0, // shutdown status notification
} LCM_commands;

typedef enum {
BOOT_DEFAULT = 0,
BOOT_REDWHITEBLUE = 1,
Expand Down
99 changes: 84 additions & 15 deletions LCM/Code/App/task.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,21 @@ static void lcmConfigReset(void)
int headlight_brightnesses[] = { 0, 150, 255 };
int status_brightnesses[] = { WS2812_1_BRIGHTNESS, WS2812_2_BRIGHTNESS, WS2812_3_BRIGHTNESS };

/**************************************************
* @brie :LED_Task()
* @note :LEDÈÎÎñ
* @param :ÎÞ
* @retval :ÎÞ
**************************************************/
void LED_Task(void)
{
if(LED_Counter >= 500)
{
LED_Counter = 0;
LED1_FILP;
}
}

/**************************************************
* @brie :KEY1_Task()
**************************************************/
Expand All @@ -59,6 +74,7 @@ void KEY1_Task(void)
return;
}

Idle_Time = 0;
switch(KEY1_State)
{
case 1: // Click
Expand All @@ -84,15 +100,18 @@ void KEY1_Task(void)
case 3: // Long press
if(Power_Flag == 2) // Boot completed
{
#ifdef ADV2
Power_Flag = 5; // external power off
#else
Power_Flag = 4; // VESC power off
#endif
Power_Time = 0;
}
break;

case 4: // Three presses
if(Power_Flag == 2) // Boot completed
{
Idle_Time = 0;
if(Buzzer_Flag == 2)
{
Buzzer_Flag = 1;
Expand Down Expand Up @@ -373,12 +392,9 @@ static void WS2818_Knight_Rider(uint8_t brightness) {
static void WS2812_Idle()
{
if (Idle_Time > KR_DELAY_MS) {
if (Power_Display_Flag < 10) {
if (Power_Display_Flag < 10 && Idle_Time <= KR_DELAY_MS + 40) {
// Voltage below 10%? Flash bright red for 40ms!
WS2812_Set_AllColours(1, 10, 255, 20, 20);
if (Idle_Time > KR_DELAY_MS + 40) {
Idle_Time = 0;
}
return;
}

Expand All @@ -387,6 +403,8 @@ static void WS2812_Idle()
WS2818_Knight_Rider(WS2812_Measure);
return;
}

Idle_Time = 0;
}
// Battery mode
WS2812_Power_Display(WS2812_Measure);
Expand Down Expand Up @@ -420,7 +438,11 @@ void WS2812_Task(void)
{
uint8_t i;

if(Charge_Flag == 3) { // Battery fully charged
if(Power_Flag == 1) {
Idle_Time = 0;
WS2812_Boot();
}
else if(Charge_Flag == 3) { // Battery fully charged
WS2812_Set_AllColours(1,10,50,150,50); // white with a strong green tint
}
else if(Charge_Flag == 2) { // Charge display pattern (pulsating led)
Expand All @@ -436,10 +458,6 @@ void WS2812_Task(void)
WS2812_Flag = 0;
Power_Display_Flag = 0;
}
else if(Power_Flag == 1) {
Idle_Time = 0;
WS2812_Boot();
}
else if (Power_Flag > 2) {
Idle_Time = 0;
}
Expand Down Expand Up @@ -494,6 +512,13 @@ void Power_Task(void)
Power_Flag = 3;
}
}
else if (Power_Flag == 5) {
if(Power_Time > VESC_SHUTDOWN_TIME)
{
// BMS should shutdown the board by now, otherwise it was a false positive
Power_Flag = 2;
}
}

if(power_flag_last == Power_Flag && Power_Flag != 1)
{
Expand Down Expand Up @@ -532,6 +557,7 @@ void Power_Task(void)
break;

case 4:// New Power state for shutdown sequence
case 5:// New Power state for ADV2 external shutdown sequence
WS2812_Display_Flag = 3;
break;

Expand All @@ -542,6 +568,10 @@ void Power_Task(void)

void CheckPowerLevel(float battery_voltage)
{
#ifdef S50S
uint16_t battVoltages_mv[11] = {4200, 4075, 4040, 3900, 3820, 3735, 3640, 3520, 3375, 3160, 3000}; //50S
#endif

#ifdef P42A
uint16_t battVoltages_mv[11] = {4200, 4065, 3938, 3854, 3776, 3695, 3618, 3543, 3460, 3342, 3000}; //P42A
#endif
Expand Down Expand Up @@ -572,7 +602,7 @@ void CheckPowerLevel(float battery_voltage)

/**************************************************
* @brie :Charge_Task()
* @note :Check for charge start/end conditions
* @note :Check for charge start/end conditions, only for ADV1
**************************************************/
#ifdef ADV
void Charge_Task(void)
Expand Down Expand Up @@ -824,7 +854,7 @@ void Buzzer_Task(void)
buzzer_step = 0;
return;
}
else if (Power_Flag == 4)
else if (Power_Flag == 4 || Power_Flag == 5)
{
// Beep when powering off
if (buzzer_step == 0)
Expand Down Expand Up @@ -1057,7 +1087,10 @@ void ADC_Task(void)

ADC1_Val = (float)(adc1_val_sum_ave*0.0012890625);
ADC2_Val = (float)(adc2_val_sum_ave*0.0012890625);


#ifdef ADV2
Charge_Voltage = (float)(adc_charge_sum_ave*0.0008056640625);
#else
if(V_I == 0)
{
if(Charge_Time>100)
Expand All @@ -1072,8 +1105,8 @@ void ADC_Task(void)
Charge_Voltage = (float)(adc_charge_sum_ave*0.0257080078125);
}
}
#endif
}

break;

default:
Expand All @@ -1088,8 +1121,13 @@ void ADC_Task(void)
**************************************************/
void VESC_State_Task(void)
{
if ((Charge_Flag > 0) || (Power_Flag != 2) || !Vesc_Data_Ready)
if ((Power_Flag != 2) || !Vesc_Data_Ready)
return;

#ifdef ADV
if (Charge_Flag > 0)
return;
#endif

Vesc_Data_Ready = false;

Expand Down Expand Up @@ -1166,6 +1204,7 @@ void VESC_State_Task(void)
Shutdown_Time_M = 0;
}

#ifndef ADV2
if(Shutdown_Time_S>60000)
{
Shutdown_Time_S = 0;
Expand All @@ -1184,5 +1223,35 @@ void VESC_State_Task(void)
Power_Flag = 4;
Power_Time = 0;
}
#endif
lcmConfig.boardOff = false;
}

#ifdef ADV2
/**************************************************
* @brie :Charge_Detect_Task()
* @note :Detect charging state signalled by BMS
**************************************************/
void Charge_Detect_Task(void)
{
// NOTE from surfdado:
// Somehow Charge_Voltage will be below 3.0V when charging starts
// I guess ADC3 is just a signal from the BMS?
if(Charge_Voltage >= CHARGING_VOLTAGE)
{
Charge_Flag = 0;
}
else if(data.inpVoltage >= FULL_VOLTAGE)
{
if(Charge_Time > 2000)
{
Charge_Flag = 3;
}
}
else
{
Charge_Flag = 2;
Charge_Time = 0;
}
}
#endif
3 changes: 3 additions & 0 deletions LCM/Code/App/task.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
#define SHUTDOWN_TIME 20
#define VESC_RPM 1000
#define VESC_BOOT_TIME 4000
#ifndef VESC_SHUTDOWN_TIME
#define VESC_SHUTDOWN_TIME 1000
#endif
#define DUTY_CYCLE 0.9
#define VOLTAGE_RECEIPT 0.02
#define CHARGE_COMMAND_TIME 1000 // frequency of notifying the float package of current charge state
Expand All @@ -32,6 +34,7 @@ void KEY1_Task(void);
void WS2812_Task(void);
void Power_Task(void);
void Charge_Task(void);
void Charge_Detect_Task(void);
void Headlights_Task(void);
void Buzzer_Task(void);
void Usart_Task(void);
Expand Down
42 changes: 32 additions & 10 deletions LCM/Code/App/vesc_uasrt.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id)
command[0] = id;

if (id == COMM_CUSTOM_APP_DATA) {
command[1] = 101;
command[2] = 24; // FLOAT_COMMAND_POLL
command[1] = FLOAT_COMMAND_ID;
command[2] = FLOAT_COMMAND_LCM_POLL;
len = 3;
if (!lcmConfig.isSet) {
// write firmware id string to command
Expand All @@ -109,8 +109,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id)

if (id == COMM_CHARGE_INFO) {
command[0] = COMM_CUSTOM_APP_DATA;
command[1] = 101;
command[2] = 28; // FLOAT_COMMAND_CHARGESTATE
command[1] = FLOAT_COMMAND_ID;
command[2] = FLOAT_COMMAND_CHARGING_STATE;
command[3] = 151; // -charging: 1/0 aka true/false
command[4] = Charge_Flag == 2 ? 1: 0; // -charging: 1/0 aka true/false
uint8_t ind = 5;
Expand All @@ -121,8 +121,8 @@ void Get_Vesc_Pack_Data(COMM_PACKET_ID id)

if (id == COMM_CUSTOM_DEBUG) {
command[0] = COMM_CUSTOM_APP_DATA;
command[1] = 101;
command[2] = 99; // FLOAT_COMMAND_LCM_DEBUG
command[1] = FLOAT_COMMAND_ID;
command[2] = FLOAT_COMMAND_LCM_DEBUG;
command[3] = Power_Flag;
command[4] = Charge_Flag;
command[5] = data.dutyCycleNow;
Expand Down Expand Up @@ -333,12 +333,34 @@ uint8_t Protocol_Parse(uint8_t * message)

case COMM_CUSTOM_APP_DATA:

if (len < 12) {
if (len < 3) {
break;
}
uint8_t magicnr = pdata[ind++];
uint8_t floatcmd = pdata[ind++];
if ((magicnr != 101) || (floatcmd != FLOAT_COMMAND_LCM_POLL)) {
uint8_t magicnr = pdata[ind++];
uint8_t cmdid = pdata[ind++];

if (magicnr == LCM_COMMAND_ID)
{
switch(cmdid)
{
case LCM_COMMAND_EXTERNAL_SHUTDOWN_STATUS:
if(len != 4) return 1;
if(Power_Flag == 2 &&
pdata[ind] == 1) // shutting down
{
#ifdef ADV2
Power_Flag = 5;
Power_Time = 0;
Idle_Time = 0;
#endif
}
break;
}

return 0;
}

if ((magicnr != FLOAT_COMMAND_ID) || (cmdid != FLOAT_COMMAND_LCM_POLL) || (len < 12)) {
break;
}
data.floatPackageSupported = true;
Expand Down
Loading