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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.