# CCD Library Function Description
CCD library contains CCD.dll, CCD.lib, CCD.h
The Source code of this is CCD.c and CCD.h.
------
**Structure**
```c
typedef struct CCDInformation{
...
}CCDInfo;
```
* long **camera**: Atmcd32.h 의 GetCameraHandle 로 얻은 값
* int **status**: CCD 현재 상태 (**-1**: 연결되지 않음, **1**: 연결, **0**: 종료)
* int **HBin**: 파장 방향 비닝 값
* int **VBin**: 슬릿 방향 비닝 값
* int **ScanNum**: 스캔하는 총 스탭 수 (frame number)
* int **Gain**: EM gain 값 (0-255)
* int **PGain**: preampgain 값 (0-2)
* int **Trigger**: 내부 또는 외부 트리거 사용 유무 (**0**: Internal, **1**: External)
* int **AcqMode**: Acqusition mode. (**1**: Single (Step), **0**: Video(Focous), **6**: Frame Transfer, **5**:Scan stop, **8**: Single (continuous))
* int **ReadMode**: 어떻게 찍을지 설정 ex. image, track, line (**4**: Imaging mode, **1**: Full Vertical Binning). 4 만 유효하다.
* int **ShutterMode**: shutter mode (**0**: Fully Auto, **1**: Permanently Open, **2**: Permanently Closed)
* int **ScanMode**: i.e. scan mode - 0:spectrograph, 1:imaging mode, -1:None
* int **FanSpeed**: Fan Speed (**0**: High, **1**: low, **2**: off)
* int **nx**: 비닝 까지 한 후 계산 결과 얻은 파장 방향 픽셀 값 //nwidth, nhdim
* int **ny**: 비닝 까지 한 후 계산 결과 얻은 슬릿 방향 픽셀 값 //nheight, nydim
* int **CCD_XPix**: CCD 가 가질 수 있는 비닝 전 파장 방향 총 픽셀 값
* int **CCD_YPix**: CCD 가 가질 수 있는 비닝 전 슬릿 방향 총 픽셀 값
* int **Temperature**: CCD 온도 값
* int **wvIndex**: grating_focous.h 에 있는 WvSet 에서 선택할 설정 값의 index
* int **TelXpos**: 관측 중인 X 축 위치 값 (arcsec)
* int **TelYpos**: 관측 중인 Y 축 위치 값 (arcsec)
* int **gStep**: Grating step count
* float **gWv**: Grating wavelength
* float **gAngle**: Grating angle
* float **exptime**: 노출시간
* float **elapseTime**: 관측 완료까지 걸린 시간
* float **stepTime**: 1 스텝 스캔하는데 걸린 시간
* float **stepSize**: 1 스텝의 실제 스캔 사이즈, 스캐너에 지령을 줄 때는 이 값의 절반을 사용하여야 한다. // real_scan_size
* float **scanSpeed**: 1 스텝 스캔하는 속도 //scan_speed
* float **scanDist**: 스캔하여 움직이는 거리 //scan_stroke
* char **FilePath[256]**: fits 파일이 저장될 파일 위치
* char **CCDPath[256]**: CCD 컨트롤하는 작업 디렉토리 (output)
* char **camID[2]**: 카메라 A 인지 B 인지를 표시하는 인자.
* char **ccdName[32]**: CCD 모델명
* char **stTime[64]**: 관측 시작 시간
* char **edTime[64]**: 관측 종료 시간
* char **Target[64]**: Target 명
* char **Observer[32]**: 관측자 이름
* unsigned short* **RawData**: 관측된 결과가 저장되는 포인터
* unsigned short* **BiasDark**: 관측된 BiasDark 가 저장될 포인터
* float* **FlatCube**: 관측된 Flat 을 저장할 포인터
------
```c
int OpenCamera(CCDInfo* CCD)
```
Power on and initialize the camera. 여기서 카메라가 가질 수 있는 총 픽셀수를 얻는다.
**Parameters**
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
**Return**
* int: 성공 또는 에러 여부 (**1**: 성공, **-1**: 초기화 오류, **-2**: 카메라 정보 받아오기 실패, **-99**: 컴퓨터 타이머(diff_time 계산시 필요) 세팅 오류)
----------
```c
int CloseCamera(CCDInfo* CCD)
```
관측 데이터 메모리를 반환하고 카메라를 초기 설정으로 되돌린 후 종료한다.
**Parameters**
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
**Return**
* int: 성공 또는 에러 여부 (**1**: 성공, **-6**: status 오류, **-7**: 셔터 오류, **-8**: 팬 종료 오류, **-9**: 카메라 종료 오류)
----------
```c
int GetCameraInfo(char* array)
```
Get camera information.
**Parameter**
* char* **array**: 카메라 정보를 출력 받을 문자열.
**Return**
* int: 성공 또는 에러 여부 (**1**:성공, **-2**: 카메라 정보 받아오기 오류, **-3**: ANDOR capabilities 정보 받아오기 오류, **-4**: HeadModel 정보 받아오기 오류, **-5**: AD 채널 수 받아오기 오류)
------------
```c
int SetCameraParam(CCDInfo* CCD, char* statOut)
```
binning, 촬영 모드 메모리 초기 할당 등 카메라를 세팅한다.
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
* char* **StatOut**: 설정한 노출 시간과 실제로 설정된 노출시간을 저장한 문자열. (Output)
**Return**
* int: 성공 유무 (**1**: 성공, **-7**: 셔터 오류, **-8**: fan 오류, **-10**: 메모리 할당 오류, **-11**: 관측 모드 (acqusition) 오류, **-12**: 프레임 수 오류, **-13**: readmode 오류, **-14**: preampgain 오류, **-15**: gain 오류, **-16**: 트리거 오류, **-17**: 노출시간 오류)
----------
```c
int TakeImage(void)
```
촬영 시작
**Return**
* int: 성공 유무 (**1**: 성공, **-18**: 관측 에러)
----------
```c
int SaveFits(CCDInfo CCD, double* diff_time)
```
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체.
* double* **diff_time**: fits 파일 저장하는 데 걸리는 시간을 문자열로 가지고 온다. (Output)
**Return**
* int: 성공유무 (**1**: 성공)
-----------
```c
int DataDump(CCDInfo* CCD, int i)
```
관측된 데이터를 컴퓨터 메모리로 반환한다.
**Parameter**:
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
* int **i**: i 번째 프레임
------
```c
int TakeBiasDark(CCDInfo* CCD)
```
BiasDark 이미지를 100 장 촬영하고 합쳐서 master BiasDark 를 만든다.
반드시 SetCameraParam 을 먼저 수행해야한다.
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
**Return**
* int: 성공유무 (**1**: 성공, **-18**: 관측 오류, **-6**: 상태 오류)
-----
```c
int TakeImage_FTmode(CCDInfo* CCD)
```
Frame Transfer 모드로 이미지를 관측한다.
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체 포인터.
**Return**
* int: 성공유무 (**1**: 성공, **-18**: 관측 오류, **-6**: 상태 오류)
------
```c
void marktime(char* timestring, LARGE_INTEGER* gTime)
```
**Parameter**
* char* **timestring**: 현재 시간을 밀리초 단위 까지 가지고 isot 형식으로 문자열을 가지고 온다. (ex. 2019-12-18T19:26:30.375)
* LARGE_INTEGER* **gTime**: 추후에 elapsetime 을 계산하기 위해 시스템 시간을 고분해능으로 가지고 나온다.
------
```c
float time_difference()
```
입력된 두 시간 사이의 차이를 계산한다.
**Parameters**
* LARGE_INTEGER* **gStart**: 시작 시간
* LARGE_INTEGER* **gEnd**: 종료 시간
**Return**
* float **timediff**: 종료 시간과 시작 시간의 시간차이
---------
```c
int SaveBiasDark(CCDInfo CCD, double* diff_time)
```
관측된 BiasDark 이미지를 fits 파일로 저장한다.
**Parameters**
* CCDInfo **CCD**: ccdinfo 구조체.
* double* **diff_time**: fits 파일 저장하는 데 걸리는 시간을 문자열로 가지고 온다. (Output)
**Return**
* int: 성공유무 (**1**: 성공)
-------
```c
int SaveFlatFits(CCDInfo CCD, int number, double* diff_time)
```
관측된 Flat 이미지를 fits 파일로 저장한다.
**Parameters**
* CCDInfo **CCD**: ccdinfo 구조체.
* int **number**: grating 바꾸는 횟수 (초기값: 7)
* double* **diff_time**: fits 파일 저장하는 데 걸리는 시간을 문자열로 가지고 온다. (Output)
--------
```c
int TempSet(CCDInfo CCD, int OnOff, int Temp)
```
Turn on or Turn of the CCD cooler.
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체.
* int **Onoff**: Turn on/off the CCD. (1 is true)
* int **Temp**: Set the cooling temperature of the CCD in degree.
**Output**
* int: 성공 유무 (**1**: 성공, **2**: 에러)
-----------
```c
void StructTestCCD(CCDInfo* CCD)
```
dll 에서 로드 할때 구조체에 변수가 제대로 들어가는 지 확인하기 위해서 사용
**Parameter**
* CCDInfo **CCD**: ccdinfo 구조체. (Output)