📄 pctohandset.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 + -