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