mirror of
https://github.com/marcelstoer/nodemcu-pyflasher.git
synced 2025-07-27 13:16:36 +00:00
Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0f1b1099b6 | ||
![]() |
2d5daab9f1 | ||
![]() |
31584f693b | ||
![]() |
f22d7857a0 | ||
![]() |
2fbc40315d | ||
![]() |
eef9f3a58d | ||
![]() |
4899c16d4e | ||
![]() |
0122639652 | ||
![]() |
d742c2ff13 | ||
![]() |
d7c61bd814 | ||
![]() |
1887e38bb1 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
.idea/
|
.idea/
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
@ -83,6 +84,7 @@ celerybeat-schedule
|
|||||||
# virtualenv
|
# virtualenv
|
||||||
venv/
|
venv/
|
||||||
ENV/
|
ENV/
|
||||||
|
.venv
|
||||||
|
|
||||||
# Spyder project settings
|
# Spyder project settings
|
||||||
.spyderproject
|
.spyderproject
|
||||||
|
5
About.py
5
About.py
@ -2,6 +2,7 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import datetime
|
||||||
import os
|
import os
|
||||||
import wx
|
import wx
|
||||||
import wx.html
|
import wx.html
|
||||||
@ -36,7 +37,7 @@ class AboutDlg(wx.Dialog):
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>© 2019 Marcel Stör. Licensed under MIT.</p>
|
<p>© {2} Marcel Stör. Licensed under MIT.</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<wxp module="wx" class="Button">
|
<wxp module="wx" class="Button">
|
||||||
@ -54,7 +55,7 @@ class AboutDlg(wx.Dialog):
|
|||||||
html = HtmlWindow(self, wx.ID_ANY, size=(420, -1))
|
html = HtmlWindow(self, wx.ID_ANY, size=(420, -1))
|
||||||
if "gtk2" in wx.PlatformInfo or "gtk3" in wx.PlatformInfo:
|
if "gtk2" in wx.PlatformInfo or "gtk3" in wx.PlatformInfo:
|
||||||
html.SetStandardFonts()
|
html.SetStandardFonts()
|
||||||
txt = self.text.format(self._get_bundle_dir(), __version__)
|
txt = self.text.format(self._get_bundle_dir(), __version__, datetime.datetime.now().year)
|
||||||
html.SetPage(txt)
|
html.SetPage(txt)
|
||||||
ir = html.GetInternalRepresentation()
|
ir = html.GetInternalRepresentation()
|
||||||
html.SetSize((ir.GetWidth() + 25, ir.GetHeight() + 25))
|
html.SetSize((ir.GetWidth() + 25, ir.GetHeight() + 25))
|
||||||
|
44
Main.py
44
Main.py
@ -13,12 +13,12 @@ import json
|
|||||||
import images as images
|
import images as images
|
||||||
from serial import SerialException
|
from serial import SerialException
|
||||||
from serial.tools import list_ports
|
from serial.tools import list_ports
|
||||||
from esptool import ESPLoader
|
import locale
|
||||||
from esptool import NotImplementedInROMError
|
|
||||||
from esptool import FatalError
|
|
||||||
from argparse import Namespace
|
|
||||||
|
|
||||||
__version__ = "4.0"
|
# see https://discuss.wxpython.org/t/wxpython4-1-1-python3-8-locale-wxassertionerror/35168
|
||||||
|
locale.setlocale(locale.LC_ALL, 'C')
|
||||||
|
|
||||||
|
__version__ = "5.1.0"
|
||||||
__flash_help__ = '''
|
__flash_help__ = '''
|
||||||
<p>This setting is highly dependent on your device!<p>
|
<p>This setting is highly dependent on your device!<p>
|
||||||
<p>
|
<p>
|
||||||
@ -61,6 +61,11 @@ class RedirectText:
|
|||||||
# noinspection PyStatementEffect
|
# noinspection PyStatementEffect
|
||||||
None
|
None
|
||||||
|
|
||||||
|
# esptool >=3 handles output differently of the output stream is not a TTY
|
||||||
|
# noinspection PyMethodMayBeStatic
|
||||||
|
def isatty(self):
|
||||||
|
return True
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@ -83,6 +88,8 @@ class FlashingThread(threading.Thread):
|
|||||||
command.extend(["--baud", str(self._config.baud),
|
command.extend(["--baud", str(self._config.baud),
|
||||||
"--after", "no_reset",
|
"--after", "no_reset",
|
||||||
"write_flash",
|
"write_flash",
|
||||||
|
# https://github.com/espressif/esptool/issues/599
|
||||||
|
"--flash_size", "detect",
|
||||||
"--flash_mode", self._config.mode,
|
"--flash_mode", self._config.mode,
|
||||||
"0x00000", self._config.firmware_path])
|
"0x00000", self._config.firmware_path])
|
||||||
|
|
||||||
@ -200,6 +207,15 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
|
|
||||||
panel = wx.Panel(self)
|
panel = wx.Panel(self)
|
||||||
|
|
||||||
|
# Fix popup that never goes away.
|
||||||
|
def onHover(event):
|
||||||
|
global hovered
|
||||||
|
if(len(hovered) != 0 ):
|
||||||
|
hovered[0].Dismiss()
|
||||||
|
hovered = []
|
||||||
|
|
||||||
|
panel.Bind(wx.EVT_MOTION,onHover)
|
||||||
|
|
||||||
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
fgs = wx.FlexGridSizer(7, 2, 10, 10)
|
fgs = wx.FlexGridSizer(7, 2, 10, 10)
|
||||||
@ -207,9 +223,8 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
self.choice = wx.Choice(panel, choices=self._get_serial_ports())
|
self.choice = wx.Choice(panel, choices=self._get_serial_ports())
|
||||||
self.choice.Bind(wx.EVT_CHOICE, on_select_port)
|
self.choice.Bind(wx.EVT_CHOICE, on_select_port)
|
||||||
self._select_configured_port()
|
self._select_configured_port()
|
||||||
bmp = images.Reload.GetBitmap()
|
|
||||||
reload_button = wx.BitmapButton(panel, id=wx.ID_ANY, bitmap=bmp,
|
reload_button = wx.Button(panel, label="Reload")
|
||||||
size=(bmp.GetWidth() + 7, bmp.GetHeight() + 7))
|
|
||||||
reload_button.Bind(wx.EVT_BUTTON, on_reload)
|
reload_button.Bind(wx.EVT_BUTTON, on_reload)
|
||||||
reload_button.SetToolTip("Reload serial device list")
|
reload_button.SetToolTip("Reload serial device list")
|
||||||
|
|
||||||
@ -218,8 +233,7 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
|
|
||||||
serial_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
serial_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
serial_boxsizer.Add(self.choice, 1, wx.EXPAND)
|
serial_boxsizer.Add(self.choice, 1, wx.EXPAND)
|
||||||
serial_boxsizer.AddStretchSpacer(0)
|
serial_boxsizer.Add(reload_button, flag=wx.LEFT, border=10)
|
||||||
serial_boxsizer.Add(reload_button, 0, wx.ALIGN_RIGHT, 20)
|
|
||||||
|
|
||||||
baud_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
baud_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
@ -282,6 +296,8 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
flashmode_label = wx.StaticText(panel, label="Flash mode")
|
flashmode_label = wx.StaticText(panel, label="Flash mode")
|
||||||
|
|
||||||
def on_info_hover(event):
|
def on_info_hover(event):
|
||||||
|
global hovered
|
||||||
|
if(len(hovered) == 0):
|
||||||
from HtmlPopupTransientWindow import HtmlPopupTransientWindow
|
from HtmlPopupTransientWindow import HtmlPopupTransientWindow
|
||||||
win = HtmlPopupTransientWindow(self, wx.SIMPLE_BORDER, __flash_help__, "#FFB6C1", (410, 140))
|
win = HtmlPopupTransientWindow(self, wx.SIMPLE_BORDER, __flash_help__, "#FFB6C1", (410, 140))
|
||||||
|
|
||||||
@ -291,6 +307,8 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
win.Position(image_position, (0, image_size[1]))
|
win.Position(image_position, (0, image_size[1]))
|
||||||
|
|
||||||
win.Popup()
|
win.Popup()
|
||||||
|
hovered = [win]
|
||||||
|
|
||||||
|
|
||||||
icon = wx.StaticBitmap(panel, wx.ID_ANY, images.Info.GetBitmap())
|
icon = wx.StaticBitmap(panel, wx.ID_ANY, images.Info.GetBitmap())
|
||||||
icon.Bind(wx.EVT_MOTION, on_info_hover)
|
icon.Bind(wx.EVT_MOTION, on_info_hover)
|
||||||
@ -298,7 +316,7 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
flashmode_label_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
flashmode_label_boxsizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
flashmode_label_boxsizer.Add(flashmode_label, 1, wx.EXPAND)
|
flashmode_label_boxsizer.Add(flashmode_label, 1, wx.EXPAND)
|
||||||
flashmode_label_boxsizer.AddStretchSpacer(0)
|
flashmode_label_boxsizer.AddStretchSpacer(0)
|
||||||
flashmode_label_boxsizer.Add(icon, 0, wx.ALIGN_RIGHT, 20)
|
flashmode_label_boxsizer.Add(icon)
|
||||||
|
|
||||||
erase_label = wx.StaticText(panel, label="Erase flash")
|
erase_label = wx.StaticText(panel, label="Erase flash")
|
||||||
console_label = wx.StaticText(panel, label="Console")
|
console_label = wx.StaticText(panel, label="Console")
|
||||||
@ -386,6 +404,8 @@ class NodeMcuFlasher(wx.Frame):
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
class MySplashScreen(wx.adv.SplashScreen):
|
class MySplashScreen(wx.adv.SplashScreen):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
global hovered
|
||||||
|
hovered = []
|
||||||
wx.adv.SplashScreen.__init__(self, images.Splash.GetBitmap(),
|
wx.adv.SplashScreen.__init__(self, images.Splash.GetBitmap(),
|
||||||
wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT, 2500, None, -1)
|
wx.adv.SPLASH_CENTRE_ON_SCREEN | wx.adv.SPLASH_TIMEOUT, 2500, None, -1)
|
||||||
self.Bind(wx.EVT_CLOSE, self._on_close)
|
self.Bind(wx.EVT_CLOSE, self._on_close)
|
||||||
@ -415,6 +435,8 @@ class MySplashScreen(wx.adv.SplashScreen):
|
|||||||
# ----------------------------------------------------------------------------
|
# ----------------------------------------------------------------------------
|
||||||
class App(wx.App, wx.lib.mixins.inspection.InspectionMixin):
|
class App(wx.App, wx.lib.mixins.inspection.InspectionMixin):
|
||||||
def OnInit(self):
|
def OnInit(self):
|
||||||
|
# see https://discuss.wxpython.org/t/wxpython4-1-1-python3-8-locale-wxassertionerror/35168
|
||||||
|
self.ResetLocale()
|
||||||
wx.SystemOptions.SetOption("mac.window-plain-transition", 1)
|
wx.SystemOptions.SetOption("mac.window-plain-transition", 1)
|
||||||
self.SetAppName("NodeMCU PyFlasher")
|
self.SetAppName("NodeMCU PyFlasher")
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
# NodeMCU PyFlasher
|
# NodeMCU PyFlasher
|
||||||
[](https://github.com/marcelstoer/nodemcu-pyflasher/blob/master/LICENSE)
|
[](https://github.com/marcelstoer/nodemcu-pyflasher/blob/master/LICENSE)
|
||||||
[](https://github.com/marcelstoer/nodemcu-pyflasher/releases)
|
[](https://github.com/marcelstoer/nodemcu-pyflasher/releases)
|
||||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HFN4ZMET5XS2Q)
|
[](https://github.com/marcelstoer/nodemcu-pyflasher/releases)
|
||||||
[](https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fmarcelstoer%2Fnodemcu-pyflasher)
|
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HFN4ZMET5XS2Q)
|
||||||
[](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fgithub.com%2Fmarcelstoer%2Fnodemcu-pyflasher)
|
|
||||||
|
|
||||||
Self-contained [NodeMCU](https://github.com/nodemcu/nodemcu-firmware) flasher with GUI based on [esptool.py](https://github.com/espressif/esptool) and [wxPython](https://www.wxpython.org/).
|
Self-contained [NodeMCU](https://github.com/nodemcu/nodemcu-firmware) flasher with GUI based on [esptool.py](https://github.com/espressif/esptool) and [wxPython](https://www.wxpython.org/).
|
||||||
|
|
||||||
|
@ -1,30 +1,60 @@
|
|||||||
# -*- mode: python -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
|
|
||||||
block_cipher = None
|
import os
|
||||||
|
|
||||||
a = Analysis(['nodemcu-pyflasher.py'],
|
# We need to add the flasher stub JSON files explicitly: https://github.com/espressif/esptool/issues/1059
|
||||||
binaries=None,
|
venv_python_folder_name = next(d for d in os.listdir('./.venv/lib') if d.startswith('python') and os.path.isdir(os.path.join('./.venv/lib', d)))
|
||||||
datas=[("images", "images")],
|
local_stub_flasher_path = "./.venv/lib/{}/site-packages/esptool/targets/stub_flasher".format(venv_python_folder_name)
|
||||||
|
|
||||||
|
a = Analysis(
|
||||||
|
['nodemcu-pyflasher.py'],
|
||||||
|
pathex=[],
|
||||||
|
binaries=[],
|
||||||
|
datas=[
|
||||||
|
("images", "images"),
|
||||||
|
("{}/1".format(local_stub_flasher_path), "./esptool/targets/stub_flasher/1"),
|
||||||
|
("{}/2".format(local_stub_flasher_path), "./esptool/targets/stub_flasher/2")
|
||||||
|
],
|
||||||
hiddenimports=[],
|
hiddenimports=[],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
|
hooksconfig={},
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
excludes=[],
|
excludes=[],
|
||||||
win_no_prefer_redirects=False,
|
noarchive=False,
|
||||||
win_private_assemblies=False,
|
optimize=0,
|
||||||
cipher=block_cipher)
|
)
|
||||||
pyz = PYZ(a.pure, a.zipped_data,
|
pyz = PYZ(a.pure)
|
||||||
cipher=block_cipher)
|
|
||||||
exe = EXE(pyz,
|
exe = EXE(
|
||||||
|
pyz,
|
||||||
a.scripts,
|
a.scripts,
|
||||||
a.binaries,
|
[],
|
||||||
a.zipfiles,
|
exclude_binaries=True,
|
||||||
a.datas,
|
name='NodeMCU PyFlasher',
|
||||||
name='NodeMCU-PyFlasher',
|
|
||||||
debug=False,
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
strip=False,
|
strip=False,
|
||||||
upx=True,
|
upx=True,
|
||||||
console=False , icon='images/icon-256.icns')
|
console=False,
|
||||||
app = BUNDLE(exe,
|
disable_windowed_traceback=False,
|
||||||
name='NodeMCU-PyFlasher-4.0.app',
|
argv_emulation=False,
|
||||||
icon='./images/icon-256.icns',
|
target_arch=None,
|
||||||
|
codesign_identity=None,
|
||||||
|
entitlements_file=None,
|
||||||
|
)
|
||||||
|
coll = COLLECT(
|
||||||
|
exe,
|
||||||
|
a.binaries,
|
||||||
|
a.datas,
|
||||||
|
strip=False,
|
||||||
|
upx=True,
|
||||||
|
upx_exclude=[],
|
||||||
|
name='NodeMCU PyFlasher',
|
||||||
|
icon='images/icon-256.icns'
|
||||||
|
)
|
||||||
|
app = BUNDLE(
|
||||||
|
coll,
|
||||||
|
name='NodeMCU PyFlasher.app',
|
||||||
|
version='5.1.0',
|
||||||
|
icon='images/icon-256.icns',
|
||||||
bundle_identifier='com.frightanic.nodemcu-pyflasher')
|
bundle_identifier='com.frightanic.nodemcu-pyflasher')
|
||||||
|
@ -1,26 +1,46 @@
|
|||||||
# -*- mode: python -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
|
|
||||||
block_cipher = None
|
# We need to add the flasher stub JSON files explicitly: https://github.com/espressif/esptool/issues/1059
|
||||||
|
local_stub_flasher_path = "./.venv/Lib/site-packages/esptool/targets/stub_flasher"
|
||||||
|
|
||||||
a = Analysis(['nodemcu-pyflasher.py'],
|
a = Analysis(
|
||||||
|
['nodemcu-pyflasher.py'],
|
||||||
|
pathex=[],
|
||||||
binaries=[],
|
binaries=[],
|
||||||
datas=[("images", "images")],
|
datas=[
|
||||||
|
("images", "images"),
|
||||||
|
("{}/1".format(local_stub_flasher_path), "./esptool/targets/stub_flasher/1"),
|
||||||
|
("{}/2".format(local_stub_flasher_path), "./esptool/targets/stub_flasher/2")
|
||||||
|
],
|
||||||
hiddenimports=[],
|
hiddenimports=[],
|
||||||
hookspath=[],
|
hookspath=[],
|
||||||
|
hooksconfig={},
|
||||||
runtime_hooks=[],
|
runtime_hooks=[],
|
||||||
excludes=[],
|
excludes=[],
|
||||||
win_no_prefer_redirects=False,
|
noarchive=False,
|
||||||
win_private_assemblies=False,
|
optimize=0,
|
||||||
cipher=block_cipher)
|
)
|
||||||
pyz = PYZ(a.pure, a.zipped_data,
|
pyz = PYZ(a.pure)
|
||||||
cipher=block_cipher)
|
|
||||||
exe = EXE(pyz,
|
exe = EXE(
|
||||||
|
pyz,
|
||||||
a.scripts,
|
a.scripts,
|
||||||
a.binaries,
|
a.binaries,
|
||||||
a.zipfiles,
|
|
||||||
a.datas,
|
a.datas,
|
||||||
name='NodeMCU-PyFlasher-4.0',
|
[],
|
||||||
|
name='NodeMCU-PyFlasher',
|
||||||
|
version='windows-version-info.txt',
|
||||||
debug=False,
|
debug=False,
|
||||||
|
bootloader_ignore_signals=False,
|
||||||
strip=False,
|
strip=False,
|
||||||
upx=True,
|
upx=True,
|
||||||
console=False , icon='images\\icon-256.ico')
|
upx_exclude=[],
|
||||||
|
runtime_tmpdir=None,
|
||||||
|
console=False,
|
||||||
|
icon='images\\icon-256.ico',
|
||||||
|
disable_windowed_traceback=False,
|
||||||
|
argv_emulation=False,
|
||||||
|
target_arch=None,
|
||||||
|
codesign_identity=None,
|
||||||
|
entitlements_file=None,
|
||||||
|
)
|
||||||
|
13
build.sh
13
build.sh
@ -1,12 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
#rm -fr build dist
|
# rm -fr build dist
|
||||||
VERSION=4.0
|
VERSION=5.1.0
|
||||||
NAME=NodeMCU-PyFlasher
|
NAME="NodeMCU PyFlasher"
|
||||||
|
DIST_NAME="NodeMCU-PyFlasher"
|
||||||
|
|
||||||
pyinstaller --log-level=DEBUG \
|
pyinstaller --log-level=DEBUG \
|
||||||
--noconfirm \
|
--noconfirm \
|
||||||
build-on-mac.spec
|
build-on-mac.spec
|
||||||
|
|
||||||
#https://github.com/sindresorhus/create-dmg
|
# https://github.com/sindresorhus/create-dmg
|
||||||
create-dmg dist/$NAME-$VERSION.app
|
create-dmg "dist/$NAME.app"
|
||||||
mv "$NAME-$VERSION 0.0.0.dmg" dist/$NAME-$VERSION.dmg
|
mv "$NAME $VERSION.dmg" "dist/$DIST_NAME.dmg"
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
If esptool.py is installed using python setup.py` from a checked out version it creates something like the following
|
|
||||||
in the Python environment
|
|
||||||
|
|
||||||
esptool.py file containing
|
|
||||||
|
|
||||||
#!/usr/local/opt/python/bin/python2.7
|
|
||||||
# EASY-INSTALL-SCRIPT: 'esptool==1.3.dev0','esptool.py'
|
|
||||||
__requires__ = 'esptool==1.3.dev0'
|
|
||||||
__import__('pkg_resources').run_script('esptool==1.3.dev0', 'esptool.py')
|
|
||||||
|
|
||||||
PyInstaller (and cx_Freeze) doesn't support pkg_resources and complains about 'ImportError: "No module named
|
|
||||||
pkg_resources"'. This can be avoided if the application maintains a local copy of esptool.py.
|
|
2959
esptool.py
2959
esptool.py
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,6 @@
|
|||||||
esptool==2.6
|
esptool==4.8.1
|
||||||
wxPython==4.0.4
|
pyserial~=3.5
|
||||||
PyInstaller==3.4
|
wxPython==4.2.2
|
||||||
|
PyInstaller==6.11.1
|
||||||
|
httplib2>=0.18.1
|
||||||
|
pyinstaller-versionfile>=2.0.0
|
||||||
|
9
windows-metadata.yaml
Normal file
9
windows-metadata.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# https://github.com/DudeNr33/pyinstaller-versionfile
|
||||||
|
# create-version-file windows-metadata.yaml --outfile windows-version-info.txt
|
||||||
|
Version: 5.1.0
|
||||||
|
CompanyName: Marcel Stör
|
||||||
|
FileDescription: NodeMCU PyFlasher
|
||||||
|
InternalName: NodeMCU PyFlasher
|
||||||
|
LegalCopyright: © Marcel Stör. All rights reserved.
|
||||||
|
OriginalFilename: NodeMCU-PyFlasher.exe
|
||||||
|
ProductName: NodeMCU PyFlasher
|
46
windows-version-info.txt
Normal file
46
windows-version-info.txt
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# GENERATED FILE. DO NOT EDIT. Created by running create-version-file windows-metadata.yaml --outfile windows-version-info.txt
|
||||||
|
#
|
||||||
|
# UTF-8
|
||||||
|
#
|
||||||
|
# For more details about fixed file info 'ffi' see:
|
||||||
|
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
|
||||||
|
|
||||||
|
VSVersionInfo(
|
||||||
|
ffi=FixedFileInfo(
|
||||||
|
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
|
||||||
|
# Set not needed items to zero 0. Must always contain 4 elements.
|
||||||
|
filevers=(5,1,0,0),
|
||||||
|
prodvers=(5,1,0,0),
|
||||||
|
# Contains a bitmask that specifies the valid bits 'flags'r
|
||||||
|
mask=0x3f,
|
||||||
|
# Contains a bitmask that specifies the Boolean attributes of the file.
|
||||||
|
flags=0x0,
|
||||||
|
# The operating system for which this file was designed.
|
||||||
|
# 0x4 - NT and there is no need to change it.
|
||||||
|
OS=0x40004,
|
||||||
|
# The general type of file.
|
||||||
|
# 0x1 - the file is an application.
|
||||||
|
fileType=0x1,
|
||||||
|
# The function of the file.
|
||||||
|
# 0x0 - the function is not defined for this fileType
|
||||||
|
subtype=0x0,
|
||||||
|
# Creation date and time stamp.
|
||||||
|
date=(0, 0)
|
||||||
|
),
|
||||||
|
kids=[
|
||||||
|
StringFileInfo(
|
||||||
|
[
|
||||||
|
StringTable(
|
||||||
|
u'040904B0',
|
||||||
|
[StringStruct(u'CompanyName', u'Marcel Stör'),
|
||||||
|
StringStruct(u'FileDescription', u'NodeMCU PyFlasher'),
|
||||||
|
StringStruct(u'FileVersion', u'5.1.0.0'),
|
||||||
|
StringStruct(u'InternalName', u'NodeMCU PyFlasher'),
|
||||||
|
StringStruct(u'LegalCopyright', u'© Marcel Stör. All rights reserved.'),
|
||||||
|
StringStruct(u'OriginalFilename', u'NodeMCU-PyFlasher.exe'),
|
||||||
|
StringStruct(u'ProductName', u'NodeMCU PyFlasher'),
|
||||||
|
StringStruct(u'ProductVersion', u'5.1.0.0')])
|
||||||
|
]),
|
||||||
|
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
|
||||||
|
]
|
||||||
|
)
|
Loading…
x
Reference in New Issue
Block a user