Platformio.ini and post

Hi,

I use vsc with platformio to program esp32.
In platformio.ini I define several env (about 10).
I ask chatgpt to write a ptyhon script to rename firmware.bin

But I have to run twice the build command : in the first pass, the script says firmware.bin doesn’t exist.
When I run the build command a second time, there is no pb.

I asked again chatgpt, which tell me to add à timer, but it doesn’t fix my pb.

So what do I miss ?
The script is in a line in env section

extra_scripts = post:rename_firmware.bin

Doesn’t post executed AFTER the compilation ?

Want do I have to change ?

Thank you for your help.

Here is my py script.

import shutil
import os
import time
from SCons.Script import DefaultEnvironment, ARGUMENTS

# Obtenir l'environnement de compilation PlatformIO
env = DefaultEnvironment()

# Récupérer le nom de l'environnement courant
env_name = env['PIOENV']

build_flags = ARGUMENTS.get("BUILD_FLAGS", "")
afficheur = "true" if "-D AFFICHEUR=true" in build_flags else "false"

# Pour SIMPLE, on va extraire la valeur numérique, qui est entre 1 et 6
simple_value = None
for flag in build_flags.split():
    if flag.startswith("-D SIMPLE="):
        simple_value = flag.split("=")[1]

# Si SIMPLE n'est pas défini, on met une valeur par défaut
simple = simple_value if simple_value is not None else "1"

# Récupérer le numéro de version à partir du fichier 'versioning'
version_file = 'versioning'
try:
    with open(version_file, 'r') as vf:
        version = vf.readline().strip()  # Lire la version depuis le fichier
except FileNotFoundError:
    version = "V0"  # Valeur par défaut si le fichier n'existe pas

print(f"VERSION : {version}")
# Construire le nouveau nom de fichier avec le nom de l'environnement et la version
new_filename = "firmware.bin"

if env_name=="AFFICHEUR_PLUS_SIMPLE_IDEASPARK":
    new_filename = f"firmware - IDEASPARK - V{version} - version simple.bin"
elif env_name=="AFFICHEUR_PLUS_2RELAIS_IDEASPARK":
    new_filename = f"firmware - IDEASPARK - V{version} - version 2 relais.bin"
elif env_name=="AFFICHEUR_TACTILE_SIMPLE":
    new_filename = f"firmware - TACTILE - V{version} - version simple.bin"
elif env_name=="AFFICHEUR_TACTILE_2RELAIS":
    new_filename = f"firmware - TACTILE - V{version} - version 2 relais.bin"
elif env_name=="AFFICHEUR_SIMPLE_TTGO":
    new_filename = f"firmware - TTGO - V{version} - version simple.bin"
elif env_name=="AFFICHEUR_2RELAIS_TTGO":
    new_filename = f"firmware - TTGO - V{version} - version 2 relais.bin"
elif env_name=="AFFICHEUR_PLUS_SIMPLE_LILYGO":
    new_filename = f"firmware - S3 - V{version} - version simple.bin"
elif env_name=="AFFICHEUR_PLUS_2RELAIS_LILYGO":
    new_filename = f"firmware - S3 - V{version} - version 2 relais.bin"
elif env_name=="DELESTEUR_2CH_KIT":
    new_filename = f"firmware - DELESTEUR - V{version} - version kit.bin"
elif  env_name=="DELESTEUR_2CH_AUTONOME":
    new_filename = f"firmware - DELESTEUR - V{version} - version autonome.bin"
    
elif  env_name=="DELESTEUR_2CH_AUTONOME_VERSION_BATTERIE":
    new_filename = f"firmware - DELESTEUR - V{version} - version autonome batterie.bin"
elif env_name=="DELESTEUR_6CH":
    new_filename = f"firmware - DELESTEUR - V{version} - version 6CH.bin"


# Emplacement du fichier généré par PlatformIO (firmware.bin)
firmware_path = os.path.join(env.subst("$BUILD_DIR"), "firmware.bin")

# Emplacement avec le nouveau nom
new_firmware_path = os.path.join(env.subst("$BUILD_DIR"), new_filename)

# Attendre que le fichier firmware soit disponible avant de le renommer
timeout = 20  # Délai d'attente en secondes
start_time = time.time()
while not os.path.exists(firmware_path):
    if time.time() - start_time > timeout:
        print(f"Erreur : le fichier firmware.bin n'a pas été trouvé dans le délai imparti.")
        exit(1)
    time.sleep(0.5)

# Renommer le fichier firmware
shutil.move(firmware_path, new_firmware_path)
print(f"Firmware renamed to: {new_filename}")

This script makes no sense. To change the default firmware file name from “firmware” (.elf) to something else, you have to env.Replace(PROGNAME="your new name"), as documented.

This python script doesn’t do that at all. Furthermore, it needs to be a pre: script.

https://docs.platformio.org/en/latest/scripting/examples/custom_program_name.html

Thank you for the reply.
I’ll take a look.

In fact to make my script work, It should be executed as standalone, after compiling all the env.

.