ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
1264627 Топик полностью
abivan (02.12.2022 17:13, просмотров: 338) ответил IBAH на Поднимите руки, те кто хоть раз писал функцию с переменным количеством аргументов. Я думаю что такие функции пишутся чиста поржать.
на поржи. 
void Log_Write(OST_TASK_POINTER tp, int EventId, ...){
  t_Log_KRSPI TaskInfo;
  va_list  ap;
  if(EventId >= enLogEnd)
    return;
  memset(&TaskInfo, 0, sizeof(TaskInfo));
  switch(EventId){
    case enLogGENERAL_EXCEPTION:{
      uint32_t dwData;
      va_start(ap, EventId);
      strcpy( TaskInfo.szDatName , "cause: ");
      strcat( TaskInfo.szDatName, cause[va_arg(ap, uint32_t)]);
      strcat(TaskInfo.szDatName, "|Addr: 0x");
      dwData = va_arg(ap, uint32_t);
      arr2hex(TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                        (const uint8_t *)&dwData, sizeof(dwData), true);
      strcat( TaskInfo.szDatName, "|Caller: 0x");
      dwData = va_arg(ap, uint32_t);
      arr2hex(TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                               (const uint8_t *)&dwData, sizeof(dwData), true);
      Nop();
      va_end(ap);
      break;
    }
    case enLogUSR_MCU1_FAILURE:
    case enLogUSR_ASR_ZONES:{
      va_start(ap, EventId);
      if(EventId==enLogUSR_MCU1_FAILURE) {
        uint8_t* pRepeatBuff;
        uint8_t bLength;
        TaskInfo.dwData = va_arg(ap, uint32_t);
        pRepeatBuff = va_arg(ap, uint8_t * );
        bLength = (((t_PT*)pRepeatBuff)->bLength+sizeof(t_PT));
        if(bLength > arrsize(TaskInfo.szDatName)/2)
          bLength = arrsize(TaskInfo.szDatName)/2;
        arr2hex(TaskInfo.szDatName, pRepeatBuff, bLength, false);
      }else{
        TaskInfo.dwData = (uint16_t)va_arg(ap, uint32_t);
      }
      va_end(ap);
      break;
    }
    case enLogRF_FIRMWARE_UPDATE:{
      uint8_t         bRFId;
      t_EEDevCnfRel   EEDevCnfRel;
      t_BootSectionHeader Header;
      va_start(ap, EventId);
      bRFId = (uint8_t)va_arg(ap, uint32_t);
      if(DB_GetPar(bRFId, (ptr)&EEDevCnfRel, sizeof(t_EEDevCnfRel)) == -1){
        Check_UnconditionalReboot(OS_Task_GetCur(), enLogERR_DB_BAD_REC);
      }
      TaskInfo.dwData = EEDevCnfRel.dwSerial;
      strcpy( TaskInfo.szDatName , "Previos version: ");
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                                               HIBYTE(EEDevCnfRel.wSWVer), 10);
      strcat(TaskInfo.szDatName, ".");
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
              LOBYTE(EEDevCnfRel.wSWVer), 10);
      strcat(TaskInfo.szDatName, "(");
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                                                   EEDevCnfRel.bSwSubVer, 10);
      strcat(TaskInfo.szDatName, ") / Downloadable version: ");
      if(EXTF_DataRead(SPIFlash_GetHandle(), &Header,
                           MCUFirmwareOffset(enUpdRFFirmware), sizeof(Header))){
        Check_UnconditionalReboot(OS_Task_GetCur(), enLogERR_DB_BAD_REC);
      }
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                                                     HIBYTE(Header.wSVer), 10);
      strcat(TaskInfo.szDatName, ".");
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
              LOBYTE(Header.wSVer), 10);
      strcat(TaskInfo.szDatName, "(");
      cvtutoa( TaskInfo.szDatName+strlen(TaskInfo.szDatName),
                                                      Header.bBuildNumber, 10);
      strcat(TaskInfo.szDatName, ")");
      va_end(ap);
      break;
    }
    case enLogWDT_TASK:{
      void *p;
      va_start(ap, EventId);
      p = (void *)(uintptr_t)va_arg(ap, uintptr_t);
      strncpy(TaskInfo.szDatName, p, sizeof(TaskInfo.szDatName));
      TaskInfo.szDatName[arrsize(TaskInfo.szDatName)-1] = '\0';
      va_end(ap);
      break;
    }
    case enLogTIME_SET:{
      uint32_t dwData;
      va_start(ap, EventId);
      dwData = va_arg(ap, uint32_t);
      strncpy(TaskInfo.szDatName, ctime((time_t*)&dwData),
                                                   sizeof(TaskInfo.szDatName));
      TaskInfo.szDatName[arrsize(TaskInfo.szDatName)-1] = '\0';
      TaskInfo.szDatName[strlen(TaskInfo.szDatName)-1] = '\0';
      va_end(ap);
      break;
    }
    case enLogRESET: {
      va_start(ap, EventId);
      TaskInfo.dwData = va_arg(ap, RESET_REASON);
      TaskInfo.szDatName[0]='\0';
      if(TaskInfo.dwData &  RESET_POR_MASK)
        strncat(TaskInfo.szDatName, "POR", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[arrsize(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_BOR_MASK)
        strncat(TaskInfo.szDatName, " BOR", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_WDTO_MASK)
        strncat(TaskInfo.szDatName, " WDT", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_SWR_MASK)
        strncat(TaskInfo.szDatName, " SOFTW", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_EXTR_MASK)
        strncat(TaskInfo.szDatName, " MCLR", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_CMR_MASK)
        strncat(TaskInfo.szDatName, " CMR", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      if(TaskInfo.dwData &  RESET_HVDR_MASK)
        strncat(TaskInfo.szDatName, " HVDR", sizeof(TaskInfo.szDatName)-
                                                   strlen(TaskInfo.szDatName));
      TaskInfo.szDatName[sizeof(TaskInfo.szDatName)-1] = '\0';
      va_end(ap);
      break;
    }
    case enLogERR_FLASH_FIRMWARE: {
      va_start(ap, EventId);
      TaskInfo.dwData = va_arg(ap, t_enUserFlashLocationId);
      va_end(ap);
      break;
    }
    case enLogREBOOT:{
      va_start(ap, EventId);
      strcpy(TaskInfo.szDatName, szLogName[va_arg(ap, t_enLog)]);
      va_end(ap);
      break;
    }
    case enLogERR_UPDATE:{
      va_start(ap, EventId);
      strcpy(TaskInfo.szDatName, szUSBReqName[va_arg(ap, uint32_t)]);
      va_end(ap);
      break;
    }
    case enLogEnd: //for navigation
      break;
  }
  Check_GetTaskInfo(tp, &TaskInfo);
  TaskInfo.bEventId = EventId;
  strcpy(TaskInfo.szEventName, szLogName[EventId]);
  TaskInfo.Time = GetTime();
  TaskInfo.bLogVer = DEF_LOG_VER;
  ErrLog_Put(&TaskInfo, sizeof(TaskInfo));
}