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

📄 dischar.h

📁 该程序是基于PC104的工控板的多参数监护仪的源程序.监护内容包含:心电血氧呼吸无创血压等等.
💻 H
📖 第 1 页 / 共 5 页
字号:
      PLETHWave_row=PLETH_SMALL_ENDY;//血氧波形的基线位置
      if(RESPCHK->value==V_OFF){//呼吸关了不显示
	  WaveCont=0x03;
	  PLETHWave_row=WAVE_ENDY;
      }
      EwaveX=PwaveX=RwaveX=WAVXSTART;
      ECGWavItstr=PLETHWavItstr=RESPWavItstr=NULL;
  }
  LeadStr2=VAL_LEAD[SECLEAD->value];
  drawECGScaleRule();
  SaveCount=0;//立即重新开始保存设置的值
  return;
}

void initface(void)
{

 char tempstr[20];
 //float fvar;
 int   col, var;
 
 ReviseColor();//重新写调色板颜色
 SetBackColor(BACKCOLOR->value);//设置背景色
 //SETCOLOR(ITEMUL_COLOR);
 fillrect(1,   561, 23,  798, ITEMUL_COLOR);
 fillrect(580, 561, 599, 798, ITEMUL_COLOR);


 SETCOLOR(CYAN);
 commline(0, LEFTMAXX, 599, LEFTMAXX);//左右分界线
 Rectangle(0, 0, 599, 799);


//画波形速度标尺-----------------与实际尺寸对应12.1寸液晶800*600分辨率---------
 gapbeeline(24, 0, 24, LEFTMAXX);
 for(col=560, var=0;  ; var++){
 	if(var&0x01){
 	    col-=32;
 	}else{
 	    col-=33;
 	}
 	if(col<0) break;
 	commline(24, col, 29, col);
 }
 gapbeeline(29, 0, 29, LEFTMAXX);
 //结束画波形速度标尺-------------实际尺寸对应12.1寸液晶800*600分辨率---------

 gapbeeline(ECG_ENDY+1, 0, ECG_ENDY+1, LEFTMAXX); //ECG+I WAVE UP
 gapbeeline(ECG_IENDY+1, 0, ECG_IENDY+1, LEFTMAXX);	//PLETH WAVE UP
 gapbeeline(PLETH_ENDY+1, 0, PLETH_ENDY+1, LEFTMAXX);//RESP WAVE UP

 gapbeeline(115, 560, 115, 799);//ECG value 与 ST value 分界线
 gapbeeline(180, 560, 180, 799);//ST value 与 NIBP value分界线
 gapbeeline(380, 560, 380, 799);//NIBP value 与 SPO2 RESP value 分界线
 gapbeeline(490, 560, 490, 799);//SPO2和RESP value 与TEMP1和TEMP2 value 分界线
 gapbeeline(380, 683, 490, 683);
 gapbeeline(579, 560, 579, 799);


 drawECGScaleRule();//画心电增益标尺
 
 sprintf(tempstr,"%4.2fmV",(float)2/(1<<ECGSCALE->value));
 outtext( 7 , 160, tempstr, WHITE, BLACK, FONT10);//心电增益
 outtext(7, 400, VAL_SCALE[ECGSCALE->value], ECGSCL_COLOR, BLACK, FONT10);//ECG sacle
 outtext(7, 72, VAL_LEAD[MAINLEAD->value], LIGHTGREEN, BLACK, FONT10); //I,II,III
 outtext(414, 736, VAL_SCALE[RESPSCALE->value], LIGHTRED, BLACK, FONT10);//呼吸增益
 //outtext(7, 336, workstastr, LIGHTCYAN, BLACK, FONT12);//工作状态
 
 
 GAPmin=GAPTIME->value-1; GAPsec=60;//设置间断报警时间
 AlarmTime=ALARMTIME->value;//设置报警时间
 PRINTmin=PRTTIME->value;//设置自动打印时间
 
 NIBPmin=NIBPsec=0;
 sprintf(tempstr,"%02d:%02d", NIBPmin, NIBPsec);
 outtext(362, 664, tempstr, WHITE, BLACK, FONT10);

 outtext(584, 600, "-01-", WHITE, ITEMUL_COLOR, FONT10); //YEAR[年月日]
 outtext(584, 736, ":00:", WHITE, ITEMUL_COLOR, FONT10); //TIME[时间]
 
 
 //ItemAllow=0x17;
 //if(RESPCHK->value==V_OFF){
 	//ItemAllow=0x13;//呼吸波形标题不刷新
 	//DisListHd(PLETH_ENDY+4);
 	//function()发送命令到心电板
 //}
 
 pulsering();	//脉搏铃
 AlarmRingAllow();//显示所有小的报警铃开关状态
 alarmring();	//大的(总的)报警开关铃
 outtext(8, 752, ":6.02", WHITE, ITEMUL_COLOR, FONT10);//版本
 outtext(340, 656, ":", WHITE, BLACK, FONT10);//标准: 成人 高
 outtext(362, 648, ":", WHITE, BLACK, FONT10);//手动测量:04:59清除
 
 if(NIBPUNIT->value==V_KPA)
     SYST_UP->type=SYST_LOW->type=MEAN_UP->type=MEAN_LOW->type=DIAS_UP->type=DIAS_LOW->type=TP_KPA;
 if(TEMP1UNIT->value==V_F_)
     TEMP1_UP->type=TP__F;
 if(TEMP2UNIT->value==V_F_)
     TEMP2_UP->type=TP__F;
 if(SECLEAD->value==MAINLEAD->value){//导联相同时的处理
  	MAINLEAD->value=V_II;
  	SECLEAD->value=V_III;
 }
 ExitMenu();
 return;
}


void DataSampling(void)
{
  (DataHand+Datapoint)->HR=HRrate;	(DataHand+Datapoint)->PR=PRrate;
  (DataHand+Datapoint)->ST=STvalue;	(DataHand+Datapoint)->SPO2=SPO2value;
  (DataHand+Datapoint)->TEMP1=TEMP1value;
  (DataHand+Datapoint)->TEMP2=TEMP2value;
  (DataHand+Datapoint)->RESP=RESPvalue;
  if(NIBPsave&0x01){
  	if((DataHand+Datapoint)->PR==255)
  	    (DataHand+Datapoint)->PR=NIBPrate;
  	(DataHand+Datapoint)->SYST=disSYST;
  	(DataHand+Datapoint)->DIAS=disDIAS;
  	(DataHand+Datapoint)->MEAN=disMEAN;
  	NIBPsave&=0xfe;
  }else{
  	(DataHand+Datapoint)->SYST=255;
  	(DataHand+Datapoint)->DIAS=255;
  	(DataHand+Datapoint)->MEAN=255;
  }
  Datapoint++;
  if(Datapoint>=MONDATAL){
  	Datafill=1;
  	Datapoint=0;
  }
  return;
}

void SaveRealData(void)
{//实时记录血压测量时的数据
  static listlencount=0;
  static char pagecount=0;
  if(disSYST!=255||disMEAN!=255||disDIAS!=255){
     if(NoWriteRealData){//从记录过数据
	(RealData_Sta+RealDataCurrnt)->TIME=RealTimeCount=0;
	NoWriteRealData=listlencount=pagecount=0;
     }else{
	(RealData_Sta+RealDataCurrnt)->TIME=RealTimeCount;
     }
     (RealData_Sta+RealDataCurrnt)->DATA.HR=HRrate;
     (RealData_Sta+RealDataCurrnt)->DATA.PR=PRrate;
     if((RealData_Sta+RealDataCurrnt)->DATA.PR==255)
     	(RealData_Sta+RealDataCurrnt)->DATA.PR=NIBPrate;
     (RealData_Sta+RealDataCurrnt)->DATA.ST=STvalue;
     (RealData_Sta+RealDataCurrnt)->DATA.SPO2=SPO2value;
     (RealData_Sta+RealDataCurrnt)->DATA.TEMP1=TEMP1value;
     (RealData_Sta+RealDataCurrnt)->DATA.TEMP2=TEMP2value;
     (RealData_Sta+RealDataCurrnt)->DATA.RESP=RESPvalue;
     (RealData_Sta+RealDataCurrnt)->DATA.SYST=disSYST;
     (RealData_Sta+RealDataCurrnt)->DATA.MEAN=disMEAN;
     (RealData_Sta+RealDataCurrnt)->DATA.DIAS=disDIAS;

     RealDataCurrnt=(RealDataCurrnt+1)%REALDATALEN;
     listlencount++; pagecount++;
     if(pagecount==PRTLSTLEN){
  	NIBPLSTPAGE->up++;
  	pagecount=0;
     }
     if(listlencount==REALDATALEN){
     	NIBPListFill=1;
     	listlencount=0;
     }
  }
  return;
}

void FreeRealData(void)
{ unsigned i_i;
  NoWriteRealData=1;//从来未记录过数据
  NIBPListFill=0;//数据没有满
  RealDataCurrnt=0;//置当前数据为头
  NIBPLSTPAGE->up=NIBPLSTPAGE->low=NIBPLSTPAGE->value=1;
  for(i_i=0;i_i<REALDATALEN;i_i++){
	(RealData_Sta+i_i)->DATA.HR=(RealData_Sta+i_i)->DATA.PR=\
	(RealData_Sta+i_i)->DATA.SYST=(RealData_Sta+i_i)->DATA.MEAN=\
	(RealData_Sta+i_i)->DATA.DIAS=(RealData_Sta+i_i)->DATA.SPO2=\
	(RealData_Sta+i_i)->DATA.RESP=255;
 	(RealData_Sta+i_i)->DATA.ST=127;
 	(RealData_Sta+i_i)->DATA.TEMP2=(RealData_Sta+i_i)->DATA.TEMP1=455;
 	(RealData_Sta+i_i)->TIME=0;
  }
  return;
}

void ItemChange(void)
{ static unsigned char DisNo=0, oldNIBPsec=0xff, oldNIBPmin=0xff, AlarmPrint=0;
  static unsigned char oldsec=60, oldmin=60, oldhour=24, oldday=0, oldmon=0;
  static unsigned oldyear=0xff;
  unsigned char tempstr[20], color, var;
  unsigned char *strpoint;
  gettime(&timer);
  getdate(&dater);
  
  while(com1count<6)//发送没有执行的命令
	sendcom1();
			    
  if(!(alarmsound&0x1ff)){//所有值都没有超出报警限
     AlarmTime=ALARMTIME->value;
     GAPmin=GAPTIME->value-1;
     GAPsec=60;
  }
  
  if(oldsec!=timer.ti_sec){	//--second counter and display
     //=============自动退出菜单处理===================
     MenuTime=MenuTime<MENUCOLOCK ? ++MenuTime :MENUCOLOCK;
     if(MenuTime>=MENUCOLOCK-1&&CUR_item!=NULL)
	ExitMenu();
     //====END======自动退出菜单处理===============

     //==========记录实时测量血压的时间间隔===============
     RealTimeCount++;
     if(RealTimeCount>=REALTIMELEN)//如果记录满24小时*60分钟*60秒
     	RealTimeCount=0;
     //===END=====记录实时测量血压的时间间隔===============

     //=============秒钟的显示处理==================
     TIME_SEC->value=oldsec=timer.ti_sec;
     if(oldsec)
     	TIME_SEC->up=TIME_SEC->low=oldsec;
     else
        TIME_SEC->up=TIME_SEC->low=1;

     sprintf(tempstr,"%02d",oldsec);
     outtext(584, 768, tempstr, WHITE, ITEMUL_COLOR, FONT10);

     if(CUR_vmenu==VM_DATETIME){//在时间日期菜单
     	unsigned char bkcolor;
	if((CUR_vmenu+CUR_Vcus)==TIME_SEC&&ItemValue==AT_VALUE){//在秒修改中
	    color=VM_CCOLOR;	bkcolor=VM_CBCOLOR;
	}else{
	    color=VM_COLOR;	bkcolor=VM_BCOLOR;
	}
	outtext(TIME_SEC->vy, TIME_SEC->vx, tempstr, color, bkcolor, FONT12);
     }//END 在时间日期菜单
     //===END==========秒钟的显示处理==================
     
     //=============报警时间处理==================
     if(AlarmTime) {//在报警时间中
	AlarmTime--; alarmsound|=0x4000;//alarm time allow
     }else{//不在报警时间中
	if(GAPALARM->value==V_ON){//间断报警开
	    alarmsound&=0xbfff;//alarm time don't allow
	    if(GAPsec){//间断记时开始
		GAPsec--;
	    }else{
		if(GAPmin){
		    GAPmin--;
		}else{//间断时间到
		    AlarmTime=ALARMTIME->value;//开启报警时间
		    GAPsec=59;	GAPmin=GAPTIME->value-1;
		}
	    }
	}else{//间断报警关
	    AlarmTime=ALARMTIME->value;//开启报警时间
	}
     }
     //=====END========报警时间处理==================
     
     //=============血压测量(清除)的时间处理==================
     if(NIBPsec){//NIBP 记时开始
	    NIBPsec--;
     }else{
	if(NIBPmin){
	    NIBPmin--;
	    NIBPsec=59;
	}else{//NIBP 记时时间到
       	    if(AUTOMANUAL->value==V_AUTO){//自动测量
		if(MONDEMO->value==V_MONITOR){
		    if(!(NIBPStatus&0x01)&&NIBPCheckTure){
            		NIBPsec=60;
			NIBPmin=AUTOTIME->value-1;
			com1str[2]=0x01;	//启动血压测量
			com1str[3]=NIBPCRIT->value|(CHECKMODE->value<<4);
			com1str[4]=0;
		    	com1str[5]=((com1str[2]+com1str[3])&255);
		    	com1count=0;
		    	while(com1count<6)
			    sendcom1();
		    }
		}
	    }else{//清楚数据
		//NIBPmin=CLEARTIME->value;
		if(MONDEMO->value==V_MONITOR){
		    if(disSYST!=255||disMEAN!=255||disDIAS!=255){
			com1str[2]=0x0a;	//清除血压数据
			com1str[3]=0;
			com1str[4]=0;
		    	com1str[5]=com1str[2];
		    	com1count=0;
		    	while(com1count<6)
			    sendcom1();
		    }
        	}else{//Demo mode
        	    NIBPmin=CLEARTIME->value-1;
        	    NIBPsec=60;
    		}
	    }//END 清除数据
	}//END NIBP 时间到
     }//END NIBP 记时开始
     //====END======血压测量(清除)的时间处理==================
     
     if(alarmstatus&0x01ff){//有报警
     	if(!AlarmPrint&&ALARMPRT->value==V_ON){//报警开始
     		AlarmPrint=1;
     		PRINTmin=PRTTIME->value-1;
     		PRINTsec=60;
     		key_code=F5_K;//打印键
     	}
     }else{//没有报警
     	AlarmPrint=0;
     }

     if(PRINTsec){
     	PRINTsec--;
     }else{
     	if(PRINTmin){
     		PRINTmin--;
     		PRINTsec=59;
     	}else{//打印时间到
     		PRINTmin=PRTTIME->value-1;
     		PRINTsec=60;
     		if(AUTOPRT->value==V_ON){//定时打印
     	    		key_code=F5_K;//打印键
     	    	}
		if((ALARMPRT->value==V_ON)&&(alarmstatus&0x01ff)){//警报打印
			key_code=F5_K;//打印键
		}
     	}
     }//
//====END======自动(报警)打印的时间处理==================
   if(NIBPsave&0x02){
     static char clock=0;
     if(clock>=2){
	SaveRealData();//存储当前测量的数据
	NIBPsave&=0xfd;
        clock=0;
     }
     clock++;
   }
   
    //=============数据保存==================
    if(timer.ti_sec==59)
    	DataSampling();//HR,PR,ST..数据取样

    //===============check sum================
   //{static char readsta=1;
   // if(ReadFromIQR&0x01){//have IQR
        //if(readsta){
            //ReadNvmemory();//发读心电模块NVmemory数据命令
            //GetNVmemorToMap();

            //readsta=0;
    	//}
    	//if(!(ReadFromIQR&0x02))//head is error;
        	//Quit=0;
     //}
    //}

  }//end TIME_SEC->value!=timer.ti_sec;


  if(oldNIBPsec!=NIBPsec){
      sprintf(tempstr, "%02d", NIBPsec);//NIBP秒钟显示
      outtext(362, 688, tempstr, WHITE, BLACK, FONT10);
      oldNIBPsec=NIBPsec;
  }
  if(oldNIBPmin!=NIBPmin){
      sprintf(tempstr, "%02d", NIBPmin);//NIBP分钟显示
      outtext(362, 664, tempstr, WHITE, BLACK, FONT10);
      oldNIBPmin=NIBPmin;

⌨️ 快捷键说明

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