COMI_US_FileSaveFirst


SYNOPSYS

BOOL COMI_US_FileSaveFirst (HANDLE hDevice, char *szFilePath, BOOL bIsFromStart)

DESCRIPTION

  • 이 함수는 자동 파일 저장 기능을 시작합니다. 이 함수는 자동 저장을 준비시켜주는 함수이며, 실제로 스캔 데이터를 저장하지는 않습니다. 실제 데이터의 저장은 COMI_US_FileSaveNext() 함수가 호출될 때 이루어 집니다.

PARAMETER

▶ hDevice : 디바이스 핸들값입니다. 이 값은 COMI_LoadDevice() 함수에 의해 얻어진 값이어야 합니다.

▶ szFilepath : 데이터를 저장할 바이너리 파일의 Path 를 지정합니다.

▶ blsFromStart : 이 값이 1이면 Scan 이 시작된 처음 데이터부터 저장하게 되며, 0 이면 File Save 시작한 순간의 데이터부터 저장합니다.

RETURN VALUE

Value

Meaning

1

성공

0

실패

Warning

이 함수는 반드시 COMI_US_Start(..) 함수가 실행된 이후에 수행되어야 합니다.

Device

  • 지원 디바이스: COMI-CP101, COMI-CP201, COMI-SD101, COMI-SD102, COMI-SD103, COMI-SD104, COMI-SD201

EXAMPLE

  • Unlimited Scan 사용예 4: 자동 파일 저장 기능을 사용하여 스캔 데이터를 텍스트 파일로 저장하는 예제

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/**********************************************************************************
/* [COMIDAS sample progrma by COMIZOA Inc.. Ltd]
/*
/* - Subject : Unlimited Scan
/* - contents: 이 프로그램은 A/D CH0 와 CH4 의 두채널을 Unlimited scan을
/*             이용하여 A/D convert를 하고 그 결과를 COMI_US_FileSaveFirst(...),
/*             COMI_US_FileSaveNext(...), COMI_US_FileSaveStop(...) 함수들을 이용
/*             하여 파일에 저장하는 예제입니다.
/* - Remarks :
/*   1. 이 예제는 COMI-CP101 보드를 사용하는 것으로 작성되었습니다. 따라서 다른 보드를
/*      사용하는 경우에는 COMI_LoadDevice(...) 함수의 첫 번째 파라미터를 알맞은 디바이스
/*      ID로 바꾸어야 합니다.
/**********************************************************************************/

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "Comidas.h"

#define NUM_CH 2    /* Number of channels                                    */
#define S_FREQ 1000 /* Scan freq. -> 1000 Hz                                 */
#define MSB 40960   /* Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데
                    /* 1024의 배수로 지정하는것이 좋다                           */

void main(void)
{
  HANDLE hDevice;
  int ch_list[2] = {0, 4}; /* scan channel list : 0번 과 4 번 채널 */
  float progress;
  ULONG dwSavedScanCnt = 0;

  /* Load Dll */
  if(!COMI_LoadDll()){
    printf("Comidas.dll load failure");
    exit(0);
  }
  /* Load device */
  hDevice = COMI_LoadDevice (COMI_CP101, 0);
  if(hDevice == INVALID_HANDLE_VALUE){
    printf("Can't load specified device!");
    COMI_UnloadDll();
    exit(0);
  }

  // Set A/D range //
  COMI_AD_SetRange(hDevice, 0, -10, 10);
  COMI_AD_SetRange(hDevice, 4, -10, 10);

  /* start unlimited scan */
  if(COMI_US_Start (hDevice, NUM_CH, ch_list, S_FREQ, MSB, TRS_SINGLE) < 0)
  {
    /* Error 처리 */
    COMI_ErrorString (COMI_LastError());
    COMI_UnloadDevice(hDevice);
    COMI_UNloadDll();
    exit(0);
  }

  // Start file save //
  printf("A/D Scan data file save is started !\n");
  dwSavedScanCnt = 0;
  if(COMI_US_FileSaveFirst(hDevice, "C:\\ComiUscan.bin", TRUE))
  {
    while(!kbhit())
    {
      Sleep(100);
      // Continue file save //
      dwSavedScanCnt += COMI_US_FileSaveNext(hDevice);
      printf("Total save scan count = %u\n", dwSavedScanCnt);
    }
  }
  COMI_US_FileSaveStop(hDevice); // Stop file save
  COMI_US_Stop(hDevice, TRUE); // Stop unlimited scan

  // Start binary file to text file conversion //
  COMI_US_FileConvert("C:\\ComiUscan.bin", "C:\\ComiUscan.txt" , 0);

  // Conversion 진행률을 체크하여 사용자에게 보여준다. //
  While((progress = COMI_US_CheckFileConvert()) < 100.f){
    printf("File conversion progress = %.1f %c\n", progress, '&');
  }

  COMI_UnloadDevice(hDevice);
  COMI_UnloadDll();
}

EXAMPLE2

  • Unlimited Scan 사용예 5: 자동 파일 저장 기능에 의해 생성된 바이너리 파일을 사용자가 직접 읽어서 처리하는 예제

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/**********************************************************************************
/* [COMIDAS sample progrma by COMIZOA Inc.. Ltd]
/* - Subject : Unlimited Scan
/* - contents: 이 프로그램은 UnlimScan4 의 예제와 같은 기능을 수행한다.
/*             단, 이 프로그램에서는 COMI_US_FileConvert () 함수를 사용하지 않고,
/*             바이너리 파일을 직접 읽어들여 텍스트 파일로 변환하게 된다.
/*             이 예제의 의도는 COMI_US_FileSaveFirst() , COMI_US_FileSaveNext()
/*             등의 함수를 이용하여 저장된 바이너리 파일을 사용자가 직접 읽는
/*             방법을 보이기 위한 것이다.
/* - Remarks :
/*   1. 이 예제는 COMI-CP101 보드를 사용하는 것으로 작성되었습니다. 따라서 다른 보드를
/*      사용하는 경우에는 COMI_LoadDevice(...) 함수의 첫 번째 파라미터를 알맞은 디바이스
/*      ID로 바꾸어야 합니다.
/**********************************************************************************/

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include "Comidas.h"

#define NUM_CH 2      /* Number of channels                                   */
#define S_FREQ 1000   /* Scan freq. -> 1000 Hz                                */
#define MSB 40960     /* Max scans/buffer => 이 값은 scan 버퍼의 크기를 결정하는데
                      /* 1024의 배수로 지정하는것이 좋다                          */

//**********************************************************************************
//* BinToTextFileConversion() : COMI_US_FileSaveFirst() 등의 함수를 통해
//*                             저장된 바이너리 파일을 읽어들여 텍스트 파일로 변환하는 함수
//*                             - szBinFilePath  : 바이너리 파일의 Path
//*                             - szTextFilePath : 텍스트 파일의 Path
//*                             - Return : 0 => 실패, 1 => 성공
//**********************************************************************************

BOOL BinToTextFileConversion(char *szBinFilePath, char *szTextFilePath)
{
  TScanFileHead Header; // Binary file 에 저장된 header information 구조체
  FILE *fpBin, *fpTxt;
  ULONG dwCnvtedCnt = 0;
  short digits[16];
  float volt, fProgress;
  int i;

  if((fpBin = fopen(szBinFilePath, "rb")) == NULL)
    return FALSE;

  if((fpTxt = fopen(szTextFilePath, "w")) == NULL)
  {
    fclose(fpBin);
    return FALSE;
  }

  fseek(fpBin, 0L , SEEK_SET); // File pointer 를 처음으로 위치시킨다.

  // Binary file header 정보를 얻는다. TScanFileHead 형식의 구조체는 //
  // Comidas.h 파일에 정의되어 있다. //
  fread(&Header, sizeof(TScanFileHead), 1, fpBin);

  // Text file에 타이틀 필드를 작성한다. //
  fprintf(fpTxt, "Date : %s, Time : %s\n", header.szDate, header.szTime);
  for(i=0; i<Header.nNumChan; i++)
  {
    fprintf(fpTxt, "CH%2d", Header.nChanList[i]);
  }
  fprintf(fpTxt, "\n");

  // Binary file에서 1 scan line씩 읽어들여 그 값을 Text file에 //
  // 프린트한다.                                              //
  while(fread(digits, sizeof(short), Header.nNumChan, fpBin))
  {
    for(i=0; i<Header.nNumChan; i++)
    {
      if(Header.dmin < 0) // 16 Bit resolution : -32768 ~ 32767 //
        volt = (float)COMI_Digit16ToVolt(digits[i], Header.vmin[i], Header.vmax[i]);
      else // 12 Bit resolution : 0 ~ 4095 //
        volt = (float)COMI_DigitToVolt(digits[i], Header.vmin[i], Header.vmax[i]);

      fprintf(fpTxt, "%7.3f" , volt);
    }
    fpintf(fpTxt, "\n");
    dwCnvtedCnt++;
    if(!(dwCnvtedCnt % 100)){ // 100회의 scan line 데이터가 저장될때마다 진행률을 표시
      fProgress = 100.f*(float)dwCnvtedCnt / (float)Header.dwSavedScanCnt;
      // Conversion 진행률을 화면에 보여준다. //
      printf("Conversion progress = %.0f %c\n", fProgress, '%');
    }
  }
  fclose(fpTxt);
  fclose(fpBin);
  return TRUE;
}

void main (void)
{
  HANDLE hDevice;
  int ch_list[2] = {0, 4}; /* Scan channel lsit : 0번과 4번 채널*/
  ULONG dwSavedScanCnt = 0;
  BOOL bSuccess;

  /* Load DLL */
  if(!COMI_LoadDll()){
    printf("Comidas.dll load failure");
    exit(0);
  }
  /* Load device */
  hDevice = COMI_LoadDevice (COMI_CP101, 0);
  if(hDevice == INVALID_HANDLE_VALUE){
    printf("Can't load specified device!");
    COMI_UnloadDll();
    exit(0);
  }

  // Set A/D range //
  COMI_AD_SetRange(hDevice, 0, -10, 10);
  COMI_AD_SetRange(hDevice, 4, -10, 10);

  /* Start unlimited scan */
  if(COMI_US_Start (hDevice, NUM_CH, ch_list, S_FREQ, MSB, TRS_SINGLE) < 0)
  {
    /* Error 처리 */
    COMI_ErrorString (COMI_LastError());
    COMI_UnloadDevice(hDevice);
    COMI_UNloadDll();
    exit(0);
  }

  // Start file save //
  printf("A/D Scan data file save is started !\n");
  dwSavedScanCnt = 0;
  if(COMI_US_FileSaveFirst(hDevice, "C:\\ComiUscan.bin", TRUE))
  {
    while(!kbhit())
    {
      Sleep(100);
      dwSavedScanCnt += COMI_US_FileSaveNext(hDevice); // Continue file save
      printf("Total save scan count = %u\n", dwSavedScanCnt);
    }
    COMI_US_FileSaveStop(hDevice); // Stop file save
    COMI_US_Stop(hDevice, TRUE); // Stop unlimited scan

    // Convert binary file to text file //
    bSuccess = BinToTextFileConversion("C:\\ComiUscan.bin", "C:\\ComiUscan.txt");
    if(!bSuccess)
      printf("File conversion failed !");

    COMI_UnloadDevice(hDevice);
    COMI_UnloadDll();
  }
}