dlg_ad.c

来自「minigui PDA系统 可实现手机功能」· C语言 代码 · 共 243 行

C
243
字号

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#include "ad/ad.h"



static HWND hwnd_ad;	//AD转换窗口句柄
static BOOL STOP;	//线程停止标志
static BOOL PAUSE;	//线程暂停标志

//AD对话框结构体
static DLGTEMPLATE DlgAD =
{
    WS_BORDER | WS_CAPTION, 
    WS_EX_NONE,
    25, 45, 270, 150, 
    "数据采集",
    0,
    0,
    8, NULL,
    0
};


//AD对话框控件数组
static CTRLDATA CtrlAD [] =
{ 
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        10, 50, 30, 16, 
        IDC_AD_WINFO, 
        "土壤:",
        0
    },
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        40, 50, 50, 16, 
        IDC_AD_WATER, 
        "0.0",
        0
    },
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        100, 50, 30, 16, 
        IDC_AD_AINFO, 
        "温度:",
        0
    },
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        130, 50, 50, 16, 
        IDC_AD_AIR, 
        "0.0",
        0
    },
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        190, 50, 30, 16, 
        IDC_AD_SINFO, 
        "湿度:",
        0
    },
    {
        "static",
        WS_VISIBLE | SS_SIMPLE,
        220, 50, 50, 16, 
        IDC_AD_SOIL, 
        "0.0",
        0
    },
    {
        "button",
        WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 
        50, 80, 60, 25,
        IDC_AD_SAVE, 
        "保存数据",
        0
    },
    {
        "button",
        WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 
        150, 80, 60, 25,
        IDC_AD_CANCEL, 
        "取消",
        0
    }
   /* ,
   {
        "static",
        WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
        10, 20, 30, 16,
        IDC_AD_XYINFO,
        "坐标:",
        0
    },
    {
        "static",
        WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON,
        40, 20, 200, 16,
        IDC_AD_XY,
        "N 40 35' 45\" : E 60 21' 32\"",
        0
    }*/
};


static void* GetADData (void * arg)
{
    int i;
    float ad_data[3]={0.0, 0.0, 0.0};
    char ptr[3][7];
    usleep(1);
    while(STOP == FALSE)
    if(PAUSE == FALSE)
    {
	//三路AD数据采集,并将采集到的数据转换成字符串
	for (i=0;i<3;i++)
	{
	ad_data[i] = ((float)GetADresult(i) * 3.3) / 1024.0;
	gcvt(ad_data[i], 5, ptr[i]);
	ptr[i][6] = '\0';
	}

	//在窗口上显示由数据转换来的字符串
	SetWindowText (GetDlgItem(hwnd_ad, IDC_AD_WATER), ptr[0]);
	SetWindowText (GetDlgItem(hwnd_ad, IDC_AD_AIR), ptr[1]);
	SetWindowText (GetDlgItem(hwnd_ad, IDC_AD_SOIL), ptr[2]);
	sleep(1);
    }
}

static int SaveData(HWND hWnd, struct DATA data)
{
		FILE *fp;
		fp = fopen("data/ad.dat","a+");
		if(!fp)
		{
			 return (-1);
		}
		fwrite(&data,sizeof(struct DATA),1,fp);
		fclose(fp);
		return 1;
}

static int DlgADProc (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
    struct DATA data;
    char buf[7] = {'\0'};
    time_t timep;
    struct tm *gmt;
    hwnd_ad = hDlg;
    switch (message) 
    {
    case MSG_COMMAND:
    switch (wParam) 
	  {
    case IDC_AD_SAVE:	 //点击保存按钮时
		PAUSE = TRUE;
		
		timep = time(NULL);
		gmt = gmtime(&timep);
		
		if (MessageBox (hDlg, "是否保存采集到的数据", "确认保存", MB_YESNO | MB_ICONQUESTION) == IDYES)
		{
			//点击YES后,将时间和采集到的数据保存在ad.dat文件中	
			strcpy(data.time, asctime(gmt));
			GetDlgItemText (hDlg, IDC_AD_AIR, buf, 6);
			data.air = (float)atof(buf);
			GetDlgItemText (hDlg, IDC_AD_WATER, buf, 6);
			data.water = (float)atof(buf);
			GetDlgItemText (hDlg, IDC_AD_SOIL, buf, 6);
			data.soid = (float)atof(buf);
			
			if(SaveData (hDlg, data) == -1)
			{
				//data.txt文件打开失败时
				MessageBox (hDlg, "保存失败!!!", "错误",
					    MB_OK | MB_ICONEXCLAMATION);
			}
			else
			{
				//保存成功时
				MessageBox (hDlg, "保存完毕", "信息",
					    MB_OK | MB_ICONINFORMATION);
			}
		}
		PAUSE = FALSE;
	break;

        case IDC_AD_CANCEL:
		STOP = TRUE;
        	EndDialog (hDlg, wParam);
	break;
        }
    break;

    case MSG_CLOSE:
	STOP = TRUE;
	EndDialog (hDlg,wParam);
    break;
    }
    return DefaultDialogProc (hDlg, message, wParam, lParam);
}


int OpenAD (HWND hWnd)
{
    pthread_t th_ad;
    STOP = FALSE;
    if(init_ADdevice() == -1)
    {
	//AD设备打开失败时,通知用户,然后返回 -1
	MessageBox (hWnd, "A/D设备打开失败","错误",MB_OK | MB_ICONEXCLAMATION);
	return -1;
    }
    
    DlgAD.controls = CtrlAD;

    //建立数据采集线程
    pthread_create (&th_ad, NULL, GetADData, 0);

    //建立AD对话框
    DialogBoxIndirectParam (&DlgAD, hWnd, DlgADProc, 0L);

    //关闭数据采集线程
    pthread_join (th_ad, NULL);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?