Redakcja WebInsider.pl zaprasza na WordCamp 2018 Poznań. Poznajmy się w Poznaniu!

Jestem właśnie w trakcie przygotowania pewnego rozwiązania programowo-sprzętowego, z którego oprócz mnie będą korzystały – jeśli wszystko pójdzie dobrze – również osoby „z zewnątrz”. Obok odpowiedniego sprzętu, istotnym elementem jest oprogramowanie, które całością zarządza. Z racji tego, że użytkownik będzie mógł samodzielnie zaktualizować oprogramowanie urządzenia, pojawiła się potrzeba wyraźnego i jednoznacznego określenia wersji, tak by w razie wystąpienia jakichś problemów (lub pytań ;-)) od razu było wiadomo z którą wersją mamy(y) do czynienia.

Oczywiście można to zrobić ręcznie, zmieniając przed każdą kompilacją numerek na wyższy, ale… Jeśli można coś relatywnie małym nakładem sił zautomatyzować, i nie ma to wpływu na parametry produktu/usługi, to zazwyczaj nie ma co się nawet zastanawiać…

Wersja aplikacji na podstawie czasu kompilacji w C/C++

Rozwiązanie o którym pisałem wyżej oparte jest o moduł ESP8266 (o tym coś więcej już niebawem :-)), którego oprogramowanie tworzone jest m.in. w Arduino IDE, a więc mamy tu do czynienia – z uwzględnieniem kilku specyficznych elementów związanych z samą platformą sprzętową – z językiem C/C++, a więc zazwyczaj możemy skorzystać m.in. z 3 „zmiennych”, które są tworzone automatycznie przez kompilator w momencie kompilacji:

__DATE__
__TIME__
__TIMESTAMP__

Mamy godzinę i datę kompilacji, oraz kompozycję tych 2 parametrów (timestamp), co wydaje się idealnym punktem wyjścia do generowania automatycznej.

Oczywiście można by poprzestać na bezpośrednim wykorzystaniu, gdyby nie to, że nie mamy tu żadnej kontroli nad tym, w jakim formacie wyświetla się godzina i data:

  • Data: Feb 16 2018
  • Time: 11:22:33
  • Timestamp: Fri Feb 16 11:22:33 2018

A ja do tego celu (prosta wersja aplikacji) zdecydowanie wolałbym coś bardziej w stylu:

yyyymmddhhmmss
20180216112233

Dlatego postanowiłem na szybko napisać prostą funkcję, która na bazie dostępnych danych wygeneruje mi kod wersji w pożądanym formacie.

void MakeVersionCode() {

 // Get: Feb 16 2018 11:22:33
 String VersionCode_TEMP = __DATE__ " " __TIME__;

 // 'Jan' | 'Feb' | 'Mar' | 'Apr' | 'May' | 'Jun' | 'Jul' | 'Aug' | 'Sep' | 'Oct' | 'Nov' | 'Dec'
 String M = VersionCode_TEMP.substring( 0, 3 );

 // Conversion "short month name" -> digits:
 if ( M == "Jan" ) { M = "01"; }
 else if ( M == "Feb" ) { M = "02"; }
 else if ( M == "Mar" ) { M = "03"; }
 else if ( M == "Apr" ) { M = "04"; }
 else if ( M == "May" ) { M = "05"; }
 else if ( M == "Jun" ) { M = "06"; }
 else if ( M == "Jul" ) { M = "07"; }
 else if ( M == "Aug" ) { M = "08"; }
 else if ( M == "Sep" ) { M = "09"; }
 else if ( M == "Oct" ) { M = "11"; }
 else if ( M == "Dec" ) { M = "12"; }
 else { M = "00"; } // just in case

 // Make: 20180216112233
 VersionCode = VersionCode_TEMP.substring( 7, 11 );
 VersionCode += M; // month after conversion
 VersionCode += VersionCode_TEMP.substring( 4, 6 );
 VersionCode += VersionCode_TEMP.substring( 12, 14 );
 VersionCode += VersionCode_TEMP.substring( 15, 17 );
 VersionCode += VersionCode_TEMP.substring( 18, 20 );

}

Do tego w „nagłówku” programu zdeklarowanie odpowiedniej zmiennej, z której korzystam w dalszej części programu, właśnie do wyświetlenia wersji aplikacji:

String VersionCode;

I wywołanie naszej funkcji podczas startu urządzenia (programu):

void setup() {
 [...]
 MakeVersionCode();
 [...]
}

Pewnie można to rozwiązanie jeszcze jakoś zmodyfikować (może jakaś tabela, może dodatkowe kodowanie/zaciemnianie daty), ale na moje potrzeby sprawdza się idealnie.


Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!
Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.
Janusz i Janusz dzięki motywowi Divi od Elegant Themes koszą siano robiąc strony
WebInsider poleca księgowość wFirma
WebInsider korzysta z VPSa w HitMe.pl
WebInsider poleca VPSy DigitalOcean
WebInsider poleca serwis Vindicat
Napisz komentarz
wipl_napisz-komentarz_01Jeśli informacje zawarte na tej stronie okazały się pomocne, możesz nam podziękować zostawiając poniżej swój komentarz.

W tej formie możesz również zadać dodatkowe pytania dotyczące wpisu, na które – w miarę możliwości – spróbujemy Ci odpowiedzieć.
Linki partnerskie
Niektóre z linków na tej stronie to tzw. „linki partnerskie”, co oznacza, że jeśli klikniesz na link i dokonasz wymaganej akcji (np. zakup/rejestracja) możemy otrzymać za to prowizję. Pamiętaj, że polecamy tylko te produkty i usługi, z których sami korzystamy, i uważamy, że są tego na prawdę warte… :-)
Znaki towarowe i nazwy marek
W niektórych wpisach (oraz innych miejscach na stronie) mogą być przedstawione/użyte znaki towarowe i/lub nazwy marek, które stanowią własność intelektualną tych podmiotów, a zostały użyte wyłącznie w celach informacyjnych.
Młody Szymon powiedział tacie o promocji dla czytelników WebInsider.pl i zaoszczędzili 80% na księgowości internetowej wFirma