def includes(config): ret = [] for include in config.get(CONF_INCLUDES, []): path = CORE.relative_path(include) res = os.path.relpath(path, CORE.relative_build_path('src')) ret.append(u'#include "{}"'.format(res)) return ret
def write_cpp(code_s): path = CORE.relative_build_path('src', 'main.cpp') if os.path.isfile(path): try: with codecs.open(path, 'r', encoding='utf-8') as f_handle: text = f_handle.read() except OSError: raise pi4homeError(u"Could not read C++ file at {}".format(path)) prev_file = text code_format = find_begin_end(text, CPP_AUTO_GENERATE_BEGIN, CPP_AUTO_GENERATE_END) code_format_ = find_begin_end(code_format[0], CPP_INCLUDE_BEGIN, CPP_INCLUDE_END) code_format = (code_format_[0], code_format_[1], code_format[1]) else: prev_file = None mkdir_p(os.path.dirname(path)) code_format = CPP_BASE_FORMAT include_s = get_include_text() full_file = code_format[ 0] + CPP_INCLUDE_BEGIN + u'\n' + include_s + CPP_INCLUDE_END full_file += code_format[ 1] + CPP_AUTO_GENERATE_BEGIN + u'\n' + code_s + CPP_AUTO_GENERATE_END full_file += code_format[2] if prev_file == full_file: return with codecs.open(path, 'w+', encoding='utf-8') as f_handle: f_handle.write(full_file)
def write_platformio_project(): mkdir_p(CORE.build_path) platformio_ini = CORE.relative_build_path('platformio.ini') content = get_ini_content() write_gitignore() write_platformio_ini(content, platformio_ini)
def get_ini_content(): lib_deps = gather_lib_deps() build_flags = gather_build_flags() data = { 'platform': CORE.arduino_version, 'board': CORE.board, 'framework': 'arduino', 'lib_deps': lib_deps + ['${common.lib_deps}'], 'build_flags': build_flags + ['${common.build_flags}'], 'upload_speed': UPLOAD_SPEED_OVERRIDE.get(CORE.board, 115200), } if CORE.is_esp32: data['board_build.partitions'] = "partitions.csv" partitions_csv = CORE.relative_build_path('partitions.csv') if not os.path.isfile(partitions_csv): with open(partitions_csv, "w") as f: f.write("nvs, data, nvs, 0x009000, 0x005000,\n") f.write("otadata, data, ota, 0x00e000, 0x002000,\n") f.write("app0, app, ota_0, 0x010000, 0x190000,\n") f.write("app1, app, ota_1, 0x200000, 0x190000,\n") f.write("eeprom, data, 0x99, 0x390000, 0x001000,\n") f.write("spiffs, data, spiffs, 0x391000, 0x00F000\n") if CONF_BOARD_FLASH_MODE in CORE.config[CONF_PI4HOME]: flash_mode = CORE.config[CONF_PI4HOME][CONF_BOARD_FLASH_MODE] data['board_build.flash_mode'] = flash_mode if not CORE.config[CONF_PI4HOME][CONF_USE_CUSTOM_CODE]: # Ignore libraries that are not explicitly used, but may # be added by LDF data['lib_ldf_mode'] = 'chain' REMOVABLE_LIBRARIES = [ 'ArduinoOTA', 'Update', 'Wire', 'FastLED', 'NeoPixelBus', 'ESP Async WebServer', 'AsyncMqttClient', 'AsyncTCP', 'ESPAsyncTCP', ] ignore = [] for x in REMOVABLE_LIBRARIES: for o in lib_deps: if o.startswith(x): break else: ignore.append(x) if ignore: data['lib_ignore'] = ignore data.update(CORE.config[CONF_PI4HOME].get(CONF_PLATFORMIO_OPTIONS, {})) content = u'[env:{}]\n'.format(CORE.name) content += format_ini(data) return content
def symlink_pi4home_core_version(pi4home_core_version): lib_path = CORE.relative_build_path('lib') dst_path = CORE.relative_build_path('lib', 'pi4home-core') if CORE.is_local_pi4home_core_copy: src_path = CORE.relative_path(pi4home_core_version[CONF_LOCAL]) do_write = True if os.path.islink(dst_path): old_path = os.path.join(os.readlink(dst_path), lib_path) if old_path != lib_path: os.unlink(dst_path) else: do_write = False if do_write: mkdir_p(lib_path) symlink(src_path, dst_path) else: # Remove symlink when changing back from local version if os.path.islink(dst_path): os.unlink(dst_path)
def migrate_src_version_0_to_1(): main_cpp = CORE.relative_build_path('src', 'main.cpp') if not os.path.isfile(main_cpp): return with codecs.open(main_cpp, 'r', encoding='utf-8') as f_handle: content = orig_content = f_handle.read() if CPP_INCLUDE_BEGIN in content: return content, count = replace_file_content(content, r'\s*delay\((?:16|20)\);', '') if count != 0: _LOGGER.info("Migration: Removed %s occurrence of 'delay(16);' in %s", count, main_cpp) content, count = replace_file_content(content, r'using namespace pi4homelib;', '') if count != 0: _LOGGER.info( "Migration: Removed %s occurrence of 'using namespace pi4homelib;' " "in %s", count, main_cpp) if CPP_INCLUDE_BEGIN not in content: content, count = replace_file_content( content, r'#include "pi4homelib/application.h"', CPP_INCLUDE_BEGIN + u'\n' + CPP_INCLUDE_END) if count == 0: _LOGGER.error( "Migration failed. PI4Home 1.10.0 needs to have a new auto-generated " "include section in the %s file. Please remove %s and let it be " "auto-generated again.", main_cpp, main_cpp) _LOGGER.info("Migration: Added include section to %s", main_cpp) if orig_content == content: return with codecs.open(main_cpp, 'w', encoding='utf-8') as f_handle: f_handle.write(content)