/*@!Encoding:936*/
includes
{
  //#include "VH1160.cin"
  #include "DiagService.can"
}

variables
{

}

on prestart
{
  /*PhyAddr = @FBLFlash::PhyAddress;
  FuncAddr = @FBLFlash::FuncAddress;
  RespAddr = @FBLFlash::RespAddress;*/
  GetPCDate();
  InitDownLoadProgress();
}

on sysvar FBLFlash::FingerPrint_UsePCDate
{
  if(@this==1)
  {
    GetPCDate();
  }
}

void GetPCDate()
{
  long tm[9];
  getLocalTime(tm);
  @FBLFlash::FingerPrint_ProgrammingDateYear = tm[5]-100;
  @FBLFlash::FingerPrint_ProgrammingDateMonth = tm[4]+1;
  @FBLFlash::FingerPrint_programmingDateDay = tm[3];
}

testfunction Initialization()
{
  PhyAddr = @FBLFlash::PhyAddress;
  FuncAddr = @FBLFlash::FuncAddress;
  RespAddr = @FBLFlash::RespAddress;
  
  CRC16BUF_DRIVER[0] = (@FBLFlash::DriverCRC32Val>>8)&0xFF;
  CRC16BUF_DRIVER[1] = (@FBLFlash::DriverCRC32Val)&0xFF;
  
  CRC16BUF_APP[0] = (@FBLFlash::AppCRC32Val>>8)&0xFF;
  CRC16BUF_APP[1] = (@FBLFlash::AppCRC32Val)&0xFF;
  
  CRC16BUF_FBL[0] = (@FBLFlash::FblCRC32Val>>8)&0xFF;
  CRC16BUF_FBL[1] = (@FBLFlash::FblCRC32Val)&0xFF;
  
  CRC16BUF_CAL[0] = (@FBLFlash::CalCRC32Val>>8)&0xFF;
  CRC16BUF_CAL[1] = (@FBLFlash::CalCRC32Val)&0xFF;
  
  InitFlags();
}

testfunction SecurityAccessValidTest()
{
  //testStep("", "测试27服务");
  SecurityAccess(4);
}

void testCaseStart(char log[], char logName[])
{
  /*setLogFileName(log, logName);*/
  DUTPowerOn();
  testWaitForTimeout(2*1000);
}

/// <UDS_TEST>
testcase UNIT_TEST()
{
  testCaseTitle("UDS 31", "读文件测试");
  testCaseStart("UDS 31", "读文件测试");
  SecurityAccess(4);
  testCaseEnd();
}

void testCaseEnd()
{
  stopLogging();
  
  DUTPowerOff();
}

testfunction Test_PreconditionCheckTest()
{
  int result;
  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  //发送NM报文，唤醒APP
  CanSendNM();
  testWaitForTimeout(500);
  CanSendNM();
  
  testStep("", "执行预编程流程");
    if(gSkipExtendedSession == 0){
    result = SessionControl(0x03, PhyAddr);
    if(result == 1)
    {
      testStepPass("", "成功进入扩展会话模式");
    }
    else
    {
      testStepFail("", "进入扩展会话模式失败");
      return;
    }
  }
  else
  {
    testStepPass("", "跳过进入扩展会话模式");
  }    
  
  if(gSkipCheckProgrammingPrecondition == 0){
    result = checkProgrammingPreconditions();
    if(result == 1)
    {
      testStepPass("", "执行检查编程预条件成功");
    }
    else{
      testStepFail("", "执行检查编程预条件失败");
      return;
    }
  }
  else{
    testStepPass("", "跳过执行检查编程预条件");
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_DownloadwithDriverFileError()
{
  int result;
  
  gDownloadwithDriverFileError = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_AppliacationInvalidFlashTest()
{ 
  int result;
  gAppliacationInvalidFlashTest = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_TransferDataTest()
{ 
  int result;
  gTransferLessThanMaxNumber = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_DownloadwithAppFileOnly()
{  
  int result;
  gDownloadwithAppFileOnly = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_ReadFingerPrintAfterFlash()
{
  int result;
  
  gReadFingerPrintAfterFlash = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  if(gReadFingerPrintAfterFlash == 1)
  {
    testStep("", "刷写完成后，进入FBL，读取写入的指纹");  
    APPJumpToFBL();
    result = readFingerPrint();
    if(result == 1)
    {
      testStepPass("", "读取指纹信息成功");
    }
    else
    {
      testStepFail("", "读取指纹信息失败");
    }
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_RobustnessTest()
{
  int result;
  /* 开启 3E 80 100ms周期送信 */
  sysSetVariableInt("FBLFlash","TesterPresentFlag",0);

  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
  /* 关闭 3E 80 100ms周期送信 */
  sysSetVariableInt("FBLFlash","TesterPresentFlag",1);
}

testfunction Test_DownloadwithAppFileError()
{
  int result;
  
  gDownloadwithAppFileError = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_FlashValidTest()
{
  int result;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_FlashValidTest_FBL()
{
  int result;
  gUpgradeFromFBL = 1;
  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  testWaitForTimeout(5000);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(1000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
  testWaitForTimeout(5000);
}

testfunction Test_ComInterruptBeforeErase()
{
  int result;
  gComInterruptBeforeErase = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_CalibrationDataFlashSeparately()
{
  int result;
  gDownloadwithAppFileOnly = 1;
  gDownloadwithFblFileOnly = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_ComInterruptDuringTransfer()
{
  int result;
  gComInterruptDuringTransfer = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipDownloadFlashDriver()
{
  int result;
  gSkipDownloadFlashDriver = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipCheckProgrammingPrecondition()
{
  int result;
  
  gSkipCheckProgrammingPrecondition = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SkipProgrammingSession()
{
  int result;
  
  gSkipProgrammingSession = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SkipSecurityAccess()
{
  int result;
  
  gSkipSecurityAccess = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SecurityAccessFail()
{
  int result;
  
  gSecurityAccessFail = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SkipFingerPrint()
{
  int result;
  
  gSkipFingerPrint = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SkipDownloadFlashDriverAndCheckMemory()
{
  int result;
  gDownloadwithDriverFileOnly = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipEraseMemory()
{
  int result;
  gSkipEraseMemory = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipRequestDownload()
{ 
   int result;
  gSkipRequestDownload = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_TransferPartialData()
{
  int result;
  gTransferPartialData = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_SkipPartialDataDuring36()
{
  int result;
  gSkipPartialDataDuring36 = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipTransmitData()
{ 
  int result;
  gSkipTransmitData = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_CheckMemoryError()
{
  int result;
  gCheckMemoryError = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_LostTransferData()
{
  int result;
  gLostTransferData = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  if(gSkipCheckProgrammingDependencies == 0)
  {
    result = checkProgrammingDependencies();
    if(result == 1)
    {
      testStepPass("", "检查编程依赖性满足条件");
    }
    else
    {
      testStepFail("", "检查编程依赖性不满足条件");
    }
  }
  else
  {
    testStepPass("", "跳过检查编程依赖性");
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_SkipBlockNumber2()
{
  int result;
  gSkipBlockNumber2 = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_BlockLengthTest()
{
  int result;
  gBlockLengthTest = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_DriverAddressInvalid()
{
  int result;
  gDriverAddressInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_DriverLengthInvalid()
{
  int result;
  gDriverLengthInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_EraseAddressInvalid()
{
  int result;
  gEraseAddressInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_FlashAddressInvalid()
{
  int result;
  gFlashAddressInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_FlashLengthInvalid()
{
  int result;
  gFlashLengthInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_EraseLengthInvalid()
{
  int result;
  gEraseLengthInvalid = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}

testfunction Test_ReadBootDIDInfo()
{
  gUpgradeFromFBL = 0; 
  APPJumpToFBL();
  sysSetVariableInt("FBLFlash","LogEnable",1);
  readBootDIDInfo();
  sysSetVariableInt("FBLFlash","LogEnable",0);
}

testfunction Test_RepeatTransferData()
{
  int result;
  gRepeatTransferData = 1;
  gUpgradeFromFBL = 0;  
  sysSetVariableInt("FBLFlash","LogEnable",1);
  
  testStep("", "执行文件有效性检查");
  result = ProgramPrepare();
  if(result != 1){
    return;
  }
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testWaitForTimeout(3000);
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
  
  sysSetVariableInt("FBLFlash","LogEnable",0); 
}


testfunction Test_SkipCheckProgrammingDependencies()
{
  int result;
  
  gSkipCheckProgrammingDependencies = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_SkipCheckProgrammingIntegrity()
{
  int result;
  
  gSkipCheckProgrammingIntegrity = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_CheckProgrammingIntegrity_CrcError()
{
  int result;
  
  gCheckProgrammingIntegrity_CrcError = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_DownloadwithValidApp_9v()
{
  int result;
  
  SetOutputVoltValue(9);
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_DownloadwithValidApp_16v()
{
  int result;
  
  SetOutputVoltValue(16);
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_PoweroffDuringEraseMemory()
{
  int result;
  
  gPoweroffDuringEraseMemory = 1;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_PoweroffDuringFlashProgress10Percent()
{
  int result;
  
  gPoweroffDuringFlashProgressPercent = 10;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_PoweroffDuringFlashProgress50Percent()
{
  int result;
  
  gPoweroffDuringFlashProgressPercent = 50;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}

testfunction Test_PoweroffDuringFlashProgress80Percent()
{
  int result;
  
  gPoweroffDuringFlashProgressPercent = 80;
  
  testStep("", "执行预编程流程");
  result = PreProgramming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行主编程流程");
  result = Programming();
  if(result != 1){
    return;
  }
  
  testStep("", "执行后编程流程");
  result = PostProgramming();
  if(result != 1){
    return;
  }
}


/// <TG1>
testcase TG1_TC0_FlashValidTest()
{
  testCaseTitle("2.0", "刷写正常测试");
  testCaseStart("2.0", "刷写正常测试");

  /* start flash program from App */
  Test_FlashValidTest();

  testCaseEnd();
}

/// <TG1>
testcase TG1_TC0_FlashValidTest_FBL()
{
  testCaseTitle("2.0", "从FBL开始刷写测试");
  testCaseStart("2.0", "从FBL开始刷写测试");
  
  /* start flash program from fbl */
  Test_FlashValidTest_FBL();

  testCaseEnd();
}

/// <TG1>
testcase TG1_TC2_AppliacationInvalidFlashTest()
{
  testCaseTitle("1.2", "应用程序无效时正常刷写测试");
  testCaseStart("1.2", "应用程序无效时正常刷写测试");
  
  Test_AppliacationInvalidFlashTest();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC3_DownloadwithAppFileOnly()
{
  testCaseTitle("1.3", "单独下载App文件");
  testCaseStart("1.3", "单独下载App文件");
  
  Test_DownloadwithAppFileOnly();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC4_DownloadwithAppFileError()
{
  testCaseTitle("1.4", "下载App文件错误");
  testCaseStart("1.4", "下载App文件错误");
  
  Test_DownloadwithAppFileError();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC5_CalibrationDataFlashSeparately()
{
  testCaseTitle("1.5", "标定数据单独刷写测试");
  testCaseStart("1.5", "标定数据单独刷写测试");
  
  Test_CalibrationDataFlashSeparately();

  testCaseEnd(); 
}

/// <TG1>
testcase TG1_TC7_FingerprintInformationData()
{
  testCaseTitle("1.7", "刷写后指纹信息读取测试");
  testCaseStart("1.7", "刷写后指纹信息读取测试");
  
  Test_ReadFingerPrintAfterFlash();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC8_RobustnessTest()
{
  testCaseTitle("1.8", "鲁棒性测试");
  testCaseStart("1.8", "鲁棒性测试");
  
  Test_RobustnessTest();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC9_TransferDataTest()
{
  testCaseTitle("1.9", "Transfer Data 测试");
  testCaseStart("1.9", "Transfer Data 测试");
  
  Test_TransferDataTest();
  
  testCaseEnd();
}

/// <TG1>
testcase TG1_TC11_PreconditionCheckTest()
{
  testCaseTitle("1.10", "前置条件检查测试(NT3)");
  testCaseStart("1.10", "前置条件检查测试(NT3)");
  
  Test_PreconditionCheckTest();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC4_ComInterruptBeforeErase()
{
  testCaseTitle("2.4", "例程擦除前通信中断测试");
  testCaseStart("2.4", "例程擦除前通信中断测试");
  
  Test_ComInterruptBeforeErase();

  testCaseEnd();
}

/// <TG2>
testcase TG2_TC6_ComInterruptDuringTrans()
{
  testCaseTitle("2.6", "应用数据传输中通信中断测试");
  testCaseStart("2.6", "应用数据传输中通信中断测试");
  
  Test_ComInterruptDuringTransfer();

  testCaseEnd();
}

/// <TG2>
testcase TG2_TC7_1_SkipDownloadFlashDriver()
{
  testCaseTitle("2.7-1", "跳过FlashDriver刷写，直接请求CheckMemory");
  testCaseStart("2.7-1", "跳过FlashDriver刷写，直接请求CheckMemory");
  
  Test_SkipDownloadFlashDriver();

  testCaseEnd();
}

/// <TG2>
testcase TG2_TC7_2_SkipDownloadFlashDriverAndCheckMemory()
{
  testCaseTitle("2.7-2", "跳过FlashDriver刷写和CheckMemory，直接请求擦除");
  testCaseStart("2.7-2", "跳过FlashDriver刷写和CheckMemory，直接请求擦除");
  
  Test_SkipDownloadFlashDriverAndCheckMemory();

  testCaseEnd();
}

/// <TG2>
testcase TG2_TC8_SkipEraseMemory()
{
  testCaseTitle("2.8", "跳过擦除Memory");
  testCaseStart("2.8", "跳过擦除Memory");
  
  Test_SkipEraseMemory();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC9_SkipRequestDownload()
{
  testCaseTitle("2.9", "跳过请求下载");
  testCaseStart("2.9", "跳过请求下载");
  
  Test_SkipRequestDownload();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC10_1_TransferPartialData()
{
  testCaseTitle("2.10-1", "传输一段数据，直接$37退出传输");
  testCaseStart("2.10-1", "传输一段数据，直接$37退出传输");
  
  Test_TransferPartialData();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC10_2_SkipPartialDataDuring36()
{
  testCaseTitle("2.10-2", "跳过一段数据，直接36进行剩数据传输");
  testCaseStart("2.10-2", "跳过一段数据，直接36进行剩数据传输");
  
  Test_SkipPartialDataDuring36();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC10_3_SkipTransferData()
{
  testCaseTitle("2.10-3", "跳过传输数据，直接37退出传输");
  testCaseStart("2.10-3", "跳过传输数据，直接37退出传输");
  
  Test_SkipTransmitData();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC11_1_CheckMemoryError()
{
  testCaseTitle("2.11-1", "CheckMemory错误后，请求编程依赖性检查");
  testCaseStart("2.11-1", "CheckMemory错误后，请求编程依赖性检查");
  
  Test_CheckMemoryError();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC11_2_LostTransferData()
{
  testCaseTitle("2.11-2", "传输数据丢失，请求编程依赖性检查");
  testCaseStart("2.11-2", "传输数据丢失，请求编程依赖性检查");
  
  Test_LostTransferData();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC12_SkipBlockNumber2()
{
  testCaseTitle("2.12", "传输完block1，跳过block2，传输block3");
  testCaseStart("2.12", "传输完block1，跳过block2，传输block3");
  
  Test_SkipBlockNumber2();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC13_BlockLengthTest()
{
  testCaseTitle("2.13", "传输数据长度大于MaxNumberOfBlockLength");
  testCaseStart("2.13", "传输数据长度大于MaxNumberOfBlockLength");
  
  Test_BlockLengthTest();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC14_1_DriverAddressInvalid()
{
  testCaseTitle("2.14-1", "请求刷写flash driver地址无效");
  testCaseStart("2.14-1", "请求刷写flash driver地址无效");
  
  Test_DriverAddressInvalid();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC14_2_DriverLengthInvalid()
{
  testCaseTitle("2.14-2", "请求刷写flash driver大小无效");
  testCaseStart("2.14-2", "请求刷写flash driver大小无效");
  
  Test_DriverLengthInvalid();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC15_1_EraseAddressInvalid()
{
  testCaseTitle("2.15-1", "请求擦除地址无效");
  testCaseStart("2.15-1", "请求擦除地址无效");
  
  Test_EraseAddressInvalid();
  
  testCaseEnd();  
}

/// <TG2>
testcase TG2_TC15_2_EraseLengthInvalid()
{
  testCaseTitle("2.15-2", "请求擦除大小无效");
  testCaseStart("2.15-2", "请求擦除大小无效");
  
  Test_EraseLengthInvalid();
  
  testCaseEnd();  
}

/// <TG2>
testcase TG2_TC15_3_FlashAddressInvalid()
{
  testCaseTitle("2.15-3", "请求刷写地址无效");
  testCaseStart("2.15-3", "请求刷写地址无效");
  
  Test_FlashAddressInvalid();
  
  testCaseEnd(); 
}

/// <TG2>
testcase TG2_TC15_4_FlashLengthInvalid()
{
  testCaseTitle("2.15-4", "请求刷写大小无效");
  testCaseStart("2.15-4", "请求刷写大小无效");
  
  Test_FlashLengthInvalid();
  
  testCaseEnd();  
}

/// <TG2>
testcase TG2_TC18_ReadBootDIDInfo()
{
  testCaseTitle("2.18", "BOOT下读取boot号和硬件版本好");
  testCaseStart("2.18", "BOOT下读取boot号和硬件版本好");
  
  Test_ReadBootDIDInfo();
  
  testCaseEnd();
}

/// <TG2>
testcase TG2_TC20_RepeatTransferData()
{
  testCaseTitle("2.20", "发送两次36 01 xx");
  testCaseStart("2.20", "发送两次36 01 xx");
  
  Test_RepeatTransferData();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC1_NormalStressFlashTest()
{
  byte i;
  testCaseTitle("3.1", "正常压力测试");
  testCaseStart("3.1", "正常压力测试");
  
  for(i = 0; i < 100; i++)
  {
    Test_FlashValidTest();
    testWaitForTimeout(2000);
  }
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC2_SkipProgrammingSession()
{
  testCaseTitle("3.2", "跳过编程会话模式");
  testCaseStart("3.2", "跳过编程会话模式");
  
  Test_SkipProgrammingSession();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC3_SkipSecurityAccess()
{
  testCaseTitle("3.3", "跳过安全访问");
  testCaseStart("3.3", "跳过安全访问");
  
  Test_SkipSecurityAccess();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC4_SecurityAccessFail()
{
  testCaseTitle("3.4", "安全访问失败");
  testCaseStart("3.4", "安全访问失败");
  
  Test_SecurityAccessFail();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC5_SkipFingerPrint()
{
  testCaseTitle("3.5", "跳过指纹信息写入");
  testCaseStart("3.5", "跳过指纹信息写入");
  
  Test_SkipFingerPrint();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC6_SkipDownloadFlashDriver()
{
  testCaseTitle("3.6", "跳过下载Driver文件");
  testCaseStart("3.6", "跳过下载Driver文件");
  
  Test_SkipDownloadFlashDriver();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC10_SkipCheckProgrammingDependencies()
{
  testCaseTitle("3.10", "跳过检查编程依赖性");
  testCaseStart("3.10", "跳过检查编程依赖性");
  
  Test_SkipCheckProgrammingDependencies();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC11_SkipCheckProgrammingIntegrity()
{
  testCaseTitle("3.11", "跳过检查编程完整性");
  testCaseStart("3.11", "跳过检查编程完整性");
  
  Test_SkipCheckProgrammingIntegrity();
  
  testCaseEnd();
}

/// <TG3>
testcase TG3_TC12_CheckProgrammingIntegrity_CrcError()
{
  testCaseTitle("3.12", "检查编程完整性中crc错误");
  testCaseStart("3.12", "检查编程完整性中crc错误");
  
  Test_CheckProgrammingIntegrity_CrcError();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC1_DownloadwithValidApp_9v()
{
  testCaseTitle("4.1", "在9V电压下下载有效的App文件");
  testCaseStart("4.1", "在9V电压下下载有效的App文件");
  
  Test_DownloadwithValidApp_9v();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC2_DownloadwithValidApp_16v()
{
  testCaseTitle("4.2", "在16V电压下下载有效的App文件");
  testCaseStart("4.2", "在16V电压下下载有效的App文件");
  
  Test_DownloadwithValidApp_16v();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC3_PoweroffDuringEraseMemory()
{
  testCaseTitle("4.3", "在擦除Memory时断开电源");
  testCaseStart("4.3", "在擦除Memory时断开电源");
  
  Test_PoweroffDuringEraseMemory();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC4_PoweroffDuringFlashProgress10Percent()
{
  testCaseTitle("4.4", "在App文件下载到10%时断开电源");
  testCaseStart("4.4", "在App文件下载到10%时断开电源");
  
  Test_PoweroffDuringFlashProgress10Percent();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC5_PoweroffDuringFlashProgress50Percent()
{
  testCaseTitle("4.5", "在App文件下载到50%时断开电源");
  testCaseStart("4.5", "在App文件下载到50%时断开电源");
  
  Test_PoweroffDuringFlashProgress50Percent();
  
  testCaseEnd();
}

/// <TG4>
testcase TG4_TC6_PoweroffDuringFlashProgress80Percent()
{
  testCaseTitle("4.6", "在App文件下载到80%时断开电源");
  testCaseStart("4.6", "在App文件下载到80%时断开电源");
  
  Test_PoweroffDuringFlashProgress80Percent();
  
  testCaseEnd();
}

