summaryrefslogtreecommitdiff
path: root/include/py/homekit/pio
diff options
context:
space:
mode:
authorEvgeny Zinoviev <me@ch1p.io>2024-02-17 03:08:25 +0300
committerEvgeny Zinoviev <me@ch1p.io>2024-02-17 03:08:25 +0300
commit0ce2e41a2bad790c5232fafb4b6ed631ca8cd957 (patch)
treefd401495b87cae8c95a4c4edf2c851c8177b6069 /include/py/homekit/pio
parente9fc2c1835f7ac8e072919df81a6661c6308dea9 (diff)
parentb7f1d55c9b4de4d21b11e5615a5dc8be0d4e883c (diff)
merge with master
Diffstat (limited to 'include/py/homekit/pio')
-rw-r--r--include/py/homekit/pio/__init__.py1
-rw-r--r--include/py/homekit/pio/exceptions.py2
-rw-r--r--include/py/homekit/pio/products.py125
3 files changed, 128 insertions, 0 deletions
diff --git a/include/py/homekit/pio/__init__.py b/include/py/homekit/pio/__init__.py
new file mode 100644
index 0000000..7216bc4
--- /dev/null
+++ b/include/py/homekit/pio/__init__.py
@@ -0,0 +1 @@
+from .products import get_products, platformio_ini \ No newline at end of file
diff --git a/include/py/homekit/pio/exceptions.py b/include/py/homekit/pio/exceptions.py
new file mode 100644
index 0000000..a6afd20
--- /dev/null
+++ b/include/py/homekit/pio/exceptions.py
@@ -0,0 +1,2 @@
+class ProductConfigNotFoundError(Exception):
+ pass
diff --git a/include/py/homekit/pio/products.py b/include/py/homekit/pio/products.py
new file mode 100644
index 0000000..3d5034f
--- /dev/null
+++ b/include/py/homekit/pio/products.py
@@ -0,0 +1,125 @@
+import os
+import logging
+
+from io import StringIO
+from collections import OrderedDict
+from ..mqtt import MqttNodesConfig
+
+
+_logger = logging.getLogger(__name__)
+_products_dir = os.path.join(
+ os.path.dirname(__file__),
+ '..', '..', '..', '..',
+ 'pio'
+)
+
+
+def get_products():
+ products = []
+ for f in os.listdir(_products_dir):
+ if f in ('common',):
+ continue
+
+ if os.path.isdir(os.path.join(_products_dir, f)):
+ products.append(f)
+
+ return products
+
+
+def platformio_ini(product_config: dict,
+ target: str,
+ # node_id: str,
+ build_specific_defines: dict,
+ build_specific_defines_enums: list[str],
+ platform: str,
+ framework: str = 'arduino',
+ upload_port: str = '/dev/ttyUSB0',
+ monitor_speed: int = 115200,
+ debug=False,
+ debug_network=False) -> str:
+ node_id = build_specific_defines['CONFIG_NODE_ID']
+ if node_id not in MqttNodesConfig().get_nodes().keys():
+ raise ValueError(f'node id "{node_id}" is not specified in the config!')
+
+ try:
+ node_defines = MqttNodesConfig().get_node(node_id)['defines']
+ except KeyError:
+ node_defines = None
+
+ # defines
+ defines = {
+ **product_config['common_defines'],
+ 'CONFIG_NODE_ID': node_id,
+ 'CONFIG_WIFI_AP_SSID': ('HK_'+node_id)[:31]
+ }
+ try:
+ defines.update(product_config['target_defines'][target])
+ except KeyError:
+ pass
+ defines['CONFIG_NODE_SECRET_SIZE'] = len(defines['CONFIG_NODE_SECRET'])
+ defines['CONFIG_MQTT_CLIENT_ID'] = node_id
+
+ build_type = 'release'
+ if debug:
+ defines['DEBUG'] = True
+ build_type = 'debug'
+ if debug_network:
+ defines['DEBUG'] = True
+ defines['DEBUG_ESP_SSL'] = True
+ defines['DEBUG_ESP_PORT'] = 'Serial'
+ build_type = 'debug'
+ if build_specific_defines:
+ for k, v in build_specific_defines.items():
+ defines[k] = v
+ if node_defines:
+ defines = {**defines, **node_defines}
+ defines = OrderedDict(sorted(defines.items(), key=lambda t: t[0]))
+
+ # libs
+ libs = []
+ if 'common_libs' in product_config:
+ libs.extend(product_config['common_libs'])
+ if 'target_libs' in product_config and target in product_config['target_libs']:
+ libs.extend(product_config['target_libs'][target])
+ libs = list(set(libs))
+ libs.sort()
+
+ try:
+ target_real_name = product_config['target_board_names'][target]
+ except KeyError:
+ target_real_name = target
+
+ buf = StringIO()
+
+ buf.write('; Generated by pio_ini.py\n\n')
+ buf.write(f'[env:{target_real_name}]\n')
+ buf.write(f'platform = {platform}\n')
+ buf.write(f'board = {target_real_name}\n')
+ buf.write(f'framework = {framework}\n')
+ buf.write(f'upload_port = {upload_port}\n')
+ buf.write(f'monitor_speed = {monitor_speed}\n')
+ if libs:
+ buf.write(f'lib_deps =\n')
+ for lib in libs:
+ if lib.startswith('homekit_'):
+ lib = 'file://../../include/pio/libs/'+lib[8:]
+ buf.write(f' {lib}\n')
+ buf.write(f'build_flags =\n')
+ if defines:
+ for name, value in defines.items():
+ buf.write(f' -D{name}')
+ is_enum = name in build_specific_defines_enums
+ if type(value) is not bool:
+ buf.write('=')
+ if type(value) is str:
+ if not is_enum:
+ buf.write('"\\"')
+ value = value.replace('"', '\\"')
+ buf.write(f'{value}')
+ if type(value) is str and not is_enum:
+ buf.write('"\\"')
+ buf.write('\n')
+ buf.write(f' -I../../include/pio/include')
+ buf.write(f'\nbuild_type = {build_type}')
+
+ return buf.getvalue()