Coder Social home page Coder Social logo

microeeg's Issues

ChxNUM Change

// 修改1: Inc/AttritubeTable.h
/*!
 *  @def    属性值变化回调函数原型
 *	@param	ChxNum - 值变化的通道编号
 *	@param	AttrNum - 值变化的属性编号
 *
 */
typedef void (*pfnAttrChangeCB_t)( uint8_t ChxNum, uint8_t AttrNum );


// 修改2:MicroEEG/Src/AttritubeTable.c
/*!
 *  @fn		写属性回调函数
 *
 *	@param	InsAttrNum - 待写入属性编号
 *			CHxNum - 通道编号(通道属性专用,默认不用 0xFF)
 *			pValue - 待写入数据的指针
 *			pLen - 待写入数据大小
 *
 *	@return SUCCESS 读取属性值成功
 *			ATTR_NOT_FOUND 属性不存在
 */
static uint8_t WriteAttrCB( uint8_t InsAttrNum,uint8_t CHxNum, 
							uint8_t *pValue, uint8_t len )
{
	uint8_t status;
	uint8_t notifyApp=0xFF;	//!< 标志位 - 通知上层应用程序属性值变化 0xff-invalid 0x00-valid
	uint8_t AttrPermission;	//!< 属性读写权限	
	uint8_t AttrLen;		//!< 属性值大小
	uint8_t *pAttrValue;	//!< 属性值地址	
	
	if(CHxNum == 0xFF)
	{
		AttrPermission = *(pattr_offset[InsAttrNum]); 
		AttrLen = *(pattr_offset[InsAttrNum]+1); 
	}else{
		AttrPermission = *(pchxattr_offset[CHxNum][InsAttrNum]); 
		AttrLen = *(pchxattr_offset[CHxNum][InsAttrNum]+1); 
	}

	
	if ((InsAttrNum > CHANNEL_NUM ) && ( CHxNum != CHX_NONE ) )
	{
		status = ATTR_NOT_FOUND; //!< 通道属性不存在	
	}
	else if( (InsAttrNum > ATTR_NUM ) && ( CHxNum == CHX_NONE ) )
	{
		status = ATTR_NOT_FOUND; //!< 属性不存在
	}
	else if(( AttrPermission == ATTR_RO )||( AttrPermission == ATTR_NV ))
	{
		status = ATTR_ERR_RO; //!< 属性不允许写操作
	}
	else if( len!= AttrLen)
	{
		status = ATTR_ERR_SIZE; //!< 待写数据长度与属性值长度不符
	}
	else status = SUCCESS;
	
	//!< 写属性值并通知上层应用程序(AttrChange_Process)
	if ( status == SUCCESS )
	{
		if( CHxNum == CHX_NONE ) //通用属性写操作
		{
			pAttrValue = (uint8_t*)*(uint32_t*)(pattr_offset[InsAttrNum]+2);//!< 属性值地址传递
		} else //通道属性写操作
		{
			pAttrValue = (uint8_t*)*(uint32_t*)(pchxattr_offset[CHxNum][InsAttrNum]+2);//!< 属性值地址传递 
		}
		
		memcpy(pAttrValue,pValue,len); //!< 属性值写入
		notifyApp=InsAttrNum;
	}
	if( (notifyApp!=0xFF) && pAppCallbacks )
	{
		(*pAppCallbacks)(CHxNum, InsAttrNum);
	}
	
	return status;

}

//修改3:/Src/MicroEEG_Misc.c
/*  ======================== 属性值变化处理服务 ============================
 */
/*! @fn	AttrChangeProcess 
 *	
 *	@param	AttrChangeNum - 变化的属性值编号
 *			AttrChangeChxNum - 变化的通道编号
 *
 *	@return SUCCESS 处理完成
 *			ERROR 处理异常
 */
uint8_t AttrChangeProcess (uint8_t ChxChangeNum, uint8_t AttrChangeNum)
{
	uint8_t ret = SUCCESS;
	uint8_t val;
	
	//!< ads1299 参数配置
	TADS1299CHnSET ChVal; 
	
	switch(AttrChangeNum)
	{
		case SAMPLING: 
			App_GetAttr(SAMPLING,CHX_NONE,pValue); // 获取属性值 

			if( *(uint8_t*)pValue == SAMPLLE_START )
			{
				
				/* 系统状态更新 */				
				SYS_Event |= EEG_DATA_START_EVT; //!< 更新事件:一包ad数据开始采集		
				
				/* 样本时间戳服务开启 */				
				LL_TIM_EnableCounter(TIM5); //!< 打开样本增量时间戳定时器
				
				/* ads1299 开始采集 */				
				ADS1299_Sampling_Control(SAMPLLE_START);
				
				/* 备份重要参数 */
				BKP_Write(SAMPLING_BKP,(uint32_t)SAMPLLE_START);
				
			}
			else
			{
				/* 系统状态更新 */
				SYS_Event |= EEG_STOP_EVT; //!< 更新事件:ad数据暂停采集
				
				/* ads1299 停止采集 */				
				ADS1299_Sampling_Control(SAMPLLE_STOP);
						
				/* 样本时间戳戳服务停止 */					
				LL_TIM_DisableCounter(TIM5); //!< 关闭定时器
				TIM5->CNT = 0;	//!< 样本增量时间戳定时器归零
			
				/* 备份重要参数 */
				BKP_Write(SAMPLING_BKP,(uint32_t)SAMPLLE_STOP);

			}
		break;
			
		case CURSAMPLERATE:
			
			/* 安全操作:修改采样率值时确保停止采样 */
			App_GetAttr(SAMPLING,CHX_NONE,pValue);	// 获取正在采样属性值	
		
			if((*pValue&0x0000FF) == SAMPLLE_START )		
				ADS1299_Sampling_Control(SAMPLLE_STOP); //!< 若正在采样,则先停止采样
			
			App_GetAttr(CURSAMPLERATE,CHX_NONE,pValue); //获取当前采样率属性值
			
			switch(*pValue)
			{
				case 250:
					ADS1299_SetSamplerate(0,250);
				break;
				
				case 500:
					ADS1299_SetSamplerate(0,500);
				break;
				
				case 1000:
					ADS1299_SetSamplerate(0,1000);
				break;				
				
				case 2000:
					ADS1299_SetSamplerate(0,2000);	
				break;
				
				default: //!< default samplerate 250 针对上电后没有修改采样率的情况下异常断电设置
					ADS1299_SetSamplerate(0,250);		//250HZ采样			
				break;		
			}
			
			/* 备份重要参数 */
			BKP_Write(CURSAMPLERATE_BKP,*pValue);		
			
		break;
		
		case CURGAIN:
			
			/* 安全操作:修改采样率值时确保停止采样 */
			App_GetAttr(SAMPLING,CHX_NONE,pValue);	// 获取正在采样属性值	
		
			if((*pValue&0x0000FF) == SAMPLLE_START )		
				ADS1299_Sampling_Control(SAMPLLE_STOP); //!< 若正在采样,则先停止采样
			
			App_GetAttr(CURGAIN,CHX_NONE,pValue); //获取当前增益属性值
			
			switch(*pValue)
			{
				case 1:
					ADS1299_SetGain(0,1);
				break;
				
				case 2:
					ADS1299_SetGain(0,2);
				break;
				
				case 4:
					ADS1299_SetGain(0,4);
				break;
				
				case 6:
					ADS1299_SetGain(0,6);
				break;
				
				case 8:
					ADS1299_SetGain(0,8);
				break;
				
				case 12:
					ADS1299_SetGain(0,12);
				break;
				
				case 24:
					ADS1299_SetGain(0,24);			
				break;	
				
				default: //!< default gain x24 针对上电后没有修改增益的情况下异常断电设置
					ADS1299_SetGain(0,24);				
				break;						
			}
			
			/* 备份重要参数 */
			BKP_Write(CURGAIN_BKP,*pValue);	
			
		break;
	
		case IMP_MEAS_EN:
			App_GetAttr(IMP_MEAS_EN,CHX_NONE,pValue); // 获取属性值

			if( ( *(uint8_t*)pValue == IMP_MEAS_MODE ) & ( (SYS_Event&EEG_IMP_MODE)==0 ) )
			{
				SYS_Event |= EEG_IMP_MODE; //!< 更新事件:阻抗检测模式
				ADS1299_SetSamplerate(0,250); //!< 默认250Hz采样
				
			}
			else if( *(uint8_t*)pValue == SAMPLE_MODE ) 
			{
				SYS_Event &= ~EEG_IMP_MODE; //!< 清除前序事件
				ADS1299_Mode_Config(ADS1299_ParaGroup_ACQ); //!< 恢复采样模式
				BKP_Service_Recovery();//!< 恢复采样率、增益
			}
		break;	
	}

}

//修改4: 
/* 属性值变化处理服务 */
uint8_t AttrChangeProcess (uint8_t ChxChangeNum, uint8_t AttrChangeNum);

Ads1299 driver issue

void ADS1299_Channel_Control(uint8_t chip, uint8_t channel, uint8_t PDn)
{
	TADS1299CHnSET chVal;
	uint8_t bias = (1<<channel);
	uint8_t regval;

	chVal=ADS1299_ReadREG(chip,ADS1299_REG_CH1SET+channel); // read original value before modifying it

	if(PDn==0){
		chVal.control_bit.mux = 0x01;  // input shorted
		chVal.control_bit.pd = 0x01; // power down
		ADS1299_Channel_Config(chip,channel,chVal);
		
		regval = ADS1299_ReadREG(chip,ADS1299_REG_BIASSENSP);
		ADS1299_WriteREG(chip,ADS1299_REG_BIASSENSP,regval&(0xFF&bias));
	}
	else
	{
		chVal.control_bit.mux = 0; 
		chVal.control_bit.pd = 0x00; // power on
		ADS1299_Channel_Config(chip,channel,chVal);
	}
}
bool ADS1299_SetGain(uint8_t chip, uint8_t gain)
{
    uint8_t valget,i;
    TADS1299CHnSET ChVal; 

    chVal=ADS1299_ReadREG(chip,ADS1299_REG_CH1SET+channel); // read original value before modifying it
		
    switch(gain)
     {
         case 1:
             ChVal.control_bit.gain = 0;
         break;

         case 2:
             ChVal.control_bit.gain = 1;
         break;

         case 4:
             ChVal.control_bit.gain = 2;
         break;

         case 6:
             ChVal.control_bit.gain = 3;
         break;

         case 8:
             ChVal.control_bit.gain = 4;
         break;

         case 12:
             ChVal.control_bit.gain = 5;
         break;

         case 24:
             ChVal.control_bit.gain = 6;
         break;

         default:
             ChVal.control_bit.gain = 6; //default x24
         break;
     }


     for(i=0;i<8;i++)
     {
         /* 尝试配置 */
         ADS1299_Channel_Config(chip,i,ChVal);
				
			   if(chip==0){
					 /* 如果需要设置所有模块通道一致,则每配置一次回读一次 */
					 valget = ADS1299_ReadREG(chip,ADS1299_REG_CH1SET+i);
					 if(valget!=ChVal.value) 
						 return EXIT_FAILURE;
					}
     }
     return EXIT_SUCCESS;
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.