?? data.cpp
字號(hào):
#include "stdafx.h"
#include "data.h"
#include "vcstyle.h"
#include "sja\\sjamacro.h"
#include "sja\\sjaexport.h"
#include <memory.h>
/*數(shù)據(jù)保存
g_data : 存放所有的采集到的數(shù)據(jù)。每個(gè)模塊分配有MAX_CHANS個(gè)BYTE。
歷史數(shù)據(jù)長(zhǎng)度為MAX_LEN
*/
double g_data[MAX_MODELS][MAX_CHANS][MAX_LEN];
BOOL g_data_new[MAX_MODELS][MAX_CHANS];
//作為'new'的標(biāo)識(shí),
//接收線(xiàn)程負(fù)責(zé)置位,主程序負(fù)責(zé)清空
/*規(guī)定:
對(duì)于驅(qū)動(dòng)
g_data[addr][0] : 熱電偶(mV)
g_data[addr][1] : 角度(mV)
g_data[addr][2] : 室溫值(度)
*/
/*模塊分類(lèi)
粗分: AD,DA,DI,DO,DIO,QD
細(xì)分:7710,7703,7703-2,驅(qū)動(dòng)
*/
BYTE RC_BUF[FRAMELEN];
BYTE TX_BUF[FRAMELEN];
/*幀格式:
08 addr 0 ch cmdtype params
*/
//波特率
BYTE baud;
//7710放大倍數(shù)
UINT g_scale;
//-----------------------------------------------------------------------------
//模塊信息表
//模塊配置信息存放的數(shù)據(jù)結(jié)構(gòu)
MDINFO ModelTable[MAX_MODELS];//存放由配置文件讀入數(shù)據(jù)。只讀
MDINFO ModelTableBk[MAX_MODELS];//副本。允許對(duì)其修改。存盤(pán)操作將保存這里面的數(shù)據(jù)
//刪除副本
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;
}
}
//復(fù)制副本
void cp_md_table()
{
free_bk_md_table();//先刪除原來(lái)的內(nèi)容
memcpy(ModelTableBk,ModelTable,sizeof(ModelTable));
//將詳細(xì)配置參數(shù)讀過(guò)來(lái),填充MdTableBk[i].detail
//................
}
//初始化原件
void init_md_table()
{
for(int i=0;i<MAX_MODELS;i++){
ModelTable[i].type = T_NULL;//不存在
ModelTable[i].detail = 0;
}
}
//獲取模塊類(lèi)型
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;//缺省值
}
}
//寫(xiě)文件
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();
}
//初始化兩個(gè)表
void init_tables()
{
init_md_table();
read_cfg_file();
cp_md_table();
}
//釋放兩個(gè)表
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值。對(duì)AD7703,AD7710,驅(qū)動(dòng)模塊有效
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;
//寫(xiě)入
// 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://測(cè)試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];
}
//調(diào)用各種函數(shù)進(jìn)行處理
parsedata(RC_BUF);
//send message to main program.
PostMessage(AfxGetMainWnd()->m_hWnd,
WM_RECEIVEFRAME,0,0);
// SendMessage(pView->m_hWnd,MM_GOTFRAME,0,0);//也可直接調(diào)用OnGotFrame
//如果主線(xiàn)程Sleep了,發(fā)這個(gè)消息有效嗎?
// ((CMainFrame*)AfxGetMainWnd())->m_nFrames++;
}
void CALLBACK rchandler(BYTE* rcframe)
{
handle_rc_frame(rcframe);
}
BYTE intcode;
void CALLBACK errhandler(BYTE errcode)
{
intcode = errcode;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -