Skip to content

Commit ade4bb4

Browse files
Merge pull request #17 from nextroundwinner/documentation_ifu
Documentation ifu
2 parents 7087237 + 8ceab92 commit ade4bb4

File tree

9 files changed

+51
-35
lines changed

9 files changed

+51
-35
lines changed

.vscode/launch.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"name": "Python Debugger: Current File",
99
"type": "debugpy",
1010
"request": "launch",
11-
// "program": "src/__main__.py",
12-
"module": "examples.dyscom.example_dyscom_send_file",
11+
"program": "src/__main__.py",
12+
// "module": "examples.dyscom.example_dyscom_send_file",
1313
"justMyCode": false,
1414
// "args": ["COM3"],
1515
"console": "integratedTerminal"

HINTS.md

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,10 @@ This page describes implementation details.
102102
- https://www.reddit.com/r/macOSVMs/comments/1gb8egp/macos_sonoma_virtualbox_bootloop_afterduring/?rdt=48615
103103

104104

105-
# Deviation from Instruction for Use
106-
107-
## Dyscom commands
108-
109-
### Common
110-
- Datetime parameters have a different order
105+
## I24 protocol hints
111106

112107
### DL_init
113108
- Init state seems always be UNUSED
114-
- Strings are 1 byte longer than in other commands
115109
- Output data rate depends on init params filter property
116110
- Setting a filter overwrite other settings
117111
- ADS129x register channel 1-4 settings
@@ -121,26 +115,10 @@ This page describes implementation details.
121115
### DL_get for type file system status and list of measurement info
122116
- Return never meaningful values, probably not implemented on I24 side
123117

124-
### DL_get_ack for type file by name
125-
- Additional parameter mode (1 byte)
126-
- Undefined = 0
127-
- Multiblock = 1
128-
- Singleblock = 2
129-
130118
### DL_get for type battery
131119
- Dl get types (table 23)
132120
- 0 -> Battery (was Unused)
133121

134-
### DL_get_ack for type battery
135-
- Energy state, 1 byte, is a flag, bit 1: cable connected, bit 2: device is loading
136-
- Percentage, 1 byte, [0, 100] in percent
137-
- Temperature, 1 byte, [-128, 127] in degrees
138-
- Current, 4 bytes, [-327675, 327675] in milliampere
139-
- Voltage, 4 bytes, [0, 65535] in millivolt
140-
141-
### DL_send_file_ack
142-
- Block number, 4 byte, block number of DL_send_file
143-
144122
### DL_send_live_data
145123
- SignalType for each sample is always 0
146124
- Contains always 5 samples, regardless of selected signal types in DL_init

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Introduction
44

5-
Python implementation of HasomedScience ScienceMode 4 protocol for P24 (https://github.com/ScienceMode/ScienceMode4_P24) and I24 (https://github.com/ScienceMode/ScienceMode4_I24) devices. To use this library see section [Installation](#installation).
5+
Pure Python implementation of HasomedScience ScienceMode 4 protocol for P24 (https://github.com/ScienceMode/ScienceMode4_P24) and I24 (https://github.com/ScienceMode/ScienceMode4_I24) devices. To use this library see section [Installation](#installation). Library and examples are tested under Windows, Linux and MacOS.
66

77
## Requirements
88

@@ -125,4 +125,7 @@ Python 3.11 or higher
125125
- Fixed error with PacketLowLevelChannelConfigAck result
126126

127127
## 0.0.17
128-
- Added sample that demonstrates how to read measurement data files from I24 devices
128+
- Added sample that demonstrates how to read measurement data files from I24 devices
129+
130+
## 0.0.18
131+
- More documentation

examples/dyscom/example_dyscom_get.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,20 @@ async def main() -> int:
4646
file_system_status = await dyscom.get_file_system_status()
4747
print(file_system_status)
4848

49-
####
49+
# this is the default calibration filename
5050
calibration_filename = f"rehaingest_{device_id}.cal"
51+
####
52+
# get calibration file content
5153
calibration_content = await dyscom.get_file_content(calibration_filename)
5254
print(f"Calibration content length: {len(calibration_content)}")
55+
# I24 devices calculates checksum from first 2 bytes of the file content
56+
calculated_checksum = (calibration_content[0] << 8) | calibration_content[1]
57+
print(f"Calculated calibration content checksum: {calculated_checksum}")
58+
59+
####
60+
# get file info for calibration file
61+
file_info = await dyscom.get_file_info(calibration_filename)
62+
print(f"Calibration file info checksum: {file_info.checksum}")
5363

5464
# close serial port connection
5565
connection.close()

src/__main__.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from science_mode_4.device_i24 import DeviceI24
88
from science_mode_4.dyscom.dyscom_types import DyscomFilterType, DyscomInitFlag, DyscomInitParams, DyscomPowerModulePowerType,\
9-
DyscomPowerModuleType, DyscomSignalType
9+
DyscomPowerModuleType, DyscomSignalType, DyscomSysType
1010
from science_mode_4.utils.serial_port_connection import SerialPortConnection
1111

1212

@@ -24,8 +24,24 @@ async def main() -> int:
2424
# to have a defined state
2525
await device.initialize()
2626

27+
2728
# get dyscom layer to call low level commands
2829
dyscom = device.get_layer_dyscom()
30+
device_id = await dyscom.get_device_id()
31+
32+
####
33+
calibration_filename = f"rehaingest_{device_id}.cal"
34+
calibration_content = await dyscom.get_file_content(calibration_filename)
35+
print(f"Calibration content length: {len(calibration_content)}")
36+
calculated_checksum = (calibration_content[0] << 8) | calibration_content[1]
37+
print(f"Calculated calibration content checksum: {calculated_checksum}")
38+
39+
####
40+
file_info = await dyscom.get_file_info(calibration_filename)
41+
print(f"Calibration file info checksum: {file_info.checksum}")
42+
43+
s_y_s = await dyscom.sys(DyscomSysType.DEVICE_STORAGE)
44+
print(f"Sys {s_y_s.state.name}")
2945

3046
# call enable measurement power module and memory card for measurement
3147
await dyscom.power_module(DyscomPowerModuleType.MEASUREMENT, DyscomPowerModulePowerType.SWITCH_ON)

src/science_mode_4/device.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ async def initialize(self):
8484
if DeviceCapability.DYSCOM in self._capabilities:
8585
# get operation mode to see if dyscom measurement is running
8686
operation_mode = await self.get_layer_dyscom().get_operation_mode()
87-
if operation_mode in [DyscomGetOperationModeType.LIVE_MEASURING_PRE,
87+
if operation_mode in [DyscomGetOperationModeType.UNDEFINED,
88+
DyscomGetOperationModeType.LIVE_MEASURING_PRE,
8889
DyscomGetOperationModeType.LIVE_MEASURING,
8990
DyscomGetOperationModeType.RECORD_PRE,
9091
DyscomGetOperationModeType.RECORD,

src/science_mode_4/dyscom/ads129x/ads129x.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Ads129x:
3131
channel_4_setting_register = Ads129xChannelSettingsRegister() # CH4SET
3232

3333
positive_signal_derivation_register = 0x02 # RLD_SENSP
34-
negative_signal_derivation_register = 0xEA # RLD_SENSN
34+
negative_signal_derivation_register = 0x02 # RLD_SENSN
3535
positive_signal_lead_off_detection_register = 0 # LOFF_SENSP
3636
negative_signal_lead_off_detection_register = 0 # LOFF_SENSN
3737

src/science_mode_4/dyscom/dyscom_get_file_info.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ def get_data(self) -> bytes:
3030
bb = ByteBuilder()
3131
bb.append_bytes(super().get_data())
3232
bb.append_bytes(DyscomHelper.str_to_bytes(self._filename, 128))
33-
# maybe more parameters are necessary here
34-
# file_size, file_checksum
33+
# file size
34+
bb.append_value(0, 4, True)
35+
# checksum
36+
bb.append_value(0, 2, True)
3537
return bb.get_bytes()
3638

3739

src/science_mode_4/dyscom/dyscom_layer.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from science_mode_4.layer import Layer
77
from science_mode_4.protocol.commands import Commands
88
from science_mode_4.utils.logger import logger
9-
from .dyscom_types import DyscomFrequencyOut, DyscomGetOperationModeType, DyscomPowerModuleType,\
10-
DyscomPowerModulePowerType, DyscomSignalType, DyscomSysType
9+
from .dyscom_types import DyscomFrequencyOut, DyscomGetOperationModeType, DyscomInitState, DyscomPowerModuleType,\
10+
DyscomPowerModulePowerType, DyscomSignalType, DyscomSysState, DyscomSysType
1111
from .dyscom_init import DyscomInitResult, PacketDyscomInit, PacketDyscomInitAck, DyscomInitParams
1212
from .dyscom_get_file_system_status import PacketDyscomGetFileSystemStatus, PacketDyscomGetAckFileSystemStatus,\
1313
DyscomGetFileSystemStatusResult
@@ -36,6 +36,9 @@ async def init(self, params: DyscomInitParams) -> DyscomInitResult:
3636
p = PacketDyscomInit(params)
3737
ack: PacketDyscomInitAck = await self.send_packet_and_wait(p)
3838
self._check_result_error(ack.result_error, "DyscomInit")
39+
if ack.init_state not in [DyscomInitState.UNUSED, DyscomInitState.SUCCESS]:
40+
raise ValueError(f"Dyscom error init {ack.init_state.name}")
41+
3942
logger().info("Dyscom init, measurement_file_id: %s, state: %s, frequency: %s",\
4043
ack.measurement_file_id, ack.init_state.name, ack.frequency_out.name)
4144
return DyscomInitResult(ack.register_map_ads129x, ack.measurement_file_id, ack.init_state, ack.frequency_out)
@@ -139,6 +142,9 @@ async def sys(self, sys_type: DyscomSysType, filename: str = "") -> DyscomSysRes
139142
p = PacketDyscomSys(sys_type, filename)
140143
ack: PacketDyscomSysAck = await self.send_packet_and_wait(p)
141144
self._check_result_error(ack.result_error, "DyscomSys")
145+
if ack.state not in [DyscomSysState.SUCCESSFUL]:
146+
raise ValueError(f"Dyscom error sys {ack.state.name}")
147+
142148
logger().info("Dyscom sys, type: %s, state: %s, filename: %s", ack.sys_type.name, ack.state.name, ack.filename)
143149
return DyscomSysResult(ack.sys_type, ack.state, ack.filename)
144150

0 commit comments

Comments
 (0)