여기는 편의상 스톱워치를 만들었다.

1 -> 프로젝트에 연결된 파일을 표시 합니다.

2 -> GUI 화면을 표시 합니다.

3 -> GUI 화면상에 있는 컴퍼넌트 list 가 대표명으로 표기, 선택 하면 해당 컴퍼넌트가 표시됨

4 -> 선택된 컴퍼넌트의 특성을 표시 합니다.

 

    

마우스를 이용해서 위치 및 크기 등을 조절 할 수 있다.

컴퍼넌트에 마우스 포인트를 이동 후 오른쪽 마우스를 누르면 여러 매뉴가 나타난다.

Generate Control Callback : 이 키를 누르면(이벤트를 발생하면) 동작할 함수를 만든다.

신규 함수 생성시 사용한다. 주의 사항은 함수를 만든 상태에서 소스코드를 입력 하고

다시 만들어 버리면 기존 소스를 지울지 유지할지를 물어보는데 잘못하면 ~~

View Control Callback : 이 키를 누르면(이벤트를 발생하면) 동작할 함수를 보여준다.

타이머를 발생시키기 위해 타이머를 추가 했다.

컴파일이 완료되면 보이지 않는다.

 

소스를 대충 보겠다.

 

변수 선언한다.

#include <ansi_c.h>

#include <cvirte.h>        

#include <userint.h>

#include <utility.h>

#include "test_app1.h"

 

static int panelHandle;

static int flag = 0;    //stop watch 사용용

static int flag1 = 0; // 프로그램 시작 초기화

static int flag2 = 0; //타이머 사용용

static long time_count =0;    //stop watch 사용용

static long time_count2 =0;    //타이머 사용용

char buf[100];

 

Main 함수

int main (int argc, char *argv[])

{

    if (InitCVIRTE (0, argv, 0) == 0)

        return -1;    /* out of memory */

    if ((panelHandle = LoadPanel (0, "test_app1.uir", PANEL)) < 0)

        return -1; //test_app1.uir이 없으면 실행불가

    DisplayPanel (panelHandle);

    RunUserInterface (); //여기서 화면이 표시된다.

    DiscardPanel (panelHandle);

    return 0;

}

 

기능을 선언한다.

int CVICALLBACK panelCB (int panel, int event, void *callbackData,

        int eventData1, int eventData2)

{

    switch (event)

    {

        case EVENT_GOT_FOCUS:

 

            break;

        case EVENT_LOST_FOCUS:

 

            break;

        case EVENT_CLOSE:

            QuitUserInterface(0); //X 버튼 눌리면 종료

            break;

    }

    return 0;

}

 

버튼이 눌리면 처리하는 함수

int CVICALLBACK COMMANDBUTTON_A (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    switch (event)

    {

        case EVENT_COMMIT:

            //SetCtrlVal( panel,PANEL_STRING,"아빠 바보");

            flag = 1;

            break;

    }

    return 0;

}

 

int CVICALLBACK COMMANDBUTTON_B (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    switch (event)

    {

        case EVENT_COMMIT:

            //SetCtrlVal( panel,PANEL_STRING,"그 바보가 아니라 천재");

            flag = 0;

            break;

    }

    return 0;

}

 

int CVICALLBACK COMMANDBUTTON_C (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    switch (event)

    {

        case EVENT_COMMIT:

            //SetCtrlVal( panel,PANEL_STRING,"누구세요 ??");

            flag = 0;

            time_count = 0;

            sprintf(buf,"%d : %d : %d : %d", (time_count/360000), (time_count/6000)%60,(time_count/100)%60,time_count%100);

            SetCtrlVal( panel,PANEL_STRING,buf);

            break;

    }

    return 0;

}

 

int CVICALLBACK COMMANDBUTTON_D (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    int info;

 

    switch (event)

    {

        case EVENT_COMMIT:

 

            GetCtrlVal(panel,PANEL_NUMERIC, &info);

            time_count2 = info * 6000 ;

            sprintf(buf,"%d : %d : %d : %d", (time_count2/360000), (time_count2/6000)%60,(time_count2/100)%60,time_count2%100);

            SetCtrlVal( panel,PANEL_STRING1,buf);

            flag2 = 1;

            

            break;

    }

    return 0;

}

 

int CVICALLBACK COMMANDBUTTON_E (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    switch (event)

    {

        case EVENT_COMMIT:

            flag2 = 0;

            break;

    }

    return 0;

}

 

int CVICALLBACK NUMERIC_A (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    int info;

 

    

    switch (event)

    {

        case EVENT_COMMIT:

            if(flag2 == 0)

            {

                GetCtrlVal(panel,PANEL_NUMERIC, &info);

                time_count2 = info * 6000 ;

                sprintf(buf,"%d : %d : %d : %d", (time_count2/360000), (time_count2/6000)%60,(time_count2/100)%60,time_count2%100);

                SetCtrlVal( panel,PANEL_STRING1,buf);

 

            }

            

            break;

    }

    return 0;

}

 

int CVICALLBACK COMMANDBUTTON_F (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    int info;

 

    switch (event)

    {

        case EVENT_COMMIT:

 

            if(flag2 == 0)

            {

                GetCtrlVal(panel,PANEL_NUMERIC, &info);

                time_count2 = info * 6000 ;

                sprintf(buf,"%d : %d : %d : %d", (time_count2/360000), (time_count2/6000)%60,(time_count2/100)%60,time_count2%100);

                SetCtrlVal( panel,PANEL_STRING1,buf);

 

            }

            

            break;

    }

    return 0;

}

 

타이머 동작 실행

int CVICALLBACK Timer_aaa (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

    int info;

 

    switch (event)

    {

        case EVENT_TIMER_TICK:

 

            if(flag1 == 0)

            {

                sprintf(buf,"%d : %d : %d : %d", (time_count/360000), (time_count/6000)%60,(time_count/100)%60,time_count%100);

                SetCtrlVal( panel,PANEL_STRING,buf);

 

                GetCtrlVal(panel,PANEL_NUMERIC, &info);

                time_count2 = info * 6000 ;

                sprintf(buf,"%d : %d : %d : %d", (time_count2/360000), (time_count2/6000)%60,(time_count2/100)%60,time_count2%100);

                SetCtrlVal( panel,PANEL_STRING1,buf);

 

                flag1 = 1;

            }

 

            

            if(flag)

            {

                time_count ++;

                sprintf(buf,"%d : %d : %d : %d", (time_count/360000), (time_count/6000)%60,(time_count/100)%60,time_count%100);

                SetCtrlVal( panel,PANEL_STRING,buf);

            }

 

            if(flag2)

            {

                if(time_count2 > 0)

                {

                    time_count2 --;

            

                    sprintf(buf,"%d : %d : %d : %d", (time_count2/360000), (time_count2/6000)%60,(time_count2/100)%60,time_count2%100);

                    SetCtrlVal( panel,PANEL_STRING1,buf);

                    

                    if(time_count2 == 0)

                    {

                        flag2 =0;

                        Beep();

                        Beep();

                        Beep();

 

                    }

                }

            

            }

            break;

    }

    return 0;

}

 

추가로 Uir 파일 실행파일에 추가하기

Target Setting 에서 Embed project .UIRs 를 선택 한다.

 

예제 파일 다운로드 : 00001.zip

 

'공부 > CVI' 카테고리의 다른 글

CVI 프로젝트 만들기 2  (0) 2012.11.20
CVI 프로젝트 만들기 1  (0) 2012.11.20
CVI 가 window 7 64bit 를 지원할까 ?  (0) 2012.11.16
CVI 고찰  (0) 2012.11.16

User Interface Application.uir 를 선택하면 아래와 같이 GUI를 만들 기본 화면을 볼수 있다.

기본 Panel 에서 오른쪽 마우스 키를 누르면 각종 컨퍼넌트를 확인할 수 있고 이를

화면에 입력 할 수 있다. (적색원 표시 부분)

오른쪽 창에는 선택된 컨퍼넌트의 특성이 나온다. 이를 이용해서 각종 값을 조정할 수 있다.

여러 가지 를 선택해서 화면에 넣은 후 마우스를 이용해 크기 등을 변경하면 된다.

여기서 기본 화면을 만든다.

 

버튼을 만들어 보겠다.

선택하면 버튼이 입력된다.

버튼을 버블클릭 하면 특성 창이 나타난다.

중요 내용을 보면

Constant name : 내부 명칭을 선언

Callback function : 버튼을 누르거나 이벤트 발생시 연결되는 함수명을 선언

Control mode :

Shortcut Key : 특수키와 연결

Label : 표시 이름

 

Start 로 변경하고 이에 대한 특성은 아래처럼 처리 했다.

Callback function 을 보변 COMMANDBUTTON_A 로 되어 있는데 이것은 아래의 함수로 연결된다.

 

int CVICALLBACK COMMANDBUTTON_A (int panel, int control, int event,

        void *callbackData, int eventData1, int eventData2)

{

}

 

'공부 > CVI' 카테고리의 다른 글

CVI 프로젝트 만들기 3  (0) 2012.11.20
CVI 프로젝트 만들기 1  (0) 2012.11.20
CVI 가 window 7 64bit 를 지원할까 ?  (0) 2012.11.16
CVI 고찰  (0) 2012.11.16

CVI 프로젝트 만들기

먼저 CVI 를 실행하면 아래와 같은 화면이 나온다.

신규 프로젝트를 만들기 위해서 Project from Template 를 선택 한다.

User Interface Application 을 선택하고 프로젝트를 저장할 디렉토리를 선언한다

OK 를 누르면 프로젝트를 자동으로 만들어 준다.

(project name은 보기 편하게 변경하는 것을 추천한다.)

이때 디렉토리가 없으면 자동을 생성을 해준다.

'공부 > CVI' 카테고리의 다른 글

CVI 프로젝트 만들기 3  (0) 2012.11.20
CVI 프로젝트 만들기 2  (0) 2012.11.20
CVI 가 window 7 64bit 를 지원할까 ?  (0) 2012.11.16
CVI 고찰  (0) 2012.11.16

CVI 는 64bit 를 지원하는듯 하다.

잘은 모르겠는데 컴파일 할때 64bit용으로 별도로 지원 하는 듯 하다.

그런데 코딩을 주의해야 할듯 하다. 아래와 같이 변수의 사이즈가 달라지는듯 한데

비트 연산이 많으면 꼬이지 않을까..

 

 

Data type Description Size on 32-bit applications Size on 64-bit applications
size_t, ssize_t size_t is an unsigned integer type, and ssize_t is a signed integer type. Both are used to represent the size or number of objects. size_t is returned by sizeof operator. 32 64
intptr_t, uintptr_t Integer types capable of storing a pointer value. Used primarily for performing pointer arithmetic. 32 64
ptrdiff_t Signed integer type representing a relative offset from a pointer, or the result of subtracting two pointers. 32 64

 

 

아래 내용을 보면 2010 버전은 만능 인듯 하다. 거의 모든 OS 를 지원 한다.

 

 

가능하면 2010 이나 2012로 해봐야 겠다. 내가 linux 용 프로그램은 안할것 같아서 PASS

'공부 > CVI' 카테고리의 다른 글

CVI 프로젝트 만들기 3  (0) 2012.11.20
CVI 프로젝트 만들기 2  (0) 2012.11.20
CVI 프로젝트 만들기 1  (0) 2012.11.20
CVI 고찰  (0) 2012.11.16

주로 MCU 기반의 장비나 F/W를 개발 해 오다보니 PC용 프로그램을 다루지 않게 되었다.

 

그러다 보니 가끔 필요한 프로그램 짜는 것도 부담스러운 지경이 되었다.

 

이러면 안되는데.. 그렇다고 주고 C 언어로 프로그램 해오다가 갑자기 다른 언어의 프로그램을

 

공부해서 해보려고 하면 막막하고 잘 익혀지지도 않는다.

 

그래서 좋은 방법이 없을까 늘 고민을 해왔다.

 

C 언어 기반의 PC용 프로그램 컴파일러가 있는것을 알게 되었다.

 

NI 사에서 나온 LabWindows/CVI

 

그래서 관련 자료를 찾아보니 http://www.cvi.kr/  사이트가 있는데 정말 나름 정리를 잘해 두었고

 

참고할 만한 내용이 많았다.

 

그래서 앞으로 시간 날때마다. 해당 사이트를 참고로 나만의 프로그램을 만들어 보고자 한다.

 

참 기본 컴파일을 해봤는데 몇개의 dll 같은 파일이 꼭 있어야 한다.

 

한개로 생기면 정말 좋을텐데..

 

'공부 > CVI' 카테고리의 다른 글

CVI 프로젝트 만들기 3  (0) 2012.11.20
CVI 프로젝트 만들기 2  (0) 2012.11.20
CVI 프로젝트 만들기 1  (0) 2012.11.20
CVI 가 window 7 64bit 를 지원할까 ?  (0) 2012.11.16

+ Recent posts