Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Computer Controls
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3

p.kaczmarek2 12 Aug 2021 15:28 1590 0
  • Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Witajcie moi drodzy.
    Przedstawię tutaj sposób w jaki zautomatyzowałem i zoptymalizowałem proces pisania kodu, kompilacji wsadu oraz jego wgrywanie na platformę XR809/XR3. Trochę zabawy z tym było, a nowy workflow opiera się zarówno na skryptach wsadowych Windowsa jak i Linuxa a dodatkowo też na drobnych programach napisanych w C i C#. Mój system znacznie redukuje ilość kroków które musi podjąć użytkownik by wgrać wsad na moduł, zasadniczo to system nawet sam klika przycisk "Programuj" w phoenixMC.exe.

    XR809 - co to jest i o co chodzi?
    XR809/XR3 to moduł WiFi podobny jak ESP12F, opierają się na nim niektóre produkty IoT przeznaczone dla inteligentnego domu, np. czujniki otwarcia drzwi, wilgotności, ruchu.
    Szczegóły tutaj:
    https://www.elektroda.pl/rtvforum/topic3806769.html
    Dla XR809 nie ma tej chwili żadnego otwartego firmware (oprócz mojego wczesnego zalążku z tematu powyżej), ale pracuje nad tym by to zmienić i nieco bardziej ten moduł "otworzyć".

    XR809 - początkowa procedura programowania
    W sieci nie ma zasadniczo żadnych dobrych informacji o organizacji pracy pod XR809, a praca z nim w początkowym stadium (bez moich optymalizacji) wyglądała tak:
    1. pisanie kodu w Notatniku
    2. ręczne otwieranie konsoli Cygwin, kompilacja SDK, przejście do odpowiedniego folderu, src, ręczne wywołanie make i make install
    3. dalej w konsoli Cygwin, kompilacja projektu, czyli przejście do ../project/at_demo/gcc/, wywołanie make i make image
    4. wprowadzenie XR809 w stan RESET, czyli ręczne zwarcie RESET do masy na płytce stykowej, zwarcie obu PGM do masy, odłączenie RESET
    5. w phoenixMC.exe otwarcie pliku IMG a potem włączenie programowania (wgrywanie wsadu przez UART)
    6. ręcznie odłączenie PGM od masy, a potem ponowne zwarcie RESET do masy by XR809 się uruchomił ponownie
    To zdecydowanie za dużo kroków! Pora to zoptymalizować. Poniżej opiszę jak.
    Najgorsza jest ta potrzeba ręcznego odpinania RESET/PG od masy na płytce stykowej, to też wyeliminuję.

    Optymalizacja skryptów shell w Cygwinie by wszystko było jednym poleceniem
    Na początku coś prostego i dość oczywistego.
    Szereg komend można umieścić w pliku wsadowym i wykonywać jednym poleceniem:
    Code: bash
    Log in, to see the code

    Oczywiście plik musi być w odpowiednim miejscu by relatywne ścieżki działały:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    To upraszcza nam ilość komend do wpisania w Cygwinie.

    Wywoływanie polecenia z Cygwina z poziomu Windowsa
    Cygwin zasadniczo jest emulatorem linuxowej linii komend na Windowsa. Wygląda jak na zrzucie ekranu poniżej:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Od razu rodzi to pytanie, jak możemy wywołać polecenie Cygwinowe (lub inaczej mówiąc, linuxowy skrypt .sh) bezpośrednio z poziomu Windowsa?
    Służy do tego trik z komendą login, pełen kod Windowsowy bat poniżej:
    Code: bash
    Log in, to see the code

    To eliminuje potrzebę ręcznego włączania Cygwina oraz pozwala nam na dalsze podpięcie automatyzacji pod wszystko co jest w stanie uruchomić plik .bat.
    Należy też pamiętać o mapowaniu ścieżek windowsowych na Cygwina - poprzez /cygdrive/.


    Automatyczne resetowanie XR809 (automatyczne zwieranie EN/RESET/PG do masy)
    Teraz pora na nieco bardziej elektroniczny krok, ale też niezwykle ważny.
    Musimy jakoś zrealizować automatyczne zwieranie RESET do masy, by nie robić tego za każdym razem ręcznie.
    Zasadniczo zrobimy tu to, co robi też Arduino ze swoim CH340G lub podobnym.
    Przejrzałem jakie mam dostępne układy i trafił mi się MCP2221:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Steruje się go przez USB, oferuje on przejściówkę USB na UART oraz dodatkowe piny GPIO.
    Nie ma tu też problemu z zasilaniem z 3.3V, MCP2221 pracuje poprawnie na 3.3V i poziomy UART 3.3V:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    (docelowo chciałem też użyć go w roli portu szeregowego, ale ostatecznie to nie do końca wyszło, bo nie wspiera większych baud rate).
    Jak już mamy GPIO, to możemy zwierać do masy sygnały RESET i PGM za pomocą tranzystorów, miałem pod ręką BC547:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Została kwestia sterowania po stronie komputera.
    Użyłem do tego biblioteki HID MCP2221 autorstwa Zak Kemble, dostępnej na licencji GPL.
    https://blog.zakkemble.net/mcp2221-hid-library/
    Poniżej przykłady funkcji sterujących GPIO:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Jeszcze trzeba móc jakoś wyprowadzić te opcje 'na zewnątrz', by móc z poziomu linii komend poprzez argumenty sterować tym co zrobi MCP. Robi się to bardzo prosto:
    Code: c
    Log in, to see the code

    int argc to ilość argumentów (pierwszy argument to wywoływana ścieżka do exe), argv to tablica wskaźników na argumenty (napisy w stylu C). Funkcja atoi zamienia ciąg znaków na integer.
    Dzięki temu np. takie wywołanie:
    myMCPtool.exe 2
    uruchomi tryb programowania XR809.

    Całość złożyłem na płytce stykowej:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3 Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Niestety ostatecznie nie użyłem MCP jako USB na UART gdyż jest dość wolny (może jak podmienię na MCP2221A jak dojdzie to będzie lepiej). Z tego też powodu na zdjęciu jest druga przejściówka USB-UART (ona z kolei ma sam UART, nie ma DTR ani nic by użyć, a szkoda).


    Wygodne środowisko do pisania kodu
    Kolejnym problemem do rozwiązania jest kwestia dobrego edytora tekstu dla kodu, najlepiej takiego którego już dość dobrze znam, też oferującego autocomplete (podpowiadanie nazw zmiennych, klas, funkcji), wygodną nawigację po projekcie C++ (możliwość kliknięcia na #include <header.h> i przejścia do treści tego nagłówka), wygodną nawigację po funkcjach (możliwość kliknięcia na nazwie funkcji w jej wywołaniu i przeskoczenia do jej definicji), itp.
    Zdecydowałem się na mój ulubiony Visual Studio 2008 Express Edition.
    Wersja 2008, bo wciąż ją mam i wciąż działa na Windows 10 a jest dość lekka.
    Zacząłem od wykonania "Project From Existing Code":
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Tam odpowiednio wybrałem interesujące mnie pliki projektu z XR809 (jak też i nagłówki, by podpowiedzi działały, oraz SDK by móc zbadać co robi co):
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Tu należy uważać, by nie załączyć do projektu za dużo zbędnych plików.
    Tryb kompilacji - wybieramy external, zewnętrzny. Zaraz tam podepniemy wcześniej przygotowany plik .bat:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Tu można zrobić 3 osobne pliki .bat, ale na razie starczy jeden. Ten .bat zawiera wywołanie Cygwina omówione wcześniej:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Finalnie tworzymy projekt Visual Studio, ale to jeszcze nie gotowe.
    Nawigacja po include nie działa:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Trzeba dodać ręcznie ścieżki do nich, gdyż Visual nie jest ich teraz świadomy. W przypadku własnego systemu build jest to w ustawieniach NMake:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Od teraz nawigacja po nagłówkach działa.
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Sprawdźmy jeszcze, czy kompilacja z poziomu Visuala działa?
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Rezultat:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Warto też pamiętać, że w MSVC możemy wyłączać/włączać kompilację wybranych plików bez usuwania ich z projektu:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Warto też pamiętać, że w MSVC mamy możliwość ustawienia (tutaj tylko dla podpowiedzi i podświetlania) aktywnych #define preprocesora:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Te kroki są niezbędne by super-wygodne "Go To Definition" działało:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    W ten sposób mamy działające, wygodne IDE do pisania kodu pod XR809 a dodatkowo możemy z jego poziomu kompilować a log kompilacji mamy też tym samym IDE (strumień std przechodzi długą drogę, poprzez Cygwina, do bat, aż do MSVC).
    Oczywiście nie musi to być akurat wersja 2008, można zastosować nowsze wersje, ustawienia są dość podobne wtedy.

    Wygodniejsze wgrywanie wsadu - część 1
    Teraz jeszcze można nieco zmniejszyć ilość kliknięć potrzebnych do wgrania wsadu. Po co mamy klikać ręcznie na phoenixMC.exe, jak może to zrobić komputer?
    phoenixMC.exe to program do wgrywania wsadu na XR809 przez UART:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    I nie ma tego programu w innej wersji językowej niż ta powyżej, ale to najmniejszy problem.
    Spróbujmy zastanowić się, czy można jakoś zautomatyzować wciskanie jego przycisków?
    Jak najbardziej można - najpierw musimy skopiować z nich nazwy (by móc potem je po nich wyszukać).
    Przychodzi nam z pomocą narzędzie Spy++.
    Instaluje się je wraz z Visual Studio.
    U mnie jest tutaj:
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Program jest prosty w użyciu. Przenosimy (przeciągamy) celownik na okno i przycisk który nas interesuje i w ten sposób zyskujemy o nim informacje:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Program ten pozwala np. łatwo skopiować nazwę przycisku (co tu jest dość ważne, bo bym miał problem z przepisaniem tych chińskich znaków).
    Teraz tylko trzeba te informacje użyć....
    Użyjemy ich z poziomu C#, też pisanego w Visual Studio, ale 2017 (bo takie miałem pod ręką).
    Windows, a dokładniej WINAPI oferuje funkcje która umożliwiają nam manipulacje oknami programów, nawet tych, które do nas nie należą.
    https://docs.microsoft.com/en-us/windows/win32/apiindex/windows-api-list
    Należy je zaimportować z user32.dll. Do importowania służy DllImport.
    Do znalezienia okna użyjemy FindWindow.
    Do znalezienia przycisku użyjemy FindWindowEx.
    Do symulacji kliknięcia SendMessage.
    W oparciu o nie można napisać program, który znajduje nam phoenixMC.exe (jego okienko), maksymalizuje je i wciska przycisk od programowania.
    Gotowy kod:
    Code: csharp
    Log in, to see the code

    Program powyżej automatycznie otwiera okno (zminimalizowane) i klika wybrany przycisk (tj. symuluje kliknięcie poprzez wysłanie komunikatu BM_CLICK, nie rusza kursorem myszki).


    Wygodniejsze wgrywanie wsadu - część 2
    Skoro mamy już gotowe klocki wykonujące osobno wejście w tryb programowania, wgrywanie wsadu oraz normalne bootwanie XR809, to możemy je teraz połączyć w jedną całość.
    Połączenia tego dokonałem w C#.
    Poniżej sposób na uruchomienie programu w exe z argumentami z poziomu C# (użyłem tego by uruchomić mój program dla MCP2221):
    Code: csharp
    Log in, to see the code

    I pełna funkcja programowania:
    Code: csharp
    Log in, to see the code

    Funkcja zakłada, że phoenixMC.exe zdąży zaprogramować w 60 sekund całość. Można by to sprawdzać lepiej, np. co sekundę badać stan przycisku lub pola jakiegoś lub kolor tła (robi się zielony), ale uznałem to za zbędne.
    Dodatkowo w kodzie powyżej jest przykład wywołania kompilacji z poziomu C# (i oczekiwania na ukończenie wykonania całego pliku bat - WaitForExit), ale ostatecznie tego nie używam bo kompiluję z poziomu Visual Studio.
    Gotowe! Mój program sam włącza XR809 w tryb programowania, potem sam go programuje, a ostatecznie sam go ponownie włącza już w trybie normalnej pracy.

    Co można by jeszcze ulepszyć?
    Zasadniczo to trafiłem na dwa problemy, których do tej pory nie rozwiązałem, choć nie są kłopotliwe.
    - ostatecznie nie użyłem MCP2221 w roli konwertera USB na UART bo jest za wolny (więc MCP2221 tylko resetuje dwoma pinami XR809), do UART użyłem USB to TTL HW 597. Po prostu XR809 dawał ciągle błędy programowania z tym MCP. Muszę sprawdzić MCP2221 wkrótce, może będzie lepszy.
    - w phoenixMC.exe trzeba i tak ręcznie wybrać plik img z wsadem. Można by to zoptymalizować, ale już uznałem że na razie nie opłaca się kombinować z OpenFileDialog by oszczędzić te kilka sekund klikania.... w sumie można by to zrobić na dwa sposoby, albo z poziomu okienka symulować kliknięcia albo się wpiąć w sam program, np. mniej więcej tutaj:
    Automatyzacja środowiska pracy (kompilacja, wgrywanie wsadu) XR809/XR3
    Zrzut ekranu przedstawia zdekompilowaną funkcję phoenixMC.exe odpowiedzialną za wczytanie pliku img z wsadem. Jest ona wołana m. in. przez funkcję obsługującą zatwierdzenie OpenFileDialog od przycisku "Otwórz wsad". Łatwo ją było znaleźć po stałych tekstowych (komunikat "wrong MAGIC").
    - program mógłby sam włączać phoenixMC.exe i wybierać tam port UART, ale to naprawdę nie ma już znaczenia, bo takie rzeczy wykonuje się raz a nie z każdą kompilacją od nowa

    XR809 - nowa procedura programowania
    Wszystko się znacznie uprościło po moich zmianach. Teraz zasadniczo praca z XR809 wygląda tak:
    1. kod piszemy w Visual Studio z pomocą IntelliSense, kompilację robimy tak jak zwykle z MSVC przez menu Build lub klawisz F7
    2. aby wgrać wsad tylko musimy go wybrać w phoenixMC.exe (otworzyć plik IMG tam) a potem uruchomić mojego 'pomocnika' napisanego w C#, on sam wprowadzi XR809 w tryb programowania, sam włączy wgrywanie wsadu, i sam zrestartuje potem XR809

    Podsumowanie
    Całość tego systemu złożyłem zasadniczo z gotowych klocków (tego co miałem pod ręką) w godzinę, a wygoda programowania znacznie się zwiększyła. Mogłem rzeczywiście zrobić to wcześniej.
    Przedstawione tu pomysły i metody są zasadniczo na tyle uniwersalne, że mogą się Wam przydać też jak nie macie nic wspólnego z XR809. Warto wiedzieć, że można z poziomu C# wywołać z argumentami plik .bat, który potem wywoła skrypt .sh na Cygwinie, który uruchomi Make...
    Kody są w treści tematu, ale też załączam ich pełną wersję poniżej. Kody będą ulepszane, bo na razie ścieżki są wpisane na sztywno, itp. Tak samo jeśli ktoś coś robi z XR809 i potrzebuje ich "na zaraz" to proszę dać znać, zaktualizuję je szybciej.

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    p.kaczmarek2
    Level 25  
    Offline 
  • Computer Controls