***********************************************************************************/
* Author :tommy.zhang@egteks.cn
* Date   :2023.08.18
* Website:www.egteks.cn
*
*==================================================================================
*HISTORY
*----------------------------------------------------------------------------------
* V1.0.1.1 	2022.04.15	初版
* V1.0.2.1 	2022.05.17 	支持单次读取实时电流接口GetCurrentLast
* V1.0.2.2	2022.05.21 	1.支持Visual Studio实时调试 
			2.支持获取4位DLL版本号
* V1.0.3.2	2022.08.19 	1.支持波形实时存储 
			2.支持获取指定时间段的平均/最大/最小电流值
			3.支持存储深度配置
* V1.0.4.2	2022.08.30	1.支持StartSampleInTimeForMs单次采样非阻塞接口
			2.支持StartSampleInTimeExForMs连续采样非阻塞接口
* V1.0.5.1	2022.09.16 	1.支持获取错误码用于调试
* V1.0.6.1	2022.11.02 	1.支持实时获取和重置平均/最大/最小电流统计信息
* V1.0.6.2	2022.11.02 	1.修复GetCurrentInTime获取电流信息异常bug
* V1.0.7.1	2022.11.15 	1.支持第三方数据转为egk文件
			2.修复V1.0.5.1之后版本无法存储电流波形bug
			3.该版本极其之后版本dll库存储的egk文件只能
			用Esight2.2.0.3极其之后版本的工具打开
* V1.0.9.1 	2023.03.02 	支持噪声抑制接口
* V1.1.0.1 	2023.03.13 	支持获取设备SN号接口
* V1.1.1.1 	2023.04.07 	支持egk文件读取和限流配置接口
* V1.1.2.1 	2023.05.05 	修复使能波形实时存储后调用StartSampleInTime接口结束后报错问题
* V1.1.3.1 	2023.08.18 	1.SetFilePath接口变更,支持配置文件名是否携带时间戳后缀
			2.新增GetEgkFileDuration获取egk文件总时长
			3.修复频繁打开和关闭端口可能导致端口打开失败问题
* V1.1.4.1 	2023.08.21 	修复重复打开未知端口返回值变成有效端口问题
* V1.1.5.1 	2023.08.22 	修复mini电源概率性电源on和初始化失败问题
* V1.1.6.1 	2023.08.24 	修复频繁启动采集关闭采集偶尔启动失败导致电流为0问题
* V1.1.7.1 	2023.09.02 	新增接口GetCurrentLastWithVol支持同时获取电流和电压
* V1.1.8.1 	2024.09.12 	新增接口SetSampleRate/SetSampleVoltageEn,仅用于mPower1203U
* V1.1.9.2 	2025.04.02 	egk文件时间戳支持毫秒
* V1.1.9.3 	2025.07.03 	电流表模式支持开关外部电源
* V1.1.9.4 	2025.08.18 	1203U电压设置支持全量程0.1v步进(需要联系技术支持获取指定功耗仪固件)
* V1.1.9.5 	2025.10.10 	1.dll支持log配置 2.支持错误码上报
* V1.1.9.6 	2025.10.13 	1.优化错误码上报log 2.修复限流设置不准bug
* V1.1.9.7 	2026.03.17 	支持PowerMiniQ设备

***********************************************************************************/

mPower1203.dll提供如下API接口:
/**********************************************************************************
** 函数名:     Init
** 函数描述:   初始化mPower1203动态库
** 参数:       无
**
** 返回:       [out]结果码: 0-成功 其他-失败
***********************************************************************************/
int Init()

/**********************************************************************************
** 函数名:     OpenPort
** 函数描述:   打开一路mPower1203设备
** 参数:       [in]port:mPower1203设备端口号(设备使用USB连接PC后可以在PC的设备管理
               器中查看对应设备的端口号)
**
** 返回:       [out]设备id:通常是从1开始,依次累加,如果ID小于0表示打开失败
***********************************************************************************/
int OpenPort(string port)

/**********************************************************************************
** 函数名:     ClosePort
** 函数描述:   关闭一路mPower1203设备
** 参数:       [in]设备id
**
** 返回:       [out]结果码: 设备id-成功 其他-失败
************************************************************************************/
int ClosePort(int id)

/***********************************************************************************
** 函数名:     SetType
** 函数描述:   配置为电流表/电源类型
** 参数:       [in]设备id
** 参数:       [in]type取值参考示例程序中的MPOWER_TYPE_E
**
** 返回:       [out]结果码: 0-成功 其他-失败
************************************************************************************/
int SetType(int id, int type)

/************************************************************************************
** 函数名:     SetMode
** 函数描述:   配置设备工作模式
** 参数:       [in]设备id
** 参数:       [in]mode在电压表模式下取值参考示例程序中的MPOWER_POWER_MODE_E,电流表模式下取值参考
               MPOWER_AMPERE_MODE_E
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetMode(int id, int mode)

/************************************************************************************
** 函数名:     SetVoltage
** 函数描述:   电源模式下配置设备输出电压
** 参数:       [in]设备id
** 参数:       [in]voltage取值参考示例程序中的MPOWER_VOLTAGE_E,支持0.6V-13V电压可调
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetVoltage(int id, int voltage)

/************************************************************************************
** 函数名:     SetPower
** 函数描述:   电源模式下打开/关闭设备电源
** 参数:       [in]设备id
** 参数:       [in]on取值参考示例程序中的MPOWER_POWER_E
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetPower(int id, int on)

/************************************************************************************
** 函数名:     SetPowerForCurMode
** 函数描述:   仅支持mPower1203U,电流表模式下打开/切断外部电源
** 参数:       [in]设备id
** 参数:       [in]on取值参考示例程序中的MPOWER_POWER_E
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetPowerForCurMode(int id, int on)

/************************************************************************************
** 函数名:     SetSampleRate
** 函数描述:   仅支持mPower1203U,设置采样率
** 参数:       [in]设备id
** 参数:       [in]rate取值[50-1000]单位us
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetSampleRate(int id, int rate)

/************************************************************************************
** 函数名:     SetSampleVoltageEn
** 函数描述:   仅支持mPower1203U,设置是否采集电压
** 参数:       [in]设备id
** 参数:       [in]en:0-不采集电压 1-采集电压
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetSampleVoltageEn(int id, int en)

/************************************************************************************
** 函数名:     SetRecordDepth
** 函数描述:   设置实时波形存储深度
** 参数:       [in]设备id
** 参数:       [in]time:单位分钟(时间是概数非精确值),必须在启动采样之前配置
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetRecordDepth(int id, int time)

/************************************************************************************
** 函数名:     SetFilePath
** 函数描述:   设置实时波形存储路径
** 参数:       [in]设备id
** 参数:       [in]path:文件路径
** 参数:       [in]timestamp:True/False-文件名是否携带时间戳
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetFilePath(int id,string path,bool timestamp)

/************************************************************************************
** 函数名:     SetWaveStoreEnable
** 函数描述:   使能/取消波形存储实时存储功能
** 参数:       [in]设备id
** 参数:       [in]enable:True-使能  False-取消
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetWaveStoreEnable(int id, bool enable)

/************************************************************************************
** 函数名:     StartSample
** 函数描述:   启动数据采集
** 参数:       [in]设备id
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int StartSample(int id)

/************************************************************************************
** 函数名:     StopSample
** 函数描述:   停止数据采集
** 参数:       [in]设备id
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int StopSample(int id)

/************************************************************************************
** 函数名:     StartSampleInTime
** 函数描述:   启动指定时间的数据采集,单次采样,阻塞函数
** 参数:       [in]设备id
** 参数:       [in]time:指定采集的时长,单位是秒,达到采集时间后自动停止采集
**                 不需要再调用StopSample函数
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int StartSampleInTime(int id,int time)

/************************************************************************************
** 函数名:     StartSampleInTimeForMs
** 函数描述:   启动指定时间的数据采集,单次采样,非阻塞函数,需要轮询调用GetCurrentInTime函数
**             判断采样时间是否变为0
** 参数:       [in]设备id
** 参数:       [in]time:指定采集的时长,单位是毫秒,达到采集时间后自动停止采集
**                 不需要再调用StopSample函数
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int StartSampleInTimeForMs(int id, int time)

/************************************************************************************
** 函数名:     GetCurrentInTime
** 函数描述:   获取指定时间内采集的电流数据,
**             必须先调用StartSampleInTime/StartSampleInTimeForMs接口
** 参数:       [in]设备id
**
** 返回:       [out]电流数据数组,4个数据,依次是平均/最大/最小电流/采样时间(如果采样时间变为0则采集完成)
*************************************************************************************/
double[] GetCurrentInTime(int id)

/************************************************************************************
** 函数名:     StartSampleInTimeExForMs
** 函数描述:   启动指定时间的数据采集(需要先调用StartSample),连续采样,非阻塞函数,需要轮询调用GetCurrentInTimeEx函数
**             判断采样时间是否变为0
** 参数:       [in]设备id
** 参数:       [in]time:指定采集的时长,单位是毫秒,达到采集时间后停止数据计算但是继续数据采集
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int StartSampleInTimeExForMs(int id, int time)

/************************************************************************************
** 函数名:     GetCurrentInTimeEx
** 函数描述:   获取指定时间内采集的电流数据,必须先调用StartSampleInTimeExForMs接口
** 参数:       [in]设备id
**
** 返回:       [out]电流数据数组,4个数据,依次是平均/最大/最小电流/采样时间(如果采样时间变为0则采集完成)
*************************************************************************************/
double[] GetCurrentInTimeEx(int id)

/************************************************************************************
** 函数名:     GetCurrent
** 函数描述:   获取电流连续采样数据，注意：因为数据采集速率非常快，建议单独线程采集数据,且
               尽量不要有耗时操作比如延时函数或者log输出等等，如果获取到相同时间戳的数
			   据只保留一个即可
** 参数:       [in]设备id
**
** 返回:       [out]电流数据数组，长度不固定，一定是偶数，数据输出格式如下:
               [0]:时间戳(us) [1]:电流(uA) [2]:时间戳 [3]:电流(uA) ... 依次类推
*************************************************************************************/
double[] GetCurrent(int id)

/************************************************************************************
** 函数名:     GetCurrentLast
** 函数描述:   获取单次实时电流
** 参数:       [in]设备id
**
** 返回:       [out]实时电流值,单位uA
*************************************************************************************/
double GetCurrentLast(int id)

/************************************************************************************
** 函数名:     GetCurrentLastWithVol
** 函数描述:   获取单次实时电流和电压
** 参数:       [in]设备id
**
** 返回:       [out]实时电流值(uA)和电压值(V)
*************************************************************************************/
double[] GetCurrentLastWithVol(int id)

/************************************************************************************
** 函数名:     GetFwVersion
** 函数描述:   获取mPower1203设备固件版本号
** 参数:       [in]设备id
**
** 返回:       [out]版本号,[0]主版本号 [1]次版本号 [2]修订号
*************************************************************************************/
byte[] GetFwVersion(int id)

/************************************************************************************
** 函数名:     GetDllVersion
** 函数描述:   获取mPower1203.dll版本号
** 参数:       无
**
** 返回:       [out]版本号,[0]主版本号 [1]次版本号 [2]修订号 [3]构建号
*************************************************************************************/
byte[] GetDllVersion()

/************************************************************************************
** 函数名:     GetSn
** 函数描述:   获取mPower设备SN号
** 参数:       [in]设备id
**
** 返回:       [out]SN号,[0-14]共15位SN号,注意是ASIIC码
*************************************************************************************/
byte[] GetSn(int id)

/************************************************************************************
** 函数名:     GetErrCode
** 函数描述:   获取mPower1203设备运行时错误码用于调试
** 参数:       [in]设备id
**
** 返回:       [out]错误码ASCII码字节数组
*************************************************************************************/
byte[] GetErrCode(int id)

/************************************************************************************
** 函数名:     ResetCurrentInfo
** 函数描述:   重置电流统计信息
** 参数:       [in]设备id
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int ResetCurrentInfo(int id)

/************************************************************************************
** 函数名:     GetCurrentInfo
** 函数描述:   实时获取电流统计信息,
**             必须先调用StartSample和ResetCurrentInfo
** 参数:       [in]设备id
**
** 返回:       [out]电流数据数组,3个数据,依次是平均/最大/最小电流,单位uA
*************************************************************************************/
double[] GetCurrentInfo(int id)

/************************************************************************************
** 函数名:     CreateEgkFile
** 函数描述:   新建一个egk文件
** 参数:       [in]path:文件路径
**			   [in]type:0-只保存电流数据  1-同时保存电流和电压数据
**			   [in]interval:采样数据间隔,单位us
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int CreateEgkFile(string path,int type,int interval)

/************************************************************************************
** 函数名:     WriteEgkFile
** 函数描述:   向egk文件写入数据
** 参数:       [in]current:电流数据,单位uA
**			   [in]voltage:电压数据,单位mV,最大值65536mV
**
** 返回:       [out]结果码: 0-成功 1-数据存满自动重新创建了一个文件
*************************************************************************************/
int WriteEgkFile(double current,int voltage)

/************************************************************************************
** 函数名:     CloseEgkFile
** 函数描述:   关闭egk文件
** 参数:       无
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int CloseEgkFile()

/************************************************************************************
** 函数名:     OpenEgkFile
** 函数描述:   打开一个egk文件
** 参数:       [in]path:文件路径
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int OpenEgkFile(string path)

/************************************************************************************
** 函数名:     ReadEgkFile
** 函数描述:   顺序读取egk文件内容，必须先调用OpenEgkFile打开文件,读取完成后调用CloseEgkFile关闭
** 参数:       [in]Compaction:是否压缩数据,False-不压缩,True-压缩
**
** 返回:       [out]电流数据数组，长度不固定，数据输出格式如下:
               [0]:结果码,0-正常可以继续读,1=已读完,其他-异常 [1]:电流(uA) [2]:电流(uA)  ... 最后一个数据是电压值
*************************************************************************************/
double[] ReadEgkFile(bool Compaction)

/************************************************************************************
** 函数名:     GetEgkFileDuration
** 函数描述:   获取egk文件总时长，必须先调用OpenEgkFile打开文件,ReadEgkFile读取完成后调用GetEgkFileDuration
** 参数:       无
**
** 返回:       [out]总时长,单位us
*************************************************************************************/
double GetEgkFileDuration()

/************************************************************************************
** 函数名:     SetCurLimit
** 函数描述:   设置设备限流值,当限流生效时,设备自动关闭电源输出,继续获取电流值则会一直保持一个值
** 参数:       [in]设备id
** 参数:       [in]limit取值范围[0.10 - 9.90]单位是A,最小限流100mA
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetCurLimit(int id,double limit)

/************************************************************************************
** 函数名:     SetLogEnable
** 函数描述:   使能/取消 DLL log功能
** 参数:       [in]设备id
** 参数:       [in]enable:True-使能  False-取消
**
** 返回:       [out]结果码: 0-成功 其他-失败
*************************************************************************************/
int SetLogEnable(int id, bool enable)