⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pctohandset.cpp

📁 m68k手持机的通讯相关源码
💻 CPP
字号:
/**************************************************************************
File       : pctohandset.cpp
Description: 这是一个使用手持机基于数据库数据传输动态库的demo.在通常情况下你
            不需要修改本文件代码.你通过接口函数设置其参数,即可完成应用程序的
			开发工作.你需要重写的代码仅仅在guest_code.cpp中.
Author     : 梅海华
Date       : 2003/11/10             
***************************************************************************/
#include "stdafx.h"
#include "pctohandset.h"
#include "HD_DT_wl.h"
#include "message.h"
#include "guest_code.h"

unsigned char g_port_sel=0;
unsigned char g_baud=0;

unsigned char g_id_server = 0xFF;
unsigned char g_id_curr_hd = 0;
static HANDLE g_hComport=NULL;

extern unsigned char g_id_server;
extern unsigned char g_char_flag ;
//楼层的信道的设置数组
unsigned char g_info_path_array[16] = {2,15,4,8,0xff,3,1,3,5,7,0xff,4,10,11,12,0xff};
//楼层的信道的设置数组d的长度
int g_info_path_array_len = 16;
extern short __stdcall dt_atom_recv(HANDLE hComDev,unsigned char *data,unsigned long len,unsigned long *len_read);
extern short __stdcall dt_atom_send(HANDLE hComDev,unsigned char *data,int len);

/****************************************************************************
内部全局变量,不需要设置
******************************************************************************/
//buffer 
HANDLE hRevBuffMap;
LPVOID g_lpvRevBuffFile=NULL;
unsigned long g_nRevBuffFileLen=0;
/****************************************************************************
内部全局变量,需要设置的变量
******************************************************************************/
//window poniter which to receive the message,you should set this pointer 
//to your display window by set_disp_window function
CWnd *g_Disp_Wnd;

//数据表的个数:总数
int g_num_tables = MAX_NUM_OF_TABLE;

//only for display,you could set these by set_table_names
char g_TableName[MAX_NUM_OF_TABLE][80] = {"数据表1","数据表2","数据表3"};

//record size,you could set these by set_tab_rec_size
short g_rec_size[MAX_NUM_OF_TABLE];

//table block number
short g_block_num[MAX_NUM_OF_TABLE] = {2,1,2}; 
//download and upload file names
//download file names set by  set_download_fns set_download_fn
char g_strDNLDFileName[MAX_NUM_OF_TABLE][100]; 
//upload file names set_upload_fns set_upload_fn
char g_strUPLDFileName[MAX_NUM_OF_TABLE][100]={"table1","table2","table3"}; 
//数据表的设置数组,
table_struct g_array_table_struct[MAX_NUM_OF_TABLE];

//set for data transmit plan --- see function set_dt_plan
BOOL g_SelectTab[MAX_NUM_OF_TABLE]; //select or not select
BOOL g_dirTab[MAX_NUM_OF_TABLE];  //download or upload 
BOOL g_UpLDDelTab[MAX_NUM_OF_TABLE] = {0,0,0}; //delete data table on handset or not when upload 
BOOL g_DnLDDelTab[MAX_NUM_OF_TABLE] = {1,1,1}; //delete data table on handset or not when download 

void funct_step_recv_data(int step);
int save_data(int fsid,unsigned char *buff,unsigned long len);

static void dt_delay(DWORD mm)
{
   DWORD start;
   start=GetTickCount();
   while((GetTickCount()-start)<(DWORD)mm);
}

/*************************************************************************************************************
设置函数
**************************************************************************************************************/
//set display window
void set_disp_window(CWnd *wnd)
{
	g_Disp_Wnd = wnd;
}
//set record size
void set_tab_rec_size(short size[])
{
    for(int i=0;i<MAX_NUM_OF_TABLE;i++)
	{
       g_rec_size[i] = size[i];
	}
}
//set table block number
void set_tab_blocks(short block_size[])
{
    for(int i=0;i<MAX_NUM_OF_TABLE;i++)
	{
       g_block_num[i] = block_size[i];
	}
}

//set download file paths and names 
void set_download_fns(char filename[MAX_NUM_OF_TABLE][100])
{
   for(int i=0;i<MAX_NUM_OF_TABLE;i++)
   {
	   strcpy((char*)g_strDNLDFileName[i],(char*)filename[i]);
   }
}
//set download file path and names 
void set_download_fn(char *filename,int fsid)
{
	   strcpy((char*)g_strDNLDFileName[fsid],filename);
}
//set all upload file names
void set_upload_fns(char filename[MAX_NUM_OF_TABLE][100])
{
   for(int i=0;i<MAX_NUM_OF_TABLE;i++)
   {
	   strcpy(g_strUPLDFileName[i],filename[i]);
   }
} 
//set one upload file name 
void set_upload_fn(char *filename,int fsid)
{
	   strcpy(g_strUPLDFileName[fsid],filename);
}

//set data transmit plan
void set_dt_plan(BOOL tab[MAX_NUM_OF_TABLE],BOOL dir[MAX_NUM_OF_TABLE],BOOL delUpLD[MAX_NUM_OF_TABLE],BOOL delDnLD[MAX_NUM_OF_TABLE])
{
    for(int i=0;i<MAX_NUM_OF_TABLE;i++) {
		g_SelectTab[i] = tab[i];
		g_dirTab[i] = dir[i];
		g_UpLDDelTab[i] = delUpLD[i];
		g_DnLDDelTab[i] = delDnLD[i];
	}
}
//set data table name,only for table name display
void set_table_names(char name[MAX_NUM_OF_TABLE][80])
{
	for(int i=0;i<MAX_NUM_OF_TABLE;i++)
	{
		strcpy(g_TableName[i],name[i]);
	}
}
/*****************************************************************************************************
功能函数
******************************************************************************************************/
short connect_hd(HANDLE *phComDev,short port,int baud,unsigned char des,unsigned char src)
{
	static int flag = 0;
	HANDLE hComDev;

	if(!baud) {
			hComDev = dt_init(port,9600);
	} else {
			hComDev = dt_init(port,115200);
	}
	if(hComDev == (HANDLE)ERR_EXIST) 
	{
		AfxMessageBox("串口被占用!");
		return FAILURE;
	}
    if((int)hComDev<0 ) return FAILURE;
	if(SUCCESSFUL != dt_connect_send(hComDev,des,src))
	{
		dt_exit(hComDev);
		return FAILURE;
	}
	if(g_lpvRevBuffFile == NULL) 
	{
		g_lpvRevBuffFile = VirtualAlloc(NULL,52*64*1024,MEM_COMMIT,PAGE_READWRITE);
	    if(g_lpvRevBuffFile == NULL) 	
		{
			AfxMessageBox("分配内存出错!");
			return FAILURE;
		}
	}
	*phComDev = hComDev;
	g_hComport = hComDev;
    return SUCCESSFUL;
}

/******************************************************************************************************/
//自动查找串口 com1 -- com4
short connect_hd_multi_port(HANDLE *phComDev,unsigned char des,unsigned char src)
{
	static _int16 port = 0;
	static int flag = 0;
	int i;

	for(i=0;i<4;i++)
	{
		if(connect_hd(phComDev,i,1,des,src)==SUCCESSFUL) break;
	}
	if(i>=4) return FAILURE;
	g_hComport = *phComDev;
    return SUCCESSFUL;
}

short  disconnect_hd(HANDLE hComDev)
{
	unsigned char src=g_id_server,des=g_id_curr_hd;
	dt_disconnect(hComDev,des,src);
	dt_exit(hComDev);
	return SUCCESSFUL;
}

UINT Update_HDData(LPVOID pParam)
{
	int i;
	unsigned char src=g_id_server,des=g_id_curr_hd;
    HANDLE hComDev;
    short ret;
    CWnd *wnd=g_Disp_Wnd;
	int dir_com = 0;
	dir_com = *(int *)pParam;

	ret = connect_hd_multi_port(&hComDev,0,g_id_server);
    if(ret!=SUCCESSFUL) 
	{
		return FAILURE;
	}
	g_hComport = hComDev;
	for(i=0;i<MAX_NUM_OF_TABLE;i++)
	{
		if(g_SelectTab[i]) {
			if(dir_com==0)
			{
				if(g_dirTab[i]) {//下载
					if(g_DnLDDelTab[i]) 
					{
						dt_del_tab(hComDev,des,src,i);
						dt_delay(g_block_num[i]*1000+2000);
					}
					if(SendData(&i)!=SUCCESSFUL) return FAILURE;
				}
			}else {//上传
				if(!g_dirTab[i]) {
					if(GetData(&i)!=SUCCESSFUL) return FAILURE;
				    if(g_UpLDDelTab[i]) {
					   dt_del_tab(hComDev,des,src,i);
					   dt_delay(g_block_num[i]*1000+1);
					}
				}
			}
		}
	}
	disconnect_hd(hComDev);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_SENDDATA_OK);
	return SUCCESSFUL;
}

void funct_step_send_data(int step)
{
	CWnd *wnd = g_Disp_Wnd;
	TRACE("funct_step_send_data:%d\r\n",step);

	if(step>10||step<0) return ;
	if(step==10)
	{
		::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_START,NULL);
		::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_SENDDATA_START);
	}else if(step==0){
		::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_END,NULL);
		::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_SENDDATA_END);
	}else {
		::PostMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_STEPONE,NULL);
	}
}
UINT SendData(LPVOID pParam)
{
	int fsid;
    unsigned long recNum;
	DWORD start;
	unsigned char src=0xff,des=ID_BROARDCAST;

	fsid = *(int *)pParam;
	start = GetTickCount();
    if(ReadFromFile((unsigned char *)g_lpvRevBuffFile,&g_nRevBuffFileLen,g_rec_size[fsid],fsid,g_strDNLDFileName[fsid])!=SUCCESSFUL)
	{
		AfxMessageBox("读取数据文件出错!");
		return FAILURE;
	}
	TRACE("Readfile time: %ld\r\n",GetTickCount()-start);
    recNum = g_nRevBuffFileLen/g_rec_size[fsid];
	return dt_send_table_data(g_hComport,des,src,fsid,recNum,g_rec_size[fsid],(unsigned char*)g_lpvRevBuffFile,funct_step_send_data);
}

/********************************************************/
short set_time_pc(HANDLE hComDev)
{
   return dt_set_time_pc(hComDev,g_id_curr_hd,g_id_server);
}
short ask_DBCount(HANDLE hComDev,int fsid,unsigned int *count)
{
	return dt_ask_DBCount(hComDev,g_id_curr_hd,g_id_server,fsid,count);
}
short del_tab(HANDLE hComDev,int fsid)
{
	return dt_del_tab(hComDev,g_id_curr_hd,g_id_server,fsid);
}
short init_db(HANDLE hComDev)
{
	return dt_init_db(hComDev,g_id_curr_hd,g_id_server);
}
short verify_tab(HANDLE hComDev,int fsid)
{
	return dt_verify_tab(hComDev,g_id_curr_hd,g_id_server,fsid);
}

void funct_step_recv_data(int step)
{
	CWnd *wnd = g_Disp_Wnd;
	TRACE("funct_step_recv_data:%d\r\n",step);

	if(step>10||step<0) return ;
	if(step==10) 
	{
		::PostMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_START,NULL);
		::PostMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_REVDATA_START);
	}else  if(step==0){
			::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_END,NULL);
			::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,ID_PROGRESS_DATASAVE_END,(LPARAM)MESSAGE_SAVEDATA_END);
	} else {
			::PostMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_STEPONE,NULL);
	}
}
int save_data(int fsid,unsigned char *buff,unsigned long len)
{
	CWnd *wnd = g_Disp_Wnd;
	char msg[80];
	unsigned int tmp;
	CString filename ;
	struct tm when;	    
	time_t now;	    

	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_START,NULL);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_SAVEDATA_START);

    time( &now ); 
    when = *localtime( &now );        
	int year = when.tm_year+1900;
	if(strstr(g_strUPLDFileName[fsid],".txt")==NULL)
		strcpy(msg,g_strUPLDFileName[fsid]);
	else {
		tmp = strstr(g_strUPLDFileName[fsid],".txt")-g_strUPLDFileName[fsid];
		memcpy(msg,g_strUPLDFileName[fsid],tmp);
		msg[tmp] = 0;
	}
   filename.Format("%s_%04d%02d%02d%02d%02d%02d.txt",msg,
						when.tm_year+1900,
						when.tm_mon+1,
						when.tm_mday,
						when.tm_hour,
						when.tm_min,
						when.tm_sec);
    //filename.Format("%s.txt",msg);
    SaveToFile(buff,len,g_rec_size[fsid],fsid,(LPSTR)(LPCTSTR)filename);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_END,NULL);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,ID_PROGRESS_DATASAVE_END,(LPARAM)MESSAGE_SAVEDATA_END);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,ID_MESSAGE_DISP_FILE_NAME,(LPARAM)((LPSTR)(LPCTSTR)filename));
	return SUCCESSFUL;
}


UINT GetData(LPVOID pParam)
{
	// TODO: Add your control notification handler code here
	unsigned long count;
	CWnd *wnd = g_Disp_Wnd;
	char msg[80];
	int fsid = *(int *)pParam;
	DWORD start = GetTickCount();
	unsigned char src=0xff,des=ID_BROARDCAST;

    sprintf((char*)msg,"获取数据表:%s",(char*)g_TableName[fsid]);
    strcpy(MESSAGE_FILENAME,msg);
    
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_START,NULL);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,ID_PROGRESS_REVDATA_START,(LPARAM)MESSAGE_REVDATA_START);
	::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STATUS,NULL,(LPARAM)MESSAGE_FILENAME);
	//ask for data table
	if(dt_get_table_data(g_hComport,des,src,fsid,&count,g_rec_size[fsid],(unsigned char*)g_lpvRevBuffFile,funct_step_recv_data)!=SUCCESSFUL) 
	{
		::SendMessage(wnd->GetSafeHwnd(),USER_MESSAGE_STEP,ID_PROGRESS_END,NULL);
		return FAILURE;
	}
	g_nRevBuffFileLen = count * g_rec_size[fsid];
	save_data(fsid,(unsigned char*)g_lpvRevBuffFile,g_nRevBuffFileLen);
	return SUCCESSFUL;
}




⌨️ 快捷键说明

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