- CVI 정보나눔(www.cvi.kr)
- 스터디
- 강좌,팁,유용한것
강좌,팁
[강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1)
질문답변 게시판에 "컨트롤 값의 저장에 대하여..."라는 제목의 질문이있습니다. 컨트롤의 세팅값을 파일에 저장했다가 나중에 프로그램이 시작되면서 다시불러와 컨트롤 값을 세팅하는 내용이었습니다. 그리고, "initially dimmed시키고 나서 살리려는데...."라는제목의 질문도 있습니다. 이 질문은 컨트롤의 속성을 변경시키는 것에 대한 질문이었습니다.
이번 강좌에서 이 두 가지 문제를 포함하여 초기설정파일을 이용하는 방법을 살펴보겠습니다.이 강좌에서는 제가 만들어서 이용하고 있는 방법을 소개할 것입니다. (LabWindows/CVI의샘플 프로그램 중에도 ini.prj가 있습니다. cvisamplestoolboxini.prj을 참고하십시오.)
이번 강좌에서 만들어볼 프로그램의 개요를 말씀드리면, 두 개의 Panel이 있습니다.하나는 Main panel이고, 나머지 하나는 Setting panel입니다. INI 파일에 저장되는값은 주로 Setting(혹은 Option)값들이기 때문에 실제적인 상황에 가깝게 별도의Setting Panel을 두었습니다. Setting panel에서 세팅되는 컨트롤의 값을 ini 파일에다저장하고 불러오는 기능이 주된 내용이 되겠습니다.
이번 강좌의 진행순서는 다음과 같습니다.
첫 번째 과정은 일반적인 프로그램의 초기 작성 작업(화면구성, 속성설정, 소스코드생성, 간단한 소스 수정)
두 번째 과정은 INI 파일을 다루기 위한 처리부분을작성합니다.
세 번째 과정은 본 강좌의 프로그램에 한정된 기능을 구현하게 되고,
마지막으로화면구성 작업시 알아둘 팁 하나와 이번에 이용된 ini 파일에 대한 comment가 추가됩니다.
그림 15.1에 과정을 블록으로 표시해 보았습니다.
그림 15.1 ini 파일 이용하기 강좌의 작업 흐름도
제1장 일반적인 프로그래밍 시작작업 단계
1. 프로젝트 파일 생성(L015_UsingINI.prj)
LabWindows/CVI를 실행시켜서 새 프로젝트 파일을 열고, 저장(L015_UsingINI.prj)합니다.
그리고새 UIR 파일을 열고, 곧바로저장(L015_UsingINI.uir)한 다음 프로젝트에 포함시킵니다.
2. 화면구성 및 속성설정
화면구성을 그림 15.2, 15.3와 같이 하였습니다.
그림 15.2 Main Panel 화면
표 15.1 Main Panel의 속성설정
속성 | 내용 |
Constant Name | PANEL |
Callback Function | PanelCB |
Panel Title | Main Panel |
표 15.2 Main Panel의 컨트롤의 속성 설정
컨트롤 종류 | Constant | Callback Function | Label |
LED | LED_Drive |
| 구동장치 |
LED | LED_Power |
| 전원공급기 |
LED | LED_Voltmeter |
| Voltmeter |
Command Button | cmdSetting | cmdSetting | 설정 |
Command Button | cmdExit | cmdExit | 종료 |
Decoration | don't care(상관없음) |
|
|
Text Message | don't care(상관없음) |
| 여기는 Main Panel ... |
Text Message | don't care(상관없음) |
| 통신상태 |
이제는 Setting Panel에 대한 화면구성과 Panel, Control의 속성설정을 보였습니다.
그림 15.3 Setting Panel 화면
표 15.3 Setting Panel의 속성설정
속성 | 내용 |
Constant Name | P_Setting |
Callback Function | P_SettingCB |
Panel Title | Setting |
표 15.4 Setting Panel의 컨트롤의 속성 설정
컨트롤 종류 | Constant | Callback Function | Label | Data Type |
Numeric | numV_offst |
| Toleration of offset | float |
Numeric | numCheck_V |
| Max. number of check | int |
Numeric | numI_offst |
| Toleration of offset | float |
Numeric | numCheck_I |
| Max. number of check | int |
Binary Switch | bsDrive |
| 구동장치 | int |
Text Button | tgVoltmeter |
| Voltmeter |
|
Check Box | chkPowerSupply |
| 전원공급기 |
|
Check Box | chkPS_Dimmed |
| 전원공급기 LED Dimmed |
|
String | strWorkDir |
| Working paths |
|
Command Button | cmdBrowse | cmdBrowse | 찾아보기... |
|
Command Button | cmdOK | cmdOK_Setting | OK |
|
Command Button | cmdCancel | cmdCancel_Setting | Cancel |
|
Command Button | cmdApply | cmdApply_Setting | Apply |
|
Decoration 여러개 | don't care(상관없음) |
|
|
|
Text Message 여러개 | don't care(상관없음) |
| Voltmeter |
|
3. 기초 소스코드 생성(UIR 창에서 Code-Generate-All code... 메뉴)
이제 소스코드를 생성할 단계가되었습니다. uir 창에서 Code-Generate-All code... 메뉴를 선택하면, 그림 14.2와같은 대화상자가 뜹니다. 아래의 항목들을 수정합니다.
TargerFiles: Add To Current Project
Select panels to load and display at startup:일단 모두 다 체크
Select QuitUserInterface Callbacks: PanelCB, cmdExit를체크
그리고, 버튼을 누르면, L015_UsingINI.c 소스코드 창이 생기면서 프로젝트에 포함됩니다.L015_UsingINI.h 파일도 열어서 프로젝트에 포함시킵니다. 전에도 얘기했듯이헤더 파일은 프로젝트에 포함시키지 않아도 되지만, 코딩 작업 중에 헤더 파일을쉽게 불러오기 위해 프로젝트 창에 포함시켜 둡니다.
4. 사용자 정의함수 파일(...common.x), 통합헤더파일 생성
이 단계는저의 프로그래밍 스타일에 따른 과정입니다. 자동생성된 L015_UsingINI.c에는 각종Callback 함수들이 있는데, 사용자 정의 함수들과 섞이면 코딩작업시 좀 번거롭기때문에 저는 일반 사용자 정의 함수들을 ...common.c 파일에다 작성합니다. 그리고통합헤더파일을 만드는 이유는 각 소스 파일마다 include 문을 여러개 나열하는 것이번거롭기 때문이죠!
먼저, 그림 15.4에 통합헤더파일을 보였습니다. 그림과 같이 작성한 후에 프로젝트에포함시키세요.
그림 15.4 L015_UsingINI 통합헤더파일
L015_UsingINI_common.h와 L015_UsingINI_common.c는 그림 15.5, 그림 15.6에보였습니다.
L015_UsingINI_common.h의 6번 라인은 L015_UsingINI.c에서 static으로선언된 문장을 가져와서 extern으로 선언한 것입니다. 그리고, 8,9번 라인의 함수는프로그램의 초기화와 마무리 함수 선언입니다.
그림 15.5 L015_UsingINI_common.h 헤더파일
L015_UsingINI_common.c의 4번 라인은 L015_UsingINI_common.h의 6번 라인의 실제변수 선언입니다. static이 되어서는 안됩니다. 다른 파일에서도 이용될 것이기 때문이죠!
Initialize_L015_UsingINI() 함수는 L015_UsingINI 프로그램의 초기화를 담당하는부분인데, 아직은 어떤 문장도 들어가지 않았습니다. Finish_L015_UsingINI() 함수는프로그램을 종료하기 전에 마지막으로 처리해야 할 부분이 오게 됩니다.
그림 15.6 L015_UsingINI_common.c 파일
5. main() 함수 주변 수정
main() 함수가 있는 L015_UsingINI.c 파일에우선 수정하고 추가해야할 부분이 있습니다. 그림 15.7에 보였습니다.
그림 15.7 L015_UsingINI.c에서 우선 수정되는 부분
1, 2번 라인의 include 문은 3번 라인으로 통합되었고, 5번 라인은 L015_UsingINI_common.c의4번 라인으로 옮겨가면서 static이라는 수식어가 없어졌습니다.
프로그램의 초기화함수, 마무리 함수가 추가되었고, 20번, 23번 라인은 코멘트 처리되었습니다. 지금표시될 panel이 아니기 때문이죠!
6. Setting Panel을 호출하고 닫는 콜백 함수들
L015_UsingINI.c 파일에있는 콜백 함수들 중에서 Setting Panel을 표시하는 cmdSetting() 함수를 그림 15.8과같이 만듭니다. modaless 대화 상자로 표시하기 위해 InstallPopup()함수를 이용하였습니다.
그림 15.8 cmdSetting() 콜백 함수(L015_UsingINI.c 파일)
그리고, Setting Panel을 닫는 콜백함수로는 P_SettingCB()라는 Panel 콜백함수와cmdOK_Setting(), cmdCancel_Setting() 콜백함수가 있습니다. 그림 15.9에 P_SettingCB()콜백 함수를 보였습니다.
그림 15.9 P_SettingCB() Panel 콜백 함수(L015_UsingINI.c 파일)
그림 15.10에서 cmdOK_Setting() 함수는 단순히 닫는 동작만 있는것이 아니지만, 나머지는 나중에 추가하기로 하고 Setting Panel을 닫는 문장을 넣어줍니다.
그림 15.10 cmdOK_Setting(), cmdCancel_Setting() 콜백함수(L015_UsingINI.c파일)
이제 그림 15.11과 같은 Project 파일 상태에서 프로그램을 Build하여 실행시켜봅니다.
그림 15.11 L015_UsingINI.prj의 파일들
그림 15.12와 그림 15.13에는 실행된 화면을 보였는데, Setting Panel을 띄우고제거하는 부분과 종료하는 부분만 유효합니다.
그림 15.12 실행화면(Main panel)
그림 15.13 실행화면(Setting panel)
여기까지는 다른 CVI 프로그램을 작성할 때와 거의 유사한 시작 과정이었습니다.다음은 INI 관련 기능을 만들어 나가도록 합니다.