コード例 #1
0
/**
 * @brief CheckAdcStatusFail
 *
 *  Check ADC status is fail or not
 *
 * @para  pUg31xx address of SystemDataType
 * @return  _UPI_TRUE_ if fail
 */
_upi_bool_ CheckAdcStatusFail(SystemDataType *data)
{
  API_I2C_Read(NORMAL, 
               UG31XX_I2C_HIGH_SPEED_MODE, 
               UG31XX_I2C_TEM_BITS_MODE, 
               REG_COUNTER_LOW, 
               REG_COUNTER_HIGH - REG_COUNTER_LOW + 1, 
               (unsigned char *)&data->adcCheckData.regCounter);

  API_I2C_Read(NORMAL, 
               UG31XX_I2C_HIGH_SPEED_MODE, 
               UG31XX_I2C_TEM_BITS_MODE, 
               REG_AVE_VBAT1_LOW, 
               REG_AVE_VBAT1_HIGH - REG_AVE_VBAT1_LOW + 1, 
               (unsigned char *)&data->adcCheckData.regVbat1Ave);

  /// [AT-PM] : Compare counter register ; 01/27/2013
  if(data->adcCheckData.regCounter == data->adcCheckData.lastCounter)
  {
    data->adcCheckData.failCounterCurrent = data->adcCheckData.failCounterCurrent + 1;
    UG31_LOGI("[%s]: Counter fixed (%d) ... %d\n", __func__,
              data->adcCheckData.regCounter, data->adcCheckData.failCounterCurrent);
  }
  else
  {
    data->adcCheckData.failCounterCurrent = 0;
  }
  data->adcCheckData.lastCounter = data->adcCheckData.regCounter;

  /// [AT-PM] : Compre VBat1 register ; 01/27/2013
  if(data->adcCheckData.regVbat1Ave == data->adcCheckData.lastVBat1Ave)
  {
    data->adcCheckData.failCounterVoltage = data->adcCheckData.failCounterVoltage + 1;
    UG31_LOGI("[%s]: VBat1 fixed (%d) ... %d\n", __func__,
              data->adcCheckData.regVbat1Ave, data->adcCheckData.failCounterVoltage);
  }
  else
  {
    data->adcCheckData.failCounterVoltage = 0;
  }
  data->adcCheckData.lastVBat1Ave = data->adcCheckData.regVbat1Ave;

  /// [AT-PM] : Check ADC fail criteria ; 01/27/2013
  if(data->adcCheckData.failCounterCurrent > ADC_FAIL_CRITERIA)
  {
    data->adcCheckData.failCounterCurrent = 0;
    return (_UPI_TRUE_);
  }
  if(data->adcCheckData.failCounterVoltage > ADC_FAIL_CRITERIA)
  {
    data->adcCheckData.failCounterVoltage = 0;
    return (_UPI_TRUE_);
  }
  return (_UPI_FALSE_);
}	
コード例 #2
0
/**
 * @brief DecimateRst
 *
 *  Decimate reset filter of ADC
 *
 * @return  _UPI_NULL_
 */
void DecimateRst(void)
{
  _sys_u8_ tmp8;

  tmp8 = 0x00;
  API_I2C_Read(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1, &tmp8);
  tmp8 = tmp8 & (~ALARM_EN_DECIMATE_RST);
  API_I2C_Write(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1, &tmp8);
  tmp8 = tmp8 | ALARM_EN_DECIMATE_RST;
  API_I2C_Write(NORMAL, UG31XX_I2C_HIGH_SPEED_MODE, UG31XX_I2C_TEM_BITS_MODE, REG_ALARM_EN, 1,  &tmp8);
  UG31_LOGI("[%s]: DECIMATE_RST\n", __func__);
}
コード例 #3
0
/**
 * @brief UpiRestoreData
 *
 *  Restore data from system to IC routine
 *
 * @para  data  address of BackupDataType
 * @return  BACKUP_BOOL_TRUE if success
 */
_backup_bool_ UpiRestoreData(BackupDataType *data)
{
  _backup_bool_ rtn;
  _backup_u32_ driverVer;
  SystemDataType *orgSysData;
  _backup_s32_ tmp32;

  /// [AT-PM] : Create buffer ; 02/21/2013
  #ifndef UG31XX_SHELL_ALGORITHM
    orgSysData = &CheckBackupFile_orgSysData;
  #else   ///< else of UG31XX_SHELL_ALGORITHM
    orgSysData = (SystemDataType *)upi_malloc(sizeof(SystemDataType));
  #endif  ///< end of UG31XX_SHELL_ALGORITHM
  upi_memcpy(orgSysData, ptrSysData, sizeof(SystemDataType));

  /// [AT-PM] : Get data from file ; 02/21/2013
  #if defined (uG31xx_OS_WINDOWS)
  rtn = read_backup_file(data->backupFileName, data->backupBuffer, data->backupBufferSize);
  #else  ///< else of defined (uG31xx_OS_WINDOWS)
  rtn = read_backup_file(ptrBackupFileName, data->backupBuffer, data->backupBufferSize);
  #endif ///< end of defined (uG31xx_OS_WINDOWS)
  if(rtn == _UPI_FALSE_)
  {
    UG31_LOGE("[%s]: Read data from backup file fail.\n", __func__);
    #ifdef  UG31XX_SHELL_ALGORITHM
      upi_free(orgSysData);
    #endif  ///< end of UG31XX_SHELL_ALGORITHM
    return (BACKUP_BOOL_FALSE);
  }
  driverVer = ConvertData(data);
  UG31_LOGI("[%s]: Driver version = %d\n", __func__, (int)driverVer);

  /// [AT-PM] : Keep following information ; 01/22/2014
  ptrSysData->timeTagFromIC = orgSysData->timeTagFromIC;
  ptrSysData->tableUpdateIdxFromIC = orgSysData->tableUpdateIdxFromIC;

  /// [AT-PM] : Check abnormal condition ; 01/22/2014
  if((data->backupVolt1 != 0) && (data->backupVolt2 != 0))
  {
    tmp32 = (_backup_s32_)data->backupVolt1;
    tmp32 = tmp32 - data->backupVolt2;
    if((tmp32 < RESTORE_ABNORMAL_VOLT_RANGE_UPBND) && (tmp32 > RESTORE_ABNORMAL_VOLT_RANGE_LWBND))
    {
      ptrSysData->rmFromIC = orgSysData->rmFromIC;
      ptrSysData->fccFromIC = orgSysData->fccFromIC;
      ptrSysData->rsocFromIC = orgSysData->rsocFromIC;
    }
  }
  #ifdef  UG31XX_SHELL_ALGORITHM
    upi_free(orgSysData);
  #endif  ///< end of UG31XX_SHELL_ALGORITHM
  return (BACKUP_BOOL_TRUE);
}
コード例 #4
0
/**
 * @brief UpiBackupVoltage
 *
 *  Backup voltage points for abnormal battery checking
 *
 * @para  data  address of BackupDataType
 * @return  NULL
 */
void UpiBackupVoltage(BackupDataType *data)
{
  _backup_s32_ tmp32;

  /// [AT-PM] : Cumulate delta Q ; 01/22/2014
  tmp32 = (_backup_s32_)data->measData->stepCap;
  tmp32 = tmp32*data->measData->curr;
  if(tmp32 < 0)
  {
    tmp32 = 0;
  }
  else
  {
    tmp32 = (_backup_s32_)data->measData->stepCap;
  }
  tmp32 = tmp32 + data->backupDeltaQ;
  data->backupDeltaQ = (_backup_u16_)tmp32;

  /// [AT-PM] : Update voltage point 1 ; 01/22/2014
  data->backupVolt1 = (_backup_u16_)data->measData->bat1Voltage;
  UG31_LOGN("[%s]: Update backup voltage point 1 = %d (%d)\n", __func__, data->backupVolt1, data->backupDeltaQ);
  
  /// [AT-PM] : Check delta Q ; 01/22/2014
  tmp32 = data->sysData->ggbParameter->ILMD;
  tmp32 = tmp32*BACKUP_VOLTAGE_DELTA_Q_THRESHOLD/CONST_PERCENTAGE;
  if(data->backupDeltaQ < 0)
  {
    tmp32 = tmp32*(-1);
    if(data->backupDeltaQ > tmp32)
    {
      UG31_LOGN("[%s]: data->backupDeltaQ not reach threshold %d\n", __func__, tmp32);
      return;
    }
  }
  else
  {
    if(data->backupDeltaQ < tmp32)
    {
      UG31_LOGN("[%s]: data->backupDeltaQ not reach threshold %d\n", __func__, tmp32);
      return;
    }
  }

  /// [AT-PM] : Update voltage point 2 ; 01/22/2014
  data->backupVolt2 = data->backupVolt1;
  data->backupDeltaQ = 0;
  UG31_LOGI("[%s]: Update backup voltage point 2 = %d (%d)\n", __func__, data->backupVolt1, data->backupDeltaQ);
}
コード例 #5
0
/**
 * @brief ConvertData
 *
 *  Convert data from buffer
 *
 * @para  data  address of BackupDataType structure
 * @return  driver version
 */
_backup_u32_ ConvertData(BackupDataType *data)
{
  _backup_u8_ *ptr;
  _backup_u32_ driverVer;

  ptr = data->backupBuffer;
  upi_memcpy((_backup_u8_ *)data->capData->encriptTable, ptr, (_upi_u32_)data->capData->tableSize);
  ptr = ptr + data->capData->tableSize;
  upi_memcpy((_backup_u8_ *)&data->sysData->rmFromIC, ptr, sizeof(data->sysData->rmFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->rmFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->fccFromIC, ptr, sizeof(data->sysData->fccFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->fccFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->timeTagFromIC, ptr, sizeof(data->sysData->timeTagFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->timeTagFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->tableUpdateIdxFromIC, ptr, sizeof(data->sysData->tableUpdateIdxFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->tableUpdateIdxFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->deltaCapFromIC, ptr, sizeof(data->sysData->deltaCapFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->deltaCapFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->adc1ConvTime, ptr, sizeof(data->sysData->adc1ConvTime)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->adc1ConvTime)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->rsocFromIC, ptr, sizeof(data->sysData->rsocFromIC)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->rsocFromIC)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->cycleCount, ptr, sizeof(data->sysData->cycleCount)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->cycleCount)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->ccOffset, ptr, sizeof(data->sysData->ccOffset)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->ccOffset)/sizeof(_backup_u8_);
  upi_memcpy((_backup_u8_ *)&data->sysData->predictRsoc, ptr, sizeof(data->sysData->predictRsoc)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->predictRsoc)/sizeof(_backup_u8_);  
  upi_memcpy((_backup_u8_ *)&data->sysData->standbyDsgRatio, ptr, sizeof(data->sysData->standbyDsgRatio)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->sysData->standbyDsgRatio)/sizeof(_backup_u8_);  
  upi_memcpy((_backup_u8_ *)&data->backupVolt1, ptr, sizeof(data->backupVolt1)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->backupVolt1)/sizeof(_backup_u8_);  
  upi_memcpy((_backup_u8_ *)&data->backupVolt2, ptr, sizeof(data->backupVolt2)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->backupVolt2)/sizeof(_backup_u8_);  
  upi_memcpy((_backup_u8_ *)&data->capData->preDsgCharge, ptr, sizeof(data->capData->preDsgCharge)/sizeof(_backup_u8_));
  ptr = ptr + sizeof(data->capData->preDsgCharge)/sizeof(_backup_u8_);  
  upi_memcpy(&data->backupCustomerSelfDef[0], ptr, CELL_PARAMETER_STRING_LENGTH);
  ptr = ptr + CELL_PARAMETER_STRING_LENGTH;
  upi_memcpy(&data->backupProjectSelfDef[0], ptr, CELL_PARAMETER_STRING_LENGTH);
  ptr = ptr + CELL_PARAMETER_STRING_LENGTH;
  upi_memcpy((_backup_u8_ *)&driverVer, ptr, sizeof(driverVer)/sizeof(_backup_u8_));
  UG31_LOGI("[%s]: Read driver version = %d (%d)\n", __func__, (int)driverVer, UG31XX_DRIVER_VERSION);
  return (driverVer);
}