motion-master-client 0.0.422 → 0.0.424

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@ import { HardwareDescription, StackInfo } from './hardware-description';
6
6
  import { MotionMasterReqResSocket } from './motion-master-req-res-socket';
7
7
  import { UIFeaturesConfig } from './parameter';
8
8
  import { SystemLogLine } from './system-log-line';
9
- import { MotionMasterMessage, ParameterValueType, ParameterTypeValue, DeviceParameterValuesStatus, ParameterTypeValueKey, DeviceRefObj, DeviceRef, FullAutoTuningStatus, SystemVersionStatus, DeviceInfoStatus, DeviceParameterInfoStatus, GetDeviceParameterInfoRequest, GetDeviceParameterValuesRequest, GetMultiDeviceParameterValuesRequest, MultiDeviceParameterValuesStatus, SetDeviceParameterValuesRequest, SetMultiDeviceParameterValuesRequest, GetDeviceFileListRequest, DeviceFileListStatus, GetDeviceFileRequest, DeviceFileStatus, SetDeviceFileRequest, DeleteDeviceFileRequest, ResetDeviceFaultRequest, DeviceFaultResetStatus, StopDeviceRequest, DeviceStopStatus, StartDeviceFirmwareInstallationRequest, DeviceFirmwareInstallationStatus, GetDeviceLogRequest, DeviceLogStatus, StartCoggingTorqueRecordingRequest, CoggingTorqueRecordingStatus, GetCoggingTorqueDataRequest, CoggingTorqueDataStatus, StartOffsetDetectionRequest, OffsetDetectionStatus, StartPlantModelIdentificationRequest, PlantIdentificationStatus, ComputeAutoTuningGainsRequest, AutoTuningStatus, SetMotionControllerParametersRequest, MotionControllerStatus, EnableMotionControllerRequest, SetSignalGeneratorParametersRequest, SignalGeneratorStatus, StopSignalGeneratorRequest, StartMonitoringDeviceParameterValuesRequest, MonitoringParameterValuesStatus, StopMonitoringDeviceParameterValuesRequest, GetEthercatNetworkStateRequest, EthercatNetworkStateStatus, SetEthercatNetworkStateRequest, StartNarrowAngleCalibrationRequest, NarrowAngleCalibrationStatus, SetSystemClientTimeoutRequest, StartSystemIdentificationRequest, SystemIdentificationStatus, CirculoEncoderMagnetDistanceStatus, StartCirculoEncoderNarrowAngleCalibrationProcedureRequest, CirculoEncoderNarrowAngleCalibrationProcedureStatus, GetDeviceCiA402StateRequest, DeviceCiA402StateStatus, SetDeviceCiA402StateRequest, SystemLogStatus, StartDeviceSiiRestoreRequest, DeviceSiiRestoreStatus, StartOpenLoopFieldControlRequest, OpenLoopFieldControlStatus, ComputeFullAutoTuningGainsRequest, StartFullAutoTuningRequest, StopFullAutoTuningRequest, StartCirculoEncoderConfigurationRequest, CirculoEncoderConfigurationStatus, StopCirculoEncoderNarrowAngleCalibrationProcedureRequest, StartOsCommandRequest, OsCommandStatus, RestoreDefaultParametersType, DeviceParameterAddressValue, DeviceParameterIds, DeviceParameterInfo, RequestStatusMessage, UiPdoMapping, UiConfig, ExecuteForwardCallRequest, ForwardCallStatus, PlantModel, NotchFilter, LoadConfigStrategy, SystemInformationStatus, SetPdoModeRequest, PdoModeStatus, GetDeviceSiiRequest, DeviceSiiStatus, SmmAutomatedUpdate } from './types';
9
+ import { MotionMasterMessage, ParameterValueType, ParameterTypeValue, DeviceParameterValuesStatus, ParameterTypeValueKey, DeviceRefObj, DeviceRef, FullAutoTuningStatus, SystemVersionStatus, DeviceInfoStatus, DeviceParameterInfoStatus, GetDeviceParameterInfoRequest, GetDeviceParameterValuesRequest, GetMultiDeviceParameterValuesRequest, MultiDeviceParameterValuesStatus, SetDeviceParameterValuesRequest, SetMultiDeviceParameterValuesRequest, GetDeviceFileListRequest, DeviceFileListStatus, GetDeviceFileRequest, DeviceFileStatus, SetDeviceFileRequest, DeleteDeviceFileRequest, ResetDeviceFaultRequest, DeviceFaultResetStatus, StopDeviceRequest, DeviceStopStatus, StartDeviceFirmwareInstallationRequest, DeviceFirmwareInstallationStatus, GetDeviceLogRequest, DeviceLogStatus, StartCoggingTorqueRecordingRequest, CoggingTorqueRecordingStatus, GetCoggingTorqueDataRequest, CoggingTorqueDataStatus, StartOffsetDetectionRequest, OffsetDetectionStatus, StartPlantModelIdentificationRequest, PlantIdentificationStatus, ComputeAutoTuningGainsRequest, AutoTuningStatus, SetMotionControllerParametersRequest, MotionControllerStatus, EnableMotionControllerRequest, SetSignalGeneratorParametersRequest, SignalGeneratorStatus, StopSignalGeneratorRequest, StartMonitoringDeviceParameterValuesRequest, MonitoringParameterValuesStatus, StopMonitoringDeviceParameterValuesRequest, GetEthercatNetworkStateRequest, EthercatNetworkStateStatus, SetEthercatNetworkStateRequest, StartNarrowAngleCalibrationRequest, NarrowAngleCalibrationStatus, SetSystemClientTimeoutRequest, StartSystemIdentificationRequest, SystemIdentificationStatus, CirculoEncoderMagnetDistanceStatus, StartCirculoEncoderNarrowAngleCalibrationProcedureRequest, CirculoEncoderNarrowAngleCalibrationProcedureStatus, GetDeviceCiA402StateRequest, DeviceCiA402StateStatus, SetDeviceCiA402StateRequest, SystemLogStatus, StartDeviceSiiRestoreRequest, DeviceSiiRestoreStatus, StartOpenLoopFieldControlRequest, OpenLoopFieldControlStatus, ComputeFullAutoTuningGainsRequest, StartFullAutoTuningRequest, StopFullAutoTuningRequest, StartCirculoEncoderConfigurationRequest, CirculoEncoderConfigurationStatus, StopCirculoEncoderNarrowAngleCalibrationProcedureRequest, StartOsCommandRequest, OsCommandStatus, RestoreDefaultParametersType, DeviceParameterAddressValue, DeviceParameterIds, DeviceParameterInfo, RequestStatusMessage, UiPdoMapping, UiConfig, ExecuteForwardCallRequest, ForwardCallStatus, PlantModel, NotchFilter, LoadConfigStrategy, SystemInformationStatus, SetPdoModeRequest, PdoModeStatus, GetDeviceSiiRequest, DeviceSiiStatus, SmmAutomatedUpdate, SmmAutomatedUpdateProgress, SmmSoftwareUpdateProgress } from './types';
10
10
  import { Cia402State, ModesOfOperation } from './cia402';
11
11
  import { EncoderRegisterCommunicationOsCommandResponse, MotorPhaseOrderDetectionOsCommandResponse, OpenPhaseDetectionOsCommandResponse, OsCommandMode, OsCommandResponse, PhaseResistanceMeasurementOsCommandResponse, PhaseInductanceMeasurementOsCommandResponse, PolePairDetectionOsCommandResponse, CommutationOffsetMeasurementOsCommandResponse, IcMuCalibrationModeOsCommandResponse, OpenLoopFieldModeOsCommandResponse, HrdStreamingOsCommandResponse, TorqueConstantMeasurementOsCommandResponse, SkippedCyclesCounterOsCommandResponse, IgnoreBissStatusBitsOsCommandResponse, SystemIdentificationOsCommandResponse, KublerEncoderCommandOsCommandResponse, UseInternalEncoderVelocityOsCommandResponse, KublerEncoderRegisterCommunicationOsCommandResponse, SmmAcyclicHandlerOsCommandResponse, HrdStreamingOsCommandAction, HrdStreamingOsCommandDataIndex, SmmAcyclicHandlerLoadParametersForVerificationOsCommandResponse, ChirpSignalOptions, OsCommandAbortResult } from './os-command';
12
12
  import { IntegroVariant } from './integro-variant';
@@ -238,9 +238,25 @@ export declare class MotionMasterReqResClient {
238
238
  *
239
239
  * If the requested file content is empty, Motion Master will return a not found error. This is subject to change now that Motion Master reads the file error codes.
240
240
  *
241
- * SOMANET_CiA_402.xml and SOMANET_CiA_402.xml.zip files are stored in IndexedDB for faster access.
241
+ * The ESI file ("SOMANET_CiA_402.xml" or "SOMANET_CiA_402.xml.zip") is never read from the device, see {@link getEsiFromIndexedDB}.
242
242
  */
243
243
  getDeviceFile(props: GetDeviceFileRequest, requestTimeout: number, messageId?: string): Observable<DeviceFileStatus>;
244
+ /**
245
+ * Returns the ESI file cached in IndexedDB under the firmware version the device reports in 0x100A:00.
246
+ *
247
+ * The ESI file is never read from the device. Firmware installation no longer writes it to the device (see
248
+ * {@link installFirmwareAndCacheEsi}), and Motion Master does not remove a skipped file, so the file on the device may
249
+ * belong to an older firmware. Neither the file nor its ESI revision tells which firmware it belongs to.
250
+ * Caching it under the installed version would hide the correct ESI file for good.
251
+ *
252
+ * The ESI file gets into IndexedDB only from a firmware package: at firmware installation, see
253
+ * {@link cacheEsiFromFirmwarePackage}, or when a user loads it from a package in OBLAC Drives.
254
+ *
255
+ * Returns a failed status with the NOT_FOUND error code when the ESI file is not cached for the installed firmware,
256
+ * or when there is no IndexedDB, as outside the browser. Returns a failed status with the FAILED error code when the
257
+ * firmware version or IndexedDB can't be read.
258
+ */
259
+ private getEsiFromIndexedDB;
244
260
  private getDeviceFileUsingResolvedDeviceAddress;
245
261
  /**
246
262
  * Fixing a production screw-up that affects a very important customer. Added on February 29th, 2024.
@@ -315,8 +331,7 @@ export declare class MotionMasterReqResClient {
315
331
  * Extracts the ESI file (SOMANET_CiA_402.xml) from a firmware package and stores its unzipped content in
316
332
  * IndexedDB, keyed by the given firmware version.
317
333
  *
318
- * This is the install-time counterpart to the read-time caching in {@link getDeviceFile}: once the ESI is
319
- * cached here, OBLAC can resolve it from IndexedDB without reading it back from the drive. This is what
334
+ * IndexedDB is the only source of the ESI file: {@link getDeviceFile} never reads it from the drive. This is what
320
335
  * allows the ESI file (SOMANET_CiA_402.xml.zip) to be skipped during firmware installation, which avoids
321
336
  * slow and unreliable FoE transfers and works around devices (e.g. NetX) that reject writing that file.
322
337
  *
@@ -337,17 +352,18 @@ export declare class MotionMasterReqResClient {
337
352
  * user-overridable: when `props.skipFiles` is provided it is passed through unchanged, so a caller can choose to
338
353
  * still write the ESI by omitting it from that list.
339
354
  * - Extracts the ESI from the package and stores it in IndexedDB keyed by firmware version (see
340
- * {@link cacheEsiFromFirmwarePackage}) *before* the installation starts, so it can be resolved locally by
341
- * {@link getDeviceFile}. It must be cached up front because, with the ESI skipped on the drive, Motion Master
342
- * will try to read it back right after installation. This caching happens regardless of whether the ESI is
343
- * also written to the drive. A caching failure is logged but does not prevent installation.
355
+ * {@link cacheEsiFromFirmwarePackage}) *before* the installation starts, so {@link getDeviceFile} can return it
356
+ * as soon as the installation ends. IndexedDB is the only source of the ESI file: {@link getDeviceFile} never
357
+ * reads it from the drive, even when the ESI is also written there. A caching failure is logged but does not
358
+ * prevent installation; the ESI file is then not found until a user loads it from the package (Load ESI in
359
+ * OBLAC Drives).
344
360
  *
345
361
  * @param firmwareVersion - The firmware version to key the cached ESI by; this must match the value reported by
346
362
  * the device parameter 0x100a:00 after installation, which {@link getDeviceFile} uses.
347
363
  * For OBLAC firmware packages this is the version encoded in the package filename, see
348
364
  * {@link extractFirmwareVersionFromFirmwarePackageFilename}. When it cannot be determined
349
365
  * (e.g. an arbitrary package with an unrecognized filename), pass an empty value to skip
350
- * caching; the read path then falls back to the online source.
366
+ * caching; the ESI file is then not found unless it was cached before.
351
367
  */
352
368
  installFirmwareAndCacheEsi(firmwareVersion: string | undefined, props: StartDeviceFirmwareInstallationRequest, requestTimeout: number, messageId?: string): Observable<DeviceFirmwareInstallationStatus>;
353
369
  /**
@@ -1686,12 +1702,14 @@ export declare class MotionMasterReqResClient {
1686
1702
  * attempt will fail unless the user logs out beforehand.
1687
1703
  *
1688
1704
  * @param deviceRef - The reference to the device to which the login command will be sent.
1689
- * @param username - The optional username used for logging in to the SMM. If not provided, it will be treated as an empty string.
1690
- * @param password - The password used for logging in to the SMM.
1705
+ * @param username - The name of the user who logs in, 4 to 24 printable ASCII characters. It tells who configured
1706
+ * the SMM, so pass the real user's name.
1707
+ * @param password - The password used for logging in to the SMM, 1 to 24 printable ASCII characters.
1691
1708
  * @param commandTimeout - The timeout in milliseconds for the command to complete.
1692
1709
  * @param responsePollingInterval - The interval in milliseconds between polling for the response.
1693
1710
  *
1694
- * @throws {Error} If the login attempt fails.
1711
+ * @throws {Error} If the username or the password is not valid, in which case nothing is sent, or if the login
1712
+ * attempt fails.
1695
1713
  *
1696
1714
  * @remarks
1697
1715
  * If the device is already logged in, the next login attempt will fail unless the user logs out first.
@@ -1705,12 +1723,14 @@ export declare class MotionMasterReqResClient {
1705
1723
  * attempt will fail unless the user logs out beforehand.
1706
1724
  *
1707
1725
  * @param deviceRef - The reference to the device to which the login command will be sent.
1708
- * @param username - The optional username used for logging in to the SMM. If not provided, it will be treated as an empty string.
1709
- * @param password - The password used for logging in to the SMM.
1726
+ * @param username - The name of the user who logs in, 4 to 24 printable ASCII characters. It tells who configured
1727
+ * the SMM, so pass the real user's name.
1728
+ * @param password - The password used for logging in to the SMM, 1 to 24 printable ASCII characters.
1710
1729
  * @param commandTimeout - The timeout in milliseconds for the command to complete.
1711
1730
  * @param responsePollingInterval - The interval in milliseconds between polling for the response.
1712
1731
  *
1713
- * @throws {Error} If the login attempt fails.
1732
+ * @throws {Error} If the username or the password is not valid, in which case nothing is sent, or if the login
1733
+ * attempt fails.
1714
1734
  *
1715
1735
  * @remarks
1716
1736
  * If the device is already logged in, the next login attempt will fail unless the user logs out first.
@@ -1749,38 +1769,46 @@ export declare class MotionMasterReqResClient {
1749
1769
  * Changes the SMM password for the specified device.
1750
1770
  *
1751
1771
  * The sequence is: write `<newPassword><oldPassword>` to the fs-buffer and run CHANGE_PASSWORD. If, and only if, the
1752
- * SMM accepts the change, log out from the SMM, trigger an SMM restart (unless `triggerRestart` is false) and then
1753
- * wait `rebootDelay` milliseconds before completing, so the next SMM command a caller issues does not land in the
1754
- * reboot.
1772
+ * SMM accepts the change, log in for parameter download with the new password until the SMM accepts the login. The
1773
+ * SMM is not restarted, because it does not need a restart to use a new password.
1774
+ *
1775
+ * The SMM acknowledges CHANGE_PASSWORD before it stores the new password. It writes the password to its EEPROM in the
1776
+ * background, refuses every login while the write runs, and closes the session itself when the write is done. A
1777
+ * restart during the write leaves a stored password that the SMM discards at boot, so neither the new nor the old
1778
+ * password logs in and only the master password gets in again. A logout does not wait for the write either. The
1779
+ * first login that the SMM accepts with the new password is therefore the proof that the write is done and that the
1780
+ * SMM stored the intended password.
1755
1781
  *
1756
- * The logout has to come before the restart. When the SMM is restarted while the session is still open, it stores
1757
- * neither the new nor the old password, although it accepted the change, and only the master password gets in again.
1758
- * After an accepted change the session is therefore closed; log in again with the new password to continue.
1782
+ * After the call, a session for parameter download is open, logged in with the new password, so a caller can go on
1783
+ * with SMM commands without a new login. Log out with {@link logoutFromSmm} when done.
1759
1784
  *
1760
1785
  * @param deviceRef - A reference to the target device.
1786
+ * @param username - The name of the logged-in user, 4 to 24 printable ASCII characters, for the login with the new
1787
+ * password. Pass the same name the user logged in with: it tells who configured the SMM.
1761
1788
  * @param oldPassword - The current SMM password.
1762
1789
  * @param newPassword - The new password to set for the SMM, 4 to 24 printable ASCII characters.
1763
1790
  * @param commandTimeout - The timeout in milliseconds for the CHANGE_PASSWORD command. On firmware below 5.2.0 it also
1764
- * covers the FoE write of the fs-buffer, because the buffer is written before the command is issued. If it runs out
1765
- * while the SMM is still storing the password, the client gives up, the SMM is not restarted, and the result of the
1766
- * change is unknown. Defaults to 12000: the drive gives up on the SMM after 10 s, so do not set it lower, and do not
1767
- * retry after a timeout, the SMM may still be running the change.
1791
+ * covers the FoE write of the fs-buffer, because the buffer is written before the command is issued. Defaults to
1792
+ * 12000: the drive gives up on the SMM after 10 s, so do not set it lower. If it runs out, the result of the change
1793
+ * is unknown. Do not retry after a timeout, because the SMM may still be running the change.
1768
1794
  * @param responsePollingInterval - The interval in milliseconds between polling for the response.
1769
- * @param triggerRestart - Whether to restart the SMM after an accepted change and the logout. Defaults to true. The
1770
- * firmware requires a restart after a password change, so pass false only if you restart the SMM yourself (with
1771
- * {@link triggerSmmRestart}) before issuing any other SMM command. The logout happens either way, so your restart
1772
- * comes after it.
1773
- * @param rebootDelay - How long to wait after the restart command completes, in milliseconds, before the observable
1774
- * completes. Defaults to 3000, the `SMM_REBOOT_DELAY` the firmware test reference uses. Ignored when
1775
- * `triggerRestart` is false.
1776
- *
1777
- * @throws {Error} If a password is not 1 (old) or 4 (new) to 24 printable ASCII characters, if the SMM rejects the
1778
- * change (the SMM is then not restarted and the session stays open), if the logout after an accepted change fails
1779
- * (the SMM is then not restarted), or if the restart fails.
1795
+ * @param verifyTimeout - How long to keep trying the login with the new password, in milliseconds, counted from the
1796
+ * accepted change. Defaults to 10000.
1797
+ * @param verifyInterval - The pause in milliseconds between two login attempts with the new password. Defaults to
1798
+ * 500.
1799
+ *
1800
+ * @throws {Error} If the username is not 4, or a password not 1 (old) or 4 (new), to 24 printable ASCII characters
1801
+ * (nothing is sent then), if the SMM rejects the change (the session then stays open), or if the SMM does not
1802
+ * accept a login with the new password within `verifyTimeout`.
1780
1803
  *
1781
1804
  * @remarks
1782
- * Completion means the SMM accepted the change. It does not prove that the SMM stored the intended password; only a
1783
- * login with the new password does.
1805
+ * Completion means the SMM accepted a login with the new password, so the new password is stored.
1806
+ *
1807
+ * When the SMM does not accept the new password within `verifyTimeout`, the stored password is unknown. Do not run
1808
+ * the change again. Try to log in with the new password, then with the old one.
1809
+ *
1810
+ * Do not restart the SMM, and do not power the device off, until the call completes. Either one during the write
1811
+ * leaves a stored password that the SMM discards.
1784
1812
  *
1785
1813
  * Rules a caller has to follow, because the SMM and the drive do not enforce them for you:
1786
1814
  *
@@ -1792,7 +1820,7 @@ export declare class MotionMasterReqResClient {
1792
1820
  * - When the SMM rejects the change, the response does not say why: a wrong old password, a missing or expired
1793
1821
  * session and an SMM that is still booting all produce the same "the SMM rejected the request (status 2)".
1794
1822
  */
1795
- changeSmmPassword(deviceRef: DeviceRef, oldPassword: string, newPassword: string, commandTimeout?: number, responsePollingInterval?: number, triggerRestart?: boolean, rebootDelay?: number): Observable<void>;
1823
+ changeSmmPassword(deviceRef: DeviceRef, username: string, oldPassword: string, newPassword: string, commandTimeout?: number, responsePollingInterval?: number, verifyTimeout?: number, verifyInterval?: number): Observable<void>;
1796
1824
  /**
1797
1825
  * Runs an SMM sequence and then logs out from the SMM, on completion and on error alike.
1798
1826
  *
@@ -1871,6 +1899,34 @@ export declare class MotionMasterReqResClient {
1871
1899
  * The commands execute only when subscribed to, ensuring a strict sequence.
1872
1900
  */
1873
1901
  updateSmmSoftware(deviceRef: DeviceRef, username: string, password: string, buffer: Uint8Array, crc: number, chunkSize?: number, commandTimeout?: number, responsePollingInterval?: number, fsBufferReadWriteTimeout?: number): Observable<void>;
1902
+ /**
1903
+ * Performs a complete SMM software update like {@link updateSmmSoftware}, reporting progress as it goes.
1904
+ *
1905
+ * A {@link SmmSoftwareUpdateProgress} value is emitted when each stage starts, once per transmitted chunk,
1906
+ * and a final `done` value after the SMM restart has been triggered. Use it to show the user what the
1907
+ * update is doing; transmitting a large software file can take many minutes.
1908
+ *
1909
+ * Parameters are the same as for {@link updateSmmSoftware}.
1910
+ *
1911
+ * @throws {Error} If `buffer` is empty or `chunkSize` is not a positive integer. Nothing is sent to the device then.
1912
+ * @throws {Error} If any step in the software update process fails.
1913
+ */
1914
+ updateSmmSoftwareWithProgress(deviceRef: DeviceRef, username: string, password: string, buffer: Uint8Array, crc: number, chunkSize?: number, commandTimeout?: number, responsePollingInterval?: number, fsBufferReadWriteTimeout?: number): Observable<SmmSoftwareUpdateProgress>;
1915
+ /**
1916
+ * Waits until the SMM reports the expected software version.
1917
+ *
1918
+ * After an SMM software update the SMM restarts and boots the new software, which can take around 30 s.
1919
+ * Reads may fail or return the previous version during that time, so the version is polled until it
1920
+ * matches or the timeout expires.
1921
+ *
1922
+ * @param deviceRef - Reference to the target device.
1923
+ * @param expectedVersion - The expected SMM software version, bitwise encoded (e.g. 25344 for v99.0).
1924
+ * @param timeout - (Optional) How long to wait, in ms. Defaults to 90,000 ms.
1925
+ * @param pollingInterval - (Optional) Delay between reads, in ms. Defaults to 2000 ms.
1926
+ *
1927
+ * @throws {Error} If the SMM does not report the expected version within `timeout`.
1928
+ */
1929
+ waitForSmmFirmwareVersion(deviceRef: DeviceRef, expectedVersion: number, timeout?: number, pollingInterval?: number): Observable<void>;
1874
1930
  /**
1875
1931
  * Resolves whether an automated SMM software update is allowed for the specified device.
1876
1932
  *
@@ -1881,7 +1937,8 @@ export declare class MotionMasterReqResClient {
1881
1937
  *
1882
1938
  * The automation is only permitted when **all** of the following conditions are met:
1883
1939
  * - The device is a recognized Somanet product (`isValidProduct`).
1884
- * - The device belongs to the Circulo product family (`isCirculo`).
1940
+ * - The device belongs to the Circulo product family (`isCirculo`). ACTILINK-JD / JD Duo devices are judged
1941
+ * by the underlying Circulo from their hardware description, see {@link resolveEncoderProductId}.
1885
1942
  * - The binary is encrypted (`isBinaryEncrypted`).
1886
1943
  * - The binary targets one of the supported SMM versions — v1.4 (260) or v2.56 (568) (`isAllowedBinaryVersion`).
1887
1944
  * - If targeting v2.56, the device SoC firmware version is ≥ 5.5.0 (`canInstallV256`).
@@ -1896,7 +1953,7 @@ export declare class MotionMasterReqResClient {
1896
1953
  *
1897
1954
  * @returns A promise that resolves to an {@link SmmAutomatedUpdate} object containing:
1898
1955
  * - `isValidProduct` — Whether the device maps to a known Somanet product.
1899
- * - `isCirculo` — Whether the device belongs to the Circulo product family.
1956
+ * - `isCirculo` — Whether the device is a Circulo or a Circulo-based ACTILINK-JD / JD Duo.
1900
1957
  * - `isCirculo7` — Whether the device is a Circulo 7.
1901
1958
  * - `isCirculo9` — Whether the device is a Circulo 9.
1902
1959
  * - `isDeviceLw1` — Whether the device SMM firmware is below v1.3 (version < 259).
@@ -1911,7 +1968,8 @@ export declare class MotionMasterReqResClient {
1911
1968
  */
1912
1969
  resolveSmmAutomatedUpdateConditions(deviceRef: DeviceRef, buffer: Uint8Array): Promise<SmmAutomatedUpdate>;
1913
1970
  /**
1914
- * Performs an automated, multi-step SMM software update to an encrypted firmware version on a Circulo device.
1971
+ * Performs an automated, multi-step SMM software update to an encrypted firmware version on a Circulo device,
1972
+ * or a Circulo-based ACTILINK-JD / JD Duo (judged by the underlying Circulo).
1915
1973
  *
1916
1974
  * Before installing the target binary, this method evaluates the device state by calling
1917
1975
  * {@link resolveSmmAutomatedUpdateConditions}. Based on the result, it determines which
@@ -1925,20 +1983,29 @@ export declare class MotionMasterReqResClient {
1925
1983
  * - **v99.0 + Circulo 9**: v77.1 → target
1926
1984
  * - **v77.0 or v77.1**: target only
1927
1985
  *
1928
- * If the device does not support streaming, `commandTimeout` is automatically extended to 420,000 ms.
1986
+ * After each installation the SMM restarts. The next step starts only once the SMM reports the
1987
+ * version that was just installed (see {@link waitForSmmFirmwareVersion}), so a failed or
1988
+ * unfinished installation stops the sequence with an error instead of continuing blindly.
1989
+ *
1990
+ * Transfer settings that are not given are resolved from the device firmware with
1991
+ * {@link resolveSmmSoftwareUpdateTimings}. On firmware without fs-buffer streaming (< v5.2.0),
1992
+ * `chunkSize` is always 1000 and `commandTimeout` is at least 420,000 ms.
1929
1993
  *
1930
1994
  * @param deviceRef - Reference to the target device.
1931
1995
  * @param username - Username used for SMM authentication.
1932
1996
  * @param password - Password used for SMM authentication.
1933
1997
  * @param buffer - The target encrypted firmware binary as a `Uint8Array`.
1934
1998
  * @param crc - CRC32 checksum of the target firmware binary for integrity verification.
1935
- * @param chunkSize - (Optional) Size of each data chunk transmitted per step, in bytes. Defaults to 1000.
1936
- * @param commandTimeout - (Optional) Timeout for each OS command in ms. Automatically overridden to 420,000 ms
1937
- * if the device does not support streaming. Defaults to 30,000 ms.
1999
+ * @param chunkSize - (Optional) Size of each data chunk transmitted per step, in bytes.
2000
+ * Defaults to 1,000,000 with streaming (one command per file) and 1000 without.
2001
+ * @param commandTimeout - (Optional) Timeout for each OS command in ms.
2002
+ * Defaults to 180,000 ms with streaming and 420,000 ms without.
1938
2003
  * @param responsePollingInterval - (Optional) Polling interval for command responses in ms. Defaults to 1000 ms.
1939
- * @param fsBufferReadWriteTimeout - (Optional) Timeout for fs-buffer read/write operations in ms. Defaults to 120,000 ms.
2004
+ * @param fsBufferReadWriteTimeout - (Optional) Timeout for fs-buffer read/write operations in ms.
2005
+ * Defaults to 150,000 ms with streaming and 5000 ms without.
1940
2006
  *
1941
- * @returns An `Observable<void>` that completes when the full installation sequence finishes successfully.
2007
+ * @returns An `Observable` of {@link SmmAutomatedUpdateProgress} that reports each step and stage,
2008
+ * and completes when the full installation sequence finishes successfully.
1942
2009
  *
1943
2010
  * @throws {Error} With message `'Unknown product. Cannot perform SMM software update.'` if the device
1944
2011
  * serial number does not map to a known Somanet product.
@@ -1946,9 +2013,9 @@ export declare class MotionMasterReqResClient {
1946
2013
  * e.g. the device is not a Circulo, the binary is not encrypted, the target version is
1947
2014
  * unsupported, the SoC firmware is below v5.5.0 (for SMM v2.56), or the device is
1948
2015
  * already on SMM v1.3+.
1949
- * @throws {Error} If any individual firmware installation step fails during execution.
2016
+ * @throws {Error} If any installation step fails, or the SMM does not report the installed version afterwards.
1950
2017
  */
1951
- updateSmmSoftwareToEncrypted(deviceRef: DeviceRef, username: string, password: string, buffer: Uint8Array, crc: number, chunkSize?: number, commandTimeout?: number, responsePollingInterval?: number, fsBufferReadWriteTimeout?: number): Observable<void>;
2018
+ updateSmmSoftwareToEncrypted(deviceRef: DeviceRef, username: string, password: string, buffer: Uint8Array, crc: number, chunkSize?: number, commandTimeout?: number, responsePollingInterval?: number, fsBufferReadWriteTimeout?: number): Observable<SmmAutomatedUpdateProgress>;
1952
2019
  /**
1953
2020
  * Transmits SMM parameters to the specified device.
1954
2021
  *