#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#include "../Config.h"
#include "../Log/log.h"
#include "../ShareMemory/shmMem.h"
#include "../Define/define.h"

//------------------------------------------------------------------------------
void ClearAbnormalStatus_Chademo(uint8_t gun_index)
{
    bool isCleanCheck = false;
    char code[7];
    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
    struct InfoCodeData *pInfoCode = (struct InfoCodeData *)GetShmInfoCodeData();
    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun_index);

    if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "", 6) == EQUAL) {
        return;
    }

    if (true) {
        if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023700", 6) == EQUAL &&
                pInfoCode->InfoEvents.bits.ChademoEvCommFail == YES) {
            memcpy(code, "023700", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023704", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryMalfun == YES) {
            memcpy(code, "023704", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023705", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoNoPermission == YES) {
            memcpy(code, "023705", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023706", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryIncompatibility == YES) {
            memcpy(code, "023706", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023707", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryOVP == YES) {
            memcpy(code, "023707", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023708", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryUVP == YES) {
            memcpy(code, "023708", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023709", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryOTP == YES) {
            memcpy(code, "023709", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023710", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryCurrentDiff == YES) {
            memcpy(code, "023710", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023711", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryVoltageDiff == YES) {
            memcpy(code, "023711", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023712", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoShiftPosition == YES) {
            memcpy(code, "023712", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023713", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBatteryOtherFault == YES) {
            memcpy(code, "023713", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023714", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoChargingSystemError == YES) {
            memcpy(code, "023714", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023715", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoEvNormalStop == YES) {
            memcpy(code, "023715", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023716", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoTempSensorBroken == YES) {
            memcpy(code, "023716", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023717", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoConnectorLockFail == YES) {
            memcpy(code, "023717", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023718", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoD1OnNoReceive == YES) {
            memcpy(code, "023718", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023719", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsKtoJTimeout == YES) {
            memcpy(code, "023719", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023720", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsChargeAllowTimeout == YES) {
            memcpy(code, "023720", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023721", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoWaitGfdTimeout == YES) {
            memcpy(code, "023721", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023722", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsEvRelayTimeout == YES) {
            memcpy(code, "023722", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023723", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsReqCurrentTimeout == YES) {
            memcpy(code, "023723", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023724", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsKtoJOffTimeout == YES) {
            memcpy(code, "023724", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023725", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsEvRelayOffTimeout == YES) {
            memcpy(code, "023725", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023726", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoAdcMoreThan10V == YES) {
            memcpy(code, "023726", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023727", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoAdcMoreThan20V == YES) {
            memcpy(code, "023727", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023728", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoBmsChargeBeforeStop == YES) {
            memcpy(code, "023728", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023729", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoChargerGetNormalStop == YES) {
            memcpy(code, "023729", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023730", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoChargerGetEmergencyStop == YES) {
            memcpy(code, "023730", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023731", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoIsolationResultFail == YES) {
            memcpy(code, "023731", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023732", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoMissLinkWithMotherBoard == YES) {
            memcpy(code, "023732", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023733", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoOutputVolMoreThanLimit == YES) {
            memcpy(code, "023733", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023734", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoReqCurrentMoreThanLimit == YES) {
            memcpy(code, "023734", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023735", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed == YES) {
            memcpy(code, "023735", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        } else if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "023736", 6) == EQUAL &&
                   pInfoCode->InfoEvents.bits.ChademoChargeRemainCountDown == YES) {
            memcpy(code, "023736", 6);
            memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
            isCleanCheck = true;
        }
    }

    if (isCleanCheck) {
        for (uint8_t index = 0; index < pSysConfig->TotalConnectorCount; index++) {
            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);

            if (index != gun_index || pSysConfig->TotalConnectorCount == 1) {
                log_info("CHA clean error : index = %d, EvConnAlarmCode = %s, code = %s \n",
                         index,
                         pDcChargingInfo->EvConnAlarmCode,
                         code);

                if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, code, 6) != EQUAL) {
                    if (strncmp(code, "023700", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoEvCommFail = NO; }
                    if (strncmp(code, "023704", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryMalfun = NO; }
                    if (strncmp(code, "023705", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoNoPermission = NO; }
                    if (strncmp(code, "023706", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryIncompatibility = NO; }
                    if (strncmp(code, "023707", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryOVP = NO; }
                    if (strncmp(code, "023708", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryUVP = NO; }
                    if (strncmp(code, "023709", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryOTP = NO; }
                    if (strncmp(code, "023710", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryCurrentDiff = NO; }
                    if (strncmp(code, "023711", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryVoltageDiff = NO; }
                    if (strncmp(code, "023712", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoShiftPosition = NO; }
                    if (strncmp(code, "023713", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBatteryOtherFault = NO; }
                    if (strncmp(code, "023714", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoChargingSystemError = NO; }
                    if (strncmp(code, "023715", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoEvNormalStop = NO; }
                    if (strncmp(code, "023716", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoTempSensorBroken = NO; }
                    if (strncmp(code, "023717", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoConnectorLockFail = NO; }
                    if (strncmp(code, "023718", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoD1OnNoReceive = NO; }
                    if (strncmp(code, "023719", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsKtoJTimeout = NO; }
                    if (strncmp(code, "023720", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsChargeAllowTimeout = NO; }
                    if (strncmp(code, "023721", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoWaitGfdTimeout = NO; }
                    if (strncmp(code, "023722", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsEvRelayTimeout = NO; }
                    if (strncmp(code, "023723", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsReqCurrentTimeout = NO; }
                    if (strncmp(code, "023724", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsKtoJOffTimeout = NO; }
                    if (strncmp(code, "023725", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsEvRelayOffTimeout = NO; }
                    if (strncmp(code, "023726", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoAdcMoreThan10V = NO; }
                    if (strncmp(code, "023727", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoAdcMoreThan20V = NO; }
                    if (strncmp(code, "023728", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoBmsChargeBeforeStop = NO; }
                    if (strncmp(code, "023729", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoChargerGetNormalStop = NO; }
                    if (strncmp(code, "023730", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoChargerGetEmergencyStop = NO; }
                    if (strncmp(code, "023731", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoIsolationResultFail = NO; }
                    if (strncmp(code, "023732", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoMissLinkWithMotherBoard = NO; }
                    if (strncmp(code, "023733", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoOutputVolMoreThanLimit = NO; }
                    if (strncmp(code, "023734", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoReqCurrentMoreThanLimit = NO; }
                    if (strncmp(code, "023735", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoReCapBmsEqrCurrentExceed = NO; }
                    if (strncmp(code, "023736", 6) == EQUAL) { pInfoCode->InfoEvents.bits.ChademoChargeRemainCountDown = NO; }
                }
            }
        }
    }

    if (strncmp((char *)pDcChargingInfo->EvConnAlarmCode, "", 6) != EQUAL) {
        memcpy(pDcChargingInfo->EvConnAlarmCode, "", 6);
    }
}