1.技术问题
这是一个非常小的设计,完全不值得把它展示出来。但是因为这个接口设计关系到一些细微的配置和技术限制,仍然有一些细节需要处理,并且很容易出错,我们先把技术问题罗列一下:
- 多个传感器对应的多个逻辑通道需要同步采样。
- 逻辑通道数量超出了物理采集器的极限,需要多台采集器同时工作。
- 各个逻辑通道的采样率,采样点数可能都不相同。
- 有些通道不需要采集太多数据,而有些通道需要连续采集大量数据。
- 多通道、高采样率采样时在同一个采集器上,可能会遭遇物理采集器的极限。
- 采样时因为电源因素,可能会涉及到预采样部分数据点。
- 在采集到一组数据后要尽快上传,因为后续对数据分析也是高耗时过程。
- 数据分析过程包含各个通道的分析,和关联通道分析。
2.接口设计
有兴趣的同志可以自行搭建自己的接口设计,不需要填充代码,只需要把接口和功能描述给出即可。我稍后上传我的设计文档。
2.1 采集层的接口设计
2.1.1 对外接口
#define MAX_CH_PER_HUB 128
typedef struct _sensor_shake_sample_params
{int magicNumber;bool isInited;const char *ipaddr; //采集器地址int chCnts; //本采集器相关的本次采集通道数量:total channel to sampleuint16_t* nBinArray;//uint16_t* innerBuff;int lenOfBufInBytes;float saps;int ptps;void *hDevice;int volStandard; //采集器电平标准int chIdxBase1Total_asHubChFirst; //当前采集器第一个通道对应的全体传感器阵列逻辑通道编号uint8_t maskOfChannelToSample[MAX_CH_PER_HUB/8]; //最高支持MAX_CH_PER_HUB路的单个采集器采样掩码位(小端模式)
}Sensor_shake_sample_params, *LPSensor_shake_sample_params;//启动一次采样,异步
int sensor_shake_start_sample(Sensor_shake_sample_params *pparams);
//得到最近一个采样的结果
int sensor_shake_getSampleResult(Sensor_shake_sample_params *pparams);
//关闭采集设备
int sensor_shake_close(Sensor_shake_sample_params *params);
//采集结果转储
void sensor_sampleBuf2chBuff(uint16_t *tgtBuf, Sensor_shake_sample_params *pparams, int idx0OfSampleResult);
2.1.2 内部辅助函数
因为涉及到必须的预采样和物理采集通道编号、物理采集结果编号、和逻辑传感器阵列编号的转换,必须额外提供两个辅助函数:
int sensor_get_idxbase1Total(int chIdxbase1OfSampleResult, Sensor_shake_sample_params *pparams);
int getMoreSapsCntOfDataSampleBegin(float saps);int getMoreSapsCntOfDataSampleBegin(float saps)
{int moreSamplesIn100ms = ceil(100e-3*saps); #magic number 100e-3 = 100msreturn moreSamplesIn100ms;
}int sensor_get_idxbase1Total(int chIdxbase1OfSampleResult, Sensor_shake_sample_params *pparams)
{int ret = 0;int chAbsOfIdx1OfHubFirstCh = pparams->chIdxBase1Total_asHubChFirst;//仅打开需要开通的通道:int nChannel = 0; int idxBase0OfHub = 0;for(int iCh = 0; iCh<sizeof(pparams->maskOfChannelToSample);++iCh){for(int jCh=0; jCh<8;++jCh){if(pparams->maskOfChannelToSample[iCh]&(1<<jCh)){idxBase0OfHub = iCh*8+jCh;}nChannel++;if(nChannel == chIdxbase1OfSampleResult) return (chAbsOfIdx1OfHubFirstCh + idxBase0OfHub);}}return -1;
}
2.2 传感器阵列配置到采集任务拆分的辅助转换接口
这部分工作是进行与采样相关的多采集器并行加速以及在采集器物理极限达到时,必须进行的采集任务顺次拆分: