diff --git a/components/freemodbus/CMakeLists.txt b/CMakeLists.txt similarity index 100% rename from components/freemodbus/CMakeLists.txt rename to CMakeLists.txt diff --git a/components/freemodbus/Kconfig b/Kconfig similarity index 100% rename from components/freemodbus/Kconfig rename to Kconfig diff --git a/docs/en/api-reference/protocols/modbus.rst b/docs/en/esp-modbus.rst similarity index 100% rename from docs/en/api-reference/protocols/modbus.rst rename to docs/en/esp-modbus.rst diff --git a/examples/protocols/modbus/serial/README.md b/examples/protocols/modbus/serial/README.md deleted file mode 100644 index 2e5d0b7..0000000 --- a/examples/protocols/modbus/serial/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Modbus Master-Slave Example - -## Overview - -These two projects illustrate the communication between Modbus master and slave device in the segment. -Master initializes Modbus interface driver and then reads parameters from slave device in the segment. -After several successful read attempts slave sets the alarm relay (end of test condition). -Once master reads the alarm it stops communication and destroy driver. - -The examples: - -* `examples/protocols/modbus/serial/mb_master` - Modbus serial master ASCII/RTU -* `examples/protocols/modbus/serial/mb_slave` - Modbus serial slave ASCII/RTU - -See README.md for each individual project for more information. - -## How to use example - -### Hardware Required - -This example can be run on any commonly available ESP32 development board. -The master and slave boards should be connected to each other through the RS485 interface line driver. -See the connection schematic in README.md files of each example. - -### Configure the project - -This example test requires communication mode setting for master and slave be the same and slave address set to 1. -Please refer to README.md files of each example project for more information. - -## About common_component in this example - -The folder "mb_example_common" includes definitions of parameter structures for master and slave device (both projects share the same parameters). -However, currently it is for example purpose only and can be modified for particular application. - -## Example Output - -Example of Slave output: - -``` -I (343) SLAVE_TEST: Modbus slave stack initialized. -I (343) SLAVE_TEST: Start modbus test... -I (81463) SLAVE_TEST: HOLDING READ (81150420 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2868, SIZE:6 -I (82463) SLAVE_TEST: HOLDING READ (82150720 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2868, SIZE:6 -I (83573) SLAVE_TEST: HOLDING READ (83260630 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2868, SIZE:6 -I (84603) SLAVE_TEST: HOLDING READ (84290530 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2868, SIZE:6 -I (85703) SLAVE_TEST: HOLDING READ (85396692 us), ADDR:1, TYPE:2, INST_ADDR:0x3ffb2868, SIZE:6 -``` - -Example of Modbus Master output: - -``` -I (399) MASTER_TEST: Modbus master stack initialized... -I (499) MASTER_TEST: Start modbus test... -I (549) MASTER_TEST: Characteristic #0 Data_channel_0 (Volts) value = 1.230000 (0x3f9d70a4) read successful. -I (629) MASTER_TEST: Characteristic #1 Humidity_1 (%rH) value = 12.100000 (0x4141999a) read successful. -I (709) MASTER_TEST: Characteristic #2 Temperature_1 (C) value = 3.560000 (0x4063d70a) read successful. -I (769) MASTER_TEST: Characteristic #3 Humidity_2 (%rH) value = 23.400000 (0x41bb3333) read successful. -I (829) MASTER_TEST: Characteristic #4 Temperature_2 (C) value = 5.890000 (0x40bc7ae1) read successful. -I (889) MASTER_TEST: Characteristic #5 Humidity_3 (%rH) value = 34.500000 (0x420a0000) read successful. -E (949) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x108) (ESP_ERR_INVALID_RESPONSE). -E (949) MASTER_TEST: Characteristic #6 (RelayP1) read fail, err = 264 (ESP_ERR_INVALID_RESPONSE). -E (1029) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x108) (ESP_ERR_INVALID_RESPONSE). -E (1029) MASTER_TEST: Characteristic #7 (RelayP2) read fail, err = 264 (ESP_ERR_INVALID_RESPONSE). -``` - -## Troubleshooting - -If the examples do not work as expected and slave and master boards are not able to communicate correctly it is possible to find the reason for errors. -The most important errors are described in master example output and formatted as below: - -``` -E (1692332) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x107) (ESP_ERR_TIMEOUT). -``` - -ESP_ERR_TIMEOUT (0x107) - Modbus slave device does not respond during configured timeout. Check the connection and ability for communication using uart_echo_rs485 example or increase -Kconfig value CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND (CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS). - -ESP_ERR_NOT_SUPPORTED (0x106), ESP_ERR_INVALID_RESPONSE (0x108) - Modbus slave device does not support requested command or register and sent exeption response. - -ESP_ERR_INVALID_STATE (0x103) - Modbus stack is not configured correctly or can't work correctly due to critical failure. - - diff --git a/examples/protocols/modbus/serial/example_test.py b/examples/protocols/modbus/serial/example_test.py deleted file mode 100644 index 4a8b15d..0000000 --- a/examples/protocols/modbus/serial/example_test.py +++ /dev/null @@ -1,290 +0,0 @@ -# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD -# SPDX-License-Identifier: Apache-2.0 - -# Need Python 3 string formatting functions -from __future__ import print_function - -import logging -import os -import re -from threading import Thread - -import ttfw_idf - -LOG_LEVEL = logging.DEBUG -LOGGER_NAME = 'modbus_test' - -# Allowed parameter reads -TEST_READ_MIN_COUNT = 10 # Minimum number of correct readings -TEST_READ_MAX_ERR_COUNT = 2 # Maximum allowed read errors during initialization - -TEST_THREAD_EXPECT_TIMEOUT = 120 # Test theread expect timeout in seconds -TEST_THREAD_JOIN_TIMEOUT = 180 # Test theread join timeout in seconds - -# Test definitions -TEST_MASTER_RTU = 'master_rtu' -TEST_SLAVE_RTU = 'slave_rtu' - -TEST_MASTER_ASCII = 'master_ascii' -TEST_SLAVE_ASCII = 'slave_ascii' - -# Define tuple of strings to expect for each DUT. -# -master_expect = ('MASTER_TEST: Modbus master stack initialized...', 'MASTER_TEST: Start modbus test...', 'MASTER_TEST: Destroy master...') -slave_expect = ('SLAVE_TEST: Modbus slave stack initialized.', 'SLAVE_TEST: Start modbus test...', 'SLAVE_TEST: Modbus controller destroyed.') - -# The dictionary for expected values in listing -expect_dict_master_ok = {'START': (), - 'READ_PAR_OK': (), - 'ALARM_MSG': (u'7',)} - -expect_dict_master_err = {'READ_PAR_ERR': (u'263', u'ESP_ERR_TIMEOUT'), - 'READ_STK_ERR': (u'107', u'ESP_ERR_TIMEOUT')} - -# The dictionary for regular expression patterns to check in listing -pattern_dict_master_ok = {'START': (r'.*I \([0-9]+\) MASTER_TEST: Start modbus test...'), - 'READ_PAR_OK': (r'.*I\s\([0-9]+\) MASTER_TEST: Characteristic #[0-9]+ [a-zA-Z0-9_]+' - r'\s\([a-zA-Z\%\/]+\) value = [a-zA-Z0-9\.\s]*\(0x[a-zA-Z0-9]+\) read successful.'), - 'ALARM_MSG': (r'.*I \([0-9]*\) MASTER_TEST: Alarm triggered by cid #([0-9]+).')} - -pattern_dict_master_err = {'READ_PAR_ERR_TOUT': (r'.*E \([0-9]+\) MASTER_TEST: Characteristic #[0-9]+' - r'\s\([a-zA-Z0-9_]+\) read fail, err = [0-9]+ \([_A-Z]+\).'), - 'READ_STK_ERR_TOUT': (r'.*E \([0-9]+\) MB_CONTROLLER_MASTER: [a-zA-Z0-9_]+\([0-9]+\):\s' - r'SERIAL master get parameter failure error=\(0x([a-zA-Z0-9]+)\) \(([_A-Z]+)\).')} - -# The dictionary for expected values in listing -expect_dict_slave_ok = {'START': (), - 'READ_PAR_OK': (), - 'DESTROY': ()} - -# The dictionary for regular expression patterns to check in listing -pattern_dict_slave_ok = {'START': (r'.*I \([0-9]+\) SLAVE_TEST: Start modbus test...'), - 'READ_PAR_OK': (r'.*I\s\([0-9]+\) SLAVE_TEST: [A-Z]+ READ \([a-zA-Z0-9_]+ us\),\s' - r'ADDR:[0-9]+, TYPE:[0-9]+, INST_ADDR:0x[a-zA-Z0-9]+, SIZE:[0-9]+'), - 'DESTROY': (r'.*I\s\([0-9]+\) SLAVE_TEST: Modbus controller destroyed.')} - -logger = logging.getLogger(LOGGER_NAME) - - -class DutTestThread(Thread): - def __init__(self, dut=None, name=None, expect=None): - """ Initialize the thread parameters - """ - self.tname = name - self.dut = dut - self.expected = expect - self.result = False - self.data = None - super(DutTestThread, self).__init__() - - def run(self): - """ The function implements thread functionality - """ - # Must reset again as flashing during start_app will reset multiple times, causing unexpected results - self.dut.reset() - - # Capture output from the DUT - self.dut.start_capture_raw_data() - - # Check expected strings in the listing - for string in self.expected: - self.dut.expect(string, TEST_THREAD_EXPECT_TIMEOUT) - - # Check DUT exceptions - dut_exceptions = self.dut.get_exceptions() - if 'Guru Meditation Error:' in dut_exceptions: - raise Exception('%s generated an exception: %s\n' % (str(self.dut), dut_exceptions)) - - # Mark thread has run to completion without any exceptions - self.data = self.dut.stop_capture_raw_data() - self.result = True - - -def test_filter_output(data=None, start_pattern=None, end_pattern=None): - """Use patters to filter output - """ - start_index = str(data).find(start_pattern) - end_index = str(data).find(end_pattern) - logger.debug('Listing start index= %d, end=%d' % (start_index, end_index)) - if start_index == -1 or end_index == -1: - return data - return data[start_index:end_index + len(end_pattern)] - - -def test_expect_re(data, pattern): - """ - Check if re pattern is matched in data cache - :param data: data to process - :param pattern: compiled RegEx pattern - :return: match groups if match succeed otherwise None - """ - ret = None - if isinstance(pattern, type(u'')): - pattern = pattern.encode('utf-8') - regex = re.compile(pattern) - if isinstance(data, type(u'')): - data = data.encode('utf-8') - match = regex.search(data) - if match: - ret = tuple(None if x is None else x.decode() for x in match.groups()) - index = match.end() - else: - index = None - return ret, index - - -def test_check_output(data=None, check_dict=None, expect_dict=None): - """ Check output for the test - Check log using regular expressions: - """ - global logger - match_count = 0 - index = 0 - data_lines = data.splitlines() - for key, pattern in check_dict.items(): - if key not in expect_dict: - break - # Check pattern in the each line - for line in data_lines: - group, index = test_expect_re(line, pattern) - if index is not None: - logger.debug('Found key{%s}=%s, line: \n%s' % (key, group, line)) - if expect_dict[key] == group: - logger.debug('The result is correct for the key:%s, expected:%s == returned:%s' % (key, str(expect_dict[key]), str(group))) - match_count += 1 - return match_count - - -def test_check_mode(dut=None, mode_str=None, value=None): - """ Check communication mode for dut - """ - global logger - try: - opt = dut.app.get_sdkconfig()[mode_str] - logger.info('%s {%s} = %s.\n' % (str(dut), mode_str, opt)) - return value == opt - except Exception: - logger.info('ENV_TEST_FAILURE: %s: Cannot find option %s in sdkconfig.' % (str(dut), mode_str)) - return False - - -@ttfw_idf.idf_example_test(env_tag='Example_T2_RS485', target=['esp32']) -def test_modbus_serial_communication(env, comm_mode): - global logger - - # Get device under test. "dut1 - master", "dut2 - slave" must be properly connected through RS485 interface driver - dut_master = env.get_dut('modbus_master', 'examples/protocols/modbus/serial/mb_master', dut_class=ttfw_idf.ESP32DUT) - dut_slave = env.get_dut('modbus_slave', 'examples/protocols/modbus/serial/mb_slave', dut_class=ttfw_idf.ESP32DUT) - - try: - logger.debug('Environment vars: %s\r\n' % os.environ) - logger.debug('DUT slave sdkconfig: %s\r\n' % dut_slave.app.get_sdkconfig()) - logger.debug('DUT master sdkconfig: %s\r\n' % dut_master.app.get_sdkconfig()) - - # Check Kconfig configuration options for each built example - if test_check_mode(dut_master, 'CONFIG_MB_COMM_MODE_ASCII', 'y') and test_check_mode(dut_slave, 'CONFIG_MB_COMM_MODE_ASCII', 'y'): - logger.info('ENV_TEST_INFO: Modbus ASCII test mode selected in the configuration. \n') - slave_name = TEST_SLAVE_ASCII - master_name = TEST_MASTER_ASCII - elif test_check_mode(dut_master, 'CONFIG_MB_COMM_MODE_RTU', 'y') and test_check_mode(dut_slave, 'CONFIG_MB_COMM_MODE_RTU', 'y'): - logger.info('ENV_TEST_INFO: Modbus RTU test mode selected in the configuration. \n') - slave_name = TEST_SLAVE_RTU - master_name = TEST_MASTER_RTU - else: - logger.error("ENV_TEST_FAILURE: Communication mode in master and slave configuration don't match.\n") - raise Exception("ENV_TEST_FAILURE: Communication mode in master and slave configuration don't match.\n") - # Check if slave address for example application is default one to be able to communicate - if not test_check_mode(dut_slave, 'CONFIG_MB_SLAVE_ADDR', '1'): - logger.error('ENV_TEST_FAILURE: Slave address option is incorrect.\n') - raise Exception('ENV_TEST_FAILURE: Slave address option is incorrect.\n') - - # Flash app onto each DUT - dut_master.start_app() - dut_slave.start_app() - - # Create thread for each dut - dut_master_thread = DutTestThread(dut=dut_master, name=master_name, expect=master_expect) - dut_slave_thread = DutTestThread(dut=dut_slave, name=slave_name, expect=slave_expect) - - # Start each thread - dut_slave_thread.start() - dut_master_thread.start() - - # Wait for threads to complete - dut_slave_thread.join(timeout=TEST_THREAD_JOIN_TIMEOUT) - dut_master_thread.join(timeout=TEST_THREAD_JOIN_TIMEOUT) - - if dut_slave_thread.isAlive(): - logger.error('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_slave_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - raise Exception('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_slave_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - - if dut_master_thread.isAlive(): - logger.error('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_master_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - raise Exception('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_master_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - finally: - dut_master.close() - dut_slave.close() - - # Check if test threads completed successfully and captured data - if not dut_slave_thread.result or dut_slave_thread.data is None: - logger.error('The thread %s was not run successfully.' % dut_slave_thread.tname) - raise Exception('The thread %s was not run successfully.' % dut_slave_thread.tname) - - if not dut_master_thread.result or dut_master_thread.data is None: - logger.error('The thread %s was not run successfully.' % dut_slave_thread.tname) - raise Exception('The thread %s was not run successfully.' % dut_master_thread.tname) - - # Filter output to get test messages - master_output = test_filter_output(dut_master_thread.data, master_expect[0], master_expect[len(master_expect) - 1]) - if master_output is not None: - logger.info('The data for master thread is captured.') - logger.debug(master_output) - - slave_output = test_filter_output(dut_slave_thread.data, slave_expect[0], slave_expect[len(slave_expect) - 1]) - if slave_output is not None: - logger.info('The data for slave thread is captured.') - logger.debug(slave_output) - - # Check if parameters are read correctly by master - match_count = test_check_output(master_output, pattern_dict_master_ok, expect_dict_master_ok) - if match_count < TEST_READ_MIN_COUNT: - logger.error('There are errors reading parameters from %s, %d' % (dut_master_thread.tname, match_count)) - raise Exception('There are errors reading parameters from %s, %d' % (dut_master_thread.tname, match_count)) - logger.info('OK pattern test for %s, match_count=%d.' % (dut_master_thread.tname, match_count)) - - # If the test completed successfully (alarm triggered) but there are some errors during reading of parameters - match_count = test_check_output(master_output, pattern_dict_master_err, expect_dict_master_err) - if match_count > TEST_READ_MAX_ERR_COUNT: - logger.error('There are errors reading parameters from %s, %d' % (dut_master_thread.tname, match_count)) - raise Exception('There are errors reading parameters from %s, %d' % (dut_master_thread.tname, match_count)) - logger.info('ERROR pattern test for %s, match_count=%d.' % (dut_master_thread.tname, match_count)) - - match_count = test_check_output(slave_output, pattern_dict_slave_ok, expect_dict_slave_ok) - if match_count < TEST_READ_MIN_COUNT: - logger.error('There are errors reading parameters from %s, %d' % (dut_slave_thread.tname, match_count)) - raise Exception('There are errors reading parameters from %s, %d' % (dut_slave_thread.tname, match_count)) - logger.info('OK pattern test for %s, match_count=%d.' % (dut_slave_thread.tname, match_count)) - - -if __name__ == '__main__': - logger = logging.getLogger(LOGGER_NAME) - # create file handler which logs even debug messages - fh = logging.FileHandler('modbus_test.log') - fh.setLevel(logging.DEBUG) - logger.setLevel(logging.DEBUG) - # create console handler - ch = logging.StreamHandler() - ch.setLevel(logging.INFO) - # set format of output for both handlers - formatter = logging.Formatter('%(levelname)s:%(message)s') - ch.setFormatter(formatter) - fh.setFormatter(formatter) - logger.addHandler(fh) - logger.addHandler(ch) - logger.info('Start script %s.' % os.path.basename(__file__)) - test_modbus_serial_communication() - logging.shutdown() diff --git a/examples/protocols/modbus/tcp/README.md b/examples/protocols/modbus/tcp/README.md deleted file mode 100644 index 5e62a00..0000000 --- a/examples/protocols/modbus/tcp/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Modbus TCP Master-Slave Example - -## Overview - -These two projects illustrate the communication between Modbus master and slave device in the segment. -Master initializes Modbus interface driver and then reads parameters from slave device in the segment. -After several successful read attempts slave sets the alarm relay (end of test condition). -Once master reads the alarm it stops communication and destroy driver. - -The examples: - -* `examples/protocols/modbus/tcp/mb_tcp_master` - Modbus TCP master -* `examples/protocols/modbus/tcp/mb_tcp_slave` - Modbus TCP slave - -See README.md for each individual project for more information. - -## How to use example - -### Hardware Required - -This example can be run on any commonly available ESP32(-S2) development board. -The master and slave boards should be connected to the same network (see the README.md file in example folder) and slave address `CONFIG_MB_SLAVE_ADDR` be defined for slave board(s). -See the connection schematic in README.md files of each example. - -### Configure the project - -This example test requires communication mode setting for master and slave be the same and slave address set to 1. -Please refer to README.md files of each example project for more information. This example uses the default option `CONFIG_MB_SLAVE_IP_FROM_STDIN` to resolve slave IP address and supports IPv4 address type for communication in this case. - -## About common_component in this example - -The folder "mb_example_common" one level above includes definitions of parameter structures for master and slave device (both projects share the same parameters). -However, currently it is for example purpose only and can be modified for particular application. - -## Example Output - -Refer to README.md file in the appropriate example folder for more information about master and slave log output. - -## Troubleshooting - -If the examples do not work as expected and slave and master boards are not able to communicate correctly it is possible to find the reason for errors. -The most important errors are described in master example output and formatted as below: - -``` -E (1692332) MB_CONTROLLER_MASTER: mbc_master_get_parameter(111): SERIAL master get parameter failure error=(0x107) (ESP_ERR_TIMEOUT). -``` - -ESP_ERR_TIMEOUT (0x107) - Modbus slave device does not respond during configured timeout. -Check ability for communication pinging each slave configured in the master parameter description table or use command on your host machine to find modbus slave using mDNS (requires `CONFIG_MB_MDNS_IP_RESOLVER` option be enabled): -```>dns-sd -L mb_slave_tcp_XX _modbus._tcp .``` -where XX is the short slave address (index) of the slave configured in the Kconfig of slave example. -Also it is possible to increase Kconfig value `CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND` to compensate network communication delays between master and slaves. - -ESP_ERR_NOT_SUPPORTED (0x106), ESP_ERR_INVALID_RESPONSE (0x108) - Modbus slave device does not support requested command or register and sent exeption response. - -ESP_ERR_INVALID_STATE (0x103) - Modbus stack is not configured correctly or can't work correctly due to critical failure. - - diff --git a/examples/protocols/modbus/tcp/example_test.py b/examples/protocols/modbus/tcp/example_test.py deleted file mode 100644 index 925b465..0000000 --- a/examples/protocols/modbus/tcp/example_test.py +++ /dev/null @@ -1,308 +0,0 @@ -# SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD -# SPDX-License-Identifier: Apache-2.0 - -import logging -import os -import re -from threading import Thread - -import ttfw_idf -from tiny_test_fw import DUT - -LOG_LEVEL = logging.DEBUG -LOGGER_NAME = 'modbus_test' - -# Allowed options for the test -TEST_READ_MAX_ERR_COUNT = 3 # Maximum allowed read errors during initialization -TEST_THREAD_JOIN_TIMEOUT = 60 # Test theread join timeout in seconds -TEST_EXPECT_STR_TIMEOUT = 30 # Test expect timeout in seconds -TEST_MASTER_TCP = 'mb_tcp_master' -TEST_SLAVE_TCP = 'mb_tcp_slave' - -STACK_DEFAULT = 0 -STACK_IPV4 = 1 -STACK_IPV6 = 2 -STACK_INIT = 3 -STACK_CONNECT = 4 -STACK_START = 5 -STACK_PAR_OK = 6 -STACK_PAR_FAIL = 7 -STACK_DESTROY = 8 - -pattern_dict_slave = {STACK_IPV4: (r'.*I \([0-9]+\) example_connect: - IPv4 address: ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*'), - STACK_IPV6: (r'.*I \([0-9]+\) example_connect: - IPv6 address: (([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}).*'), - STACK_INIT: (r'.*I \(([0-9]+)\) MB_TCP_SLAVE_PORT: (Protocol stack initialized).'), - STACK_CONNECT: (r'.*I\s\(([0-9]+)\) MB_TCP_SLAVE_PORT: Socket \(#[0-9]+\), accept client connection from address: ' - r'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*'), - STACK_START: (r'.*I\s\(([0-9]+)\) SLAVE_TEST: (Start modbus test).*'), - STACK_PAR_OK: (r'.*I\s\(([0-9]+)\) SLAVE_TEST: ([A-Z]+ [A-Z]+) \([a-zA-Z0-9_]+ us\),\s' - r'ADDR:([0-9]+), TYPE:[0-9]+, INST_ADDR:0x[a-zA-Z0-9]+, SIZE:[0-9]+'), - STACK_PAR_FAIL: (r'.*E \(([0-9]+)\) SLAVE_TEST: Response time exceeds configured [0-9]+ [ms], ignore packet.*'), - STACK_DESTROY: (r'.*I\s\(([0-9]+)\) SLAVE_TEST: (Modbus controller destroyed).')} - -pattern_dict_master = {STACK_IPV4: (r'.*I \([0-9]+\) example_connect: - IPv4 address: ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*'), - STACK_IPV6: (r'.*I \([0-9]+\) example_connect: - IPv6 address: (([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}).*'), - STACK_INIT: (r'.*I \(([0-9]+)\) MASTER_TEST: (Modbus master stack initialized).*'), - STACK_CONNECT: (r'.*.*I\s\(([0-9]+)\) MB_TCP_MASTER_PORT: (Connected [0-9]+ slaves), start polling.*'), - STACK_START: (r'.*I \(([0-9]+)\) MASTER_TEST: (Start modbus test).*'), - STACK_PAR_OK: (r'.*I\s\(([0-9]+)\) MASTER_TEST: Characteristic #[0-9]+ ([a-zA-Z0-9_]+)' - r'\s\([a-zA-Z\%\/]+\) value = [a-zA-Z0-9\.]+ \(0x[a-zA-Z0-9]+\) read successful.*'), - STACK_PAR_FAIL: (r'.*E \(([0-9]+)\) MASTER_TEST: Characteristic #[0-9]+\s\(([a-zA-Z0-9_]+)\)\s' - r'read fail, err = [0-9]+ \([_A-Z]+\).*'), - STACK_DESTROY: (r'.*I\s\(([0-9]+)\) MASTER_TEST: (Destroy master).*')} - -logger = logging.getLogger(LOGGER_NAME) - - -class DutTestThread(Thread): - """ Test thread class - """ - def __init__(self, dut=None, name=None, ip_addr=None, expect=None): - """ Initialize the thread parameters - """ - self.tname = name - self.dut = dut - self.expected = expect - self.data = None - self.ip_addr = ip_addr - self.test_finish = False - self.param_fail_count = 0 - self.param_ok_count = 0 - self.test_stage = STACK_DEFAULT - super(DutTestThread, self).__init__() - - def __enter__(self): - logger.debug('Restart %s.', self.tname) - # Reset DUT first - self.dut.reset() - # Capture output from the DUT - self.dut.start_capture_raw_data(capture_id=self.dut.name) - return self - - def __exit__(self, exc_type, exc_value, traceback): - """ The exit method of context manager - """ - if exc_type is not None or exc_value is not None: - logger.info('Thread %s rised an exception type: %s, value: %s', self.tname, str(exc_type), str(exc_value)) - - def run(self): - """ The function implements thread functionality - """ - # Initialize slave IP for master board - if (self.ip_addr is not None): - self.set_ip(0) - - # Check expected strings in the listing - self.test_start(TEST_EXPECT_STR_TIMEOUT) - - # Check DUT exceptions - dut_exceptions = self.dut.get_exceptions() - if 'Guru Meditation Error:' in dut_exceptions: - raise RuntimeError('%s generated an exception(s): %s\n' % (str(self.dut), dut_exceptions)) - - # Mark thread has run to completion without any exceptions - self.data = self.dut.stop_capture_raw_data(capture_id=self.dut.name) - - def set_ip(self, index=0): - """ The method to send slave IP to master application - """ - message = r'.*Waiting IP([0-9]{1,2}) from stdin.*' - # Read all data from previous restart to get prompt correctly - self.dut.read() - result = self.dut.expect(re.compile(message), timeout=TEST_EXPECT_STR_TIMEOUT) - if int(result[0]) != index: - raise RuntimeError('Incorrect index of IP=%s for %s\n' % (result[0], str(self.dut))) - # Use the same slave IP address for all characteristics during the test - self.dut.write('IP0=' + self.ip_addr, '\n', False) - self.dut.write('IP1=' + self.ip_addr, '\n', False) - self.dut.write('IP2=' + self.ip_addr, '\n', False) - logger.debug('Set IP address=%s for %s', self.ip_addr, self.tname) - message = r'.*IP\([0-9]+\) = \[([0-9a-zA-Z\.\:]+)\] set from stdin.*' - result = self.dut.expect(re.compile(message), timeout=TEST_EXPECT_STR_TIMEOUT) - logger.debug('Thread %s initialized with slave IP=%s.', self.tname, self.ip_addr) - - def test_start(self, timeout_value): - """ The method to initialize and handle test stages - """ - def handle_get_ip4(data): - """ Handle get_ip v4 - """ - logger.debug('%s[STACK_IPV4]: %s', self.tname, str(data)) - self.test_stage = STACK_IPV4 - - def handle_get_ip6(data): - """ Handle get_ip v6 - """ - logger.debug('%s[STACK_IPV6]: %s', self.tname, str(data)) - self.test_stage = STACK_IPV6 - - def handle_init(data): - """ Handle init - """ - logger.debug('%s[STACK_INIT]: %s', self.tname, str(data)) - self.test_stage = STACK_INIT - - def handle_connect(data): - """ Handle connect - """ - logger.debug('%s[STACK_CONNECT]: %s', self.tname, str(data)) - self.test_stage = STACK_CONNECT - - def handle_test_start(data): - """ Handle connect - """ - logger.debug('%s[STACK_START]: %s', self.tname, str(data)) - self.test_stage = STACK_START - - def handle_par_ok(data): - """ Handle parameter ok - """ - logger.debug('%s[READ_PAR_OK]: %s', self.tname, str(data)) - if self.test_stage >= STACK_START: - self.param_ok_count += 1 - self.test_stage = STACK_PAR_OK - - def handle_par_fail(data): - """ Handle parameter fail - """ - logger.debug('%s[READ_PAR_FAIL]: %s', self.tname, str(data)) - self.param_fail_count += 1 - self.test_stage = STACK_PAR_FAIL - - def handle_destroy(data): - """ Handle destroy - """ - logger.debug('%s[DESTROY]: %s', self.tname, str(data)) - self.test_stage = STACK_DESTROY - self.test_finish = True - - while not self.test_finish: - try: - self.dut.expect_any((re.compile(self.expected[STACK_IPV4]), handle_get_ip4), - (re.compile(self.expected[STACK_IPV6]), handle_get_ip6), - (re.compile(self.expected[STACK_INIT]), handle_init), - (re.compile(self.expected[STACK_CONNECT]), handle_connect), - (re.compile(self.expected[STACK_START]), handle_test_start), - (re.compile(self.expected[STACK_PAR_OK]), handle_par_ok), - (re.compile(self.expected[STACK_PAR_FAIL]), handle_par_fail), - (re.compile(self.expected[STACK_DESTROY]), handle_destroy), - timeout=timeout_value) - except DUT.ExpectTimeout: - logger.debug('%s, expect timeout on stage #%d (%s seconds)', self.tname, self.test_stage, timeout_value) - self.test_finish = True - - -def test_check_mode(dut=None, mode_str=None, value=None): - """ Check communication mode for dut - """ - global logger - try: - opt = dut.app.get_sdkconfig()[mode_str] - logger.debug('%s {%s} = %s.\n', str(dut), mode_str, opt) - return value == opt - except Exception: - logger.error('ENV_TEST_FAILURE: %s: Cannot find option %s in sdkconfig.', str(dut), mode_str) - return False - - -@ttfw_idf.idf_example_test(env_tag='Example_Modbus_TCP', target=['esp32']) -def test_modbus_tcp_communication(env, comm_mode): - global logger - - rel_project_path = os.path.join('examples', 'protocols', 'modbus', 'tcp') - # Get device under test. Both duts must be able to be connected to WiFi router - dut_master = env.get_dut('modbus_tcp_master', os.path.join(rel_project_path, TEST_MASTER_TCP)) - dut_slave = env.get_dut('modbus_tcp_slave', os.path.join(rel_project_path, TEST_SLAVE_TCP)) - log_file = os.path.join(env.log_path, 'modbus_tcp_test.log') - print('Logging file name: %s' % log_file) - - try: - # create file handler which logs even debug messages - logger.setLevel(logging.DEBUG) - fh = logging.FileHandler(log_file) - fh.setLevel(logging.DEBUG) - # set format of output for both handlers - formatter = logging.Formatter('%(levelname)s:%(message)s') - fh.setFormatter(formatter) - logger.addHandler(fh) - # create console handler - ch = logging.StreamHandler() - ch.setLevel(logging.INFO) - # set format of output for both handlers - formatter = logging.Formatter('%(levelname)s:%(message)s') - ch.setFormatter(formatter) - logger.addHandler(ch) - - # Check Kconfig configuration options for each built example - if (test_check_mode(dut_master, 'CONFIG_FMB_COMM_MODE_TCP_EN', 'y') and - test_check_mode(dut_slave, 'CONFIG_FMB_COMM_MODE_TCP_EN', 'y')): - slave_name = TEST_SLAVE_TCP - master_name = TEST_MASTER_TCP - else: - logger.error('ENV_TEST_FAILURE: IP resolver mode do not match in the master and slave implementation.\n') - raise RuntimeError('ENV_TEST_FAILURE: IP resolver mode do not match in the master and slave implementation.\n') - address = None - if test_check_mode(dut_master, 'CONFIG_MB_SLAVE_IP_FROM_STDIN', 'y'): - logger.info('ENV_TEST_INFO: Set slave IP address through STDIN.\n') - # Flash app onto DUT (Todo: Debug case when the slave flashed before master then expect does not work correctly for no reason - dut_slave.start_app() - dut_master.start_app() - if test_check_mode(dut_master, 'CONFIG_EXAMPLE_CONNECT_IPV6', 'y'): - address = dut_slave.expect(re.compile(pattern_dict_slave[STACK_IPV6]), TEST_EXPECT_STR_TIMEOUT) - else: - address = dut_slave.expect(re.compile(pattern_dict_slave[STACK_IPV4]), TEST_EXPECT_STR_TIMEOUT) - if address is not None: - print('Found IP slave address: %s' % address[0]) - else: - raise RuntimeError('ENV_TEST_FAILURE: Slave IP address is not found in the output. Check network settings.\n') - else: - raise RuntimeError('ENV_TEST_FAILURE: Slave IP resolver is not configured correctly.\n') - - # Create thread for each dut - with DutTestThread(dut=dut_master, name=master_name, ip_addr=address[0], expect=pattern_dict_master) as dut_master_thread: - with DutTestThread(dut=dut_slave, name=slave_name, ip_addr=None, expect=pattern_dict_slave) as dut_slave_thread: - - # Start each thread - dut_slave_thread.start() - dut_master_thread.start() - - # Wait for threads to complete - dut_slave_thread.join(timeout=TEST_THREAD_JOIN_TIMEOUT) - dut_master_thread.join(timeout=TEST_THREAD_JOIN_TIMEOUT) - - if dut_slave_thread.is_alive(): - logger.error('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n', - dut_slave_thread.tname, TEST_THREAD_JOIN_TIMEOUT) - raise RuntimeError('ENV_TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_slave_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - - if dut_master_thread.is_alive(): - logger.error('TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n', - dut_master_thread.tname, TEST_THREAD_JOIN_TIMEOUT) - raise RuntimeError('TEST_FAILURE: The thread %s is not completed successfully after %d seconds.\n' % - (dut_master_thread.tname, TEST_THREAD_JOIN_TIMEOUT)) - - logger.info('TEST_INFO: %s error count = %d, %s error count = %d.\n', - dut_master_thread.tname, dut_master_thread.param_fail_count, - dut_slave_thread.tname, dut_slave_thread.param_fail_count) - logger.info('TEST_INFO: %s ok count = %d, %s ok count = %d.\n', - dut_master_thread.tname, dut_master_thread.param_ok_count, - dut_slave_thread.tname, dut_slave_thread.param_ok_count) - - if ((dut_master_thread.param_fail_count > TEST_READ_MAX_ERR_COUNT) or - (dut_slave_thread.param_fail_count > TEST_READ_MAX_ERR_COUNT) or - (dut_slave_thread.param_ok_count == 0) or - (dut_master_thread.param_ok_count == 0)): - raise RuntimeError('TEST_FAILURE: %s parameter read error(ok) count = %d(%d), %s parameter read error(ok) count = %d(%d).\n' % - (dut_master_thread.tname, dut_master_thread.param_fail_count, dut_master_thread.param_ok_count, - dut_slave_thread.tname, dut_slave_thread.param_fail_count, dut_slave_thread.param_ok_count)) - logger.info('TEST_SUCCESS: The Modbus parameter test is completed successfully.\n') - - finally: - dut_master.close() - dut_slave.close() - logging.shutdown() - - -if __name__ == '__main__': - test_modbus_tcp_communication() diff --git a/components/freemodbus/common/esp_modbus_callbacks.h b/freemodbus/common/esp_modbus_callbacks.h similarity index 100% rename from components/freemodbus/common/esp_modbus_callbacks.h rename to freemodbus/common/esp_modbus_callbacks.h diff --git a/components/freemodbus/common/esp_modbus_master.c b/freemodbus/common/esp_modbus_master.c similarity index 100% rename from components/freemodbus/common/esp_modbus_master.c rename to freemodbus/common/esp_modbus_master.c diff --git a/components/freemodbus/common/esp_modbus_master_serial.c b/freemodbus/common/esp_modbus_master_serial.c similarity index 100% rename from components/freemodbus/common/esp_modbus_master_serial.c rename to freemodbus/common/esp_modbus_master_serial.c diff --git a/components/freemodbus/common/esp_modbus_master_tcp.c b/freemodbus/common/esp_modbus_master_tcp.c similarity index 100% rename from components/freemodbus/common/esp_modbus_master_tcp.c rename to freemodbus/common/esp_modbus_master_tcp.c diff --git a/components/freemodbus/common/esp_modbus_slave.c b/freemodbus/common/esp_modbus_slave.c similarity index 100% rename from components/freemodbus/common/esp_modbus_slave.c rename to freemodbus/common/esp_modbus_slave.c diff --git a/components/freemodbus/common/esp_modbus_slave_serial.c b/freemodbus/common/esp_modbus_slave_serial.c similarity index 100% rename from components/freemodbus/common/esp_modbus_slave_serial.c rename to freemodbus/common/esp_modbus_slave_serial.c diff --git a/components/freemodbus/common/esp_modbus_slave_tcp.c b/freemodbus/common/esp_modbus_slave_tcp.c similarity index 100% rename from components/freemodbus/common/esp_modbus_slave_tcp.c rename to freemodbus/common/esp_modbus_slave_tcp.c diff --git a/components/freemodbus/common/include/esp_modbus_common.h b/freemodbus/common/include/esp_modbus_common.h similarity index 100% rename from components/freemodbus/common/include/esp_modbus_common.h rename to freemodbus/common/include/esp_modbus_common.h diff --git a/components/freemodbus/common/include/esp_modbus_master.h b/freemodbus/common/include/esp_modbus_master.h similarity index 100% rename from components/freemodbus/common/include/esp_modbus_master.h rename to freemodbus/common/include/esp_modbus_master.h diff --git a/components/freemodbus/common/include/esp_modbus_slave.h b/freemodbus/common/include/esp_modbus_slave.h similarity index 100% rename from components/freemodbus/common/include/esp_modbus_slave.h rename to freemodbus/common/include/esp_modbus_slave.h diff --git a/components/freemodbus/common/include/mbcontroller.h b/freemodbus/common/include/mbcontroller.h similarity index 100% rename from components/freemodbus/common/include/mbcontroller.h rename to freemodbus/common/include/mbcontroller.h diff --git a/components/freemodbus/common/mbc_master.h b/freemodbus/common/mbc_master.h similarity index 100% rename from components/freemodbus/common/mbc_master.h rename to freemodbus/common/mbc_master.h diff --git a/components/freemodbus/common/mbc_slave.h b/freemodbus/common/mbc_slave.h similarity index 100% rename from components/freemodbus/common/mbc_slave.h rename to freemodbus/common/mbc_slave.h diff --git a/components/freemodbus/modbus/ascii/mbascii.c b/freemodbus/modbus/ascii/mbascii.c similarity index 100% rename from components/freemodbus/modbus/ascii/mbascii.c rename to freemodbus/modbus/ascii/mbascii.c diff --git a/components/freemodbus/modbus/ascii/mbascii.h b/freemodbus/modbus/ascii/mbascii.h similarity index 100% rename from components/freemodbus/modbus/ascii/mbascii.h rename to freemodbus/modbus/ascii/mbascii.h diff --git a/components/freemodbus/modbus/ascii/mbascii_m.c b/freemodbus/modbus/ascii/mbascii_m.c similarity index 100% rename from components/freemodbus/modbus/ascii/mbascii_m.c rename to freemodbus/modbus/ascii/mbascii_m.c diff --git a/components/freemodbus/modbus/functions/mbfunccoils.c b/freemodbus/modbus/functions/mbfunccoils.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfunccoils.c rename to freemodbus/modbus/functions/mbfunccoils.c diff --git a/components/freemodbus/modbus/functions/mbfunccoils_m.c b/freemodbus/modbus/functions/mbfunccoils_m.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfunccoils_m.c rename to freemodbus/modbus/functions/mbfunccoils_m.c diff --git a/components/freemodbus/modbus/functions/mbfuncdiag.c b/freemodbus/modbus/functions/mbfuncdiag.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncdiag.c rename to freemodbus/modbus/functions/mbfuncdiag.c diff --git a/components/freemodbus/modbus/functions/mbfuncdisc.c b/freemodbus/modbus/functions/mbfuncdisc.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncdisc.c rename to freemodbus/modbus/functions/mbfuncdisc.c diff --git a/components/freemodbus/modbus/functions/mbfuncdisc_m.c b/freemodbus/modbus/functions/mbfuncdisc_m.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncdisc_m.c rename to freemodbus/modbus/functions/mbfuncdisc_m.c diff --git a/components/freemodbus/modbus/functions/mbfuncholding.c b/freemodbus/modbus/functions/mbfuncholding.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncholding.c rename to freemodbus/modbus/functions/mbfuncholding.c diff --git a/components/freemodbus/modbus/functions/mbfuncholding_m.c b/freemodbus/modbus/functions/mbfuncholding_m.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncholding_m.c rename to freemodbus/modbus/functions/mbfuncholding_m.c diff --git a/components/freemodbus/modbus/functions/mbfuncinput.c b/freemodbus/modbus/functions/mbfuncinput.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncinput.c rename to freemodbus/modbus/functions/mbfuncinput.c diff --git a/components/freemodbus/modbus/functions/mbfuncinput_m.c b/freemodbus/modbus/functions/mbfuncinput_m.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncinput_m.c rename to freemodbus/modbus/functions/mbfuncinput_m.c diff --git a/components/freemodbus/modbus/functions/mbfuncother.c b/freemodbus/modbus/functions/mbfuncother.c similarity index 100% rename from components/freemodbus/modbus/functions/mbfuncother.c rename to freemodbus/modbus/functions/mbfuncother.c diff --git a/components/freemodbus/modbus/functions/mbutils.c b/freemodbus/modbus/functions/mbutils.c similarity index 100% rename from components/freemodbus/modbus/functions/mbutils.c rename to freemodbus/modbus/functions/mbutils.c diff --git a/components/freemodbus/modbus/include/mb.h b/freemodbus/modbus/include/mb.h similarity index 100% rename from components/freemodbus/modbus/include/mb.h rename to freemodbus/modbus/include/mb.h diff --git a/components/freemodbus/modbus/include/mb_m.h b/freemodbus/modbus/include/mb_m.h similarity index 100% rename from components/freemodbus/modbus/include/mb_m.h rename to freemodbus/modbus/include/mb_m.h diff --git a/components/freemodbus/modbus/include/mbconfig.h b/freemodbus/modbus/include/mbconfig.h similarity index 100% rename from components/freemodbus/modbus/include/mbconfig.h rename to freemodbus/modbus/include/mbconfig.h diff --git a/components/freemodbus/modbus/include/mbframe.h b/freemodbus/modbus/include/mbframe.h similarity index 100% rename from components/freemodbus/modbus/include/mbframe.h rename to freemodbus/modbus/include/mbframe.h diff --git a/components/freemodbus/modbus/include/mbfunc.h b/freemodbus/modbus/include/mbfunc.h similarity index 100% rename from components/freemodbus/modbus/include/mbfunc.h rename to freemodbus/modbus/include/mbfunc.h diff --git a/components/freemodbus/modbus/include/mbport.h b/freemodbus/modbus/include/mbport.h similarity index 100% rename from components/freemodbus/modbus/include/mbport.h rename to freemodbus/modbus/include/mbport.h diff --git a/components/freemodbus/modbus/include/mbproto.h b/freemodbus/modbus/include/mbproto.h similarity index 100% rename from components/freemodbus/modbus/include/mbproto.h rename to freemodbus/modbus/include/mbproto.h diff --git a/components/freemodbus/modbus/include/mbutils.h b/freemodbus/modbus/include/mbutils.h similarity index 100% rename from components/freemodbus/modbus/include/mbutils.h rename to freemodbus/modbus/include/mbutils.h diff --git a/components/freemodbus/modbus/mb.c b/freemodbus/modbus/mb.c similarity index 100% rename from components/freemodbus/modbus/mb.c rename to freemodbus/modbus/mb.c diff --git a/components/freemodbus/modbus/mb_m.c b/freemodbus/modbus/mb_m.c similarity index 100% rename from components/freemodbus/modbus/mb_m.c rename to freemodbus/modbus/mb_m.c diff --git a/components/freemodbus/modbus/rtu/mbcrc.c b/freemodbus/modbus/rtu/mbcrc.c similarity index 100% rename from components/freemodbus/modbus/rtu/mbcrc.c rename to freemodbus/modbus/rtu/mbcrc.c diff --git a/components/freemodbus/modbus/rtu/mbcrc.h b/freemodbus/modbus/rtu/mbcrc.h similarity index 100% rename from components/freemodbus/modbus/rtu/mbcrc.h rename to freemodbus/modbus/rtu/mbcrc.h diff --git a/components/freemodbus/modbus/rtu/mbrtu.c b/freemodbus/modbus/rtu/mbrtu.c similarity index 100% rename from components/freemodbus/modbus/rtu/mbrtu.c rename to freemodbus/modbus/rtu/mbrtu.c diff --git a/components/freemodbus/modbus/rtu/mbrtu.h b/freemodbus/modbus/rtu/mbrtu.h similarity index 100% rename from components/freemodbus/modbus/rtu/mbrtu.h rename to freemodbus/modbus/rtu/mbrtu.h diff --git a/components/freemodbus/modbus/rtu/mbrtu_m.c b/freemodbus/modbus/rtu/mbrtu_m.c similarity index 100% rename from components/freemodbus/modbus/rtu/mbrtu_m.c rename to freemodbus/modbus/rtu/mbrtu_m.c diff --git a/components/freemodbus/modbus/tcp/mbtcp.c b/freemodbus/modbus/tcp/mbtcp.c similarity index 100% rename from components/freemodbus/modbus/tcp/mbtcp.c rename to freemodbus/modbus/tcp/mbtcp.c diff --git a/components/freemodbus/modbus/tcp/mbtcp.h b/freemodbus/modbus/tcp/mbtcp.h similarity index 100% rename from components/freemodbus/modbus/tcp/mbtcp.h rename to freemodbus/modbus/tcp/mbtcp.h diff --git a/components/freemodbus/modbus/tcp/mbtcp_m.c b/freemodbus/modbus/tcp/mbtcp_m.c similarity index 100% rename from components/freemodbus/modbus/tcp/mbtcp_m.c rename to freemodbus/modbus/tcp/mbtcp_m.c diff --git a/components/freemodbus/modbus/tcp/mbtcp_m.h b/freemodbus/modbus/tcp/mbtcp_m.h similarity index 100% rename from components/freemodbus/modbus/tcp/mbtcp_m.h rename to freemodbus/modbus/tcp/mbtcp_m.h diff --git a/components/freemodbus/port/port.c b/freemodbus/port/port.c similarity index 100% rename from components/freemodbus/port/port.c rename to freemodbus/port/port.c diff --git a/components/freemodbus/port/port.h b/freemodbus/port/port.h similarity index 100% rename from components/freemodbus/port/port.h rename to freemodbus/port/port.h diff --git a/components/freemodbus/port/portevent.c b/freemodbus/port/portevent.c similarity index 100% rename from components/freemodbus/port/portevent.c rename to freemodbus/port/portevent.c diff --git a/components/freemodbus/port/portevent_m.c b/freemodbus/port/portevent_m.c similarity index 100% rename from components/freemodbus/port/portevent_m.c rename to freemodbus/port/portevent_m.c diff --git a/components/freemodbus/port/portother.c b/freemodbus/port/portother.c similarity index 100% rename from components/freemodbus/port/portother.c rename to freemodbus/port/portother.c diff --git a/components/freemodbus/port/portother_m.c b/freemodbus/port/portother_m.c similarity index 100% rename from components/freemodbus/port/portother_m.c rename to freemodbus/port/portother_m.c diff --git a/components/freemodbus/port/portserial.c b/freemodbus/port/portserial.c similarity index 100% rename from components/freemodbus/port/portserial.c rename to freemodbus/port/portserial.c diff --git a/components/freemodbus/port/portserial_m.c b/freemodbus/port/portserial_m.c similarity index 100% rename from components/freemodbus/port/portserial_m.c rename to freemodbus/port/portserial_m.c diff --git a/components/freemodbus/port/porttimer.c b/freemodbus/port/porttimer.c similarity index 100% rename from components/freemodbus/port/porttimer.c rename to freemodbus/port/porttimer.c diff --git a/components/freemodbus/port/porttimer_m.c b/freemodbus/port/porttimer_m.c similarity index 100% rename from components/freemodbus/port/porttimer_m.c rename to freemodbus/port/porttimer_m.c diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c b/freemodbus/serial_master/modbus_controller/mbc_serial_master.c similarity index 100% rename from components/freemodbus/serial_master/modbus_controller/mbc_serial_master.c rename to freemodbus/serial_master/modbus_controller/mbc_serial_master.c diff --git a/components/freemodbus/serial_master/modbus_controller/mbc_serial_master.h b/freemodbus/serial_master/modbus_controller/mbc_serial_master.h similarity index 100% rename from components/freemodbus/serial_master/modbus_controller/mbc_serial_master.h rename to freemodbus/serial_master/modbus_controller/mbc_serial_master.h diff --git a/components/freemodbus/serial_master/port/port_serial_master.h b/freemodbus/serial_master/port/port_serial_master.h similarity index 100% rename from components/freemodbus/serial_master/port/port_serial_master.h rename to freemodbus/serial_master/port/port_serial_master.h diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c b/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c similarity index 100% rename from components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c rename to freemodbus/serial_slave/modbus_controller/mbc_serial_slave.c diff --git a/components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h b/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h similarity index 100% rename from components/freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h rename to freemodbus/serial_slave/modbus_controller/mbc_serial_slave.h diff --git a/components/freemodbus/serial_slave/port/port_serial_slave.h b/freemodbus/serial_slave/port/port_serial_slave.h similarity index 100% rename from components/freemodbus/serial_slave/port/port_serial_slave.h rename to freemodbus/serial_slave/port/port_serial_slave.h diff --git a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c b/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c similarity index 100% rename from components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c rename to freemodbus/tcp_master/modbus_controller/mbc_tcp_master.c diff --git a/components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h b/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h similarity index 100% rename from components/freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h rename to freemodbus/tcp_master/modbus_controller/mbc_tcp_master.h diff --git a/components/freemodbus/tcp_master/port/port_tcp_master.c b/freemodbus/tcp_master/port/port_tcp_master.c similarity index 100% rename from components/freemodbus/tcp_master/port/port_tcp_master.c rename to freemodbus/tcp_master/port/port_tcp_master.c diff --git a/components/freemodbus/tcp_master/port/port_tcp_master.h b/freemodbus/tcp_master/port/port_tcp_master.h similarity index 100% rename from components/freemodbus/tcp_master/port/port_tcp_master.h rename to freemodbus/tcp_master/port/port_tcp_master.h diff --git a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c b/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c similarity index 100% rename from components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c rename to freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.c diff --git a/components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h b/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h similarity index 100% rename from components/freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h rename to freemodbus/tcp_slave/modbus_controller/mbc_tcp_slave.h diff --git a/components/freemodbus/tcp_slave/port/port_tcp_slave.c b/freemodbus/tcp_slave/port/port_tcp_slave.c similarity index 100% rename from components/freemodbus/tcp_slave/port/port_tcp_slave.c rename to freemodbus/tcp_slave/port/port_tcp_slave.c diff --git a/components/freemodbus/tcp_slave/port/port_tcp_slave.h b/freemodbus/tcp_slave/port/port_tcp_slave.h similarity index 100% rename from components/freemodbus/tcp_slave/port/port_tcp_slave.h rename to freemodbus/tcp_slave/port/port_tcp_slave.h diff --git a/components/freemodbus/sdkconfig.rename b/sdkconfig.rename similarity index 100% rename from components/freemodbus/sdkconfig.rename rename to sdkconfig.rename diff --git a/examples/protocols/modbus/mb_example_common/CMakeLists.txt b/test/mb_example_common/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/mb_example_common/CMakeLists.txt rename to test/mb_example_common/CMakeLists.txt diff --git a/examples/protocols/modbus/mb_example_common/README.md b/test/mb_example_common/README.md similarity index 100% rename from examples/protocols/modbus/mb_example_common/README.md rename to test/mb_example_common/README.md diff --git a/examples/protocols/modbus/mb_example_common/include/modbus_params.h b/test/mb_example_common/include/modbus_params.h similarity index 100% rename from examples/protocols/modbus/mb_example_common/include/modbus_params.h rename to test/mb_example_common/include/modbus_params.h diff --git a/examples/protocols/modbus/mb_example_common/modbus_params.c b/test/mb_example_common/modbus_params.c similarity index 100% rename from examples/protocols/modbus/mb_example_common/modbus_params.c rename to test/mb_example_common/modbus_params.c diff --git a/examples/protocols/modbus/serial/mb_master/CMakeLists.txt b/test/serial/mb_serial_master/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/serial/mb_master/CMakeLists.txt rename to test/serial/mb_serial_master/CMakeLists.txt diff --git a/examples/protocols/modbus/serial/mb_master/README.md b/test/serial/mb_serial_master/README.md similarity index 100% rename from examples/protocols/modbus/serial/mb_master/README.md rename to test/serial/mb_serial_master/README.md diff --git a/examples/protocols/modbus/serial/mb_master/main/CMakeLists.txt b/test/serial/mb_serial_master/main/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/serial/mb_master/main/CMakeLists.txt rename to test/serial/mb_serial_master/main/CMakeLists.txt diff --git a/examples/protocols/modbus/serial/mb_master/main/Kconfig.projbuild b/test/serial/mb_serial_master/main/Kconfig.projbuild similarity index 100% rename from examples/protocols/modbus/serial/mb_master/main/Kconfig.projbuild rename to test/serial/mb_serial_master/main/Kconfig.projbuild diff --git a/examples/protocols/modbus/serial/mb_master/main/master.c b/test/serial/mb_serial_master/main/master.c similarity index 100% rename from examples/protocols/modbus/serial/mb_master/main/master.c rename to test/serial/mb_serial_master/main/master.c diff --git a/examples/protocols/modbus/serial/mb_master/sdkconfig.defaults b/test/serial/mb_serial_master/sdkconfig.defaults similarity index 100% rename from examples/protocols/modbus/serial/mb_master/sdkconfig.defaults rename to test/serial/mb_serial_master/sdkconfig.defaults diff --git a/examples/protocols/modbus/serial/mb_slave/CMakeLists.txt b/test/serial/mb_serial_slave/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/CMakeLists.txt rename to test/serial/mb_serial_slave/CMakeLists.txt diff --git a/examples/protocols/modbus/serial/mb_slave/README.md b/test/serial/mb_serial_slave/README.md similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/README.md rename to test/serial/mb_serial_slave/README.md diff --git a/examples/protocols/modbus/serial/mb_slave/main/CMakeLists.txt b/test/serial/mb_serial_slave/main/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/main/CMakeLists.txt rename to test/serial/mb_serial_slave/main/CMakeLists.txt diff --git a/examples/protocols/modbus/serial/mb_slave/main/Kconfig.projbuild b/test/serial/mb_serial_slave/main/Kconfig.projbuild similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/main/Kconfig.projbuild rename to test/serial/mb_serial_slave/main/Kconfig.projbuild diff --git a/examples/protocols/modbus/serial/mb_slave/main/slave.c b/test/serial/mb_serial_slave/main/slave.c similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/main/slave.c rename to test/serial/mb_serial_slave/main/slave.c diff --git a/examples/protocols/modbus/serial/mb_slave/sdkconfig.defaults b/test/serial/mb_serial_slave/sdkconfig.defaults similarity index 100% rename from examples/protocols/modbus/serial/mb_slave/sdkconfig.defaults rename to test/serial/mb_serial_slave/sdkconfig.defaults diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/CMakeLists.txt b/test/tcp/mb_tcp_master/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/CMakeLists.txt rename to test/tcp/mb_tcp_master/CMakeLists.txt diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/README.md b/test/tcp/mb_tcp_master/README.md similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/README.md rename to test/tcp/mb_tcp_master/README.md diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/main/CMakeLists.txt b/test/tcp/mb_tcp_master/main/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/main/CMakeLists.txt rename to test/tcp/mb_tcp_master/main/CMakeLists.txt diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/main/Kconfig.projbuild b/test/tcp/mb_tcp_master/main/Kconfig.projbuild similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/main/Kconfig.projbuild rename to test/tcp/mb_tcp_master/main/Kconfig.projbuild diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/main/tcp_master.c b/test/tcp/mb_tcp_master/main/tcp_master.c similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/main/tcp_master.c rename to test/tcp/mb_tcp_master/main/tcp_master.c diff --git a/examples/protocols/modbus/tcp/mb_tcp_master/sdkconfig.defaults b/test/tcp/mb_tcp_master/sdkconfig.defaults similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_master/sdkconfig.defaults rename to test/tcp/mb_tcp_master/sdkconfig.defaults diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/CMakeLists.txt b/test/tcp/mb_tcp_slave/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/CMakeLists.txt rename to test/tcp/mb_tcp_slave/CMakeLists.txt diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/README.md b/test/tcp/mb_tcp_slave/README.md similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/README.md rename to test/tcp/mb_tcp_slave/README.md diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/main/CMakeLists.txt b/test/tcp/mb_tcp_slave/main/CMakeLists.txt similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/main/CMakeLists.txt rename to test/tcp/mb_tcp_slave/main/CMakeLists.txt diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/main/Kconfig.projbuild b/test/tcp/mb_tcp_slave/main/Kconfig.projbuild similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/main/Kconfig.projbuild rename to test/tcp/mb_tcp_slave/main/Kconfig.projbuild diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/main/tcp_slave.c b/test/tcp/mb_tcp_slave/main/tcp_slave.c similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/main/tcp_slave.c rename to test/tcp/mb_tcp_slave/main/tcp_slave.c diff --git a/examples/protocols/modbus/tcp/mb_tcp_slave/sdkconfig.defaults b/test/tcp/mb_tcp_slave/sdkconfig.defaults similarity index 100% rename from examples/protocols/modbus/tcp/mb_tcp_slave/sdkconfig.defaults rename to test/tcp/mb_tcp_slave/sdkconfig.defaults