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

📄 data.cpp

📁 操作系统是Windows 98
💻 CPP
字号:
#include "stdafx.h"

#include "data.h"
#include "vcstyle.h"
#include "sja\\sjamacro.h"
#include "sja\\sjaexport.h"
#include <memory.h>


/*数据保存
	g_data : 存放所有的采集到的数据。每个模块分配有MAX_CHANS个BYTE。
		历史数据长度为MAX_LEN
*/
double g_data[MAX_MODELS][MAX_CHANS][MAX_LEN];
BOOL g_data_new[MAX_MODELS][MAX_CHANS];
	//作为'new'的标识,
	//接收线程负责置位,主程序负责清空

	/*规定:
	对于驱动
		g_data[addr][0] : 热电偶(mV)
		g_data[addr][1] : 角度(mV)
		g_data[addr][2] : 室温值(度)
	*/
/*模块分类
	粗分: AD,DA,DI,DO,DIO,QD
	细分:7710,7703,7703-2,驱动
*/


BYTE RC_BUF[FRAMELEN];
BYTE TX_BUF[FRAMELEN];
/*帧格式:
	08 addr 0 ch cmdtype params
*/

//波特率
BYTE baud;

//7710放大倍数
UINT g_scale;
//-----------------------------------------------------------------------------
//模块信息表
//模块配置信息存放的数据结构


MDINFO ModelTable[MAX_MODELS];//存放由配置文件读入数据。只读
MDINFO ModelTableBk[MAX_MODELS];//副本。允许对其修改。存盘操作将保存这里面的数据

//删除副本
void free_bk_md_table()
{
	for(int i=0;i<MAX_MODELS;i++){
		delete ModelTableBk[i].detail;
	}
}
//删除原件
void free_md_table()
{
	for(int i=0;i<MAX_MODELS;i++){
		delete ModelTable[i].detail;
	}
}
//复制副本
void cp_md_table()
{
	free_bk_md_table();//先删除原来的内容
	memcpy(ModelTableBk,ModelTable,sizeof(ModelTable));
	//将详细配置参数读过来,填充MdTableBk[i].detail

	//................
}
//初始化原件
void init_md_table()
{
	for(int i=0;i<MAX_MODELS;i++){
		ModelTable[i].type = T_NULL;//不存在
		ModelTable[i].detail = 0;
	}
}
//获取模块类型
BYTE get_type(BYTE addr)
{
	return ModelTable[addr].type;
}
//读文件
void read_cfg_file()
{
	//读配置文件cfg.txt
	CFileStatus status;
	if(CFile::GetStatus("cfg.txt",status)){//存在,则读取
		CFile f("cfg.txt",CFile::modeRead);
		CArchive ar(&f,CArchive::load);

		ar >> baud;//读取波特率

		CString sname;
		for(int i=0;i<MAX_MODELS;i++){
			ar >> ModelTable[i].type;
			ar >> sname;
			strcpy(ModelTable[i].name,sname);
		}
		ar.Close();
		f.Close();
	}
	else{
		baud = 0xC3;//缺省值
	}

}
//写文件
void write_cfg_file()
{
	CFile f("cfg.txt",CFile::modeCreate|CFile::modeWrite);
	CArchive ar(&f,CArchive::store);

	ar << baud;

	for(int i=0;i<MAX_MODELS;i++){
			ar << ModelTableBk[i].type;
			CString sname = ModelTableBk[i].name;
			ar << sname;
	}

	ar.Close();
	f.Close();
}
//初始化两个表
void init_tables()
{
	init_md_table();
	read_cfg_file();
	cp_md_table();
}
//释放两个表
void free_tables()
{
	free_md_table();
	free_bk_md_table();
}

//----------------------------------------------------
void parsedata(BYTE* frame)
{
	if(RC_BUF[1] == 0x40) return;//模块初始化帧
	if(!(RC_BUF[1] & 0x40)) return;//命令帧

	//get addr
	BYTE addr = RC_BUF[1]&~0x40;
	//get channel
	BYTE ch = RC_BUF[3]&~0x40;

	//get model type
	BYTE mdtype = get_type(addr);
	//get command type
	BYTE cmdtype = RC_BUF[4];

	int i;

	double ad_val;
	double cool_val;
	switch(cmdtype){
	case 0x02://获取AD值。对AD7703,AD7710,驱动模块有效
		ad_val = ((double)(RC_BUF[5] + (RC_BUF[6]<<8)) * 2500.0) / (64*1024-1);
		if((mdtype == T_QD) ||
			(mdtype == T_AD_7710)){
			if(ch == 0)
				ad_val /= 32;
			else
				ad_val /= 8;
			if(g_scale != 0)
				ad_val /= g_scale;
			if(addr == 7)//7好模块
				ad_val /= 4.0;
		}
		else if((mdtype == T_AD_7703) ||
			(mdtype == T_AD_7703_2)){
			ad_val /= 50;
		}
		
		cool_val = RC_BUF[7] + RC_BUF[8]/16.0;
		//写入
//		memmove(&g_data[addr][ch][0],&g_data[addr][ch][1],MAX_LEN);
		for(i= 0;i<MAX_LEN-1;i++){
			g_data[addr][ch][i] = g_data[addr][ch][i+1];
		}
		g_data[addr][ch][MAX_LEN-1] = ad_val;
//		memmove(&g_data[addr][2][0],&g_data[addr][2][1],MAX_LEN-1);
		g_data[addr][2][MAX_LEN-1] = cool_val;
		g_data_new[addr][ch] = TRUE;
		g_data_new[addr][2] = TRUE;
		break;
	case 0x11://测试7710性能。24位
		ad_val = ((double)(RC_BUF[5] + (RC_BUF[6]<<8) + (RC_BUF[7]<<16)) * 2500.0) / (64*1024-1);
		ad_val /= 256.0;
		if(g_scale != 0)
			ad_val /= g_scale;

		//if (RC_BUF[1]==8) {ad_val2=ad_val;update=1;}
		for(i= 0;i<MAX_LEN-1;i++){
			g_data[addr][3][i] = g_data[addr][3][i+1];
		}
		g_data[addr][3][MAX_LEN-1] = ad_val;
		g_data_new[addr][3] = TRUE;

	default:
		break;
	}
}

void handle_rc_frame(BYTE* rcframe)
{
	for(int i=0;i<FRAMELEN;i++){
		RC_BUF[i] = rcframe[i];
	}
	//调用各种函数进行处理
	parsedata(RC_BUF);

	//send message to main program.
	PostMessage(AfxGetMainWnd()->m_hWnd,
		WM_RECEIVEFRAME,0,0);

//	SendMessage(pView->m_hWnd,MM_GOTFRAME,0,0);//也可直接调用OnGotFrame
	//如果主线程Sleep了,发这个消息有效吗?
//	((CMainFrame*)AfxGetMainWnd())->m_nFrames++;

}
void CALLBACK rchandler(BYTE* rcframe)
{
	handle_rc_frame(rcframe);
}

BYTE intcode;
void CALLBACK errhandler(BYTE errcode)
{
	intcode = errcode;
}

⌨️ 快捷键说明

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