Skocz do zawartości

Przełącznik wersji ESP32 dla Arduino IDE


Pomocna odpowiedź

(edytowany)

Dla tych co nie umieją hodować pinginów:

#!/usr/bin/env pwsh

# Destination path for the ESP32 package
$dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32"

# Directory containing different versions
$srcdir = "$($env:USERPROFILE)\.arduinoESP32\"

if ($args.Length -gt 0) {
    if ($args[0] -eq "off") {
        # Preparing for installation
	# Will ask for recurse operation as safety ;)
        Remove-Item -Path $dstitem -Force -ErrorAction SilentlyContinue
        Write-Host "Should be ready for new version installation"
        exit 0
    }
    elseif ($args[0] -eq "show") {
        $a = Get-Item -Path $dstitem -ErrorAction SilentlyContinue
        if ($a) {
            $a | Get-Item | Select-Object -ExpandProperty Target | Split-Path -Leaf
        }
        else {
            Write-Host "No configured version"
        }
        exit 0
    }
  
    # The argument is the version number
    $src = "$srcdir/$($args[0])"
    if (-not (Test-Path -Path $src -PathType Container)) {
        Write-Host "Version $($args[0]) not found"
    }
    else {
        New-Item -ItemType SymbolicLink -Path $dstitem -Target $src -Force | Out-Null
        Write-Host "Version $($args[0]) set"
    }
}
else {
    # List the contents of the directory without parameters
    Get-ChildItem -Path $srcdir | ForEach-Object { $_.Name }
}

Uwaga: może wymagać uprawnień administratora, bo Windows to szrot 😄 

Edytowano przez H1M4W4R1
  • Lubię! 2
Link do komentarza
Share on other sites

No to wersja w Pythonie:

#!/usr/bin/env python3

import os,re,sys,subprocess
from natsort import natsorted

class esp32(object):
    dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32')
    srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32')

    def __init__(self):
        self.dy=list(x for x in os.listdir(self.__class__.srcdir) \
            if re.match(r'\d+\.\d+\.\d+$',x))
        self.availver = ['any']
        pfx=set()
        for a in self.dy:
            pfx.add(int(a.split('.')[0]))
        pfx = sorted(list(pfx))
        for a in pfx:
            self.availver.append('any %d.x' % a)
        self.dy=natsorted(self.dy)
        self.availver.extend(self.dy)
        if os.path.islink(self.__class__.dstitem):
            self.curversion=os.readlink(self.__class__.dstitem).split('/')[-1]
        else:
            self.curversion='0.0.0'

    def verlist(self):
        return list(self.availver)

    def curver(self):
        return self.curversion

    def setver(self, version):
        def versionSet():
            if version == 'any':
                if self.curversion != '0.0.0':
                    return None
                return self.dy[-1]
            if not version.startswith('any'):
                if self.curversion != '0.0.0' and version == self.curversion:
                    print("Wersja %s jest już aktywna" % version)
                    return None
                if version not in self.dy:
                    raise Exception("Wersja %s nie jest zainstalowanaa" % version)
                return version
            ds=version.split()[1].split('.')[0]
            if self.curversion  != '0.0.0':
                es=self.curversion.split('.')[0]
                if ds == es:
                    print("Włączona wersja %s jest zgodna z wymaganiem %s.x" %\
                        (self.curversion, ds))
                    return None
            vr=None
            for a in self.dy[-1::-1]:
                b=a.split('.')[0]
                if b == ds:
                    vr=a
                    break
            if vr is None:
                raise Exception('Brak kandydata na wersję %s.x' % ds)
            return vr
            
        if version != 'off' and not re.match(r'\d+\.\d+\.\d+$',version) \
                and not re.match(r'any(\s+\d+\..*)?$',version):
            raise Exception('Błędny numer wersji: '+version)
        if os.path.exists(self.__class__.dstitem):
            if not os.path.islink(self.__class__.dstitem):
                raise Exception('Docelowy katalog esp32 to nie link')
        if version !='off':
            v=versionSet()
            if v is None:
                return
            version = v
        if os.path.exists(self.__class__.dstitem):
            os.unlink(self.__class__.dstitem)
        if version == 'off':
            if self.curversion == '0.0.0':
                print("Pakiet esp32 jest już wyłączony")
                return
            else:
                print("Wyłączono core esp32:esp32")
        else:
            os.symlink(os.path.join(self.__class__.srcdir,version),self.__class__.dstitem)
            print ("Włączono wersję %s" % version)
    
    def install(self, version):
        if not re.match(r'\d+\.\d+\.\d+$',version):
            raise Exception('Błędny nymer wersji: '+version)
        if version in self.dy:
            raise Exception('Wersja %s jest już zainstalowana' % version)
        self.previous = None
        if os.path.exists(self.__class__.dstitem):
            if not os.path.islink(self.__class__.dstitem):
                raise Exception('%s to nie softlink' % self.__class__.dstitem)
            self.previous=os.readlink(self.__class__.dstitem)
            os.unlink(self.__class__.dstitem)
        dstpath=os.path.join(self.__class__.srcdir,version)
        #print("Można instalować na %s" % dstpath)
        try:
            subprocess.check_call(['arduino-cli','core','install','esp32:esp32@'+version ])
        except:
            
            if self.previous:
                os.symlink(self.previous,self.__class__.dstitem)
            raise Exception('Instalacja nieudana')
        os.rename(self.__class__.dstitem,dstpath)
        os.symlink(dstpath,self.__class__.dstitem)
        print ("Zainstalowano wersję %s" % version)

#        to moje prywatne
#        mkboard=os.path.join(os.environ['HOME'],'Arduino/mkboard32.py')
#        if os.path.exists(mkboard):
#            subprocess.check_call([mkboard])
#            print("Dodatkowe wpisy partycji zostały dodane")
        
    def avail(self,update=False):
        if update:
            subprocess.check_call(['arduino-cli','core','update-index'])
        di=os.path.join(
            os.path.dirname((os.path.dirname(self.__class__.dstitem))),
            'package_esp32_index.json')
        import json
        f=open(di)
        packa=json.load(f)['packages'][0]['platforms']
        f.close()
        return list(a['version'] for a in packa)

if __name__ == '__main__':
    def helpme(s=None):
        if s:
            print(s,'\n')
        print("Użycie: %s command" % sys.argv[0])
        print("""list - pokaż bieżącą i zainstalowane wersje
avail [updated] - pokaż dostępne wersje
install <wersja> - instaluj wersję
switch <wersja> | off - przełącz wersję""")
        if s:
            exit(1)
        exit(0)
        
    esp=esp32()
    args=sys.argv[1:]
    if len(args) == 0:
        helpme ("Brak polecenia")
    cmd = args.pop(0)
    if cmd == 'list':
        cur = esp.curver()
        if cur != '0.0.0':
            print("Bieżąca wersja:", cur)
        from natsort import natsorted
        lista=natsorted(esp.dy)
        print("Dostępne wersje:",', '.join(lista))
        exit(0)
    if cmd == 'install':
        try:
            ver=args.pop(0)
        except:
            helpme("Nie podano wersji")
            exit(1)
        try:
            esp.install(ver)
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        exit(0)
        
    if cmd == 'avail':
        upd=False
        if len(args) > 0:
            arg=args.pop(0)
            if arg == 'updated':
                upd=True
            else:
                helpme("Błędny parametr "+arg)
        try:
            vers=esp.avail(upd)
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        lista=[]
        wiersz=[]
        for a in vers:
            wiersz.append('%-8s' % a)
            if len(wiersz) >= 8:
                lista.append(''.join(wiersz))
                wiersz=[]
        if len(wiersz) > 0:
            lista.append(''.join(wiersz))
        for a in lista:
            print (a)
        exit(0)
    if cmd == 'switch':
        if len(args) < 1:
            helpme("Co mam przełączyć?")
            exit(1)
        try:
            esp.setver(' '.join(args))
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        exit(0)
    helpme()

Niektóre rzeczy mogą wydawać się dziwne, ale to ma działać jako moduł do pyrduino.

Oczywiście trzeba poprawić ścieżki na początku, no i mieć arduino-cli zainstalowane.

Jakby coś to plik w załączniku: espswitch.zip

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

No to jeszcze wersja dla różnych systemów operacyjnych:

class esp32(object):
    if sys.platform.startswith('linux'):
        # Linux paths
        dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32')
        srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32')
    elif sys.platform.startswith('darwin'):
        # Mac parts - do usupełnienia
        dstitem = ''
        srcdir = ''
    elif sys.platform.startswith('win'):
        # Windows parts - do usupełnienia
        dstitem = ''
        srcdir = ''
    else:
        dstitem = ''
        srcdir = ''

    def __init__(self):
# sprawdzenie czy ścieżki są prawidłowe (wystarczy jedna)
        if self.__class__.dstitem == '':
            s=sys.platform
            if s.startswith('darwin'):
                s='macos'
            raise Exception('Brak podanych ścieżek dla systemu %s' % s)

# a to i dalej zostawiamy jak było
        self.dy=list(x for x in os.listdir(self.__class__.srcdir) \
            if re.match(r'\d+\.\d+\.\d+$',x))

Kto chętny do poprawienia ścieżek i sprawdzenia na czymś innym niż Linux?

Edytowano przez ethanak
Link do komentarza
Share on other sites

17 godzin temu, H1M4W4R1 napisał:

Dla tych co nie umieją hodować pinginów:

A dla tych co słabo czytają: nie

$dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32\hardware\esp32\"

ale

$dstitem = "$($env:USERPROFILE)\AppData\Local\Arduino15\packages\esp32"

 

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dobra, chyba dość w temacie. Wersja mam nadzieję finalna...

#!/usr/bin/env python3

import os,re,sys,subprocess
from natsort import natsorted

class esp32(object):
    if sys.platform.startswith('linux'):
        # Linux paths
        dstitem=os.path.join(os.environ['HOME'],'.arduino15/packages/esp32')
        srcdir=os.path.join(os.environ['HOME'],'.arduinoESP32')
        #postinstall = os.path.join(os.environ['HOME'],'Arduino','mkboard32.py')
    elif sys.platform.startswith('darwin'):
        # Mac paths - do uzupełnienia
        dstitem = ''
        srcdir = os.path.join(os.environ['HOME'],'.arduinoESP32')
    elif sys.platform.startswith('win'):
        # Windows paths - na odpowiedzialność kolegi H1M4W4R1
        # Jak coś nie będzie działać to do niego

        dstitem = os.path.join(os.environ["USERPROFILE"],'AppData','Local','Arduino15','packages','esp32')
        srcdir = os.path.join(os.environ["USERPROFILE"],'.arduinoESP32')
    else:
        dstitem = ''
        srcdir = ''

    def __init__(self):
        if self.__class__.dstitem == '':
            s=sys.platform
            if s.startswith('darwin'):
                s='macos'
            raise Exception('Brak podanych ścieżek dla systemu %s' % s)
        self.proper = True
        if not os.path.isdir(self.__class__.srcdir):
            self.proper = False
        elif os.path.exists(self.__class__.dstitem) and \
            not os.path.islink(self.__class__.dstitem):
                self.proper = False
        if not self.proper:
            return
        self.dy=list(x for x in os.listdir(self.__class__.srcdir) \
            if re.match(r'\d+\.\d+\.\d+$',x))
        self.availver = ['any']
        pfx=set()
        for a in self.dy:
            pfx.add(int(a.split('.')[0]))
        pfx = sorted(list(pfx))
        for a in pfx:
            self.availver.append('any %d.x' % a)
        self.dy=natsorted(self.dy)
        self.availver.extend(self.dy)
        if os.path.islink(self.__class__.dstitem):
            self.curversion=os.readlink(self.__class__.dstitem).split('/')[-1]
        else:
            self.curversion='0.0.0'

    def verlist(self):
        return list(self.availver)

    def curver(self):
        return self.curversion

    def setver(self, version):
        def versionSet():
            if version == 'any':
                if self.curversion != '0.0.0':
                    return None
                return self.dy[-1]
            if not version.startswith('any'):
                if self.curversion != '0.0.0' and version == self.curversion:
                    print("Wersja %s jest już aktywna" % version)
                    return None
                if version not in self.dy:
                    raise Exception("Wersja %s nie jest zainstalowanaa" % version)
                return version
            ds=version.split()[1].split('.')[0]
            if self.curversion  != '0.0.0':
                es=self.curversion.split('.')[0]
                if ds == es:
                    print("Aktywna wersja %s jest zgodna z wymaganiem %s.x" %\
                        (self.curversion, ds))
                    return None
            vr=None
            for a in self.dy[-1::-1]:
                b=a.split('.')[0]
                if b == ds:
                    vr=a
                    break
            if vr is None:
                raise Exception('Brak kandydata na wersję %s.x' % ds)
            return vr
            
        if version != 'off' and not re.match(r'\d+\.\d+\.\d+$',version) \
                and not re.match(r'any(\s+\d+\..*)?$',version):
            raise Exception('Błędny numer wersji: '+version)
        if os.path.exists(self.__class__.dstitem):
            if not os.path.islink(self.__class__.dstitem):
                raise Exception('Docelowy katalog esp32 to nie link')
        if version !='off':
            v=versionSet()
            if v is None:
                return
            version = v
        if os.path.exists(self.__class__.dstitem):
            os.unlink(self.__class__.dstitem)
        if version == 'off':
            if self.curversion == '0.0.0':
                print("Pakiet esp32 jest już wyłączony")
                return
            else:
                print("Wyłączono core esp32:esp32")
        else:
            os.symlink(os.path.join(self.__class__.srcdir,version),self.__class__.dstitem)
            print ("Aktywna wersja %s" % version)
    
    def install(self, version):
        if not re.match(r'\d+\.\d+\.\d+$',version):
            raise Exception('Błędny numer wersji: '+version)
        if version in self.dy:
            raise Exception('Wersja %s jest już zainstalowana' % version)
        self.previous = None
        if os.path.exists(self.__class__.dstitem):
            if not os.path.islink(self.__class__.dstitem):
                raise Exception('%s to nie softlink' % self.__class__.dstitem)
            self.previous=os.readlink(self.__class__.dstitem)
            os.unlink(self.__class__.dstitem)
        dstpath=os.path.join(self.__class__.srcdir,version)
        #print("Można instalować na %s" % dstpath)
        try:
            subprocess.check_call(['arduino-cli','core','install','esp32:esp32@'+version ])
        except:
            
            if self.previous:
                os.symlink(self.previous,self.__class__.dstitem)
            raise Exception('Instalacja nieudana')
        os.rename(self.__class__.dstitem,dstpath)
        os.symlink(dstpath,self.__class__.dstitem)
        print ("Zainstalowano wersję %s" % version)
        if hasattr(self.__class__,'postinstall') and \
            os.path.exists(self.__class__.postinstall):
                subprocess.check_call([self.__class__.postinstall])
                print("Wykonano skrypt użytkownika")
        
    def avail(self,update=False):
        if update:
            subprocess.check_call(['arduino-cli','core','update-index'])
        di=os.path.join(
            os.path.dirname((os.path.dirname(self.__class__.dstitem))),
            'package_esp32_index.json')
        import json
        f=open(di)
        packa=json.load(f)['packages'][0]['platforms']
        f.close()
        return list(a['version'] for a in packa)

    def initialize(self):
        if not os.path.isdir(self.__class__.srcdir):
            os.mkdir(self.__class__.srcdir)
            print("Utworzono katalog",self.__class__.srcdir)
        if not os.path.exists(self.__class__.dstitem):
            return
        if os.path.islink(self.__class__.dstitem):
            raise Exception("Pakiet esp32 nie jest fizycznym katalogiem")
        path=os.path.join(self.__class__.dstitem,'hardware','esp32')
        dy=os.listdir(path)
        if len(dy) != 1 or not re.match(r'\d+\.\d+\.\d+$',dy[0]):
            raise Exception("Nieznana struktura pakietu esp32")
        dy=dy[0]
        print("Wykryto zainstalowaną wersję",dy)
        tget=os.path.join(self.__class__.srcdir,dy)
        if os.path.exists(tget):
            raise Exception("Katalog docelowy istnieje:", tget)
        os.rename(self.__class__.dstitem,tget)
        os.symlink(tget,self.__class__.dstitem)
        print("Przygotowano wersję",dy)

if __name__ == '__main__':
    def helpme(s=None):
        if s:
            print(s,'\n')
        print("Użycie: %s command" % sys.argv[0])
        print("""init - inicjalizacja struktury katalogów
list - pokaż bieżącą i zainstalowane wersje
avail [updated] - pokaż dostępne wersje
install <wersja> - instaluj wersję
switch <wersja> | off - przełącz wersję""")
        if s:
            exit(1)
        exit(0)
        
    esp=esp32()
    args=sys.argv[1:]
    if len(args) == 0:
        helpme ("Brak polecenia")
    cmd = args.pop(0)
    if cmd == 'init':
        if esp.proper:
            helpme("Przełącznik wygląda na zainicjalizowany")
        esp.initialize()
        exit(0)
    if not esp.proper:
        helpme("Przełącznik nie jest zainicjalizowany")
    if cmd == 'list':
        cur = esp.curver()
        if cur != '0.0.0':
            print("Bieżąca wersja:", cur)
        from natsort import natsorted
        lista=natsorted(esp.dy)
        print("Dostępne wersje:",', '.join(lista))
        exit(0)
    if cmd == 'install':
        try:
            ver=args.pop(0)
        except:
            helpme("Nie podano wersji")
            exit(1)
        try:
            esp.install(ver)
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        exit(0)
        
    if cmd == 'avail':
        upd=False
        if len(args) > 0:
            arg=args.pop(0)
            if arg == 'updated':
                upd=True
            else:
                helpme("Błędny parametr "+arg)
        try:
            vers=esp.avail(upd)
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        lista=[]
        wiersz=[]
        for a in vers:
            wiersz.append('%-8s' % a)
            if len(wiersz) >= 8:
                lista.append(''.join(wiersz))
                wiersz=[]
        if len(wiersz) > 0:
            lista.append(''.join(wiersz))
        for a in lista:
            print (a)
        exit(0)
    if cmd == 'switch':
        if len(args) < 1:
            helpme("Co mam przełączyć?")
            exit(1)
        try:
            esp.setver(args.pop(0))
        except:
            print(str(sys.exc_info()[1]))
            exit(1)
        exit(0)
    helpme()

No i w załączniku to samo: espswitch2.zip

Udanego przełączania!

ethanak

Link do komentarza
Share on other sites

Uprzedzając pytania:

Trzeba zainstalować Python3

Trzeba zainstalować moduł natsort.

Warto zainstalować Arduino-cli (bez tego nie wszystko będzie działać)

No i w razie czego poprawić scieżkę dstitem (u kol. @H1M4W4R1 były takie, ale nie muszą być).

  • Lubię! 1
Link do komentarza
Share on other sites

Gość
Dnia 21.08.2024 o 15:44, ethanak napisał:

Trzeba zainstalować moduł natsort.

Jak zainstalować? Do CMD na YT nie brakuje poradników, do PY jest cienko. xD

1.thumb.png.6088c9b9834c47915a789f17d69fd187.png

Z ciekawości próbowałem to uruchomić bez tego natsortu, ale pokazuje się na ułamek sekundy czarne okno i znika. 

Link do komentarza
Share on other sites

(edytowany)

Polecenie pip wydajesz z cmd a nie konsoli pythona. A bogatszej dokumentacji niż do pythona dawno nie widziałem.

Edytowano przez ethanak
Link do komentarza
Share on other sites

(edytowany)

A skąd się ten dolar wziął? Robisz za cinkciarza?

Czasem warto czytać co ten windows wypisuje...

 

Edytowano przez ethanak
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.