AP_Generator: IE 2400: fix V2 low and critical errors and add warnings

This commit is contained in:
Iampete1 2023-10-13 13:53:38 +01:00 committed by Andrew Tridgell
parent c91407d662
commit 36dd720e78
4 changed files with 52 additions and 3 deletions

View File

@ -359,6 +359,12 @@ AP_BattMonitor::Failsafe AP_Generator_IE_2400::update_failsafes() const
// Check for error codes that are deemed critical
bool AP_Generator_IE_2400::is_critical_error(const uint32_t err_in) const
{
// V2 protocol
if (_version == ProtocolVersion::V2) {
return err_in > 30;
}
// V1 protocol
switch ((ErrorCode)err_in) {
// Error codes that lead to critical action battery monitor failsafe
case ErrorCode::BATTERY_CRITICAL:
@ -375,6 +381,12 @@ bool AP_Generator_IE_2400::is_critical_error(const uint32_t err_in) const
// Check for error codes that are deemed severe and would be cause to trigger a battery monitor low failsafe action
bool AP_Generator_IE_2400::is_low_error(const uint32_t err_in) const
{
// V2 protocol
if (_version == ProtocolVersion::V2) {
return (err_in >= 10) && (err_in <= 30);
}
// V1 protocol
switch ((ErrorCode)err_in) {
// Error codes that lead to critical action battery monitor failsafe
case ErrorCode::START_DENIED:
@ -382,7 +394,6 @@ bool AP_Generator_IE_2400::is_low_error(const uint32_t err_in) const
case ErrorCode::BATTERY_LOW:
case ErrorCode::PRESSURE_LOW:
case ErrorCode::SPM_LOST:
case ErrorCode::REDUCED_POWER:
return true;
default:
@ -399,7 +410,7 @@ bool AP_Generator_IE_2400::check_for_err_code(char* msg_txt, uint8_t msg_len) co
return false;
}
if ((_version == ProtocolVersion::V2) && (strlen(_valid_V2.info_str) > 0)) {
if (_version == ProtocolVersion::V2) {
hal.util->snprintf(msg_txt, msg_len, "Fuel cell err %u.%u: %s", (unsigned)_err_code, (unsigned)_sub_err_code, _valid_V2.info_str);
return true;
}
@ -408,6 +419,38 @@ bool AP_Generator_IE_2400::check_for_err_code(char* msg_txt, uint8_t msg_len) co
return true;
}
bool AP_Generator_IE_2400::check_for_warning_code(char* msg_txt, uint8_t msg_len) const
{
if (_err_code == 0) {
// No error nothing to do.
return false;
}
if (is_critical_error(_err_code) || is_low_error(_err_code)) {
// Critical or low error are already reported
return false;
}
switch (_version) {
case ProtocolVersion::DETECTING:
case ProtocolVersion::UNKNOWN:
break;
case ProtocolVersion::LEGACY:
if ((ErrorCode)_err_code == ErrorCode::REDUCED_POWER) {
hal.util->snprintf(msg_txt, msg_len, "Fuel cell reduced power <%u>", (unsigned)_err_code);
return true;
}
break;
case ProtocolVersion::V2:
hal.util->snprintf(msg_txt, msg_len, "Fuel cell warning %u.%u: %s", (unsigned)_err_code, (unsigned)_sub_err_code, _valid_V2.info_str);
return true;
}
hal.util->snprintf(msg_txt, msg_len, "Fuel cell warning code <%u>", (unsigned)_err_code);
return true;
}
#if HAL_LOGGING_ENABLED
// log generator status to the onboard log
void AP_Generator_IE_2400::log_write()

View File

@ -34,6 +34,9 @@ private:
// Check if we have received an error code and populate message with error code
bool check_for_err_code(char* msg_txt, uint8_t msg_len) const override;
// Check if we have received an warning code and populate message with warning code
bool check_for_warning_code(char* msg_txt, uint8_t msg_len) const override;
// Check for error codes that are deemed critical
bool is_critical_error(const uint32_t err_in) const;

View File

@ -182,7 +182,7 @@ bool AP_Generator_IE_FuelCell::check_for_err_code_if_changed(char* msg_txt, uint
return false;
}
if (check_for_err_code(msg_txt, msg_len)) {
if (check_for_err_code(msg_txt, msg_len) || check_for_warning_code(msg_txt, msg_len)) {
_last_err_code = _err_code;
_last_sub_err_code = _sub_err_code;
return true;

View File

@ -105,6 +105,9 @@ protected:
// Check error codes and populate message with error code
virtual bool check_for_err_code(char* msg_txt, uint8_t msg_len) const = 0;
// Check if we have received an warning code and populate message with warning code
virtual bool check_for_warning_code(char* msg_txt, uint8_t msg_len) const { return false; }
// Only check the error code if it has changed since we last checked
bool check_for_err_code_if_changed(char* msg_txt, uint8_t msg_len);