{"version":3,"file":"ivium.mjs","sources":["../src/ffiLibrary.ts","../src/core.ts","../src/errors/FileNotFoundError.ts","../src/errors/CellOffError.ts","../src/errors/DeviceBusyError.ts","../src/errors/DeviceNotConnectedToIviumsoftError.ts","../src/errors/DriverNotOpenError.ts","../src/errors/NoDeviceDetectedError.ts","../src/errors/IviumsoftNotRunningError.ts","../src/types/DeviceStatusCode.ts","../src/iviumVerifiers.ts","../src/utils/statusLabels.ts","../src/ivium.ts"],"sourcesContent":["import { Library } from 'ffi-napi';\r\nimport ref, { Pointer } from 'ref-napi';\r\nimport refArray from 'ref-array-di';\r\n\r\nconst getIviumDllPath = () => {\r\n  const architecture = process.arch === 'x64' ? '64' : '';\r\n\r\n  return `${__dirname}\\\\dlls\\\\Ivium_remdriver${architecture}.dll`;\r\n};\r\n\r\nexport const { char, CString, double, int, long } = ref.types;\r\nconst ArrayType = refArray(ref);\r\nexport const CharArray = ArrayType(char);\r\nexport const DoubleArray = ArrayType(double);\r\nexport const LongArray = ArrayType(long) as refArray.ArrayType<number>;\r\nexport const CharPtr = ref.refType(char);\r\nexport const DoublePtr = ref.refType(double);\r\nexport const LongPtr = ref.refType(long);\r\n\r\nexport const buildCharArray = (text: string) => {\r\n  return ref.allocCString(text) as unknown as Pointer<number>;\r\n};\r\n\r\n// create char array from the text \"hello\" with the ref-array-di package\r\n\r\nfunction buildPointer(refType: ref.Type, value?: number | string) {\r\n  return ref.alloc(refType, value) as unknown as Pointer<number>;\r\n}\r\n\r\nexport function buildNumericPointer(refType: ref.Type, value?: number) {\r\n  return buildPointer(refType, value) as ref.Pointer<number>;\r\n}\r\n\r\nexport function buildCharPointer(value?: string) {\r\n  return buildPointer(char, value);\r\n}\r\n\r\nexport const buildFfiLibrary = () =>\r\n  Library(getIviumDllPath(), {\r\n    /* GENERAL */\r\n    IV_open: [int, []],\r\n    IV_close: [int, []],\r\n    IV_MaxDevices: [int, []],\r\n    IV_selectdevice: [int, [LongArray]],\r\n    IV_getdevicestatus: [int, []],\r\n    IV_readSN: [int, [CharArray]],\r\n    IV_connect: [int, [LongArray]],\r\n    IV_VersionHost: [int, [LongArray]],\r\n    IV_VersionDll: [int, []],\r\n    IV_VersionCheck: [int, []],\r\n    IV_HostHandle: [int, []],\r\n    IV_VersionDllFile: [int, []],\r\n    IV_VersionDllFileStr: [int, []],\r\n    IV_SelectChannel: [int, [LongArray]],\r\n\r\n    /* DIRECT MODE */\r\n    IV_getcellstatus: [int, [LongPtr]],\r\n    IV_setconnectionmode: [int, [LongPtr]],\r\n    IV_setcellon: [int, [LongPtr]],\r\n    IV_setpotential: [int, [DoublePtr]],\r\n    IV_setpotentialWE2: [int, [DoublePtr]],\r\n    IV_setcurrent: [int, [DoublePtr]],\r\n    IV_getpotential: [int, [DoublePtr]],\r\n    IV_setcurrentrange: [int, [LongPtr]],\r\n    IV_setcurrentrangeWE2: [int, [LongPtr]],\r\n    IV_getcurrent: [int, [DoublePtr]],\r\n    IV_getcurrentWE2: [int, [DoublePtr]],\r\n    IV_setfilter: [int, [LongPtr]],\r\n    IV_setstability: [int, [LongPtr]],\r\n    IV_setbistatmode: [int, [LongPtr]],\r\n    IV_setdac: [int, [LongPtr, DoublePtr]],\r\n    IV_getadc: [int, [LongPtr, DoublePtr]],\r\n    IV_setmuxchannel: [int, [LongPtr]],\r\n    IV_setdigout: [int, [LongPtr]],\r\n    IV_getdigin: [int, [LongPtr]],\r\n    IV_setfrequency: [int, [DoublePtr]],\r\n    IV_setamplitude: [int, [DoublePtr]],\r\n    IV_getcurrenttrace: [int, [LongPtr, DoublePtr, DoublePtr]],\r\n    IV_getcurrentWE2trace: [int, [LongPtr, DoublePtr, DoublePtr]],\r\n    IV_getpotentialtrace: [int, [LongPtr, DoublePtr, DoublePtr]],\r\n\r\n    /* WE32 */\r\n    IV_we32setchannel: [int, [LongPtr]],\r\n    IV_we32setoffset: [int, [LongPtr, DoublePtr]],\r\n    IV_we32setoffsets: [int, [LongPtr, DoublePtr]],\r\n    IV_we32getoffsets: [int, [LongPtr, DoublePtr]],\r\n    IV_we32readcurrents: [int, [DoublePtr]],\r\n\r\n    /* METHOD MODE */\r\n    IV_readmethod: [int, [CString]],\r\n    IV_savemethod: [int, [CString]],\r\n    IV_startmethod: [int, [CString]],\r\n    IV_abort: [int, []],\r\n    IV_savedata: [int, [CString]],\r\n    IV_setmethodparameter: [int, [CString, CString]],\r\n    IV_Ndatapoints: [int, [LongArray]],\r\n    IV_getdata: [int, [LongPtr, DoublePtr, DoublePtr, DoublePtr]],\r\n    IV_getdatafromline: [\r\n      int,\r\n      [LongPtr, LongPtr, DoublePtr, DoublePtr, DoublePtr],\r\n    ],\r\n\r\n    /* EXTRA */\r\n    IV_getDbFileName: [int, [CharArray]],\r\n  });\r\n","import {\r\n  buildFfiLibrary,\r\n  buildNumericPointer,\r\n  CharArray,\r\n  double,\r\n  long,\r\n  LongArray,\r\n} from './ffiLibrary';\r\nimport { DeviceStatusCode } from './types/DeviceStatusCode';\r\n\r\nimport type { IviumResult } from './types/IviumResult';\r\n\r\n/**\r\n * The core class that provides access to Ivium functionality.\r\n * All its methods are static.\r\n */\r\nclass Core {\r\n  /**\r\n   * A private static field that indicates whether the Ivium driver is open.\r\n   */\r\n  static #isDriverOpen = false;\r\n\r\n  /**\r\n   * A read-only private static field that holds the FFI library object.\r\n   */\r\n  static readonly #lib = buildFfiLibrary();\r\n\r\n  // #######################\r\n  // ## GENERIC FUNCTIONS ##\r\n  // #######################\r\n\r\n  /**\r\n   * Opens the Ivium driver.\r\n   *\r\n   * @returns The result code of the operation.\r\n   */\r\n  static IV_open(): number {\r\n    Core.#isDriverOpen = true;\r\n    return Core.#lib.IV_open();\r\n  }\r\n\r\n  /**\r\n   * Closes the Ivium driver.\r\n   *\r\n   * @returns The result code of the operation.\r\n   */\r\n  static IV_close(): number {\r\n    Core.#isDriverOpen = false;\r\n    return Core.#lib.IV_close();\r\n  }\r\n\r\n  /**\r\n   * Determines whether the Ivium driver is open.\r\n   *\r\n   * @returns A boolean value indicating whether the driver is open.\r\n   */\r\n  static isDriverOpen(): boolean {\r\n    return Core.#isDriverOpen;\r\n  }\r\n\r\n  /**\r\n   * Gets the maximum number of devices supported by the Ivium library.\r\n   *\r\n   * @returns The maximum number of devices.\r\n   */\r\n  static IV_MaxDevices(): number {\r\n    return Core.#lib.IV_MaxDevices();\r\n  }\r\n\r\n  /**\r\n   * Selects a specific device based on its Ivium soft instance number.\r\n   *\r\n   * @param iviumsoftInstanceNumber - The Ivium soft instance number of the device to select.\r\n   * @returns A tuple containing the result code of the operation and the Ivium soft instance number of the selected device.\r\n   */\r\n  static IV_selectdevice(iviumsoftInstanceNumber: number): IviumResult<number> {\r\n    const instanceNumberArray = new LongArray([iviumsoftInstanceNumber]);\r\n\r\n    const resultCode = Core.#lib.IV_selectdevice(instanceNumberArray);\r\n\r\n    return [resultCode, instanceNumberArray[0]];\r\n  }\r\n\r\n  /**\r\n   * It returns -1 (no IviumSoft), 0 (not connected), 1 (available_idle), 2 (available_busy), 3 (no device available)\r\n   * @returns {number} The status of the device.\r\n   */\r\n  static IV_getdevicestatus(): DeviceStatusCode {\r\n    return Core.#lib.IV_getdevicestatus() as DeviceStatusCode;\r\n  }\r\n\r\n  /**\r\n   * Reads the serial number of the currently selected device.\r\n   *\r\n   * @returns A tuple containing the result code of the operation and the serial number of the device.\r\n   */\r\n  static IV_readSN(): IviumResult<string> {\r\n    const deviceSerialNumberPtr = new CharArray(16);\r\n\r\n    const resultCode = Core.#lib.IV_readSN(deviceSerialNumberPtr);\r\n\r\n    return [resultCode, deviceSerialNumberPtr.buffer.readCString()];\r\n  }\r\n\r\n  /**\r\n   * Connects to the Ivium device.\r\n   * @param connectionStatus A number indicating the connection status.\r\n   * @returns An IviumResult tuple containing the result code and the updated connection status.\r\n   */\r\n  static IV_connect(connectionStatus: number): IviumResult<number> {\r\n    const connectionStatusArray = new LongArray([connectionStatus]);\r\n\r\n    const resultCode = Core.#lib.IV_connect(connectionStatusArray);\r\n\r\n    return [resultCode, connectionStatusArray[0]];\r\n  }\r\n\r\n  /**\r\n   * Returns the version host.\r\n   * @returns {number} An IviumResult tuple containing the result code and the version host.\r\n   */\r\n  static IV_VersionHost(versionHost: number): IviumResult<number> {\r\n    const versionHostArray = new LongArray([versionHost]);\r\n\r\n    const resultCode = Core.#lib.IV_VersionHost(versionHostArray);\r\n\r\n    return [resultCode, versionHostArray[0]];\r\n  }\r\n\r\n  /**\r\n   * Returns the version of the IviumSoft driver DLL.\r\n   * @returns {number} The version of the IviumSoft driver DLL.\r\n   */\r\n  static IV_VersionDll(): number {\r\n    return Core.#lib.IV_VersionDll();\r\n  }\r\n\r\n  /**\r\n   * It returns 1 if the selected instance of IviumSoft is running.\r\n   * @returns {number}.\r\n   */\r\n  static IV_VersionCheck(): number {\r\n    return Core.#lib.IV_VersionCheck();\r\n  }\r\n\r\n  /**\r\n   * Returns the handle of the host.\r\n   * @returns {number} The handle of the host.\r\n   */\r\n  static IV_HostHandle(): number {\r\n    return Core.#lib.IV_HostHandle();\r\n  }\r\n\r\n  /**\r\n   * Returns the version of the DLL file.\r\n   * @returns {number} The version of the DLL file.\r\n   */\r\n  static IV_VersionDllFile(): number {\r\n    return Core.#lib.IV_VersionDllFile();\r\n  }\r\n\r\n  /**\r\n   * Returns the version of the DLL file as a string.\r\n   * @returns {number} The version of the DLL file as a string.\r\n   */\r\n  static IV_VersionDllFileStr(): number {\r\n    return Core.#lib.IV_VersionDllFileStr();\r\n  }\r\n\r\n  /**\r\n   * Sending the integer value communicates with Multichannel control:\r\n            if not yet active, the [int] number of tabs is automatically opened and the [int] tab becomes active;\r\n            if Ivium-n-Soft is active already, the [int] tab becomes active. \r\n            Now the channel/instrument that is connected to this tab can be controlled. \r\n            If no instrument is connected, the next available instrument in the list can be connected (IV_connect) and controlled.\r\n   * @param {number} channelNumber The channel number to select.\r\n   * @returns {number} The result of selecting the specified channel.\r\n   */\r\n  static IV_SelectChannel(channelNumber: number): number {\r\n    const channelNumberArray = new LongArray([channelNumber]);\r\n\r\n    return Core.#lib.IV_VersionHost(channelNumberArray);\r\n  }\r\n\r\n  // ###########################\r\n  // ## DIRECT MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  /**\r\n   * Returns the corresponding cell status label [\"I_ovl\", \"Anin1_ovl\",\"E_ovl\", \"CellOff_button pressed\", \"Cell on\"]\r\n   * @returns {number} The cell status label.\r\n   */\r\n  static IV_getcellstatus(): IviumResult<number> {\r\n    const cellStatusPtr = buildNumericPointer(long);\r\n\r\n    const resultCode = Core.#lib.IV_getcellstatus(cellStatusPtr);\r\n\r\n    return [resultCode, cellStatusPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Sets the connection mode for the Ivium device.\r\n   * @param connectionModeNumber - The connection mode number.\r\n   * @returns An IviumResult containing the result code and the updated connection mode number.\r\n   */\r\n  static IV_setconnectionmode(\r\n    connectionModeNumber: number\r\n  ): IviumResult<number> {\r\n    const connectionModeNumberPtr = buildNumericPointer(\r\n      long,\r\n      connectionModeNumber\r\n    );\r\n\r\n    const resultCode = Core.#lib.IV_setconnectionmode(connectionModeNumberPtr);\r\n\r\n    return [resultCode, connectionModeNumberPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Set cell on off to close cell relais (0=off;1=on)\r\n   * @param {number} cellOnModeNumber - The cell on mode number.\r\n   * @returns {number} The result of setting the cell on mode.\r\n   */\r\n  static IV_setcellon(cellOnModeNumber: number): number {\r\n    const cellOnModeNumberPtr = buildNumericPointer(long, cellOnModeNumber);\r\n\r\n    return Core.#lib.IV_setcellon(cellOnModeNumberPtr);\r\n  }\r\n\r\n  /**\r\n   * Set cell potential\r\n   * @param {number} potential - The potential to set.\r\n   * @returns {number} The result of setting the cell potential.\r\n   */\r\n  static IV_setpotential(potential: number): number {\r\n    const potentialPtr = buildNumericPointer(double, potential);\r\n\r\n    return Core.#lib.IV_setpotential(potentialPtr);\r\n  }\r\n\r\n  /**\r\n   * Set BiStat offset potential\r\n   * @param {number} potentialWe2 - The potential to set.\r\n   * @returns {number} The result of setting the cell potential.\r\n   */\r\n  static IV_setpotentialWE2(potentialWe2: number): number {\r\n    const potentialPtr = buildNumericPointer(double, potentialWe2);\r\n\r\n    return Core.#lib.IV_setpotentialWE2(potentialPtr);\r\n  }\r\n\r\n  /**\r\n   * Set cell current\r\n   * @param {number} current - The current to set.\r\n   * @returns {number} The result of setting the cell current.\r\n   */\r\n  static IV_setcurrent(current: number): number {\r\n    const currentPtr = buildNumericPointer(double, current);\r\n\r\n    return Core.#lib.IV_setcurrent(currentPtr);\r\n  }\r\n\r\n  /**\r\n   * Get measured cell potential\r\n   * @returns An IviumResult containing the result code and the measured cell potential.\r\n   */\r\n  static IV_getpotential(): IviumResult<number> {\r\n    const potentialPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getpotential(potentialPtr);\r\n\r\n    return [resultCode, potentialPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Set current range, 0=10A, 1=1A, etc,\r\n   * @returns The result code of the operation.\r\n   */\r\n  static IV_setcurrentrange(currentRange: number): number {\r\n    const currentRangePtr = buildNumericPointer(long, currentRange);\r\n\r\n    return Core.#lib.IV_setcurrentrange(currentRangePtr);\r\n  }\r\n\r\n  /**\r\n   * Set current range for BiStat, 0=10A, 1=1A, etc,\r\n   * @returns The result code of the operation.\r\n   */\r\n  static IV_setcurrentrangeWE2(currentRange: number): number {\r\n    const currentRangePtr = buildNumericPointer(long, currentRange);\r\n\r\n    return Core.#lib.IV_setcurrentrangeWE2(currentRangePtr);\r\n  }\r\n\r\n  /**\r\n   * Get measured cell current\r\n   * @returns An IviumResult containing the result code and the measured cell current.\r\n   */\r\n  static IV_getcurrent(): IviumResult<number> {\r\n    const currentPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getcurrent(currentPtr);\r\n\r\n    return [resultCode, currentPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Get measured cell current from WE2 (bipotentiostat)\r\n   * @returns An IviumResult containing the result code and the measured cell current from WE2 (bipotentiostat).\r\n   */\r\n  static IV_getcurrentWE2(): IviumResult<number> {\r\n    const currentPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getcurrentWE2(currentPtr);\r\n\r\n    return [resultCode, currentPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Set filter, for int :0=1MHz, 1=100kHz, 2=10kHz, 3=1kHz, 4=10Hz.\r\n   * @param {number} filter - The filter to set.\r\n   * @returns {number} The result of setting the filter.\r\n   */\r\n  static IV_setfilter(filter: number): number {\r\n    const filterPtr = buildNumericPointer(long, filter);\r\n\r\n    return Core.#lib.IV_setfilter(filterPtr);\r\n  }\r\n\r\n  /**\r\n   * Set stability, for int 0=HighSpeed, 1=Standard, 2=HighStability.\r\n   * @param {number} stability - The stability to set.\r\n   * @returns {number} The result of setting the stability.\r\n   */\r\n  static IV_setstability(stability: number): number {\r\n    const stabilityPtr = buildNumericPointer(long, stability);\r\n\r\n    return Core.#lib.IV_setstability(stabilityPtr);\r\n  }\r\n\r\n  /**\r\n   * Select mode for BiStat, for int 0=standard, 1=scanning\r\n   * This bistat_mode function also can be used to control the Automatic E-ranging function of the instrument;\r\n   * 0=AutoEranging off; 1=AutoEranging on.\r\n   * @param {number} bistatMode - The bistat mode to set.\r\n   * @returns {number} The result of setting the bistat mode.\r\n   */\r\n  static IV_setbistatmode(bistatMode: number): number {\r\n    const bistatModePtr = buildNumericPointer(long, bistatMode);\r\n\r\n    return Core.#lib.IV_setbistatmode(bistatModePtr);\r\n  }\r\n\r\n  /**\r\n   * Set dac on external port, int=0 for dac1, int=1 for dac2.\r\n   * @param {number} channel - The channel to set.\r\n   * @param {number} value - The value to set.\r\n   * @returns {number} The result of setting the dac on external port.\r\n   */\r\n  static IV_setdac(channel: number, value: number): number {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n    const valuePtr = buildNumericPointer(double, value);\r\n\r\n    return Core.#lib.IV_setdac(channelPtr, valuePtr);\r\n  }\r\n\r\n  /**\r\n   * Returns measured voltage on external ADC port, int=channelnr. 0-7.\r\n   * @param {number} channel - The channel to get.\r\n   * @returns An IviumResult containing the result code and the measured voltage on external ADC port.\r\n   */\r\n  static IV_getadc(channel: number): IviumResult<number> {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n    const valuePtr = buildNumericPointer(double, 1);\r\n\r\n    const resultCode = Core.#lib.IV_getadc(channelPtr, valuePtr);\r\n\r\n    return [resultCode, valuePtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Set channel of multiplexer, int=channelnr. starting from 0(default).\r\n   * @param {number} channel - The channel to set.\r\n   * @returns {number} The result of setting the channel of multiplexer.\r\n   */\r\n  static IV_setmuxchannel(channel: number): number {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n\r\n    return Core.#lib.IV_setmuxchannel(channelPtr);\r\n  }\r\n\r\n  /**\r\n   * Set digital lines on external port, int is bitmask.\r\n   * @param {number} channel - The channel to set.\r\n   * @returns {number} The result of setting the digital lines on external port.\r\n   */\r\n  static IV_setdigout(channel: number): number {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n\r\n    return Core.#lib.IV_setdigout(channelPtr);\r\n  }\r\n\r\n  /**\r\n   * Returns status of digital inputs from external port, int is bitmask.\r\n   * @returns An IviumResult containing the result code and the status of digital inputs from external port.\r\n   */\r\n  static IV_getdigin(): IviumResult<number> {\r\n    const valuePtr = buildNumericPointer(long);\r\n\r\n    const resultCode = Core.#lib.IV_getdigin(valuePtr);\r\n\r\n    return [resultCode, valuePtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Set the frequency value.\r\n   * @param {number} frequency - The frequency to set.\r\n   * @returns {number} The result of setting the frequency value.\r\n   */\r\n  static IV_setfrequency(frequency: number): number {\r\n    const frequencyPtr = buildNumericPointer(double, frequency);\r\n\r\n    return Core.#lib.IV_setfrequency(frequencyPtr);\r\n  }\r\n\r\n  /**\r\n   * Set the amplitude value.\r\n   * @param {number} amplitude - The amplitude to set.\r\n   * @returns {number} The result of setting the amplitude value.\r\n   */\r\n  static IV_setamplitude(amplitude: number): number {\r\n    const amplitudePtr = buildNumericPointer(double, amplitude);\r\n\r\n    return Core.#lib.IV_setamplitude(amplitudePtr);\r\n  }\r\n\r\n  /**\r\n   * Returns a sequence of measured currents at defined samplingrate (npoints, interval, array of double): npoints<=256, interval: 10us to 20ms.\r\n   * @param {number} pointsQuantity - The quantity of points to get.\r\n   * @param {number} intervalRate - The interval rate to get.\r\n   * @returns An IviumResult containing the result code and a sequence of measured currents at defined samplingrate.\r\n   */\r\n  static IV_getcurrenttrace(\r\n    pointsQuantity: number,\r\n    intervalRate: number\r\n  ): IviumResult<number> {\r\n    const pointsQuantityPtr = buildNumericPointer(long, pointsQuantity);\r\n    const intervalRatePtr = buildNumericPointer(double, intervalRate);\r\n    const resultPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getcurrenttrace(\r\n      pointsQuantityPtr,\r\n      intervalRatePtr,\r\n      resultPtr\r\n    );\r\n\r\n    return [resultCode, resultPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Returns a sequence of measured WE2 currents at defined samplingrate (npoints, interval, array of double): npoints<=256, interval: 10us to 20ms.\r\n   * @param {number} pointsQuantity - The quantity of points to get.\r\n   * @param {number} intervalRate - The interval rate to get.\r\n   * @returns An IviumResult containing the result code and a sequence of measured WE2 currents at defined samplingrate.\r\n   */\r\n  static IV_getcurrentWE2trace(\r\n    pointsQuantity: number,\r\n    intervalRate: number\r\n  ): IviumResult<number> {\r\n    const pointsQuantityPtr = buildNumericPointer(long, pointsQuantity);\r\n    const intervalRatePtr = buildNumericPointer(double, intervalRate);\r\n    const resultPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getcurrentWE2trace(\r\n      pointsQuantityPtr,\r\n      intervalRatePtr,\r\n      resultPtr\r\n    );\r\n\r\n    return [resultCode, resultPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Returns a sequence of measured potentials at defined samplingrate (npoints, interval, array of double): npoints<=256, interval: 10us to 20ms.\r\n   * @param {number} pointsQuantity - The quantity of points to get.\r\n   * @param {number} intervalRate - The interval rate to get.\r\n   */\r\n  static IV_getpotentialtrace(\r\n    pointsQuantity: number,\r\n    intervalRate: number\r\n  ): IviumResult<number> {\r\n    const pointsQuantityPtr = buildNumericPointer(long, pointsQuantity);\r\n    const intervalRatePtr = buildNumericPointer(double, intervalRate);\r\n    const resultPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getpotentialtrace(\r\n      pointsQuantityPtr,\r\n      intervalRatePtr,\r\n      resultPtr\r\n    );\r\n\r\n    return [resultCode, resultPtr.deref()];\r\n  }\r\n\r\n  // ###########################\r\n  // ## WE32 MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  /**\r\n   * Select active WE32 channel (chan)\r\n   * @param channel The channel to be selected.\r\n   * @returns The result code.\r\n   */\r\n  static IV_we32setchannel(channel: number): number {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n\r\n    return Core.#lib.IV_we32setchannel(channelPtr);\r\n  }\r\n\r\n  /**\r\n   * Set WE32 offset (chan,value), value -2 to +2V.\r\n   * Use chan=0 to apply the same offset to all channels.\r\n   * @param channel The channel to be selected.\r\n   * @param offset The offset to be applied.\r\n   * @returns The result code.\r\n   */\r\n  static IV_we32setoffset(channel: number, offset: number): number {\r\n    const channelPtr = buildNumericPointer(long, channel);\r\n    const offsetPtr = buildNumericPointer(double, offset);\r\n\r\n    return Core.#lib.IV_we32setoffset(channelPtr, offsetPtr);\r\n  }\r\n\r\n  /**\r\n   * Set WE32 offsets values (Nchan,values), with Nchan the number of channels (1..32).\r\n   * @param numberOfChannels The number of channels.\r\n   * @param offset The offset to be applied.\r\n   * @returns The result code.\r\n   */\r\n  static IV_we32setoffsets(numberOfChannels: number, offset: number): number {\r\n    const numberOfChannelsPtr = buildNumericPointer(long, numberOfChannels);\r\n    const offsetPtr = buildNumericPointer(double, offset);\r\n\r\n    return Core.#lib.IV_we32setoffsets(numberOfChannelsPtr, offsetPtr);\r\n  }\r\n\r\n  /**\r\n   * Returns array with 32 WE32 current values, that are measured simultaneously.\r\n   * @returns A tuple containing the result code and the current values.\r\n   */\r\n  static IV_we32getoffsets(numberOfChannels: number): IviumResult<number> {\r\n    const numberOfChannelsPtr = buildNumericPointer(long, numberOfChannels);\r\n    const offsetPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_we32getoffsets(\r\n      numberOfChannelsPtr,\r\n      offsetPtr\r\n    );\r\n\r\n    return [resultCode, offsetPtr.deref()];\r\n  }\r\n\r\n  /**\r\n   * Returns array with 32 WE32 current values, that are measured simultaneously.\r\n   * @returns A tuple containing the result code and the current values.\r\n   */\r\n  static IV_we32readcurrents(): IviumResult<number> {\r\n    const resultPtr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_we32readcurrents(resultPtr);\r\n\r\n    return [resultCode, resultPtr.deref()];\r\n  }\r\n\r\n  // ###########################\r\n  // ## METHOD MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  /**\r\n   * Loads method procedure previously saved to a file.\r\n   * @param {string} methodFilePath - The path to the method file.\r\n   * @returns {IviumResult<string>} A tuple containing the result code and the method file path.\r\n   */\r\n  static IV_readmethod(methodFilePath: string): IviumResult<string> {\r\n    const resultCode = Core.#lib.IV_readmethod(methodFilePath);\r\n\r\n    return [resultCode, methodFilePath];\r\n  }\r\n\r\n  /**\r\n   * Saves currently loaded method procedure to a file.\r\n   * @param {string} methodFilePath - The path to the method file.\r\n   * @returns {IviumResult<string>} A tuple containing the result code and the method file path.\r\n   */\r\n  static IV_savemethod(methodFilePath: string): IviumResult<string> {\r\n    const resultCode = Core.#lib.IV_savemethod(methodFilePath);\r\n\r\n    return [resultCode, methodFilePath];\r\n  }\r\n\r\n  /**\r\n   * Starts a method procedure.\r\n   * If method_file_path is an empty string then the presently loaded procedure is started.\r\n   * If the full path to a previously saved method is provided\r\n   * then the procedure is loaded from the file and started.\r\n   * @param {string} [methodFilePath=''] - The path to the method file. If not specified, the current method will be used.\r\n   * @returns {IviumResult<string>} A tuple containing the result code and the method file path.\r\n   */\r\n  static IV_startmethod(methodFilePath = ''): IviumResult<string> {\r\n    const resultCode = Core.#lib.IV_startmethod(methodFilePath);\r\n\r\n    return [resultCode, methodFilePath];\r\n  }\r\n\r\n  /**\r\n   * Aborts the ongoing method procedure.\r\n   * @returns {number} The result code.\r\n   */\r\n  static IV_abort(): number {\r\n    return Core.#lib.IV_abort();\r\n  }\r\n\r\n  /**\r\n   * Saves the results of the last method execution into a file.\r\n   * @param {string} dataFilePath - The full path to the new file.\r\n   * @returns {IviumResult<string>} A tuple containing the result code and the method data file path.\r\n   */\r\n  static IV_savedata(dataFilePath: string): IviumResult<string> {\r\n    const resultCode = Core.#lib.IV_savedata(dataFilePath);\r\n\r\n    return [resultCode, dataFilePath];\r\n  }\r\n\r\n  /**\r\n   * Allows updating the parameter values for the currently loaded method procedrue.\r\n   * It only works for text based parameters and dropdowns (multiple option selectors).\r\n   * @param {string} parameterName - The name of the parameter to set.\r\n   * @param {string} parameterValue - The value to set the parameter to.\r\n   * @returns {number} The result code of the function call.\r\n   */\r\n\r\n  static IV_setmethodparameter(\r\n    parameterName: string,\r\n    parameterValue: string\r\n  ): number {\r\n    return Core.#lib.IV_setmethodparameter(parameterName, parameterValue);\r\n  }\r\n\r\n  /**\r\n   * Returns actual available number of datapoints: indicates the progress during a run.\r\n   * @returns {IviumResult<number>} The result of the function call, with the number of data points as the second element.\r\n   */\r\n  static IV_Ndatapoints(): IviumResult<number> {\r\n    const dataPointArray = new LongArray(1);\r\n\r\n    return [Core.#lib.IV_Ndatapoints(dataPointArray), dataPointArray[0]];\r\n  }\r\n\r\n  /**\r\n   * Returns the data from a datapoint with index int, returns 3 values that depend on\r\n   * the used technique. For example LSV/CV methods return (E/I/0) Transient methods\r\n   * return (time/I,E/0), Impedance methods return (Z1,Z2,freq) etc.\r\n   * @param {number} dataPointIndex - The index of the data point to retrieve data for.\r\n   * @returns {IviumResult<number[]>} The result of the function call, with the data for the specified data point as the second element (an array of three numbers).\r\n   */\r\n  static IV_getdata(dataPointIndex: number): IviumResult<number[]> {\r\n    const selectedDataPointIndexPtr = buildNumericPointer(long, dataPointIndex);\r\n\r\n    const measuredValue1Ptr = buildNumericPointer(double);\r\n    const measuredValue2Ptr = buildNumericPointer(double);\r\n    const measuredValue3Ptr = buildNumericPointer(double);\r\n\r\n    // build a pointer to doble with the\r\n\r\n    const resultCode = Core.#lib.IV_getdata(\r\n      selectedDataPointIndexPtr,\r\n      measuredValue1Ptr,\r\n      measuredValue2Ptr,\r\n      measuredValue3Ptr\r\n    );\r\n\r\n    return [\r\n      resultCode,\r\n      [\r\n        measuredValue1Ptr.deref(),\r\n        measuredValue2Ptr.deref(),\r\n        measuredValue3Ptr.deref(),\r\n      ],\r\n    ];\r\n  }\r\n\r\n  /**\r\n   * Same as get_data_point, but with the additional scan_index parameter.\r\n   * This function will allow reading data from non-selected (previous) scans.\r\n   * @param {number} dataPointIndex - The index of the data point to retrieve data from.\r\n   * @param {number} scanIndex - The index of the scan to retrieve data from.\r\n   * @returns {IviumResult<number[]>} - An array with the result code as the first element, and an array of measured values as the second element.\r\n   */\r\n  static IV_getdatafromline(\r\n    dataPointIndex: number,\r\n    scanIndex: number\r\n  ): IviumResult<number[]> {\r\n    const selectedDataPointIndexPtr = buildNumericPointer(long, dataPointIndex);\r\n    const scanIndexPtr = buildNumericPointer(long, scanIndex);\r\n\r\n    const measuredValue1Ptr = buildNumericPointer(double);\r\n    const measuredValue2Ptr = buildNumericPointer(double);\r\n    const measuredValue3Ptr = buildNumericPointer(double);\r\n\r\n    const resultCode = Core.#lib.IV_getdatafromline(\r\n      selectedDataPointIndexPtr,\r\n      scanIndexPtr,\r\n      measuredValue1Ptr,\r\n      measuredValue2Ptr,\r\n      measuredValue3Ptr\r\n    );\r\n\r\n    return [\r\n      resultCode,\r\n      [\r\n        measuredValue1Ptr.deref(),\r\n        measuredValue2Ptr.deref(),\r\n        measuredValue3Ptr.deref(),\r\n      ],\r\n    ];\r\n  }\r\n}\r\n\r\nexport default Core;\r\n","export default class FileNotFoundError extends Error {\r\n  constructor(message = 'File not found.') {\r\n    super(message); // (1)\r\n    this.name = 'FileNotFoundError'; // (2)\r\n  }\r\n}\r\n","export default class CellOffError extends Error {\r\n  constructor(message = 'The cell is off.') {\r\n    super(message); // (1)\r\n    this.name = 'CellOffError'; // (2)\r\n  }\r\n}\r\n","export default class DeviceBusyError extends Error {\r\n  constructor(\r\n    message = 'The selected device is busy, connect/select another device or wait till it becomes available.'\r\n  ) {\r\n    super(message); // (1)\r\n    this.name = 'DeviceBusyError'; // (2)\r\n  }\r\n}\r\n","export default class DeviceNotConnectedToIviumsoftError extends Error {\r\n  constructor(\r\n    message = 'IviumSoft has no connected device. Please, connect one.'\r\n  ) {\r\n    super(message); // (1)\r\n    this.name = 'DeviceNotConnectedToIviumsoftError'; // (2)\r\n  }\r\n}\r\n","export default class DriverNotOpenError extends Error {\r\n  constructor(\r\n    message = 'The driver is not open. Please, use Ivium.openDriver() to open it.'\r\n  ) {\r\n    super(message); // (1)\r\n    this.name = 'DriverNotOpenError'; // (2)\r\n  }\r\n}\r\n","export default class NoDeviceDetectedError extends Error {\r\n  constructor(\r\n    message = 'Please, check your device is properly connected to the usb port.'\r\n  ) {\r\n    super(message); // (1)\r\n    this.name = 'NoDeviceDetectedError'; // (2)\r\n  }\r\n}\r\n","export default class IviumsoftNotRunningError extends Error {\r\n  constructor(\r\n    message = 'IviumSoft is not currently running. Please, start it.'\r\n  ) {\r\n    super(message); // (1)\r\n    this.name = 'NoIviumsoftRunningError'; // (2)\r\n  }\r\n}\r\n","export const DeviceStatusCode = {\r\n  noIviumsoft: -1,\r\n  notConnected: 0,\r\n  availableIdle: 1,\r\n  availableBusy: 2,\r\n  noDeviceAvailable: 3,\r\n} as const;\r\n\r\nexport type DeviceStatusCode =\r\n  typeof DeviceStatusCode[keyof typeof DeviceStatusCode];\r\n","import Core from './core';\r\nimport {\r\n  CellOffError,\r\n  DeviceBusyError,\r\n  DeviceNotConnectedToIviumsoftError,\r\n  DriverNotOpenError,\r\n  IviumsoftNotRunningError,\r\n  NoDeviceDetectedError,\r\n} from './errors';\r\nimport { DeviceStatusCode } from './types/DeviceStatusCode';\r\n\r\n/**\r\n * @class\r\n * @classdesc Class that encapsulates methods to validated the current status of the IviumSoft environment.\r\n */\r\nclass IviumVerifiers {\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if the driver is not open.\r\n   * @throws {DriverNotOpenError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verifyDriverIsOpen() {\r\n    if (!Core.isDriverOpen()) {\r\n      throw new DriverNotOpenError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if IviumSoft is not running.\r\n   * @throws {IviumsoftNotRunningError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verifyIviumsoftIsRunning() {\r\n    const deviceStatus = Core.IV_getdevicestatus();\r\n\r\n    if (deviceStatus === DeviceStatusCode.noIviumsoft) {\r\n      throw new IviumsoftNotRunningError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if a device is not connected through the IviumSoft app.\r\n   * @throws {DeviceNotConnectedToIviumsoftError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verifyDeviceIsConnectedToIviumsoft() {\r\n    const deviceStatus = Core.IV_getdevicestatus();\r\n\r\n    if (\r\n      deviceStatus < DeviceStatusCode.availableIdle ||\r\n      deviceStatus === DeviceStatusCode.noDeviceAvailable\r\n    ) {\r\n      throw new DeviceNotConnectedToIviumsoftError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if no device is connected to your computer through usb.\r\n   * @throws {NoDeviceDetectedError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verifyDeviceIsConnectedToComputer() {\r\n    const deviceStatus = Core.IV_getdevicestatus();\r\n\r\n    if (deviceStatus === DeviceStatusCode.noDeviceAvailable) {\r\n      throw new NoDeviceDetectedError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if no device is connected to your computer through usb.\r\n   * @throws {DeviceBusyError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verifyDeviceIsAvailable() {\r\n    const deviceStatus = Core.IV_getdevicestatus();\r\n\r\n    if (deviceStatus === DeviceStatusCode.availableBusy) {\r\n      throw new DeviceBusyError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @static\r\n   * @method\r\n   * @description Raise exception if cell is off.\r\n   * @throws {CellOffError}\r\n   * @memberof IviumVerifiers\r\n   */\r\n  static verfiyCellIsOn() {\r\n    const [, cellStatus] = Core.IV_getcellstatus();\r\n\r\n    if (!cellStatus) {\r\n      throw new CellOffError();\r\n    }\r\n  }\r\n}\r\n\r\nexport default IviumVerifiers;\r\n","const statusLabels = [\r\n  'no IviumSoft',\r\n  'connected',\r\n  'available_idle',\r\n  'available_busy',\r\n  'no device available',\r\n];\r\n\r\nexport default statusLabels;\r\n","import Core from './core';\r\nimport FileNotFoundError from './errors/FileNotFoundError';\r\nimport IviumVerifiers from './iviumVerifiers';\r\nimport {\r\n  IviumsoftNotRunningError,\r\n  DeviceNotConnectedToIviumsoftError,\r\n} from './errors';\r\nimport statusLabels from './utils/statusLabels';\r\nimport type { IviumResult } from './types/IviumResult';\r\nimport { DeviceStatusCode } from './types/DeviceStatusCode';\r\n\r\nconst CELL_STATUS_LABELS = [\r\n  'I_ovl',\r\n  '',\r\n  'Anin1_ovl',\r\n  'E_ovl',\r\n  '',\r\n  'CellOff_button pressed',\r\n  'Cell on',\r\n];\r\n\r\n/**\r\n * Wrapper class for the Ivium library.\r\n * It uses the methods defined in the Core class.\r\n * All its methods are static.\r\n */\r\nclass Ivium {\r\n  // #######################\r\n  // ## GENERIC FUNCTIONS ##\r\n  // #######################\r\n\r\n  /**\r\n   * Open the driver to manipulate the Ivium software.\r\n   */\r\n  static openDriver() {\r\n    if (Core.isDriverOpen()) {\r\n      Core.IV_close();\r\n    }\r\n\r\n    Core.IV_open();\r\n\r\n    try {\r\n      IviumVerifiers.verifyIviumsoftIsRunning();\r\n    } catch (error) {\r\n      Core.IV_close();\r\n      throw error;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Close the iviumsoft driver.\r\n   */\r\n  static closeDriver() {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n\r\n    Core.IV_close();\r\n  }\r\n\r\n  /**\r\n   * @returns the maximum number of devices that can be managed by IviumSoft.\r\n   */\r\n  static getMaxDeviceNumber() {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n\r\n    return Core.IV_MaxDevices();\r\n  }\r\n\r\n  /**\r\n   * Informs about the status of IviumSoft and the connected device.\r\n   * It use the global statusLabes array including all the possible resulting status.\r\n   * @returns -1 (no IviumSoft), 0 (not connected), 1 (available_idle), 2 (available_busy),\r\n   * 3 (no device available).\r\n   */\r\n  static getDeviceStatus(): IviumResult<string> {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n\r\n    const resultCode = Core.IV_getdevicestatus();\r\n\r\n    return [resultCode, statusLabels[resultCode + 1]];\r\n  }\r\n\r\n  /**\r\n   * @returns A boolean value indicating whether IviumSoft is running.\r\n   */\r\n  static isIviumsoftRunning(): boolean {\r\n    return Core.IV_getdevicestatus() !== DeviceStatusCode.noIviumsoft;\r\n  }\r\n\r\n  /**\r\n   * @returns A list of active(open) IviumSoft instances.\r\n   */\r\n  static getActiveIviumsoftInstances(): number[] {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    const MAX_INSTANCE_NUMBER = 32;\r\n    const activeInstances = [];\r\n    let firstActiveInstanceNumber = 0;\r\n\r\n    for (\r\n      let instanceNumber = 1;\r\n      instanceNumber < MAX_INSTANCE_NUMBER;\r\n      instanceNumber++\r\n    ) {\r\n      Core.IV_selectdevice(instanceNumber);\r\n\r\n      if (Ivium.isIviumsoftRunning()) {\r\n        activeInstances.push(instanceNumber);\r\n        if (firstActiveInstanceNumber === 0) {\r\n          firstActiveInstanceNumber = instanceNumber;\r\n        }\r\n      }\r\n    }\r\n\r\n    if (firstActiveInstanceNumber === 0) {\r\n      firstActiveInstanceNumber = 1;\r\n    }\r\n\r\n    Core.IV_selectdevice(firstActiveInstanceNumber);\r\n\r\n    return activeInstances;\r\n  }\r\n\r\n  /**\r\n   * It allows to select one instance of the currently running IviumSoft instances\r\n   *  @param {number} iviumsoftInstanceNumber The instance number to select.\r\n   */\r\n  static selectIviumsoftInstance(iviumsoftInstanceNumber: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    const activeInstances = Ivium.getActiveIviumsoftInstances();\r\n    if (!activeInstances.includes(iviumsoftInstanceNumber)) {\r\n      const errorMsg = `No IviumSoft on instance number ${iviumsoftInstanceNumber}, actual active instances list = ${activeInstances}`;\r\n      throw new IviumsoftNotRunningError(errorMsg);\r\n    }\r\n    Core.IV_selectdevice(iviumsoftInstanceNumber);\r\n  }\r\n\r\n  /**\r\n   * @returns The serial number of the currently selected device if available.\r\n   */\r\n  static getDeviceSerialNumber(): string {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToComputer();\r\n    const [, serialNumber] = Core.IV_readSN();\r\n    if (serialNumber === '') {\r\n      throw new DeviceNotConnectedToIviumsoftError(\r\n        'This device needs to be connected to get its serial number'\r\n      );\r\n    }\r\n\r\n    return serialNumber;\r\n  }\r\n\r\n  /**\r\n   * It connects the currently selected device.\r\n   */\r\n  static connectDevice(): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToComputer();\r\n    Core.IV_connect(1);\r\n  }\r\n\r\n  /**\r\n   * It disconnects the currently selected device.\r\n   */\r\n  static disconnectDevice(): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToComputer();\r\n    Core.IV_connect(0);\r\n  }\r\n\r\n  /**\r\n   * @returns The version of the IviumSoft dll.\r\n   */\r\n  static getDllVersion(): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    return Core.IV_VersionDll();\r\n  }\r\n\r\n  /**\r\n   * @returns The version of the IviumSoft that match with this iviumjs version.\r\n   */\r\n  static getIviumsoftVersion(): string {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    const versionStr = Core.IV_VersionDllFile().toString();\r\n\r\n    return `${versionStr.slice(0, 1)}.${versionStr.slice(1, 5)}`;\r\n  }\r\n\r\n  /**\r\n   * Sending the number value communicates with Multichannel control:\r\n   *  if not yet active, the [number] of tabs is automatically opened and the [number] tab becomes active.\r\n   *  if Ivium-n-Soft is active already, the [number] tab becomes active.\r\n   *  Now the channel/instrument that is connected to this tab can be controlled.\r\n   *  If no instrument is connected, the next available instrument in the list can be connected (IV_connect) and controlled.\r\n   * @param {number} channelNumber to target\r\n   */\r\n  static selectChannel(channelNumber: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_SelectChannel(channelNumber);\r\n  }\r\n\r\n  // ###########################\r\n  // ## DIRECT MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  /**\r\n   * @returns The cell status labels:\r\n   *  [\"I_ovl\", \"Anin1_ovl\",\"E_ovl\", \"CellOff_button pressed\", \"Cell on\"].\r\n   */\r\n  static getCellStatus(): string[] {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, cellStatusBits] = Core.IV_getcellstatus();\r\n    const cellStatusLabels = [];\r\n\r\n    let counter = 2;\r\n\r\n    for (const label of CELL_STATUS_LABELS) {\r\n      if (cellStatusBits & (1 << counter) && label) {\r\n        cellStatusLabels.push(label);\r\n      }\r\n\r\n      counter++;\r\n    }\r\n\r\n    if (cellStatusLabels.length === 0) {\r\n      cellStatusLabels.push('Cell off');\r\n    }\r\n\r\n    return cellStatusLabels;\r\n  }\r\n\r\n  /**\r\n   * Select the connection mode for the currently connected device.\r\n   * The available modes depend on the connected device.\r\n   * The list can include: 0=off, 1=EStat4EL(default), 2=EStat2EL,\r\n   * 3=EstatDummy1,4=EStatDummy2,5=EstatDummy3,6=EstatDummy4\r\n   * 7=Istat4EL, 8=Istat2EL, 9=IstatDummy, 10=BiStat4EL, 11=BiStat2EL.\r\n   * @param connectionMode the number corresponding with available list.\r\n   */\r\n  static setConnectionMode(connectionMode: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setconnectionmode(connectionMode);\r\n  }\r\n\r\n  /**\r\n   * Set cell on.\r\n   */\r\n  static setCellOn(): void {\r\n    if (Ivium.getCellStatus().includes('Cell off')) {\r\n      Core.IV_setcellon(1);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set cell off.\r\n   */\r\n  static setCellOff(): void {\r\n    if (Ivium.getCellStatus().includes('Cell on')) {\r\n      Core.IV_setcellon(0);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set cell potential.\r\n   * @param potential the value of potential (in Volts) to set.\r\n   */\r\n  static setPotential(potential: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setpotential(potential);\r\n  }\r\n\r\n  /**\r\n   * Set BiStat (WE2) offset potential potential.\r\n   * @param we2Potential the value of potential, in Volts (V), to set.\r\n   */\r\n  static setWe2Potential(we2Potential: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setpotentialWE2(we2Potential);\r\n  }\r\n\r\n  /**\r\n   * Set cell current (galvanostatic mode).\r\n   * @param current the value of current intensity, in Amperes (A), to be set.\r\n   */\r\n  static setCurrent(current: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setcurrent(current);\r\n  }\r\n\r\n  /**\r\n   * @returns The measured potential.\r\n   */\r\n  static getPotential(): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, potentialValue] = Core.IV_getpotential();\r\n    return potentialValue;\r\n  }\r\n\r\n  /**\r\n   * Set current range: 0=10A, 1=1A, etc...\r\n   * @param currentRange The current range from the available current ranges list.\r\n   */\r\n  static setCurrentRange(currentRange: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setcurrentrange(currentRange);\r\n  }\r\n\r\n  /**\r\n   * Set current range for BiStat (WE2): 0=10mA, 1=1mA, etc...\r\n   * @param currentRange The number of current range from the available current ranges list.\r\n   */\r\n  static setWe2CurrentRange(currentRange: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setcurrentrangeWE2(currentRange);\r\n  }\r\n\r\n  /**\r\n   * @returns The measured(applied) current.\r\n   */\r\n  static getCurrent(): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, currentValue] = Core.IV_getcurrent();\r\n    return currentValue;\r\n  }\r\n\r\n  /**\r\n   * @returns The measured current from WE2 (bipotentiostat).\r\n   */\r\n  static getWe2Current(): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, currentValue] = Core.IV_getcurrentWE2();\r\n    return currentValue;\r\n  }\r\n\r\n  /**\r\n   * Set filter: 0=1MHz, 1=100kHz, 2=10kHz, 3=1kHz, 4=10Hz\r\n   * @param filter The number of filter from the available filter list.\r\n   */\r\n  static setFilter(filter: 0 | 1 | 2 | 3 | 4): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setfilter(filter);\r\n  }\r\n\r\n  /**\r\n   * Set stability: 0=HighSpeed, 1=Standard, 2=HighStability\r\n   * @param stability The number value from the available filter list.\r\n   */\r\n  static setStability(stability: 0 | 1 | 2): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setstability(stability);\r\n  }\r\n\r\n  /**\r\n   * Select mode for BiStat, for number 0=standard, 1=scanning.\r\n   * This bistat_mode function also can be used to control the Automatic E-ranging function of the instrument;\r\n   * 0=AutoEranging off; 1=AutoEranging on.\r\n   * @param bistatMode The number value 0=standard or 1=scanning.\r\n   */\r\n  static setBistatMode(bistatMode: 0 | 1): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setbistatmode(bistatMode);\r\n  }\r\n\r\n  /**\r\n   * Set dac on external port: channelNumber=0 for dac1 and channelNumber=1 for dac2.\r\n   * @param channel The dac channel number.\r\n   * @param dac The dac value to set.\r\n   */\r\n  static setDac(channel: 0 | 1, dac: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setdac(channel, dac);\r\n  }\r\n\r\n  /**\r\n   * Returns measured voltage on external ADC port, int=channelnr. 0-7\r\n   * @param channel The dac channel number.\r\n   */\r\n  static getAdc(channel: number): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, measuredVoltage] = Core.IV_getadc(channel);\r\n\r\n    return measuredVoltage;\r\n  }\r\n\r\n  /**\r\n   * Set channel of multiplexer, int=channelnr. starting from 0(default).\r\n   * @param channel The number multiplexer channel.\r\n   */\r\n  static setMuxChannel(channel = 0): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    Core.IV_setmuxchannel(channel);\r\n  }\r\n\r\n  /**\r\n   * @returns A sequence of measured currents at defined sampling rate\r\n   * @param pointsQuantity The number of points <= 256.\r\n   * @param intervalRate The interval rate (10us to 20ms).\r\n   */\r\n  static getCurrentTrace(pointsQuantity: number, intervalRate: number): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, current] = Core.IV_getcurrenttrace(pointsQuantity, intervalRate);\r\n\r\n    return current;\r\n  }\r\n\r\n  /**\r\n   * @returns A sequence of measured  WE2 currents at defined sampling rate\r\n   * @param pointsQuantity The number of points <= 256.\r\n   * @param intervalRate The interval rate (10us to 20ms).\r\n   */\r\n  static getCurrentWe2Trace(\r\n    pointsQuantity: number,\r\n    intervalRate: number\r\n  ): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n\r\n    const [, current] = Core.IV_getcurrentWE2trace(\r\n      pointsQuantity,\r\n      intervalRate\r\n    );\r\n\r\n    return current;\r\n  }\r\n\r\n  /**\r\n   * @returns A sequence of measured potentials at defined samplingrate\r\n   * @param pointsQuantity The number of points <= 256.\r\n   * @param intervalRate The interval rate (10us to 20ms).\r\n   */\r\n  static getPotentialTrace(\r\n    pointsQuantity: number,\r\n    intervalRate: number\r\n  ): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n    const [, potential] = Core.IV_getpotentialtrace(\r\n      pointsQuantity,\r\n      intervalRate\r\n    );\r\n\r\n    return potential;\r\n  }\r\n\r\n  /**\r\n   * Set the value of the ac amplitude in Volts.\r\n   * @param acAmplitude The AC amplitude in Hz.\r\n   */\r\n  static setAcAmplitude(acAmplitude: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_setamplitude(acAmplitude);\r\n  }\r\n\r\n  /**\r\n   * Set the value of the ac frequency in Hz.\r\n   * @param acFrequency The AC frequency in Hz.\r\n   */\r\n  static setAcFrequency(acFrequency: number): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_setfrequency(acFrequency);\r\n  }\r\n\r\n  // ###########################\r\n  // ## WE32 MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  // ###########################\r\n  // ## METHOD MODE FUNCTIONS ##\r\n  // ###########################\r\n\r\n  /**\r\n   * Loads method procedure previously saved to a file.\r\n   * @param methodFilePath The path to the file where the method is stored.\r\n   */\r\n  static loadMethod(methodFilePath: string) {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n\r\n    const [resultCode] = Core.IV_readmethod(methodFilePath);\r\n\r\n    if (resultCode === 1) {\r\n      throw new FileNotFoundError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Saves currently loaded method procedure to a file..\r\n   * @param methodFilePath The the full path to the new file.\r\n   */\r\n  static saveMethod(methodFilePath: string): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_savemethod(methodFilePath);\r\n  }\r\n\r\n  /**\r\n   * Starts a method procedure.\r\n   * If methodFilePath is an empty string then the presently loaded procedure is started.\r\n   * If the full path to a previously saved method is provided\r\n   * then the procedure is loaded from the file and started\r\n   * @param {string} [methodFilePath=''] - The path to the method file. If not specified, the current method will be used.\r\n   */\r\n  static startMethod(methodFilePath = ''): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n    IviumVerifiers.verifyDeviceIsAvailable();\r\n\r\n    const [resultCode] = Core.IV_startmethod(methodFilePath);\r\n\r\n    if (resultCode === 1) {\r\n      throw new FileNotFoundError();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Aborts the ongoing method procedure\r\n   */\r\n  static abortMethod(): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    IviumVerifiers.verifyDeviceIsConnectedToIviumsoft();\r\n    Core.IV_abort();\r\n  }\r\n\r\n  /**\r\n   * Saves the results of the last method execution into a file.\r\n   * @param {string} dataFilePath - The full path to the new file.\r\n   * IMPORTANT: If the path provided is not valid,\r\n   * it will close the selected iviumsoft instance.\r\n   */\r\n\r\n  static saveData(dataFilePath: string): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_savedata(dataFilePath);\r\n  }\r\n\r\n  /**\r\n   * Allows updating the parameter values for the currently loaded method procedrue.\r\n   * It only works for text based parameters and dropdowns (multiple option selectors).\r\n   * @param {string} parameterName - The name of the parameter to set.\r\n   * @param {string} parameterValue - The value to set the parameter to.\r\n   */\r\n\r\n  static setMethodParameter(\r\n    parameterName: string,\r\n    parameterValue: string\r\n  ): void {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    Core.IV_setmethodparameter(parameterName, parameterValue);\r\n  }\r\n\r\n  /**\r\n   * Returns actual available number of datapoints: indicates the progress during a run.\r\n   * @returns {number} The number of available data points.\r\n   */\r\n  static getAvailableDataPointsNumber(): number {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    const [, dataPoints] = Core.IV_Ndatapoints();\r\n\r\n    return dataPoints;\r\n  }\r\n\r\n  /**\r\n   * Returns the data from a datapoint with index int, returns 3 values that depend on\r\n   * the used technique. For example LSV/CV methods return (E/I/0) Transient methods\r\n   * return (time/I,E/0), Impedance methods return (Z1,Z2,freq) etc.\r\n   * @param {number} dataPointIndex - The index of the data point to retrieve data for.\r\n   * @returns {number[]} The data for the specified data point (an array of three numbers).\r\n   */\r\n  static getDataPoint(dataPointIndex: number): number[] {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n\r\n    const [, values] = Core.IV_getdata(dataPointIndex);\r\n\r\n    return values;\r\n  }\r\n\r\n  /**\r\n   * Same as get_data_point, but with the additional scan_index parameter.\r\n   * This function will allow reading data from non-selected (previous) scans.\r\n   * @param {number} dataPointIndex - The index of the data point to retrieve data from.\r\n   * @param {number} scanIndex - The index of the scan to retrieve data from.\r\n   * @returns {number[]} - An array of measured values.\r\n   */\r\n  static getDataPointFromScan(\r\n    dataPointIndex: number,\r\n    scanIndex: number\r\n  ): number[] {\r\n    IviumVerifiers.verifyDriverIsOpen();\r\n    IviumVerifiers.verifyIviumsoftIsRunning();\r\n    const [, values] = Core.IV_getdatafromline(dataPointIndex, scanIndex);\r\n\r\n    return values;\r\n  }\r\n}\r\n\r\nexport default Ivium;\r\n"],"names":[],"mappings":"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"}