From fb4c352b2e83c0d22c09ff297d6c6f86e64521b6 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Wed, 25 Jun 2025 16:48:55 +0200 Subject: [PATCH 01/14] VariableInfo goes under info member --- pyx2cscope/x2cscope.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/pyx2cscope/x2cscope.py b/pyx2cscope/x2cscope.py index 0c4dbe88..37344d01 100644 --- a/pyx2cscope/x2cscope.py +++ b/pyx2cscope/x2cscope.py @@ -40,8 +40,8 @@ def get_variable_as_scope_channel(variable: Variable) -> ScopeChannel: ScopeChannel: A ScopeChannel object representing the given variable. """ return ScopeChannel( - name=variable.name, - source_location=variable.address, + name=variable.info.name, + source_location=variable.info.address, data_type_size=variable.get_width(), source_type=0, is_integer=variable.is_integer(), @@ -83,7 +83,7 @@ class X2CScope: uc_width (int): the processor architecture 2: 16 bit, 4: 32 bit. """ - def __init__(self, elf_file: str = None, interface: InterfaceABC = None, **kwargs): + def __init__(self, elf_file: str = None, interface: InterfaceType = None, **kwargs): """Initialize the X2CScope instance. Args: @@ -179,7 +179,7 @@ def add_scope_channel(self, variable: Variable, trigger: bool = False) -> int: int: The ID of the added scope channel. """ scope_channel = get_variable_as_scope_channel(variable) - self.convert_list[variable.name] = variable.bytes_to_value + self.convert_list[variable.info.name] = variable.bytes_to_value return self.scope_setup.add_channel(scope_channel, trigger) def clear_all_scope_channel(self): @@ -204,9 +204,9 @@ def remove_scope_channel(self, variable: Variable): Returns: The result of the channel removal operation. """ - if variable.name in self.convert_list: - self.convert_list.pop(variable.name) - return self.scope_setup.remove_channel(variable.name) + if variable.info.name in self.convert_list: + self.convert_list.pop(variable.info.name) + return self.scope_setup.remove_channel(variable.info.name) def get_scope_channel_list(self) -> Dict[str, ScopeChannel]: """Get a list of all scope channels. @@ -411,9 +411,7 @@ def _filter_channels( channels[channel].extend(rest) return channels - def get_scope_channel_data( - self, valid_data: bool = True - ) -> Dict[str, List[Number]]: + def get_scope_channel_data(self, valid_data: bool = True) -> Dict[str, List[Number]]: """Get the sorted and optionally filtered scope channel data. Args: @@ -465,6 +463,7 @@ def scope_sample_time( def get_device_info(self): """Returns the device information as a dictionary.""" device_info = self.variable_factory.device_info + uc_width_value = "8-bit" if device_info.uc_width == UC_WIDTH_16BIT: uc_width_value = "16-bit" elif device_info.uc_width == UC_WIDTH_32BIT: From da9e06adc39b5a9dd1aba4c0d419146f7b3d27a0 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 14:01:28 +0200 Subject: [PATCH 02/14] fixed enum byte size an enumeration has variable byte size, and depends on the mcu architecture. the byte size is read during parsing and available at variable.info.byte_size --- pyx2cscope/variable/variable.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/pyx2cscope/variable/variable.py b/pyx2cscope/variable/variable.py index c1c3c80a..f929d947 100644 --- a/pyx2cscope/variable/variable.py +++ b/pyx2cscope/variable/variable.py @@ -952,13 +952,16 @@ def is_signed(self) -> bool: return False def get_width(self) -> int: - """Get the width of the 16-bit enum. + """Get the width of the enum. + + The enum may have variable byte size, depending on the mcu architecture and the + amount of elements contained under each specific enumeration. The size is obtained + during parsing and is described under byte_size. Returns: - int: Width of the variable, which is 2. + int: Width of the variable in bytes. """ - #TODO depends on architecture and enum count of elements - return self.l_net.device_info.uc_width + return self.info.byte_size def _set_value(self, value: int): From 68e66833cb9f2296082ace5aca20b9bb33fffb2c Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 14:33:02 +0200 Subject: [PATCH 03/14] fixed sample time window calculation renamed method from scope_sample_time to get_scope_sample_time calculation is based on retrieved values and not on magic numbers --- pyx2cscope/x2cscope.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pyx2cscope/x2cscope.py b/pyx2cscope/x2cscope.py index 37344d01..220705f5 100644 --- a/pyx2cscope/x2cscope.py +++ b/pyx2cscope/x2cscope.py @@ -240,14 +240,15 @@ def clear_trigger(self): self.scope_setup.reset_trigger() def set_sample_time(self, sample_time: int): - """Define a pre-scaler for sampling mode. + """Define the resolution how the samples will be buffered at the internal buffer. This can be used to extend total sampling time at the cost of resolution. - 0 = every sample, 1 = every 2nd sample, 2 = every 3rd sample … + 1 = every sample, 2 = every 2nd sample, 3 = every 3rd sample … Args: sample_time (int): The sample time factor. """ + sample_time = 1 if sample_time < 1 else sample_time self.scope_setup.set_sample_time_factor(sample_time) def set_scope_state(self, scope_state: int): @@ -427,13 +428,17 @@ def get_scope_channel_data(self, valid_data: bool = True) -> Dict[str, List[Numb return self._filter_channels(channels) if valid_data else channels return {} - def scope_sample_time( - self, time_microseconds: float - ) -> float: # TODO testing and implementing the time axis. + def get_scope_sample_time(self, time: float) -> float: """Evaluate the scope sample time based on user-provided time value. + X2Cscope has an internal buffer which is filled with data at a specific rate. + The argument time relates to the sampling rate of each sample. The total scope + channel time depends on the size of the internal buffer, the sampling rate, and + the time factor (resolution) set when starting the scope channel. See also + set_sample_time + Args: - time_microseconds (float): The time value in microseconds for evaluating one scope sample. + time (float): The time value in microseconds of one sample. Returns: float: The real-time duration for the scope functionality in milliseconds. @@ -450,7 +455,7 @@ def scope_sample_time( samples_in_buffer = buffer_size // dataset_size # Calculate the total time duration for the samples in the buffer - total_time_microseconds = time_microseconds * samples_in_buffer + total_time_microseconds = time * samples_in_buffer # Convert the total time to milliseconds total_time_milliseconds = total_time_microseconds / 1000 @@ -458,7 +463,7 @@ def scope_sample_time( logging.info( f"Total time for the scope functionality: {total_time_milliseconds} ms" ) - return self.scope_setup.sample_time_factor * total_time_milliseconds * 2 + return self.scope_setup.sample_time_factor * total_time_milliseconds def get_device_info(self): """Returns the device information as a dictionary.""" From 6eb75da118240366163572654481ba539c760d3a Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 14:33:39 +0200 Subject: [PATCH 04/14] adapted generic_gui.py to correct function call on get_sample_time --- pyx2cscope/gui/generic_gui/generic_gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyx2cscope/gui/generic_gui/generic_gui.py b/pyx2cscope/gui/generic_gui/generic_gui.py index f4c70f50..dbdf1af5 100644 --- a/pyx2cscope/gui/generic_gui/generic_gui.py +++ b/pyx2cscope/gui/generic_gui/generic_gui.py @@ -1560,7 +1560,7 @@ def start_sampling(self): # Set the scope sample time from the user input in microseconds scope_sample_time_us = int(self.scope_sampletime_edit.text()) - self.real_sampletime = self.x2cscope.scope_sample_time( + self.real_sampletime = self.x2cscope.get_scope_sample_time( scope_sample_time_us ) logging.debug(f"Real sample time: {self.real_sampletime} µs") # Check this value From 689186460b8a588a92cf2403c77a431c51de5b98 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 15:03:47 +0200 Subject: [PATCH 05/14] formatting --- pyx2cscope/gui/generic_gui/generic_gui.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyx2cscope/gui/generic_gui/generic_gui.py b/pyx2cscope/gui/generic_gui/generic_gui.py index dbdf1af5..47ef675c 100644 --- a/pyx2cscope/gui/generic_gui/generic_gui.py +++ b/pyx2cscope/gui/generic_gui/generic_gui.py @@ -445,9 +445,7 @@ def create_trigger_configuration_group(self): self.trigger_delay_edit = QLineEdit("0") self.trigger_delay_edit.setValidator(self.decimal_validator) - self.scope_sampletime_edit = QLineEdit( - "50" - ) # Default sample time in microseconds + self.scope_sampletime_edit = QLineEdit("50") # Default sample time in microseconds self.scope_sampletime_edit.setValidator(self.decimal_validator) # Total Time From 4b7c0c81471ae21543de0b21e35328dbb57cfd5c Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 15:04:10 +0200 Subject: [PATCH 06/14] fixed web gui with new VarInfo dataclass --- pyx2cscope/gui/web/views/scope_view.py | 14 +++++++------- pyx2cscope/gui/web/views/watch_view.py | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pyx2cscope/gui/web/views/scope_view.py b/pyx2cscope/gui/web/views/scope_view.py index de9c69ec..d855d7bf 100644 --- a/pyx2cscope/gui/web/views/scope_view.py +++ b/pyx2cscope/gui/web/views/scope_view.py @@ -54,7 +54,7 @@ def get_data(): """ result = [] for data in scope_data: - result.append({f: v.name if f == "variable" else v for f, v in data.items()}) + result.append({f: v.info.name if f == "variable" else v for f, v in data.items()}) return {"data": result} @@ -65,7 +65,7 @@ def add(): """ with get_x2c() as x2c: parameter = request.args.get("param", "") - if not any(_data["variable"].name == parameter for _data in scope_data): + if not any(_data["variable"].info.name == parameter for _data in scope_data): variable = x2c.get_variable(parameter) data = _get_variable(variable) scope_data.append(data) @@ -91,18 +91,18 @@ def remove(): def _set_trigger(data, param, field, value): if field == "trigger": value = float(value) - if data["variable"].name != param: + if data["variable"].info.name != param: data["trigger"] = 0.0 if value == 1.0 else data["trigger"] def _set_fields(data, param, field, value): - if data["variable"].name == param: + if data["variable"].info.name == param: data[field] = value if field == "color" else float(value) def _set_enable(x2c, data, param, field, value): if field == "enable": - if data["variable"].name == param: + if data["variable"].info.name == param: if float(value): x2c.add_scope_channel(data["variable"]) else: @@ -182,8 +182,8 @@ def _get_datasets(x2c): channel_data = x2c.get_scope_channel_data() for channel in scope_data: # if variable is disabled on scope_data, it is not available on channel_data - if channel["variable"].name in channel_data: - variable = channel["variable"].name + if channel["variable"].info.name in channel_data: + variable = channel["variable"].info.name data_line = [ l * channel["gain"] + channel["offset"] for l in channel_data[variable] ] diff --git a/pyx2cscope/gui/web/views/watch_view.py b/pyx2cscope/gui/web/views/watch_view.py index 9dc7e536..f3eb8f08 100644 --- a/pyx2cscope/gui/web/views/watch_view.py +++ b/pyx2cscope/gui/web/views/watch_view.py @@ -57,7 +57,7 @@ def get_data(): for _data in watch_data: if _data["live"]: _read_variable(_data) - result.append({f: v.name if f == "variable" else v for f, v in _data.items()}) + result.append({f: v.info.name if f == "variable" else v for f, v in _data.items()}) return {"data": result} @@ -68,7 +68,7 @@ def add(): """ parameter = request.args.get("param", "") with get_x2c() as x2c: - if not any(_data["variable"].name == parameter for _data in watch_data): + if not any(_data["variable"].info.name == parameter for _data in watch_data): variable = x2c.get_variable(parameter) watch_data.append(_get_variable_as_dict(variable)) return jsonify({"status": "success"}) @@ -81,7 +81,7 @@ def remove(): """ parameter = request.args.get("param", "") for _data in watch_data: - if _data["variable"].name == parameter: + if _data["variable"].info.name == parameter: watch_data.remove(_data) break return jsonify({"status": "success"}) @@ -96,7 +96,7 @@ def update(): field = request.args.get("field", "").lower() value = request.args.get("value", "") for _data in watch_data: - if _data["variable"].name == param: + if _data["variable"].info.name == param: _data[field] = float(value) if field == "value": _data["variable"].set_value(_data[field]) From d661c0a7bc5adeb16d394d11065bd4b2b1773e72 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 15:21:36 +0200 Subject: [PATCH 07/14] formatting code and enhancing docs --- pyx2cscope/examples/SFR_Example.py | 2 +- pyx2cscope/examples/get_device_id.py | 10 +++++++++- pyx2cscope/examples/pyX2CScope_demo.py | 10 +++------- pyx2cscope/variable/variable.py | 10 ++-------- 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/pyx2cscope/examples/SFR_Example.py b/pyx2cscope/examples/SFR_Example.py index cb32de1c..537942aa 100644 --- a/pyx2cscope/examples/SFR_Example.py +++ b/pyx2cscope/examples/SFR_Example.py @@ -68,7 +68,7 @@ def example(): """Main function to demonstrate LED state changes using SFR.""" try: # Initialize the variable for the Special Function Register (SFR) controlling the LEDs - variable_info = VariableInfo("my_led", "int", 1, 3702, 0, {}) + variable_info = VariableInfo("my_led", "int", 1, 0, 0, 3702, 0, {}) sfr_led = x2cscope.get_variable_raw(variable_info) # LATE address from data sheet 3702 # Get the initial LED state from the SFR diff --git a/pyx2cscope/examples/get_device_id.py b/pyx2cscope/examples/get_device_id.py index 5b2eee9b..557178a6 100644 --- a/pyx2cscope/examples/get_device_id.py +++ b/pyx2cscope/examples/get_device_id.py @@ -38,7 +38,15 @@ speed_measured = x2c_scope.get_variable("mcFocI_ModuleData_gds.dOutput.elecSpeed") # or load a variable directly from the memory -speed_measured_info = VariableInfo("speed_measured", "float", 2, 536879832, 0, {}) +# name: str +# type: str +# byte_size: int +# bit_size: int +# bit_offset: int +# address: int +# array_size: int +# valid_values: Dict[str, int] +speed_measured_info = VariableInfo("speed_measured", "float", 2, 0, 0, 536879832, 0, {}) speed_measured_raw = x2c_scope.get_variable_raw(speed_measured_info) # Read the value of the "motor.apiData.velocityMeasured" variable from the target diff --git a/pyx2cscope/examples/pyX2CScope_demo.py b/pyx2cscope/examples/pyX2CScope_demo.py index 59a0def5..a56c3629 100644 --- a/pyx2cscope/examples/pyX2CScope_demo.py +++ b/pyx2cscope/examples/pyX2CScope_demo.py @@ -13,6 +13,7 @@ from pyx2cscope import set_logger from pyx2cscope.utils import get_com_port, get_elf_file_path from pyx2cscope.x2cscope import X2CScope +from x2cscope import TriggerConfig set_logger( logging.INFO, @@ -45,13 +46,8 @@ # Setting up Trigger, any available variable can be selected. -x2c_scope.set_scope_trigger( - variable3, - trigger_level=500, - trigger_mode=1, - trigger_delay=50, - trigger_edge=1, -) +config = TriggerConfig(variable3, trigger_level=500, trigger_mode=1, trigger_delay=50, trigger_edge=1) +x2c_scope.set_scope_trigger(config) # Request and Acquire Scope Data # This loop requests and receives data from the scope, storing it in a dictionary for later use. diff --git a/pyx2cscope/variable/variable.py b/pyx2cscope/variable/variable.py index f929d947..5c6b4606 100644 --- a/pyx2cscope/variable/variable.py +++ b/pyx2cscope/variable/variable.py @@ -57,18 +57,12 @@ class VariableInfo: class Variable: """Represents a variable in the MCU data memory.""" - def __init__( - self, l_net: LNet, info: VariableInfo - ) -> None: + def __init__(self, l_net: LNet, info: VariableInfo) -> None: """Initialize the Variable object. - On var_info, the minimal information needed are name, address, and array_size. This is valid - for most of the variables. Enums will need enum_list, and unions having elements which are smaller - than a byte. - Args: l_net (LNet): LNet protocol that handles the communication with the target device. - info (VariableInfo): Address of the variable in the MCU memory. + info (VariableInfo): Information of the variable in the MCU memory. """ if type(self) == Variable: # protect super class to be initiated directly raise Exception(" must be subclassed.") From 20bb50d183b7a56a5e5571a002cf3e5247e54208 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 15:21:51 +0200 Subject: [PATCH 08/14] bump version 0.4.4 --- pyproject.toml | 2 +- pyx2cscope/__init__.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 78da6f87..e531b810 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "pyx2cscope" -version = "0.4.3" +version = "0.4.4" description = "python implementation of X2Cscope" authors = [ "Yash Agarwal", diff --git a/pyx2cscope/__init__.py b/pyx2cscope/__init__.py index 64f31014..b2874bc9 100644 --- a/pyx2cscope/__init__.py +++ b/pyx2cscope/__init__.py @@ -1,11 +1,11 @@ """This module contains the pyx2cscope package. -Version: 0.4.3 +Version: 0.4.4 """ import logging -__version__ = "0.4.3" +__version__ = "0.4.4" def set_logger( From 22b1ddd5e2c0f9de4959e3d6ce12e4166ebadd7f Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 20:28:01 +0200 Subject: [PATCH 09/14] enhancing documentation and fixing image urls --- doc/gui_qt.md | 8 +- doc/gui_web.md | 6 +- doc/images/NewGui4.jpg | Bin 109286 -> 0 bytes doc/images/Setting.jpg | Bin 63551 -> 0 bytes .../{NewGui2.jpg => gui_scope_view.jpg} | Bin doc/images/{NewGui.jpg => gui_watch_plot.jpg} | Bin .../{NewGui3.jpg => gui_watch_view.jpg} | Bin doc/scripting.rst | 127 +++++++++++------- 8 files changed, 83 insertions(+), 58 deletions(-) delete mode 100644 doc/images/NewGui4.jpg delete mode 100644 doc/images/Setting.jpg rename doc/images/{NewGui2.jpg => gui_scope_view.jpg} (100%) rename doc/images/{NewGui.jpg => gui_watch_plot.jpg} (100%) rename doc/images/{NewGui3.jpg => gui_watch_view.jpg} (100%) diff --git a/doc/gui_qt.md b/doc/gui_qt.md index 23c6bef6..60829295 100644 --- a/doc/gui_qt.md +++ b/doc/gui_qt.md @@ -20,10 +20,10 @@ python -m pyx2cscope -q ## Getting Started with pyX2Cscope reference GUI ## Tab: WatchPlot -![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/pyx2cscope/gui/img/NewGui.jpg) +![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_plot.jpg) 1. pyX2Cscope-GUI is based on Serial interface. 2. The Firmware of the microcontroller should have the X2Cscope library/Peripheral enabled. -3. in Tab WatchPlot, five channels values can be viewed, modified and can be plotted in the plot window. +3. In Tab WatchPlot, five channels values can be viewed, modified and can be plotted in the plot window. 4. In COM Port, either select **Auto Connect** or select the appropriate COM Port, Baud Rate from the drop-down menus and the ELF file of the project, the microcontroller programmed with.
5. Sample time can be changed during run time as well, by default its set to 500 ms. 6. Press on **Connect** @@ -31,7 +31,7 @@ python -m pyx2cscope -q 8. Information related to the microcontroller will be displayed in the top-left corner. ## Tab: ScopeView -![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/pyx2cscope/gui/img/NewGui2.jpg) +![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_scope_view.jpg) 1. ScopeView supports up to 8 PWM resolution channels for precise signal control. 2. You can configure all trigger settings directly within the window. To enable the trigger for a variable, check the corresponding trigger checkbox. @@ -40,7 +40,7 @@ python -m pyx2cscope -q 5. To zoom in on the plot, left-click and drag on the desired area. To return to the original view, right-click and select View All. ## Tab: WatchView -![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/pyx2cscope/gui/img/NewGui3.jpg) +![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_view.jpg) 1. WatchView lets users add or remove variables as needed. To remove a variable, click the Remove button next to it. 2. Users can visualize variables in live mode with an update rate of 500 milliseconds. This rate is the default setting and cannot be changed. diff --git a/doc/gui_web.md b/doc/gui_web.md index 26b9e413..0043dff9 100644 --- a/doc/gui_web.md +++ b/doc/gui_web.md @@ -2,10 +2,8 @@ The Web Graphic User Interface is implemented using Flask, bootstrap 4, jquery and chart.js It is also an example of how to build a custom GUI using pyX2Cscope. -This interface allows -you to use multiple windows or even access functions from smart devices. -The server runs -by default on your local machine and does not allow external access. +This interface allows you to use multiple windows or even access functions from smart devices. +The server runs by default on your local machine and does not allow external access. The server has default port 5000 and will be accessible on http://localhost:5000 ## Starting the Web GUI diff --git a/doc/images/NewGui4.jpg b/doc/images/NewGui4.jpg deleted file mode 100644 index d0b8fd51e79a8fad1d04e50550252f424899c1ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109286 zcmeFY2T)W|vo1Oah!O?KNKPtA$vKE55fCItCBra`AUO>NK(c^oB9I-6Nk?b>_KUfrwL*WF+DT>ZXU0Nr|`s-X(P z!@~o;0RBK%(;#IK{a{GV1^39^2W7&U=ny7 zplg(P_>_28?I2bV2#*k$?Vkz%_XF=5FvsgeH*OM>05??M0$szy$G=8^|7X^~-GRV$ z5CJ7275hV_>$i1Z5^=au3%`l`c7yX#c?*r+5SmNG+WqZKVp=+S21afk-n;kii;9U$ zNJ>d7KUPsyQ`dO%T;IUZ$k@cx#@5c>!O_Y2wTGvdw~w#iyZ0fXVIRUH;uAh4CMADP zN&TLcos*lFUr<<4Syf$wsI9ASZENr7?CSp6GdwanHa_uta%ypDd1ZBNePeTL|KRZG z_~aCGcK$~$JP`hW6YF0k`zN_50lBUb5a1IK{gDgrnl~`;DG3PKA6}IaD|A_W4lKsyK_Vzy{*}n?*KjfMMk>cY4i-%7M zQUD!LW*ftCMLtQdays*EC8Fr$U&Wo)*Z38o2{R?H9lTue6!9?z?c)^k#qP{HQLVR-9a+J2=<7(?}n;+smYvuYu404 zjnwJ21AXX}ogxc0C^&ysAEbjHqvfZaj4m1J$YAgvAlas4Y%Yh2XF^`*>Aa}fPjUUJ zqHZT#b5QY;d_~ch?IWLpB^nxr`s{R05$-Chu|!xKF};&CWyVjZJtHw`N8TsM3WCPS z{aEqSJ2m#79gquC8WGsp+AvzhgpA|T6J6((aJ1!#Y3UtHjgHGtc2i1^* zE6@x4cZHWRIu+|dzkD0KF87j4Eu}|JRebO4rsYg-^uDSO%%J zHlw(K0&8I{%kPEV<^y%g&(OH!B16PuXL7=9n5}@)yDdU6yZ6Kh4K)q3@?; zDlGjqLoOv>&A2JfNApF~!Ih)J`XryjT(NzZ`?|cII#J9LTvxmI)mmUrQO=~Ar>}dB z*S4EqN%Hd>pJcbz1@A2L(;pL+`o(l9jfmEzg5{)#hYeLf{3IZb(*0B6X`| z)-#U%BBX473;x<{l*pb@BB0vz(o+U;+?|^x?!5Vv_+h68Z_E*_RU$j>p`%9wr*nzj zt-y3~BDQPOZcz((na)GsV+?)^_9*<8exYg0==oLCP~h4b$%k+$Zpkxk-{mIF%VdW` z*mtEv(HNLVW7RvCusp*%w`V+yMDN4kLGM0Raq zt*l?KK!dlnuRuT4uRyK2P_j)S=OlQ}q*#@!t-4mdiy_;!A2y(mMDndwj#-IbbRxSB zYKu)gOuq2t;hp%KH7V9+9>f>gMz1=_h21g|?{7@`wX)NSx6;J^r2JsysC99&%r1O{@UB~x&XVSd? zHyPLX#;;c(1}-lU1@QKqUX~WG8sWbLQNyyIQ(WSS?qLaHv3!;h0YznJnXm5!aDMA- zNmdyd`?Nv{rf0($aQZ;ip$gIlafkhOef2@;btzY1Rl%we=H)wLdSH8pO!7@F&Tfxh z5zf4%z7vmL!G~2}+#fuQu=X)iiIL*8;ApW)U>bvbyx!8?-6cDoPVKH%cA0$zN=b=a zgwRT^M0-RM#yo{8xde+#+uD42{vACRM<7J)XYt8Rif{-r$Y+zQDg|e}yAu1tfTzZ# z`wH}4LFo$gl_&iQ6b!6Z$X_N5_q%sc(tfB}mkwTR;^aE#IRCn;pr!K@FuiHM@!{F}%A z@69LnAFEtUD2 z^B-lW{^z|{z45*Gk1mX`?DhX@(|>d!@t2{v=&B^YSPT3G!zg?Ft6$Rv_Pgs}`#nZx zkv5YQVLDpi$z41VI>#(8(V89q^;w^=tNno$h`g5h$@=x}j`+UpEeS*K)NEmsjyny| zDxU>4GFjahk|}7Ie`dpwmXE@;F{|UI#jLzl$euqG3_aK`AKA%6NUV8Sp+o-%=mN_+ z`#&PJauxq^ix^jjnT~(6l>cPscPswq*7biufB&v6{WtynWfOn&_cvZnlxj|hX5wL_ zwWQnhhGkU>=CyK-=lk5i#naP|O_!#mPKqH;?05mQjph9!oo*V_Wh2mnW#m6PqQ6aj zBST@(BT!I*+-k#Z-t0G6+Nqg#Dx_71pC4gFyBg3Q^Wev2ruQuUY>Zp#NdW-DoZx!rD|I%O&W1gVe)-w_H0x9^ zpah_3SglRbJjo*~oviU>fGGH&_Kv%IG67_wzYP z8j7{Aj2nAXlcgnO@mkC&aZxv4Ev^_Jc!j~><@Ge&?h{=9xMg*1)qgX! z6DNtf`OE16cW~DuwPwds%kPyZ55!N7WisL}q|2CRRXk^r|){mh-`^XKi)ma^zi<@gUFPO-X$Scto%N0 z2yC$zEN9dv{WSUH{QIoa_)UpS=^y*O^^?27;Ti$?wL2 zgXrWLaXmL#f78>GAye%SB_LCC(8N_3oMC>hF*HKz+1cdLdg92J9bIoHmyY`KzzKNAM{>_#SZ=^q)NNj&xN(yzh37 zAqs6L@&e^`!>7MHUaxe>J{S2IZ+?lYAmlwAwuyP~@U>8ZPF88j!hf;&R64OgmERsL z#UkU#WyFxd0pjl7ju}gELr=FEJ!OROFc`ybi`+h2ix&!QW_Y_KwKQxU;qzNqgGsug zY(t6YE#INktAO>-{DDt?R?FM%Iwwm=2<%~|`#Xo-K8;Rq2O<~J#i(_ya_OV~XakNU z!_2o^l3l2sTt^lB0l__VYd*O;(}I zI;Ktv^7;^cRZXL7sl091nc_abdyB`wtSHtyq{8GvhN#t5p>C(yWIQQYfHG+0S#2>6 zeDG-4@aSc_35Qpy3)+xDA$ORPR2!o{&Kd4Lvyoh9D3$o0psd|xvW)UpA7e+)Wq#N2 zceBZI%I!i)ht!+>6cHQiXn_iFeZ0%+IDOjhwH~!pCw({Th3ldU^>a$=7D(#(Z_CD^ z$rNhslMNP?SWY(su4}*h@z`$97zJK|NSqa9E?6(PVT%OQD?lc<$5aDgn(QxFSHJI} z8?IkGAaPw(zba$(o>;l{B_!#5!9;f0B%EIH^ahn`EU%LtLGbTRMK1iAF~7ToTz9`m zfG&f+=li@p(UMRaEm^t(nL#03MaKqQu=`_xqhr-{fhOpA{~$zG?b69(OhBx`G)t_C z$|_m_unHzzqBO5S*AZ4&uUL$dN9LZh6-KQ73bb5>M@A!oWvkaYtro&E&cgPm6c!1G zVNC_Fh4JkxP|P5KsQx_q?WV%qC=w0!yaIJO0xzS}z@6k=f!>*w;$#$W4Lygok^teT zzupz71wL^FVg{T~pup=2Ee%$J>$s6x7yrdISK^Pb}XiCWhf>Q>EC;$t%zT(-mlc3N-b-JOE{c3);B?p~IV z1;Tm-i{}?x$rxOLG8+`I_%NJ|T6*CXXka!Ihld2F@Rh8PkFI|Vw!S-X1p>_jq71D& zBM(mpW*tFwzrApMZ|ql%7EPu{xtQ4Qw`)kyZV9&7rCY-DM*t7e#3 zXVC0__GEnjSs7&|Vq~hFb7m>I)v0%%b#K({yw6`**mHHu7;8`@q}KgEVlc2gxB|s# znq7fP8LmJ_W=7uiwL0{$?i~0PXd>zgbS_X-JFCbdu>Y=$yT_MbJ%OV*6VJ>J=<#yB0*%kFCC>|~t(4(LGq{k=Xhit(pa4piagJf! zQ_Ekgt|5u9o2R@!f+67ZN~Mw4^EzFw2d-2JY*Al{l#Mar`#}>+VPVP`5v79b_rrvWoFDxBE9JJW+7$>**M_$VwSzsHjKGLNUxmddqzRZObzl$OqKX;D*sj_hEa za!9bwZB5_Px=CB*;mbCfJ(G(dD6$_O><9&?mO!3&pI1f7YFn-){f>UCl*iQN}U+1lfuNR`;(G>LJ9oR ze^=WhB6|=?V5r2;4CBH3#T8lI4Y$b-1jV(94G|5y=bK0@nYVXf_*hXB04NK-K}=2# zb#yz2%dGU6k(TrH(vk%Qk}yxZ-zBAE zmlK1BFcMgIX%=ka6YIGEcmOAkeKdik^!(bEYvF`r8QvXV0^pe%EG;*lW0QAgEf+4` z!p}kYYIoi-$sn45>rN8=UVxA=1*zjg*}(5_SD+!V@th>uVm>mrGEHY6@j;edpway? z>RXzsS%`Zcd9wH+kCHZnfw5iaEA@iJbC}h{QAU53Yn}+;m$t@Rr+i&SBT)`o!~C4} z6OB6Gn0!Ukc*R>66D59C{t_2{aA2Jf{>(w@S}azy(2J#HWN5qNNb|HiMKU*{AS)33qy7M%;enn zX_6QHdn7tcXPS&jp~i=+1>5njs&yutkE`J%24$F#C87zoQ7Z5}mF4A|W16an{xy2Y zqE&gCJN`_a%+gH2&ztUE%WC%X$ADMD@BNh#*@VSlz8e4^}d@x)_>0@ZTSTL?YHybnb*BS$J6t? zlXu)-5{kWO$6J@~=?O^*?;vQ|LgSQ#922{nOvo0XRrxy{lr8Nrk0DPeh18X|{}>&vkh&X)$nA5jCB;vRcDsQRc+6+U>o0_ecOd-IVH5oP2d*kO`hLYh|Ac#;H8q;8c zK7zas^v#6>XsKLZo@5pd=Zx1_)HJA*c=AJ8kkMF|$)RUOn0C)2Hrn)h-ID4c%DM@R zL@DgF+c3I(yv#6(>hZSiz{QICm#6QSbw21MBUuaB*`E1gg zxA&#;sj^sIEnfPZ)_2I)auDH}Q!^2UcM%Dica%sC96LH?)K2HgsIYhv@#0_-Ri`PAnExdE14te`hzQwX5JZ6({p5K>yyF(V*}t392JhF3MbN8 zPeb$~Y;ltfGNJN)M7S_9w);NI&&E75uY(a&)VIvH4aY_L>K(UzFj$ z%K&$a#ZKMUmzZP6b-mNdXsI&JL1W{&N=_LgBW)_46)SjYf3v+7C2`*GXEWQlF+li+ zX0={t=XlYA?lHO~5fWHPqCmbCU1-Lq9o7%&h`$;1RP^p+Gkr)`9G!v?SCEiDbW@=p zS2(MBG6LJgInTuhMoeT@<%T%yOJ9K&w~c?z-F-XfB(NB(J7O!Lr$&@nrkHHMB+z}6 zOxEpQ*BpcS8iw`c!&rdH!WD@8$sFE30gekfEO0D?;b&}lSr%c}?#(}JY10#zWcb+7 z*Q?W;O|pM34o#spgw=%<=7o#>th$hUa%fmJXaP6uA&JcSto4ll72d{wd4jaj!1V z_R4HWt+8Km(LJ0$NQc=}1!guCZU)F@PjArTAY-%5(O)$dYroZb*rkpu-LT=Iw(CYH z#l1O{xD)ky7}w82lh9^L8&jWAO?M)gI!^1o?UlQs?#fn22VqyPcay7fcjW|AUBtb! zu1V1LHUnc2_Km}uS|xMiJThEZq?Y`}c5|eEO7oq|5-ihFDaAmc)3{&ad;;^NKbV1k zPa_rIMgCXC^o$06FIz+KR}o!lAr8ERAc@ z?7Yg<`~+4!1F>miV{rxg$O6RGmcS})T(4(bJO24`BlQER$cYo|2;YKRy*1+Q*K7X= z4AR)YV>(0$XD92yJuvKeSpgU6jM@NwuVosDv7{*5A8n?rYZ!eo_N_j&Q)6Was+y53 z+#cUSV&$t~PbJ;UGAg`M74g-T%_va2&$(l~MTJ_A9?0cDx&~Id5pqwMs1j0E!`BSW zd`Xq`^VxGq%FP5HP`c z+qhdWa@ZgeScU~^7*>lF{SNaQ7jh{CWD!|cpe3+t1gQN_zSWj_B(w>`5VBr@ZmVJ0 zaCfdi-(Y|j{{gV3nAGX-!4DM{iO}npBI_=ME`3}|D~t@vZw#rcmH85$e*{+7GkSHIA$g3`^x^*uO-e= zn0rnIX+Q7|wRY$G3Kfp-I7&DDs>nnF_UKi~C!MlUE&oMA-6zcqPT2 z$aqB+r3A!F_?Fx>Atzq2A(i9^<_GHbfBDd21(Fu#k~G-|on>vz$4gvp`344b!oeVB z5Y6-i!y;f6M?fx67P5y+)Kp~j02pgqpEjI|02J5g0OYk0izc^!=8&L@EUa#59>9g- zCFqvr{0 z$aEyZ1i;!7f=$SU5_9XV&T$P5b312*&4idvISHc?vH6=4kvR5QOb`<@-O|U@pU851 zi-#|4srv5LBd$OiCfW1Q+v_NqfxcRDy@32OQA`V^(L?uWCwbON~ap(@v8e zGMmYd+Yv}50q1LWM+$u&(w=_dIBP0fIxG5YI$31zT;>YYc6v;8suv4AKpfSaIR?mG zfk?NPC&fAwG|_S;;Y(6gLgf-4T$zk(Pq z$RkP|&VtAR>TdCcUv{%q-tnoNs4V`;M~u~y&>gTJq(An1O?8f$(`_@W&HdRfSLl*- zOuA@|vVZ>N5$);CP!5q(i$pWAICSZvYzFhFK%UOKG7R_$l&QHq#F$|U+aes=No zjW#f+3a98>^mFN=R*#wlxn5 zcnEi%@JsA0Sa#eM%ynAP)L{W94TjppQ_=6yidy;@Jp1|zL|q@NOm~uWL2<$wqOizy z1&W7V*0Ex_S?uL|PZT%;GrIa6?d<25!L?f4t zB4l}aQt~m@2MRloM+zj>RaU&Up|7~y@sk;_$1iEp0MpNPik5Mp&R zEW8&wx*{hV^>3>}h-U+gZAC0WjEAUbb{Q#!jmZPd=AqFh4UN(CPcyXUNS43n0b$-e zZ2Mpaqug1q^FDwCJ+YkeZkd7%Bea-2g_R>4+##j zjfOAGsQZL(uOu(X_*AxQ?8{>o*aBpKc1X4X|h^ zywKH21E^rj=H?&>cS!<7;L-ytiY@i3J`|cVlw7+^58_naZstWFFC~7wo%jGjq%hv> zyHC+}so5sah4!$bjQNsr9gUjH`L>butTsjy9L-&oHfiY(bPe5)qYs@41IT|PXoDc% zrc^VLk300Xc>Ppz6ydf-U|D;H*tp?H5b8H=>)ubwb)3o0WQ_Q7#1V0)?pmaUDFVwX zH$Qida+>P>j%zj(+J=P$(e|QkaFkYIl-Nh|WUOSc#hYai5Lm$;fRKQ#W?STx?_5yd z$>5yP9E&UIg~sIxpYm4>RC_-OzH}+kn!z;Oc-v;Fk39>M!c;d_z533=7IVnuePfq_#+nFV*7|Nafr1<0E2f1J>dUvYxm4dn9!i z=Z!rIGTn#`KT4Ods>V2=S)d#@bYg3hwZ z1?e74FrhOSSrYbbG>0IvB#W^i3&o6UgPdU<@cZ!jFxM%wJ?XWUmx#a#k_U0qr)XC3 zhjroo3Xk$j!t@S5p&E2{*8nOH3T=LGHmiGZ`Fz?nBkXg~$b+QIFF{<74P0-cQCo@0 zA+VVTZLfUfFk*+v?WOOVZ)09BSfMCBSh8TC3sz)X89eAMQ;c4xan3M%JYV@qTGL32 zYpBzUxM8ib(p`Axn%kE^DTyC@{62f$Qh{Yn=$cB#@+bW9Vdk1kDakq( zVCYG07z(y8fa{-oinKonh?gI@XiPzX<{XQe;K~b0>H9hzroSXuC`V9bOm7?Mb$u-|N zVbvWcV5NKSeG7|G#D(R$wPBAYQ;kr3iuB-3C7w|s=q|h(hM%+cc5PE&Ts2Y$ z{1x4sX8ff`@TNn&`;W6={${qzh+@ykA`2z6776c~Lm9PPa0YSgvmy47ogMg;q)T*< zsETO^qqvFcnAaoL&|G)}3bT27zB!@w(dql~C9I^mA*0-Pf3IbKo`jDnUDKi#%#EaS zOcgl!<`P$>YK-lT^s&5~GI(9zi?roquy={?G;E3y;=f=OhJ^u^N~R%)s}@gpx*i8_ z>Q9Okn;Go*HEc%bINBF?|54APd)@UCpjNbtT#$3N8xq^2`0evtSDp3wARH^Xk4lv> zMunHhxwcL})}wd3-6cMoeZ6I=0yj`vguOM0W5i?`js&RWITwacHzOwDX$ zaE^H1JL*jrX)Ew9EvkB^^6H=!f_gtdrQ$}B!rA&(!a5qu4fp9i$wb4#utLiMI%@IT z9TM{NBQf7zUr&4K%}+r8JxTQ9>8r*U^*XnssJv)hXw*1#Xs{$n(-+sRLj6Lc(Yp|i z&O^yBF_o`UEt{PA z7wR1K`y3cI$4{PUYjeF2XiEqo@_O(vl_nK(WaU4NqgWi?O)O>FnQPWOA1Q@#)}u2! zC@6de3<8C;GY;eo<>blq%t$V!*Lr;5Yra%G9vPx`+}}Pz*d9#BgE*xp`YPMSiE!zz z3P+M)-c~<~NRL_Fl18PaA}#C5s%?Mh&IK8p$&Y090|wVyRTV$OX}((tq`y5gAzG6h z9A|QEcmdm-S_X;(py-_B`gr$-;qpS|NMeOpy1ygt0Le4J-6E3(adIQx}FXOUodM}e&x;!^$g@W@i{`d-tf?jtf`OhUuy3ah6WyFyPpN$FXs=kwU+q8@;Qeh z7}^n?5i4F>fpPCqUqMvU`qXiVlTo`rwPjCKxBO7-C1_UidVGFj07tZBnG6HMAqg$a zBFnd|4UzPFS)-mz-SFIUI))2=*P%D}Ajk*pgC8G=tWm(tMw{A4i=@G3m^_1IsZ$vS9NJ{3BoT8$yd=2=L zobt<3KMKz$g2k+;`YWCNuoMD?Wo7<>GQIbo#&yeLyIXZHvI+H7Z_Lg!L8i{VVV;Ta z8?iB^KjuW`9}ed=Je=lDkWpIuJsVg!lL*Ti z<*KU>T|2;S%=SYd%>y9!LL`^}=O`3Ge0vhtdfD7z(}uMu;D7x7i~->6uxXQY@bGd2 z_zH#o)2#l}ucUl?5vhimC08JuKAO{$@K=$<)A3ev#E0GT)pbkv5I)}es5A{9AjM`3 zL7`R}V^CkCOS1IBA1XEJAA`=_o`FYP2dmjL&%6MJQBf4nyHkx(mKXP(R^i-$CLnPc zO44y*5j2r;A59VIkO2*~B6Shnj?5(Q5>cUr7tE>JM`)aUw3J*nC&ZzT?1{D&nB2Z~ z0tJ%ZE6|hgrJtK0`mh4Y_6?l0)_&M)sW|=gYtwE=xsV5KG`fiZ-iRAOT&MCFDbn
    KDbA>?k>~pW6QNS=b=>|>i7v=@ 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 L@=pWAZ`J<~R+|); diff --git a/doc/images/Setting.jpg b/doc/images/Setting.jpg deleted file mode 100644 index b8c849b7a5186335b2342e519f1dd16291c6af38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63551 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 Go&N`9wN&8% diff --git a/doc/images/NewGui2.jpg b/doc/images/gui_scope_view.jpg similarity index 100% rename from doc/images/NewGui2.jpg rename to doc/images/gui_scope_view.jpg diff --git a/doc/images/NewGui.jpg b/doc/images/gui_watch_plot.jpg similarity index 100% rename from doc/images/NewGui.jpg rename to doc/images/gui_watch_plot.jpg diff --git a/doc/images/NewGui3.jpg b/doc/images/gui_watch_view.jpg similarity index 100% rename from doc/images/NewGui3.jpg rename to doc/images/gui_watch_view.jpg diff --git a/doc/scripting.rst b/doc/scripting.rst index d327c63f..45a29072 100644 --- a/doc/scripting.rst +++ b/doc/scripting.rst @@ -19,9 +19,9 @@ X2CScope class 1. Import the X2Cscope class: - .. code-block:: python +.. code-block:: python - from pyx2scope import X2CScope + from pyx2scope import X2CScope X2CScope class needs one parameter to be instantiated: @@ -32,22 +32,28 @@ and TCP/IP are coming in near future. For serial, the only parameter needed is t default baud rate is set to **115200**. If there's a need to change the baud rate, include the baud_rate parameter with your preferred baud rate. -2. Instantiate X2CScope with the port: +2. Instantiate X2CScope with the serial port number: - .. code-block:: python +.. code-block:: python - x2c_scope = X2CScope(port="COM16") + x2c_scope = X2CScope(port="COM16") -Import variables +Load variables ---------------- -X2Cscope needs the location of the variables inside the controller firmware. The list of variables can be loaded from multiple sources: .elf file, pickle binary and YML text file. +X2Cscope needs to know which variables are currently available on the firmware. +The list of variables can be loaded from multiple file formats: + - Executable and Linkable Format (ELF, .elf, binary) + - Pickle (PKL, .pkl, binary) + - Yaml (YML, .yml, text) See more details at :ref:`Import and Export variables ` section. +The ELF file is one artifact generated during code compilation. To load the variables, Execute +the code below: - .. code-block:: python +.. code-block:: python - x2c_scope.import_variables(r"..\..\tests\data\qspin_foc_same54.elf") + x2c_scope.import_variables(r"..\..\tests\data\qspin_foc_same54.elf") Variable class -------------- @@ -59,9 +65,9 @@ is a string containing the variable name. 3. Create a Variable object for the variable you want to monitor: - .. code-block:: python +.. code-block:: python - variable = x2c_scope.get_variable('variable_name') + variable = x2c_scope.get_variable('variable_name') Replace 'variable_name' with the name of the variable you want to monitor. You can create multiple variable objects as required. To get variables that are underneath a struct, use the "dot" convention: @@ -74,18 +80,18 @@ Reading values 4. Once you have gone through these steps, you can use the method **get_value()** to retrieve the actual value of the variable: - .. code-block:: python +.. code-block:: python - variable.get_value() + variable.get_value() Writing values ^^^^^^^^^^^^^^ 5. To set the value for the respective variable use the method **set_value()**: - .. code-block:: python +.. code-block:: python - variable.set_value(value) + variable.set_value(value) .. _import-and-export-variables: @@ -116,26 +122,26 @@ seaborn, etc. 1. To use the scope functionality, first you need to link a variable as previously explained, and add this variable to the scope by means of the method: **add_scope_channel(variable: Variable)** : - .. code-block:: python +.. code-block:: python - variable1 = x2c_scope.get_variable("variable1") - variable2 = x2c_scope.get_variable("variable2") + variable1 = x2c_scope.get_variable("variable1") + variable2 = x2c_scope.get_variable("variable2") - x2c_scope.add_scope_channel(variable1) - x2c_scope.add_scope_channel(variable2) + x2c_scope.add_scope_channel(variable1) + x2c_scope.add_scope_channel(variable2) 2. To remove a variable from the scope: **remove_scope_channel(variable: Variable)**, to clear all variables and reset the scope use instead: **clear_all_scope_channel()** - .. code-block:: python +.. code-block:: python - x2c_scope.remove_scope_channel(variable2) + x2c_scope.remove_scope_channel(variable2) or - .. code-block:: python +.. code-block:: python - x2c_scope.clear_all_scope_channel() + x2c_scope.clear_all_scope_channel() Up to 8 channels can be added. Each time you add or remove a variable, the number of channels present on the channel are returned. @@ -145,57 +151,78 @@ Getting Data from Scope To get data from scope channel you need to follow this sequence: -* Request data -* Check if data is ready (sampling is done) - * Data is ready? Yes, get the data and handle it. - * Data is not ready? Execute some delay and check again. -* After handling the data, start from the beginning requesting new data. +:: + + +------------------------------------+ + | Add variables to the scope channel | + +------------------------------------+ + | + v + +--------------------------+ + | Request scope data | <---------------+ + +--------------------------+ | + | | + v | + +--------------------------+ | + | Is scope data ready? | | + +--------------------------+ | + / Yes \ No | + v v | + +-----------------+ +--------------------+ | + | Handle the data | | Execute some delay | | + +-----------------+ +--------------------+ | + | | | + +-----------------+------------------+ + Step-by-step you need: 1. Request to X2CScope to collect data for the variables registered on the scope channels. - .. code-block:: python +.. code-block:: python - x2c_scope.request_scope_data() + x2c_scope.request_scope_data() 2. Check if the data is ready: Returns Scope sampling state. Returns: true if sampling has completed, false if it’s yet in progress. - .. code-block:: python +.. code-block:: python - while not x2c_scope.is_scope_data_ready(): - time.sleep(0.1) + while not x2c_scope.is_scope_data_ready(): + time.sleep(0.1) 3. Get the scope data once sampling is completed - .. code-block:: python +.. code-block:: python - data = x2c_scope.get_scope_channel_data() + data = x2c_scope.get_scope_channel_data() A simple loop request example to get only 1 frame of scope data is depicted below: - .. code-block:: python +.. code-block:: python + + # request scope to start sampling data + x2c_scope.request_scope_data() + + # wait while the data is not yet ready for reading + while not x2c_scope.is_scope_data_ready(): + time.sleep(0.1) - # request scope to start sampling data - x2c_scope.request_scope_data() - # wait while the data is not yet ready for reading - while not x2c_scope.is_scope_data_ready(): - time.sleep(0.1) - for channel, data in x2c_scope.get_scope_channel_data().items(): - # Do something with the data. - # channel contains the variable name, data is an array of values + for channel, data in x2c_scope.get_scope_channel_data().items(): + # Do something with the data. + # channel contains the variable name, data is an array of values Triggering ^^^^^^^^^^ -To Set up Trigger, any available variable can be selected, by default works on no trigger configuration. -To set any trigger configuration, you need to pass a TriggerConfig imported from from pyx2cscope.x2cscope +To set up a Trigger, any variable added to the scope channel can be selected. +By default, there is no trigger selected. +To set any trigger configuration, you need to pass a TriggerConfig imported from pyx2cscope.x2cscope - .. code-block:: python +.. code-block:: python - trigger_config = TriggerConfig(Variable, trigger_level: int, trigger_mode: int, trigger_delay: int, trigger_edge: int) - x2cscope.set_scope_trigger(trigger_config) + trigger_config = TriggerConfig(Variable, trigger_level: int, trigger_mode: int, trigger_delay: int, trigger_edge: int) + x2cscope.set_scope_trigger(trigger_config) TriggerConfig needs some parameters like the variable and some trigger values like: From 778a836901de8aae67f7a33eeba66bb251f5b335 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 22:22:09 +0200 Subject: [PATCH 10/14] fixing documentation and image links --- README.md | 2 +- doc/conf.py | 34 +++++++++++------------------ doc/development.md | 6 ++++- doc/gui_qt.md | 6 ++--- doc/scripting.rst | 7 +++--- pyx2cscope/__main__.py | 3 ++- pyx2cscope/gui/__init__.py | 29 +++++++++++++++++++++--- pyx2cscope/parser/elf16_parser.py | 3 ++- pyx2cscope/parser/generic_parser.py | 7 ++++-- 9 files changed, 61 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 5254ae38..96a3189d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

    - pyX2Cscope Logo + pyX2Cscope Logo

    # pyX2Cscope diff --git a/doc/conf.py b/doc/conf.py index 9e4207cb..995b02bc 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -34,41 +34,33 @@ "sphinx.ext.viewcode", "sphinx.ext.graphviz", "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", "autoapi.extension", ] autoapi_dirs = ["../pyx2cscope"] autoapi_ignore = [ "*/examples/*", - "*/gui/*", # For now, we ignore this, TODO: fix this + "*/gui/*", # For now, we ignore this ] suppress_warnings = [ - "autoapi.python_import_resolution" -] # Suppress warnings about unresolved imports TODO: fix this + "autoapi.python_import_resolution" +] # Suppress warnings about unresolved imports nitpick_ignore = [ - ("py:class", "numbers.Number"), + ("py:class", "pyx2cscope.gui"), + ("py:class", "mchplnet.lnet"), ("py:class", "mchplnet.lnet.LNet"), - ("py:class", "mchplnet.lnet"), # For now, we ignore this, TODO: fix this - ( - "py:class", - "pyx2cscope.variable.variable.LNet", - ), # For now, we ignore this, TODO: fix this - ("py:obj", "abc.ABC"), # For now, we ignore this, TODO: fix this - ("py:class", "enum.Enum"), # For now, we ignore this, TODO: fix this - ("py:class", "abc.ABC"), # For now, we ignore this, TODO: fix this - ("py:class", "PyQt5.QtWidgets.QMainWindow"), - ( - "py:class", - "mchplnet.services.scope.ScopeChannel", - ), # For now, we ignore this, TODO: fix this - ( - "py:class", - "mchplnet.interfaces.abstract_interface.InterfaceABC", - ), # For now, we ignore this, TODO: fix this + ("py:class", "mchplnet.services.scope.ScopeChannel"), + ("py:class", "mchplnet.interfaces.factory.InterfaceType"), + ("py:class", "mchplnet.interfaces.abstract_interface.InterfaceABC"), ] +intersphinx_mapping = { + "python": ("https://docs.python.org/3", None), +} + graphviz_output_format = "png" # 'svg' is also possible templates_path = ["_templates"] diff --git a/doc/development.md b/doc/development.md index 0855e803..b789ff7f 100644 --- a/doc/development.md +++ b/doc/development.md @@ -6,6 +6,8 @@ There is a mailing group to receive your inputs and questions: MotorControl@micr ## Contribution Contribute to source code, documentation, examples and report issues: https://github.com/X2Cscope/pyx2cscope +If you want to contribute to the project, please follow these steps: + 1. Fork the pyX2Cscope repository. 2. Create a new branch for your changes. 3. Make the necessary changes and commit them. @@ -22,8 +24,10 @@ Create virtual envrionment with make venv git clone https://github.com/X2Cscope/pyx2cscope.git cd pyx2cscope python -m venv .venv + #Windows .venv\Scripts\activate + #linux source .venv\bin\activate ``` @@ -55,4 +59,4 @@ sphinx-build -M html doc build --keep-going ## Creating executables ```bash pyinstaller --noconfirm .\pyx2cscope_win.spec -``` \ No newline at end of file +``` diff --git a/doc/gui_qt.md b/doc/gui_qt.md index 60829295..4788c909 100644 --- a/doc/gui_qt.md +++ b/doc/gui_qt.md @@ -20,7 +20,7 @@ python -m pyx2cscope -q ## Getting Started with pyX2Cscope reference GUI ## Tab: WatchPlot -![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_plot.jpg) +![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_watch_plot.jpg) 1. pyX2Cscope-GUI is based on Serial interface. 2. The Firmware of the microcontroller should have the X2Cscope library/Peripheral enabled. 3. In Tab WatchPlot, five channels values can be viewed, modified and can be plotted in the plot window. @@ -31,7 +31,7 @@ python -m pyx2cscope -q 8. Information related to the microcontroller will be displayed in the top-left corner. ## Tab: ScopeView -![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_scope_view.jpg) +![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_scope_view.jpg) 1. ScopeView supports up to 8 PWM resolution channels for precise signal control. 2. You can configure all trigger settings directly within the window. To enable the trigger for a variable, check the corresponding trigger checkbox. @@ -40,7 +40,7 @@ python -m pyx2cscope -q 5. To zoom in on the plot, left-click and drag on the desired area. To return to the original view, right-click and select View All. ## Tab: WatchView -![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_view.jpg) +![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_watch_view.jpg) 1. WatchView lets users add or remove variables as needed. To remove a variable, click the Remove button next to it. 2. Users can visualize variables in live mode with an update rate of 500 milliseconds. This rate is the default setting and cannot be changed. diff --git a/doc/scripting.rst b/doc/scripting.rst index 45a29072..1d068b37 100644 --- a/doc/scripting.rst +++ b/doc/scripting.rst @@ -43,9 +43,10 @@ Load variables X2Cscope needs to know which variables are currently available on the firmware. The list of variables can be loaded from multiple file formats: - - Executable and Linkable Format (ELF, .elf, binary) - - Pickle (PKL, .pkl, binary) - - Yaml (YML, .yml, text) + +- Executable and Linkable Format (ELF, .elf, binary) +- Pickle (PKL, .pkl, binary) +- Yaml (YML, .yml, text) See more details at :ref:`Import and Export variables ` section. The ELF file is one artifact generated during code compilation. To load the variables, Execute diff --git a/pyx2cscope/__main__.py b/pyx2cscope/__main__.py index 0a696935..f5a44a38 100644 --- a/pyx2cscope/__main__.py +++ b/pyx2cscope/__main__.py @@ -11,7 +11,8 @@ import argparse import pyx2cscope -from pyx2cscope import gui, utils +from pyx2cscope import utils +from pyx2cscope import gui def parse_arguments(): diff --git a/pyx2cscope/gui/__init__.py b/pyx2cscope/gui/__init__.py index f626f7ca..65b6bb7c 100644 --- a/pyx2cscope/gui/__init__.py +++ b/pyx2cscope/gui/__init__.py @@ -1,8 +1,31 @@ -"""This module is for all the different GUI.""" +""" +pyx2cscope.gui +============== + +This module serves as the entry point for launching the various graphical user interfaces (GUIs) provided by the pyx2cscope package. + +It provides functions to start either the Qt-based desktop GUI or the web-based GUI server. + +Functions +--------- +- execute_qt(*args, **kwargs): Launches the default Qt GUI interface for X2Cscope. +- execute_web(*args, **kwargs): Starts the web server for the web-based GUI. + +Typical usage example: + + from pyx2cscope.gui import execute_qt, execute_web + + # To launch the Qt GUI: + execute_qt() + + # To launch the web GUI: + execute_web() + +""" def execute_qt(*args, **kwargs): - """Execute the default Qt GUI interface. + """Executes the default Qt GUI interface. Args: args: non-keyed arguments for Qt App. @@ -29,7 +52,7 @@ def execute_qt(*args, **kwargs): def execute_web(*args, **kwargs): - """Start the web server. + """Starts the web server. Args: *args: non-keyed arguments diff --git a/pyx2cscope/parser/elf16_parser.py b/pyx2cscope/parser/elf16_parser.py index fabbba52..8a464d9f 100644 --- a/pyx2cscope/parser/elf16_parser.py +++ b/pyx2cscope/parser/elf16_parser.py @@ -17,7 +17,8 @@ import warnings from shutil import which -from pyx2cscope.parser.elf_parser import ElfParser, VariableInfo +from pyx2cscope.parser.elf_parser import ElfParser +from variable.variable import VariableInfo # Constants for magic values ADDRESS_CHECK_LOWER_LIMIT = 2 diff --git a/pyx2cscope/parser/generic_parser.py b/pyx2cscope/parser/generic_parser.py index 342084f5..9706c5a9 100644 --- a/pyx2cscope/parser/generic_parser.py +++ b/pyx2cscope/parser/generic_parser.py @@ -4,14 +4,17 @@ """ import logging +from typing import Any from elftools.elf.elffile import ELFFile from elftools.elf.sections import SymbolTableSection -from pyx2cscope.parser.elf_parser import ElfParser, VariableInfo +from pyx2cscope.parser.elf_parser import ElfParser from elftools.construct.lib import ListContainer from elftools.dwarf.dwarf_expr import DWARFExprParser +from variable.variable import VariableInfo + class GenericParser(ElfParser): """Class for parsing ELF files compatible with 32-bit architectures.""" @@ -184,7 +187,7 @@ def _find_actual_declaration(self, die_variable): die_variable = self.dwarf_info.get_DIE_from_refaddr(spec_ref_addr) return die_variable - def _get_member_offset(self, die) -> [int, int, int]: + def _get_member_offset(self, die) -> tuple[int | None, int, int]: """Extracts the offset for a structure member. Args: From 729b26507763e4f3ee0cc103f12d8e29f651292d Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 22:26:09 +0200 Subject: [PATCH 11/14] fix README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 96a3189d..512538b9 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ print(speed_measured.get_value()) speed_reference.set_value(1000) ``` -Further [Examples](https://github.com/X2Cscope/pyx2cscope/tree/main/pyx2cscope/examples) directory in the pyX2Cscope project to check out the available examples or create a new .py file according to your requirements. +Check [Examples](https://github.com/X2Cscope/pyx2cscope/tree/main/pyx2cscope/examples) directory in the pyX2Cscope project to see common uses of this library. ## Development From c7de93b0d25036f5732630e3e084a94a60accad7 Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 22:35:30 +0200 Subject: [PATCH 12/14] fix web initial message error --- pyx2cscope/gui/web/app.py | 11 ++--------- pyx2cscope/gui/web/views/watch_view.py | 2 +- pyx2cscope/parser/generic_parser.py | 3 +-- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/pyx2cscope/gui/web/app.py b/pyx2cscope/gui/web/app.py index 6b695dee..97678076 100644 --- a/pyx2cscope/gui/web/app.py +++ b/pyx2cscope/gui/web/app.py @@ -132,9 +132,7 @@ def main(host="localhost", web_port=5000, new=True, *args, **kwargs): app.add_url_rule("/connect", view_func=connect, methods=["POST"]) app.add_url_rule("/disconnect", view_func=disconnect) app.add_url_rule("/is-connected", view_func=is_connected) - app.add_url_rule( - "/variables", view_func=variables_autocomplete, methods=["POST", "GET"] - ) + app.add_url_rule("/variables", view_func=variables_autocomplete, methods=["POST", "GET"]) app.add_url_rule("/variables/all", get_variables, methods=["POST", "GET"]) log_level = kwargs["log_level"] if "log_level" in kwargs else "ERROR" @@ -150,12 +148,7 @@ def main(host="localhost", web_port=5000, new=True, *args, **kwargs): if new: Timer(1, open_browser, None, {"web_port": web_port}).start() - print( - "Listening at http://" - + ("localhost" if host == "0.0.0.0" else host) - + ":" - + str(web_port) - ) + print("Listening at http://" + ("localhost" if host == "0.0.0.0" else host) + ":" + str(web_port)) if host == "0.0.0.0": print("Server is open for external requests!") app.run(debug=False, host=host, port=web_port) diff --git a/pyx2cscope/gui/web/views/watch_view.py b/pyx2cscope/gui/web/views/watch_view.py index f3eb8f08..47f3c9a5 100644 --- a/pyx2cscope/gui/web/views/watch_view.py +++ b/pyx2cscope/gui/web/views/watch_view.py @@ -58,7 +58,7 @@ def get_data(): if _data["live"]: _read_variable(_data) result.append({f: v.info.name if f == "variable" else v for f, v in _data.items()}) - return {"data": result} + return {"data": result} def add(): diff --git a/pyx2cscope/parser/generic_parser.py b/pyx2cscope/parser/generic_parser.py index 9706c5a9..b2e98a46 100644 --- a/pyx2cscope/parser/generic_parser.py +++ b/pyx2cscope/parser/generic_parser.py @@ -4,7 +4,6 @@ """ import logging -from typing import Any from elftools.elf.elffile import ELFFile from elftools.elf.sections import SymbolTableSection @@ -13,7 +12,7 @@ from elftools.construct.lib import ListContainer from elftools.dwarf.dwarf_expr import DWARFExprParser -from variable.variable import VariableInfo +from pyx2cscope.variable.variable import VariableInfo class GenericParser(ElfParser): From cb1f35160aebea3dbc795ed747891353f4e4548c Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 22:39:08 +0200 Subject: [PATCH 13/14] ruff fix --- pyx2cscope/gui/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/pyx2cscope/gui/__init__.py b/pyx2cscope/gui/__init__.py index 65b6bb7c..74d0ed94 100644 --- a/pyx2cscope/gui/__init__.py +++ b/pyx2cscope/gui/__init__.py @@ -1,8 +1,4 @@ -""" -pyx2cscope.gui -============== - -This module serves as the entry point for launching the various graphical user interfaces (GUIs) provided by the pyx2cscope package. +"""This module serves as the entry point for launching the various graphical user interfaces (GUIs). It provides functions to start either the Qt-based desktop GUI or the web-based GUI server. From 91dad3e78f2fd823397f2f9144e17fc2ac034b2d Mon Sep 17 00:00:00 2001 From: Edras Pacola Date: Thu, 26 Jun 2025 23:04:22 +0200 Subject: [PATCH 14/14] review fix --- doc/gui_qt.md | 6 +++--- pyx2cscope/parser/elf16_parser.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/gui_qt.md b/doc/gui_qt.md index 4788c909..60829295 100644 --- a/doc/gui_qt.md +++ b/doc/gui_qt.md @@ -20,7 +20,7 @@ python -m pyx2cscope -q ## Getting Started with pyX2Cscope reference GUI ## Tab: WatchPlot -![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_watch_plot.jpg) +![WatchPlot](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_plot.jpg) 1. pyX2Cscope-GUI is based on Serial interface. 2. The Firmware of the microcontroller should have the X2Cscope library/Peripheral enabled. 3. In Tab WatchPlot, five channels values can be viewed, modified and can be plotted in the plot window. @@ -31,7 +31,7 @@ python -m pyx2cscope -q 8. Information related to the microcontroller will be displayed in the top-left corner. ## Tab: ScopeView -![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_scope_view.jpg) +![ScopeView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_scope_view.jpg) 1. ScopeView supports up to 8 PWM resolution channels for precise signal control. 2. You can configure all trigger settings directly within the window. To enable the trigger for a variable, check the corresponding trigger checkbox. @@ -40,7 +40,7 @@ python -m pyx2cscope -q 5. To zoom in on the plot, left-click and drag on the desired area. To return to the original view, right-click and select View All. ## Tab: WatchView -![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/bugfix---v0.4.3/doc/images/gui_watch_view.jpg) +![WatchView](https://raw.githubusercontent.com/X2Cscope/pyx2cscope/refs/heads/main/doc/images/gui_watch_view.jpg) 1. WatchView lets users add or remove variables as needed. To remove a variable, click the Remove button next to it. 2. Users can visualize variables in live mode with an update rate of 500 milliseconds. This rate is the default setting and cannot be changed. diff --git a/pyx2cscope/parser/elf16_parser.py b/pyx2cscope/parser/elf16_parser.py index 8a464d9f..f79156d0 100644 --- a/pyx2cscope/parser/elf16_parser.py +++ b/pyx2cscope/parser/elf16_parser.py @@ -18,7 +18,7 @@ from shutil import which from pyx2cscope.parser.elf_parser import ElfParser -from variable.variable import VariableInfo +from pyx2cscope.variable.variable import VariableInfo # Constants for magic values ADDRESS_CHECK_LOWER_LIMIT = 2